综合办公系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

addBudget.vue 29KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-03-25 15:05:59
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-04-03 17:29:25
  6. -->
  7. <template>
  8. <div>
  9. <div>
  10. <div class="header">
  11. <!-- <div class="back">
  12. <el-button type="primary" plain @click="goBack">返回</el-button>
  13. </div> -->
  14. <div class="title">
  15. <div class="title-text">新增预算</div>
  16. <div class="title-tips">
  17. 请精准填写预算标准,对应的人员、设备、车辆可直接选择生成固定成本
  18. </div>
  19. </div>
  20. </div>
  21. <div class="add-main">
  22. <el-steps :active="activeStep" align-center finish-status="success">
  23. <el-step title="选择项目" description="选择想要生成预算的项目"></el-step>
  24. <el-step
  25. title="选择人员、车辆和设备"
  26. description="选择参与的人员、车辆和设备,得到固定成本"
  27. ></el-step>
  28. <!-- <el-step title="选择车辆和设备" description="选择,得到对应预算"></el-step> -->
  29. <el-step title="绩效和其他预算" description="包含绩效预算和其他预算"></el-step>
  30. <el-step title="生成预算表" description="生成最终的项目预算表"></el-step>
  31. </el-steps>
  32. <!-- 选择项目 -->
  33. <div class="project" v-if="activeStep == 0">
  34. <el-form
  35. ref="form1"
  36. :model="projectForm"
  37. :rules="projectRule"
  38. label-width="120px"
  39. >
  40. <el-form-item label="项目编号:" prop="projectNumber">
  41. <div style="display: flex">
  42. <el-input
  43. v-model="projectForm.projectNumber"
  44. placeholder="请选择项目编号"
  45. disabled
  46. style="width: 300px"
  47. />
  48. </div>
  49. </el-form-item>
  50. <el-form-item label="项目名称:" prop="projectName">
  51. {{ projectForm.projectName }}
  52. </el-form-item>
  53. <el-form-item label="项目负责人:" prop="projectLeader">
  54. {{
  55. projectForm.projectLeaderUser
  56. ? projectForm.projectLeaderUser.nickName
  57. : ""
  58. }}
  59. </el-form-item>
  60. <el-form-item label="项目类型:" prop="projectType">
  61. {{ projectForm.projectType }}
  62. </el-form-item>
  63. <el-form-item label="项目概况:">
  64. <table border="1">
  65. <tr>
  66. <td style="width: 250px">工作内容</td>
  67. <td>等级或比例尺</td>
  68. <td>单位</td>
  69. <td>工作量</td>
  70. <td style="width: 100px">要求完成时间</td>
  71. <td>备注</td>
  72. </tr>
  73. <tr v-for="(work, index) in workList" :key="index">
  74. <td>
  75. {{ work.content }}
  76. </td>
  77. <td>
  78. {{ work.scale }}
  79. </td>
  80. <td>
  81. {{ work.unit }}
  82. </td>
  83. <td>
  84. {{ work.workload }}
  85. </td>
  86. <td>
  87. {{ work.deadline }}
  88. </td>
  89. <td>
  90. {{ work.remark }}
  91. </td>
  92. </tr>
  93. </table>
  94. </el-form-item>
  95. <el-form-item label="甲方单位:">
  96. {{ projectForm.partyA }}
  97. </el-form-item>
  98. <el-form-item label="联系人:">
  99. {{ projectForm.contactPerson }}
  100. </el-form-item>
  101. <el-form-item label="联系方式:">
  102. {{ projectForm.telephone }}
  103. </el-form-item>
  104. <el-form-item label="备注:">
  105. {{ projectForm.remark }}
  106. </el-form-item>
  107. <el-form-item label="项目登记人:">
  108. {{ projectForm.projectRegistrant }}
  109. </el-form-item>
  110. <el-form-item label="登记时间:">
  111. {{ projectForm.createTime }}
  112. </el-form-item>
  113. </el-form>
  114. </div>
  115. <!-- 选择参与人员、车辆和设备 -->
  116. <div class="staff" v-if="activeStep == 1">
  117. <el-breadcrumb separator-class="el-icon-arrow-right">
  118. <el-breadcrumb-item>选择项目</el-breadcrumb-item>
  119. <el-breadcrumb-item>{{ projectForm.projectNumber }}</el-breadcrumb-item>
  120. <el-breadcrumb-item>{{ projectForm.projectName }}</el-breadcrumb-item>
  121. <el-breadcrumb-item>{{ projectForm.projectLeader }}</el-breadcrumb-item>
  122. </el-breadcrumb>
  123. <el-form ref="form2" :model="peopleForm" style="padding: 20px 100px 0">
  124. <!-- 选择人员 -->
  125. <el-form-item label="选择人员:">
  126. <span v-if="chooseUser.length != 0">
  127. <el-tag
  128. effect="plain"
  129. type=""
  130. v-for="item in chooseUser"
  131. style="margin: 5px; font-size: 14px"
  132. :key="item.userId"
  133. >
  134. {{ item.nickName }}
  135. </el-tag>
  136. </span>
  137. <el-button
  138. type="primary"
  139. plain
  140. icon="el-icon-plus"
  141. @click="openPeople = true"
  142. size="mini"
  143. >选择</el-button
  144. >
  145. </el-form-item>
  146. <el-form-item label="人员预算:" v-if="chooseUser.length != 0">
  147. <table border="1">
  148. <tr>
  149. <td style="width: 80px">姓名</td>
  150. <td style="width: 100px">岗位工资</td>
  151. <td style="width: 110px">人员成本(天)</td>
  152. <td style="width: 100px">进出场单价</td>
  153. <td style="width: 100px">预算天数</td>
  154. <td style="width: 100px">总额</td>
  155. </tr>
  156. <tr v-for="user in chooseUser" :key="user.userId">
  157. <td>{{ user.nickName }}</td>
  158. <td>{{ user.salary.salary }}</td>
  159. <td>{{ parseFloat(user.salary.salary / 31).toFixed(2) }}</td>
  160. <td>
  161. <el-input
  162. v-model="user.inOutPrice"
  163. placeholder="请输入进出场单价"
  164. @change="calculateUserTotal(user)"
  165. ></el-input>
  166. </td>
  167. <td>
  168. <el-input
  169. v-model="user.days"
  170. placeholder="请输入天数"
  171. @change="calculateUserTotal(user)"
  172. ></el-input>
  173. </td>
  174. <td class="staffCost">{{ user.staffCost }}</td>
  175. </tr>
  176. <tr>
  177. <td colspan="5">合计</td>
  178. <td>{{ budgetForm.staffCost }}</td>
  179. </tr>
  180. </table>
  181. </el-form-item>
  182. <!-- 选择车辆 -->
  183. <el-form-item label="选择车辆:">
  184. <span v-if="chooseCar.length != 0">
  185. <el-tag
  186. effect="plain"
  187. type=""
  188. v-for="item in chooseCar"
  189. style="margin: 5px; font-size: 14px"
  190. :key="item.licensePlate"
  191. >
  192. {{ item.licensePlate + item.brand }}
  193. </el-tag>
  194. </span>
  195. <el-button
  196. type="primary"
  197. plain
  198. icon="el-icon-plus"
  199. @click="openCar = true"
  200. size="mini"
  201. >选择</el-button
  202. >
  203. </el-form-item>
  204. <el-form-item label="车辆预算:" v-if="chooseCar.length != 0">
  205. <table border="1">
  206. <tr>
  207. <td style="width: 120px">车牌号</td>
  208. <td style="width: 100px">油耗</td>
  209. <td style="width: 100px">总里程</td>
  210. <td style="width: 110px">折旧成本(天)</td>
  211. <td style="width: 110px">预算天数</td>
  212. <td style="width: 100px">总额</td>
  213. </tr>
  214. <tr v-for="car in chooseCar" :key="car.carId">
  215. <td>{{ car.licensePlate }}</td>
  216. <td>
  217. <el-input
  218. v-model="car.mileage"
  219. placeholder="请输入油耗"
  220. @change="calculateCarTotal(car)"
  221. ></el-input>
  222. </td>
  223. <td>
  224. <el-input
  225. v-model="car.distance"
  226. placeholder="请输入总里程"
  227. @change="calculateCarTotal(car)"
  228. ></el-input>
  229. </td>
  230. <td>
  231. {{ car.dayCost }}
  232. </td>
  233. <td>
  234. <el-input
  235. v-model="car.days"
  236. placeholder="请输入天数"
  237. @change="calculateCarTotal(car)"
  238. ></el-input>
  239. </td>
  240. <td class="carCost">{{ car.expense }}</td>
  241. </tr>
  242. <tr>
  243. <td colspan="5">合计</td>
  244. <td>{{ budgetForm.carCost }}</td>
  245. </tr>
  246. </table>
  247. </el-form-item>
  248. <!-- 选择设备 -->
  249. <el-form-item label="选择设备:">
  250. <span v-if="chooseDevice.length != 0">
  251. <el-tag
  252. effect="plain"
  253. type=""
  254. v-for="item in chooseDevice"
  255. style="margin: 5px; font-size: 14px"
  256. :key="item.code"
  257. >
  258. {{ item.name + "-" + item.series + "-" + item.brand }}
  259. </el-tag>
  260. </span>
  261. <el-button
  262. type="primary"
  263. plain
  264. icon="el-icon-plus"
  265. @click="openDevice = true"
  266. size="mini"
  267. >选择</el-button
  268. >
  269. </el-form-item>
  270. <el-form-item label="设备预算:" v-if="chooseDevice.length != 0">
  271. <table border="1">
  272. <tr>
  273. <td style="width: 120px">设备名称</td>
  274. <td style="width: 120px">规格型号</td>
  275. <td style="width: 120px">品牌</td>
  276. <td>折旧成本(天)</td>
  277. <td style="width: 100px">预算天数</td>
  278. <td style="width: 100px">总额</td>
  279. </tr>
  280. <tr v-for="device in chooseDevice" :key="device.deviceId">
  281. <td>{{ device.name }}</td>
  282. <td>{{ device.series }}</td>
  283. <td>{{ device.brand }}</td>
  284. <td>
  285. {{ device.dayCost }}
  286. </td>
  287. <td>
  288. <el-input
  289. v-model="device.days"
  290. placeholder="请输入天数"
  291. @change="calculateDeviceTotal(device)"
  292. ></el-input>
  293. </td>
  294. <td class="deviceCost">{{ device.depreciation }}</td>
  295. </tr>
  296. <tr>
  297. <td colspan="5">合计</td>
  298. <td>{{ budgetForm.deviceCost }}</td>
  299. </tr>
  300. </table>
  301. </el-form-item>
  302. <el-form-item label="固定成本小计:">
  303. <el-tag type="danger" style="margin-right: 20px; font-size: 14px"
  304. >¥ {{ budgetForm.fixCost }}</el-tag
  305. >
  306. </el-form-item>
  307. </el-form>
  308. </div>
  309. <!-- 绩效和其他预算 -->
  310. <div class="other" v-if="activeStep == 2">
  311. <el-breadcrumb separator-class="el-icon-arrow-right">
  312. <el-breadcrumb-item>选择项目</el-breadcrumb-item>
  313. <el-breadcrumb-item>{{ projectForm.projectNumber }}</el-breadcrumb-item>
  314. <el-breadcrumb-item>{{ projectForm.projectName }}</el-breadcrumb-item>
  315. <el-breadcrumb-item>{{ projectForm.projectLeader }}</el-breadcrumb-item>
  316. </el-breadcrumb>
  317. <el-breadcrumb separator-class="el-icon-arrow-right" style="margin: 15px 0">
  318. <el-breadcrumb-item>固定成本小计</el-breadcrumb-item>
  319. <el-breadcrumb-item>¥ {{ budgetForm.fixCost }}</el-breadcrumb-item>
  320. </el-breadcrumb>
  321. <el-form>
  322. <choose-money :workList="workList" @getSettle="getSettle"></choose-money>
  323. <el-form-item label="外协费用:">
  324. <el-input
  325. v-model="budgetForm.outExpense"
  326. style="width: 400px"
  327. @change="getDirectExpense(budgetForm)"
  328. ></el-input>
  329. </el-form-item>
  330. <el-form-item label="商务费用:">
  331. <el-input
  332. v-model="budgetForm.businessExpense"
  333. style="width: 400px"
  334. @change="getDirectExpense(budgetForm)"
  335. ></el-input>
  336. </el-form-item>
  337. <el-form-item label="车船租赁:">
  338. <el-input
  339. v-model="budgetForm.rentExpense"
  340. style="width: 400px"
  341. @change="getDirectExpense(budgetForm)"
  342. ></el-input>
  343. </el-form-item>
  344. <el-form-item label="其他费用:">
  345. <el-input
  346. v-model="budgetForm.otherExpense"
  347. style="width: 400px"
  348. @change="getDirectExpense(budgetForm)"
  349. ></el-input>
  350. </el-form-item>
  351. <el-form-item label="直接成本小计:">
  352. <el-tag type="danger" style="margin-right: 20px; font-size: 14px">
  353. ¥{{ budgetForm.directExpense }}
  354. </el-tag>
  355. </el-form-item>
  356. </el-form>
  357. </div>
  358. <!-- 生成预算表 -->
  359. <div class="finish" v-if="activeStep == 3">
  360. <el-breadcrumb separator-class="el-icon-arrow-right">
  361. <el-breadcrumb-item>选择项目</el-breadcrumb-item>
  362. <el-breadcrumb-item>{{ projectForm.projectNumber }}</el-breadcrumb-item>
  363. <el-breadcrumb-item>{{ projectForm.projectName }}</el-breadcrumb-item>
  364. <el-breadcrumb-item>{{ projectForm.projectLeader }}</el-breadcrumb-item>
  365. </el-breadcrumb>
  366. <el-breadcrumb separator-class="el-icon-arrow-right" style="margin: 15px 0">
  367. <el-breadcrumb-item>固定成本小计</el-breadcrumb-item>
  368. <el-breadcrumb-item>¥ {{ budgetForm.fixCost }}</el-breadcrumb-item>
  369. </el-breadcrumb>
  370. <el-breadcrumb separator-class="el-icon-arrow-right" style="margin: 15px 0">
  371. <el-breadcrumb-item>直接成本小计</el-breadcrumb-item>
  372. <el-breadcrumb-item>¥ {{ budgetForm.directExpense }}</el-breadcrumb-item>
  373. </el-breadcrumb>
  374. <budget-table
  375. :budgetForm="budgetForm"
  376. :projectForm="projectForm"
  377. @getTotal="getTotalBudget"
  378. ></budget-table>
  379. </div>
  380. <div class="finish" v-if="activeStep == 4">
  381. <el-result icon="success" title="成功提示" subTitle="预算表生成完成">
  382. <template slot="extra"> </template>
  383. </el-result>
  384. </div>
  385. <el-divider></el-divider>
  386. <div class="btn">
  387. <el-button @click="activeStep -= 1" :disabled="activeStep == 0"
  388. >上一步</el-button
  389. >
  390. <el-button @click="confirmStep" type="primary" v-if="activeStep < 4"
  391. >下一步</el-button
  392. >
  393. <el-button @click="submitComplete" type="primary" v-if="activeStep == 4"
  394. >完成</el-button
  395. >
  396. </div>
  397. </div>
  398. <!-- 项目选择对话框 -->
  399. <el-dialog
  400. title="选择项目"
  401. :visible.sync="openProject"
  402. width="700px"
  403. append-to-body
  404. >
  405. <el-form :inline="true">
  406. <el-form-item label="项目编号" prop="projectNumber">
  407. <el-input
  408. v-model="queryParams.projectNumber"
  409. placeholder="请输入项目编号"
  410. clearable
  411. @keyup.enter.native="getProjectList"
  412. />
  413. </el-form-item>
  414. <el-form-item style="margin-bottom: 0; display: none">
  415. <el-input></el-input>
  416. </el-form-item>
  417. <el-form-item>
  418. <el-button @click="getProjectList" type="primary">搜索</el-button>
  419. </el-form-item>
  420. </el-form>
  421. <el-table :data="projectList" style="margin-top: 30px" height="600px">
  422. <el-table-column type="index" width="50"> </el-table-column>
  423. <el-table-column prop="isFinshed" label="状态" width="90px">
  424. <template slot-scope="scope">
  425. <el-tag
  426. :type="scope.row.isFinished === '0' ? 'success' : 'warning'"
  427. disable-transitions
  428. >
  429. {{ scope.row.isFinished == "0" ? "进行中" : "已结束" }}
  430. </el-tag>
  431. </template>
  432. </el-table-column>
  433. <el-table-column
  434. label="项目编号"
  435. align="center"
  436. key="projectNumber"
  437. prop="projectNumber"
  438. />
  439. <el-table-column
  440. label="项目名称"
  441. align="center"
  442. key="projectName"
  443. prop="projectName"
  444. width="200px"
  445. />
  446. <el-table-column
  447. label="项目负责人"
  448. align="center"
  449. key="projectLeader"
  450. prop="projectLeaderUser.nickName"
  451. />
  452. <el-table-column align="center">
  453. <template slot-scope="scope">
  454. <el-button size="mini" type="text" @click="chooseProject(scope.row)"
  455. >选择</el-button
  456. >
  457. </template>
  458. </el-table-column>
  459. </el-table>
  460. <div style="text-align: right">
  461. <el-pagination
  462. @current-change="getProjectList"
  463. :current-page.sync="queryParams.pageNum"
  464. :page-size="queryParams.pageSize"
  465. layout="total, prev, pager, next"
  466. :total="projectTotal"
  467. >
  468. </el-pagination>
  469. </div>
  470. </el-dialog>
  471. <!-- 选择人员对话框 -->
  472. <el-dialog title="选择人员" :visible.sync="openPeople" width="700px" append-to-body>
  473. <choosePeople @chooseUser="getChooseUser"></choosePeople>
  474. </el-dialog>
  475. <!-- 选择车辆对话框 -->
  476. <el-dialog title="选择车辆" :visible.sync="openCar" width="700px" append-to-body>
  477. <chooseCar @chooseList="getChooseCar"></chooseCar>
  478. </el-dialog>
  479. <!-- 选择设备对话框 -->
  480. <el-dialog title="选择设备" :visible.sync="openDevice" width="700px" append-to-body>
  481. <chooseDevice @chooseList="getChooseDevice"></chooseDevice>
  482. </el-dialog>
  483. </div>
  484. <!-- <div v-if="taskName != '预算编制'">
  485. <budgetForm></budgetForm>
  486. </div> -->
  487. </div>
  488. </template>
  489. <script>
  490. import { getProject } from "@/api/oa/project/project";
  491. import { getSalary } from "@/api/oa/staff/salary";
  492. import choosePeople from "./components/choosePeople.vue";
  493. import chooseCar from "./components/chooseCar.vue";
  494. import chooseDevice from "./components/chooseDevice.vue";
  495. import chooseMoney from "./components/chooseMoney.vue";
  496. import budgetTable from "./components/budgetTable.vue";
  497. import { addBudget } from "@/api/oa/budget/budget.js";
  498. import { addBudgetStaff } from "@/api/oa/budget/budgetStaff.js";
  499. import { addBudgetCar } from "@/api/oa/budget/budgetCar.js";
  500. import { addBudgetDevice } from "@/api/oa/budget/budgetDevice.js";
  501. import { addBudgetSettle } from "@/api/oa/budget/budgetSettle.js";
  502. import { Snowflake } from "@/utils/snowFlake.js";
  503. import budgetForm from "./components/budgetForm.vue";
  504. import {
  505. complete,
  506. rejectTask,
  507. returnList,
  508. returnTask,
  509. getNextFlowNode,
  510. delegate,
  511. flowTaskForm,
  512. } from "@/api/flowable/todo";
  513. import { getUsersDeptLeaderByDept } from "@/api/system/post";
  514. export default {
  515. components: {
  516. choosePeople,
  517. chooseCar,
  518. chooseDevice,
  519. chooseMoney,
  520. budgetTable,
  521. budgetForm,
  522. },
  523. props: {
  524. taskForm: {
  525. type: Object,
  526. require: true,
  527. },
  528. taskName: {
  529. type: String,
  530. require: true,
  531. },
  532. },
  533. data() {
  534. return {
  535. activeStep: 0,
  536. budgetForm: {
  537. budgetId: new Snowflake(1n, 1n, 0n).nextId().toString(),
  538. projectId: null,
  539. staffCost: 0,
  540. carCost: 0,
  541. deviceCost: 0,
  542. fixCost: 0,
  543. outExpense: 0,
  544. businessExpense: 0,
  545. rentExpense: 0,
  546. otherExpense: 0,
  547. directExpense: 0,
  548. totalBudget: 0,
  549. settleExpense: 0,
  550. compiler: "",
  551. auditor: "",
  552. }, // 预算表
  553. openProject: false,
  554. projectList: [],
  555. queryParams: {
  556. pageNum: 1,
  557. pageSize: 10,
  558. projectNumber: "",
  559. projectLeader: "",
  560. projectLeaderName: undefined,
  561. projectName: "",
  562. },
  563. projectTotal: 0,
  564. projectForm: {},
  565. workList: [
  566. {
  567. content: "实景三维制作(影像分辨率优于5cm)",
  568. scale: "1:500",
  569. workload: "10",
  570. unit: "km²",
  571. deadline: "2024-01-31",
  572. remark: "此为备注此为备注此为备注此为备注此为备注此为备注",
  573. },
  574. {
  575. content: "XXXXXXXXXXXXXXXXXX",
  576. scale: "1:500",
  577. workload: "10",
  578. unit: "km²",
  579. deadline: "2024-01-31",
  580. remark: "此为备注此为备注此为备注此为备注此为备注此为备注",
  581. },
  582. ],
  583. projectRule: {
  584. projectNumber: [{ required: true, message: "请选择项目编号", trigger: "blur" }],
  585. },
  586. peopleForm: {},
  587. openPeople: false,
  588. chooseUser: [],
  589. carDeviceForm: {},
  590. openCar: false,
  591. openDevice: false,
  592. chooseCar: [],
  593. chooseDevice: [],
  594. };
  595. },
  596. created() {
  597. this.getProjectList();
  598. console.log(this.taskForm);
  599. },
  600. methods: {
  601. goBack() {
  602. let obj = { path: "/budget/add" };
  603. this.$tab.closeOpenPage(obj);
  604. this.$router.push({ path: "/budget" });
  605. },
  606. // 查询项目列表
  607. getProjectList() {
  608. getProject(this.taskForm.formId).then(response => {
  609. // console.log(response.rows);
  610. // this.projectList = response.rows;
  611. // this.projectTotal = response.total;
  612. this.projectForm = response.data;
  613. });
  614. },
  615. // 选择项目
  616. chooseProject(row) {
  617. this.projectForm = row;
  618. this.budgetForm.projectId = row.projectId;
  619. this.openProject = false;
  620. },
  621. confirmStep() {
  622. if (this.activeStep == 0) {
  623. if (this.projectForm.projectNumber == undefined) {
  624. this.activeStep = 0;
  625. this.$message.error(`请选择项目编号!`);
  626. } else {
  627. this.activeStep += 1;
  628. }
  629. } else if (this.activeStep == 2) {
  630. this.budgetForm.chooseUser = this.chooseUser;
  631. this.budgetForm.chooseCar = this.chooseCar;
  632. this.budgetForm.chooseDevice = this.chooseDevice;
  633. this.budgetForm.projectId = this.projectForm.projectId;
  634. this.activeStep += 1;
  635. this.calculateThatCost();
  636. } else if (this.activeStep == 3) {
  637. console.log(this.budgetForm);
  638. this.addBudgetForm(this.budgetForm);
  639. this.activeStep += 1;
  640. } else {
  641. this.activeStep += 1;
  642. }
  643. },
  644. getChooseUser(val) {
  645. this.chooseUser = val;
  646. this.openPeople = false;
  647. },
  648. getChooseCar(val) {
  649. this.chooseCar = val;
  650. this.openCar = false;
  651. },
  652. getChooseDevice(val) {
  653. this.chooseDevice = val;
  654. this.openDevice = false;
  655. },
  656. getUserSalary(userId) {
  657. getSalary(userId).then(res => {
  658. return res.data.salary;
  659. });
  660. },
  661. getSettle(val) {
  662. this.budgetForm.settleExpense = val.settle;
  663. this.budgetForm.workList = val.workList;
  664. this.getDirectExpense(this.budgetForm);
  665. },
  666. // 计算单个人员的成本
  667. calculateUserTotal(user) {
  668. let total =
  669. (parseFloat(user.salary.salary / 31).toFixed(2) + Number(user.inOutPrice)) *
  670. Number(user.days);
  671. this.$set(user, "staffCost", total.toFixed(2));
  672. this.getCost("staffCost", "staffCost", this.chooseUser);
  673. this.getFixCost();
  674. },
  675. calculateCarTotal(car) {
  676. let total1 = Number(car.mileage) * Number(car.distance);
  677. let total2 = Number(car.dayCost) * Number(car.days);
  678. let sum = (total1 + total2).toFixed(2);
  679. this.$set(car, "depreciation", total2);
  680. this.$set(car, "expense", sum);
  681. this.getCost("expense", "carCost", this.chooseCar);
  682. this.getFixCost();
  683. },
  684. calculateDeviceTotal(device) {
  685. let total = Number(device.dayCost) * Number(device.days);
  686. this.$set(device, "depreciation", total);
  687. this.getCost("depreciation", "deviceCost", this.chooseDevice);
  688. this.getFixCost();
  689. },
  690. getCost(name1, name2, list) {
  691. let sum = 0;
  692. for (let user of list) {
  693. sum = sum + Number(user[name1]);
  694. }
  695. this.budgetForm[name2] = sum.toFixed(2);
  696. },
  697. getFixCost() {
  698. let total =
  699. Number(this.budgetForm.staffCost) +
  700. Number(this.budgetForm.carCost) +
  701. Number(this.budgetForm.deviceCost);
  702. this.budgetForm.fixCost = total.toFixed(2);
  703. },
  704. // 获取直接成本
  705. getDirectExpense(form) {
  706. let sum =
  707. Number(form.settleExpense) +
  708. Number(form.outExpense) +
  709. Number(form.rentExpense) +
  710. Number(form.businessExpense) +
  711. Number(form.otherExpense);
  712. this.budgetForm.directExpense = sum.toFixed(2);
  713. },
  714. getTotalBudget(val) {
  715. this.budgetForm.totalBudget = val;
  716. },
  717. addBudgetForm(form) {
  718. addBudget(form);
  719. for (let user of form.chooseUser) {
  720. user.budgetId = form.budgetId;
  721. addBudgetStaff(user);
  722. }
  723. for (let car of form.chooseCar) {
  724. car.budgetId = form.budgetId;
  725. addBudgetCar(car);
  726. }
  727. for (let device of form.chooseDevice) {
  728. device.budgetId = form.budgetId;
  729. addBudgetDevice(device);
  730. }
  731. for (let work of form.workList) {
  732. work.budgetId = form.budgetId;
  733. addBudgetSettle(work).then(res => {
  734. this.$modal.msgSuccess("预算表生成成功");
  735. });
  736. }
  737. },
  738. calculateThatCost() {
  739. let staffCost = 0;
  740. let carCost = 0;
  741. let deviceCost = 0;
  742. for (let user of this.chooseUser) {
  743. staffCost = staffCost + Number(user.staffCost);
  744. }
  745. for (let car of this.chooseCar) {
  746. carCost = carCost + Number(car.expense);
  747. }
  748. for (let device of this.chooseDevice) {
  749. deviceCost = deviceCost + Number(device.depreciation);
  750. }
  751. this.budgetForm.staffCost = staffCost;
  752. this.budgetForm.carCost = carCost;
  753. this.budgetForm.deviceCost = deviceCost;
  754. },
  755. submitComplete() {
  756. const params = { taskId: this.taskForm.taskId };
  757. getNextFlowNode(params).then(res => {
  758. getUsersDeptLeaderByDept({ deptId: 107 }).then(res => {
  759. let userId = res.data.userId;
  760. this.$set(this.taskForm.variables, "approval", userId);
  761. complete(this.taskForm).then(response => {
  762. this.$modal.msgSuccess(response.msg);
  763. this.$emit("goBack");
  764. });
  765. });
  766. });
  767. },
  768. },
  769. };
  770. </script>
  771. <style lang="scss" scoped>
  772. .header {
  773. background-color: #fff;
  774. height: 110px;
  775. display: flex;
  776. align-items: center;
  777. border-bottom: 1px solid #ebeef5;
  778. .back {
  779. margin-left: 30px;
  780. flex: 1;
  781. }
  782. .title {
  783. text-align: left;
  784. flex: 24;
  785. padding-left: 40px;
  786. .title-text {
  787. font-size: 20px;
  788. font-weight: 700;
  789. }
  790. .title-tips {
  791. font-size: 14px;
  792. color: #5a5a5a;
  793. }
  794. }
  795. }
  796. .add-main {
  797. padding: 20px;
  798. .project {
  799. padding-top: 50px;
  800. width: 1000px;
  801. margin: 0 auto;
  802. }
  803. .staff,
  804. .other,
  805. .finish {
  806. width: 1200px;
  807. margin: 0 auto;
  808. padding-top: 50px;
  809. }
  810. }
  811. .btn {
  812. margin-top: 20px;
  813. text-align: center;
  814. }
  815. table {
  816. /*居中*/
  817. // margin: 0 auto;
  818. /*边框*/
  819. /* border: 1px solid black; */
  820. text-align: center;
  821. border-collapse: collapse;
  822. /*设置背景颜色*/
  823. /* background-color: #bfa; */
  824. td {
  825. padding: 3px;
  826. }
  827. }
  828. ::v-deep .el-input.is-disabled .el-input__inner {
  829. background-color: #fff;
  830. color: #5a5a5a;
  831. }
  832. </style>