综合办公系统
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.

settleForm.vue 35KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-04-30 09:03:14
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-05-08 17:54:13
  6. -->
  7. <template>
  8. <div class="app-container" v-loading="loading">
  9. <el-row :gutter="20">
  10. <el-col :span="19" :xs="24">
  11. <h2 class="text-center">项目结算表</h2>
  12. <div class="headers">
  13. 项目信息
  14. <div class="line"></div>
  15. </div>
  16. <el-form ref="settleForm" :model="form" :rules="rules" label-width="160px" :disabled="disabled">
  17. <el-form-item label="项目编号" prop="projectId">
  18. <el-select v-model="form.projectId" filterable placeholder="请选择" @change="handleSelectProject"
  19. :disabled="taskName != '结算发起'" clearable style="width: 100%">
  20. <el-option v-for="item in projectList" :key="item.value"
  21. :label="item.projectNumber + '-' + item.projectName" :value="item.projectId">
  22. </el-option>
  23. </el-select>
  24. <el-descriptions border v-if="isSelect" style="margin-top: 10px" :column="2">
  25. <el-descriptions-item label="项目编号" label-class-name="my-label">
  26. {{ chooseProject.projectNumber }}
  27. </el-descriptions-item>
  28. <el-descriptions-item label="项目名称" label-class-name="my-label">
  29. {{ chooseProject.projectName }}
  30. </el-descriptions-item>
  31. <el-descriptions-item label="合同编码" label-class-name="my-label">
  32. {{ chooseProject.contractCode }}
  33. </el-descriptions-item>
  34. <el-descriptions-item label="合同编号" label-class-name="my-label">
  35. {{ chooseProject.contractNumber }}
  36. </el-descriptions-item>
  37. <el-descriptions-item label="项目负责人" label-class-name="my-label">
  38. {{ chooseProject.projectLeaderUser ? chooseProject.projectLeaderUser.nickName : "" }}
  39. </el-descriptions-item>
  40. <el-descriptions-item label="甲方单位" label-class-name="my-label">
  41. {{ chooseProject.partyA }}
  42. </el-descriptions-item>
  43. <el-descriptions-item label="联系人" label-class-name="my-label">
  44. {{ chooseProject.contactPerson }}
  45. </el-descriptions-item>
  46. <el-descriptions-item label="联系电话" label-class-name="my-label">
  47. {{ chooseProject.telephone }}
  48. </el-descriptions-item>
  49. <el-descriptions-item label="项目类型" label-class-name="my-label">
  50. {{ chooseProject.projectType }}
  51. </el-descriptions-item>
  52. <el-descriptions-item label="项目级别" label-class-name="my-label">
  53. {{ chooseProject.projectLevel }}
  54. </el-descriptions-item>
  55. <el-descriptions-item label="承担部门" label-class-name="my-label">
  56. {{ chooseProject.undertakingDept }}
  57. </el-descriptions-item>
  58. <el-descriptions-item label="项目登记人" label-class-name="my-label">
  59. {{ chooseProject.projectRegistrant }}
  60. </el-descriptions-item>
  61. </el-descriptions>
  62. </el-form-item>
  63. <el-form-item label="工作量上报说明" prop="workloadReport">
  64. <el-input v-model="form.workloadReport" type="textarea" :disabled="taskName != '结算发起'"
  65. placeholder="请输入工作量上报说明" />
  66. </el-form-item>
  67. <el-row>
  68. <el-col :span="6" :xs="24" :offset="12">
  69. <el-form-item label="工作上报人:" prop="reporterName">
  70. <span class="auditor">
  71. {{ form.reporterName }}
  72. </span>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="6">
  76. <el-form-item label="上报日期:" prop="reportTime">
  77. <span> {{ form.reportTime }} </span>
  78. </el-form-item>
  79. </el-col>
  80. </el-row>
  81. <el-form-item label="原始上报数据" prop="">
  82. <el-upload class="upload-demo" ref="upload" :file-list="fileList" :auto-upload="false" action="">
  83. <el-button slot="trigger" size="mini" type="primary" icon="el-icon-upload"
  84. :disabled="taskName != '结算发起'">选取文件</el-button>
  85. <div slot="tip" class="el-upload__tip">
  86. 只能上传docx/doc文件,且不超过500kb
  87. </div>
  88. </el-upload>
  89. </el-form-item>
  90. <el-form-item label="项目管理部审核结算单" prop="">
  91. <el-upload class="upload-demo" ref="upload" :file-list="fileList" action="" :auto-upload="false">
  92. <el-button slot="trigger" size="mini" type="primary" icon="el-icon-upload"
  93. :disabled="taskName != '项目管理部结算'">选取文件</el-button>
  94. <div slot="tip" class="el-upload__tip">
  95. 只能上传docx/doc文件,且不超过500kb
  96. </div>
  97. </el-upload>
  98. </el-form-item>
  99. <el-form-item label="分管领导审核结算单" prop="">
  100. <el-upload class="upload-demo" ref="upload" :file-list="fileList" action="" :auto-upload="false">
  101. <el-button slot="trigger" size="mini" type="primary" icon="el-icon-upload"
  102. :disabled="taskName != '分管审核'">选取文件</el-button>
  103. <div slot="tip" class="el-upload__tip">
  104. 只能上传docx/doc文件,且不超过500kb
  105. </div>
  106. </el-upload>
  107. </el-form-item>
  108. <div class="headers">
  109. 项目完成工作量及经费计算
  110. <div class="line"></div>
  111. </div>
  112. <el-form-item label-width="60px">
  113. <table border="1">
  114. <tr>
  115. <td style="width: 50px">序号</td>
  116. <td style="width: 180px">工作内容</td>
  117. <td style="width: 100px">等级或比例尺</td>
  118. <td style="width: 100px">单位</td>
  119. <td style="width: 100px">地类</td>
  120. <td style="width: 100px">单价</td>
  121. <td>工作量</td>
  122. <td>其他系数</td>
  123. <td style="width: 100px">项目经费</td>
  124. <td>备注</td>
  125. <td>操作</td>
  126. </tr>
  127. <tr v-for="(work, index) in settleWorkList" :key="index">
  128. <td>
  129. {{ index + 1 }}
  130. </td>
  131. <td>
  132. <el-input v-model="work.content" type="textarea" clearable
  133. :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
  134. </td>
  135. <td>
  136. {{ work.scale == "" ? "无" : work.scale }}
  137. </td>
  138. <td>
  139. {{ work.unit }}
  140. </td>
  141. <td>
  142. {{ work.groundType == "0" ? "一般地类" : "复杂地类" }}
  143. </td>
  144. <td>
  145. {{ work.price }}
  146. </td>
  147. <td>
  148. <el-input-number :precision="2" style="width: 100px" v-model="work.workload" clearable
  149. @blur="calculateSettle(work)" :controls="false"></el-input-number>
  150. </td>
  151. <td>
  152. <el-input-number :precision="2" style="width: 100px" v-model="work.coefficient" clearable
  153. @blur="calculateSettle(work)" :controls="false"></el-input-number>
  154. </td>
  155. <td>
  156. <!-- <el-input-number style="width:100px" v-model="work.settle" clearable :controls="false"></el-input-number> -->
  157. {{ work.settle }}
  158. </td>
  159. <td>
  160. <el-input v-model="work.remark" type="textarea" clearable
  161. :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
  162. </td>
  163. <td>
  164. <el-button size="mini" type="text" @click="handleChoosePrice(work, index)">选择单价</el-button>
  165. <el-button type="text" size="mini" style="color: #f56c6c"
  166. @click="deletWorkItem(index, settleWorkList)">删除行</el-button>
  167. </td>
  168. </tr>
  169. <tr>
  170. <td :colspan="8">结算费用合计</td>
  171. <td>{{ settleSumTr.amount }}</td>
  172. <td>
  173. <el-input v-model="settleSumTr.remark" type="textarea" clearable
  174. :autosize="{ minRows: 2, maxRows: 10 }"></el-input>
  175. </td>
  176. </tr>
  177. </table>
  178. <el-button icon="el-icon-plus" type="primary" plain size="mini" @click="addWorkList"></el-button>
  179. </el-form-item>
  180. <!-- 结算汇总 -->
  181. <div class="headers">
  182. 结算汇总
  183. <div class="line"></div>
  184. </div>
  185. <el-form-item label-width="60px">
  186. <h3>表1:扣除明细</h3>
  187. <table border="1">
  188. <tr>
  189. <td style="width: 50px">序号</td>
  190. <td style="width: 280px">结算内容</td>
  191. <td style="width: 200px">结算金额(元)</td>
  192. <td style="width: 280px">备注</td>
  193. <td style="width: 100px">操作</td>
  194. </tr>
  195. <tr v-for="(work, index) in settleSumList" :key="index">
  196. <td>
  197. {{ index + 1 }}
  198. </td>
  199. <td>
  200. <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 2, maxRows: 10 }">
  201. </el-input>
  202. </td>
  203. <td>
  204. <el-input-number :min="0" :precision="2" style="width: 200px" v-model="work.amount" clearable
  205. :controls="false" @blur="calculateActualSumSettle()"></el-input-number>
  206. <!-- {{ work.amount }} -->
  207. </td>
  208. <td>
  209. <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 2, maxRows: 10 }">
  210. </el-input>
  211. </td>
  212. <td>
  213. <el-button type="text" size="mini" style="color: #f56c6c"
  214. @click="deletWorkItem(index, settleSumList)">删除行</el-button>
  215. </td>
  216. </tr>
  217. </table>
  218. <el-button icon="el-icon-plus" type="primary" plain size="mini" @click="addSumWorkList"></el-button>
  219. <h3>表2:部门结算金额</h3>
  220. <table border="1">
  221. <tr>
  222. <td style="width: 50px">序号</td>
  223. <td style="width: 280px">部门名称</td>
  224. <td style="width: 200px">结算金额(元)</td>
  225. <td style="width: 280px">备注</td>
  226. <td style="width: 100px">操作</td>
  227. </tr>
  228. <tr v-for="(dept, index) in deptSettleList" :key="index">
  229. <td>
  230. {{ index + 1 }}
  231. </td>
  232. <td>
  233. <el-input v-model="dept.content" type="textarea" clearable :autosize="{ minRows: 2, maxRows: 10 }">
  234. </el-input>
  235. </td>
  236. <td>
  237. <el-input-number :precision="2" style="width: 200px" v-model="dept.amount" clearable
  238. :controls="false" @blur="calculateDeptAmount(index)"></el-input-number>
  239. </td>
  240. <td>
  241. <el-input v-model="dept.remark" type="textarea" clearable :autosize="{ minRows: 2, maxRows: 10 }">
  242. </el-input>
  243. </td>
  244. <td>
  245. <el-button type="text" size="mini" style="color: #f56c6c"
  246. @click="deletWorkItem(index, deptSettleList)">删除行</el-button>
  247. </td>
  248. </tr>
  249. <tr>
  250. <td :colspan="2">实际结算总金额</td>
  251. <td :colspan="3">
  252. <el-input-number :precision="2" style="width: 100%" v-model="actualSumSettle" clearable
  253. :controls="false"></el-input-number>
  254. </td>
  255. </tr>
  256. <tr>
  257. <td :colspan="2">结算说明</td>
  258. <td :colspan="3">
  259. <el-input v-model="form.settleComment" type="textarea" clearable
  260. :autosize="{ minRows: 2, maxRows: 10 }">
  261. </el-input>
  262. </td>
  263. </tr>
  264. </table>
  265. <el-button icon="el-icon-plus" type="primary" plain size="mini" @click="addDeptSettleList"></el-button>
  266. </el-form-item>
  267. <!-- 结算审核情况 -->
  268. <div v-if="taskName != '结算发起'">
  269. <div class="headers">
  270. 结算审核情况
  271. <div class="line"></div>
  272. </div>
  273. <el-form-item label="综合事务部(设备领用情况)">
  274. <el-input v-model="form.zhComment" type="textarea" :disabled="taskName != '综合事务部处理'" clearable
  275. :autosize="{ minRows: 4, maxRows: 10 }">
  276. </el-input>
  277. </el-form-item>
  278. <el-row>
  279. <el-col :span="6" :xs="24" :offset="12">
  280. <el-form-item label="签名:" label-width="120px">
  281. <span class="auditor"> {{ form.zhUserName }} </span>
  282. </el-form-item>
  283. </el-col>
  284. <el-col :span="6">
  285. <el-form-item label="日期:" label-width="120px">
  286. <span> {{ form.zhTime }} </span>
  287. </el-form-item>
  288. </el-col>
  289. </el-row>
  290. <el-form-item label="技术质量部(质量及工作量)">
  291. <el-input v-model="form.jsComment" type="textarea" :disabled="taskName != '技术质量部审核'" clearable
  292. :autosize="{ minRows: 4, maxRows: 10 }">
  293. </el-input>
  294. </el-form-item>
  295. <el-row>
  296. <el-col :span="6" :xs="24" :offset="12">
  297. <el-form-item label="签名:" label-width="120px">
  298. <span class="auditor"> {{ form.jsUserName }} </span>
  299. </el-form-item>
  300. </el-col>
  301. <el-col :span="6">
  302. <el-form-item label="日期:" label-width="120px">
  303. <span> {{ form.jsTime }} </span>
  304. </el-form-item>
  305. </el-col>
  306. </el-row>
  307. <el-form-item label="项目管理部(结算)">
  308. <el-input v-model="form.xmComment" type="textarea" :disabled="taskName != '项目管理部结算'" clearable
  309. :autosize="{ minRows: 4, maxRows: 10 }">
  310. </el-input>
  311. </el-form-item>
  312. <el-row>
  313. <el-col :span="6" :xs="24" :offset="12">
  314. <el-form-item label="签名:" label-width="120px">
  315. <span class="auditor"> {{ form.xmUserName }} </span>
  316. </el-form-item>
  317. </el-col>
  318. <el-col :span="6">
  319. <el-form-item label="日期:" label-width="120px">
  320. <span> {{ form.xmTime }} </span>
  321. </el-form-item>
  322. </el-col>
  323. </el-row>
  324. <el-form-item label="项目承担部门(确认)">
  325. <el-input v-model="form.deptComment" type="textarea" :disabled="taskName != '结算发起人确认'" clearable
  326. :autosize="{ minRows: 4, maxRows: 10 }">
  327. </el-input>
  328. </el-form-item>
  329. <el-row>
  330. <el-col :span="6" :xs="24" :offset="12">
  331. <el-form-item label="签名:" label-width="120px">
  332. <span class="auditor"> {{ form.deptUserName }} </span>
  333. </el-form-item>
  334. </el-col>
  335. <el-col :span="6">
  336. <el-form-item label="日期:" label-width="120px">
  337. <span> {{ form.deptTime }} </span>
  338. </el-form-item>
  339. </el-col>
  340. </el-row>
  341. <el-form-item label="经营发展部(校核)">
  342. <el-input v-model="form.jyComment" type="textarea" :disabled="taskName != '经营发展部校核'" clearable
  343. :autosize="{ minRows: 4, maxRows: 10 }">
  344. </el-input>
  345. </el-form-item>
  346. <el-row>
  347. <el-col :span="6" :xs="24" :offset="12">
  348. <el-form-item label="签名:" label-width="120px">
  349. <span class="auditor"> {{ form.jyUserName }} </span>
  350. </el-form-item>
  351. </el-col>
  352. <el-col :span="6">
  353. <el-form-item label="日期:" label-width="120px">
  354. <span> {{ form.jyTime }} </span>
  355. </el-form-item>
  356. </el-col>
  357. </el-row>
  358. <el-form-item label="分管领导(审核)">
  359. <el-input v-model="form.managerComment" type="textarea" :disabled="taskName != '分管审核'" clearable
  360. :autosize="{ minRows: 4, maxRows: 10 }">
  361. </el-input>
  362. </el-form-item>
  363. <el-row>
  364. <el-col :span="6" :xs="24" :offset="12">
  365. <el-form-item label="签名:" label-width="120px">
  366. <span class="auditor"> {{ form.managerUserName }} </span>
  367. </el-form-item>
  368. </el-col>
  369. <el-col :span="6">
  370. <el-form-item label="日期:" label-width="120px">
  371. <span> {{ form.managerTime }} </span>
  372. </el-form-item>
  373. </el-col>
  374. </el-row>
  375. <el-form-item label="总经理(审批)">
  376. <el-input v-model="form.gmComment" type="textarea" :disabled="taskName != '总经理审批'" clearable
  377. :autosize="{ minRows: 4, maxRows: 10 }">
  378. </el-input>
  379. </el-form-item>
  380. <el-row>
  381. <el-col :span="6" :xs="24" :offset="12">
  382. <el-form-item label="签名:" label-width="120px">
  383. <span class="auditor"> {{ form.gmUserName }} </span>
  384. </el-form-item>
  385. </el-col>
  386. <el-col :span="6">
  387. <el-form-item label="日期:" label-width="120px">
  388. <span> {{ form.gmTime }} </span>
  389. </el-form-item>
  390. </el-col>
  391. </el-row>
  392. </div>
  393. </el-form>
  394. <div style="text-align: center" v-if="!disabled">
  395. <el-button type="warning" @click="preserve">保存</el-button>
  396. <el-button type="primary" @click="submitNextFlow">提交下一个流程</el-button>
  397. </div>
  398. </el-col>
  399. <el-col :span="5" :xs="24">
  400. <el-card>
  401. <h2 style="text-align: center">流程进度</h2>
  402. <div>
  403. <flow :flowData="flowData" />
  404. </div>
  405. </el-card>
  406. </el-col>
  407. </el-row>
  408. <el-drawer title="选择单价" :visible.sync="drawer" direction="rtl">
  409. <choose-price :row="clickWork" @getPrice="getPrice" @cancel="drawer = false"></choose-price>
  410. </el-drawer>
  411. </div>
  412. </template>
  413. <script>
  414. import flow from "@/views/flowable/task/todo/detail/flow";
  415. import { flowXmlAndNode } from "@/api/flowable/definition";
  416. import { parseTime } from "@/utils/ruoyi";
  417. import { listProject, getProject } from "@/api/oa/project/project";
  418. import { deepClone } from '@/utils'
  419. import { listSettle, getSettle, delSettle, addSettle, updateSettle } from "@/api/oa/settle/settle";
  420. import { listSettleSummary, getSettleSummary, addSettleSummary, delSettleSummary, updateSettleSummary } from "@/api/oa/settle/settleSummary";
  421. import { listSettleWork, getSettleWork, addSettleWork, updateSettleWork, delSettleWork } from "@/api/oa/settle/settleWork";
  422. import { listProjectContract, addProjectContract, } from "@/api/oa/contract/projectContract";
  423. import { getPrice } from "@/api/oa/price/price";
  424. import ChoosePrice from "./components/choosePrice.vue";
  425. import { getUser } from "@/api/system/user";
  426. import { complete, getNextFlowNode } from "@/api/flowable/todo";
  427. import { getUsersDeptLeader, getUsersDeptLeaderByDept, getUsersManageLeaderByDept } from '@/api/system/post.js'
  428. export default {
  429. components: {
  430. flow,
  431. ChoosePrice,
  432. },
  433. props: {
  434. taskName: {
  435. type: String,
  436. required: true,
  437. },
  438. taskForm: {
  439. type: Object,
  440. required: true,
  441. },
  442. disabled: {
  443. type: Boolean,
  444. default: false
  445. }
  446. },
  447. watch: {
  448. },
  449. data() {
  450. return {
  451. loading: true,
  452. drawer: false,
  453. flag: false,
  454. flowData: {},
  455. form: {},
  456. rules: {
  457. projectId: [
  458. { required: true, trigger: "change", message: "请选择项目编号" }]
  459. },
  460. projectList: [],
  461. isSelect: false,
  462. chooseProject: {},
  463. fileList: [],
  464. settleWorkList: [
  465. {
  466. content: "",
  467. priceId: "",
  468. scale: "无",
  469. unit: "",
  470. groundType: "0",
  471. price: "",
  472. workload: 0,
  473. coefficient: 1,
  474. settle: 0,
  475. remark: "",
  476. },
  477. ],
  478. oldSettleWorkList: [],
  479. settleSumTr: {
  480. content: "结算费用合计",
  481. amount: 0,
  482. remark: "",
  483. tableNumber: '2'
  484. },
  485. settleSumList: [
  486. {
  487. content: "",
  488. amount: 0,
  489. remark: "",
  490. tableNumber: '0'
  491. },
  492. ],
  493. deptSettleList: [
  494. {
  495. content: "",
  496. amount: 0,
  497. remark: "",
  498. tableNumber: '1'
  499. }
  500. ],
  501. oldSettleSumList: [],
  502. actualSumSettle: "",
  503. clickWork: {},
  504. deptId: undefined
  505. };
  506. },
  507. created() {
  508. this.getProjectList(); //获取项目列表
  509. this.getContractDataList(); //获取合同编码和编号
  510. this.initForm();
  511. if (this.$route.query.projectId) {
  512. }
  513. flowXmlAndNode({
  514. procInsId: this.taskForm.procInsId,
  515. deployId: this.taskForm.deployId,
  516. }).then(res => {
  517. this.flowData = res.data;
  518. });
  519. },
  520. mounted() { },
  521. methods: {
  522. initForm() {
  523. listSettle({ settleId: this.taskForm.formId }).then(res => {
  524. if (res.total == 1) {
  525. this.form = res.rows[0];
  526. this.flag = true;
  527. this.handleSelectProject(res.rows[0].projectId);
  528. this.listSettleWorkFn();
  529. this.listSettleSummaryFn();
  530. getUser(this.form.reporter).then(res => {
  531. if (res.data) {
  532. this.form.reporterName = res.data.nickName;
  533. this.deptId = res.data.deptId
  534. }
  535. })
  536. this.getCurrentUser();
  537. } else if (res.total == 0) {
  538. this.flag = false;
  539. if (this.taskName == "结算发起") {
  540. this.form.reporter = this.$store.state.user.id;
  541. this.form.reporterName = this.$store.state.user.name;
  542. this.form.reportTime = parseTime(new Date(), "{y}-{m}-{d}");
  543. }
  544. }
  545. setTimeout(() => {
  546. this.loading = false
  547. }, 500);
  548. });
  549. },
  550. getCurrentUser() {
  551. if (this.taskName == '综合事务部处理') {
  552. this.form.zhUserName = this.$store.state.user.name;
  553. this.form.zhUserId = this.$store.state.user.id;
  554. this.form.zhTime = parseTime(new Date(), "{y}-{m}-{d}");
  555. } else if (this.taskName == '技术质量部审核') {
  556. this.form.jsUserName = this.$store.state.user.name;
  557. this.form.jsUserId = this.$store.state.user.id;
  558. this.form.jsTime = parseTime(new Date(), "{y}-{m}-{d}");
  559. } else if (this.taskName == '项目管理部结算') {
  560. this.form.xmUserName = this.$store.state.user.name;
  561. this.form.xmUserId = this.$store.state.user.id;
  562. this.form.xmTime = parseTime(new Date(), "{y}-{m}-{d}");
  563. } else if (this.taskName == '结算发起人确认') {
  564. this.form.deptUserName = this.$store.state.user.name;
  565. this.form.deptUserId = this.$store.state.user.id;
  566. this.form.deptTime = parseTime(new Date(), "{y}-{m}-{d}");
  567. } else if (this.taskName == '经营发展部校核') {
  568. this.form.jyUserName = this.$store.state.user.name;
  569. this.form.jyUserId = this.$store.state.user.id;
  570. this.form.jyTime = parseTime(new Date(), "{y}-{m}-{d}");
  571. } else if (this.taskName == '分管审核') {
  572. this.form.managerUserName = this.$store.state.user.name;
  573. this.form.managerUserId = this.$store.state.user.id;
  574. this.form.managerTime = parseTime(new Date(), "{y}-{m}-{d}");
  575. } else if (this.taskName == '总经理审批') {
  576. this.form.gmUserName = this.$store.state.user.name;
  577. this.form.gmUserId = this.$store.state.user.id;
  578. this.form.gmTime = parseTime(new Date(), "{y}-{m}-{d}");
  579. }
  580. this.getReviewerName();
  581. },
  582. getReviewerName() {
  583. if (this.form.zhUserId) {
  584. getUser(this.form.zhUserId).then(res => {
  585. this.form.zhUserName = res.data.nickName;;
  586. })
  587. }
  588. if (this.form.jsUserId) {
  589. getUser(this.form.jsUserId).then(res => {
  590. this.form.jsUserName = res.data.nickName;;
  591. })
  592. }
  593. if (this.form.xmUserId) {
  594. getUser(this.form.xmUserId).then(res => {
  595. this.form.xmUserName = res.data.nickName;;
  596. })
  597. }
  598. if (this.form.deptUserId) {
  599. getUser(this.form.deptUserId).then(res => {
  600. this.form.deptUserName = res.data.nickName;;
  601. })
  602. }
  603. if (this.form.jyUserId) {
  604. getUser(this.form.jyUserId).then(res => {
  605. this.form.jyUserName = res.data.nickName;;
  606. })
  607. }
  608. if (this.form.managerUserId) {
  609. getUser(this.form.managerUserId).then(res => {
  610. this.form.managerUserName = res.data.nickName;;
  611. })
  612. }
  613. if (this.form.gmUserId) {
  614. getUser(this.form.gmUserId).then(res => {
  615. this.form.gmUserName = res.data.nickName;;
  616. })
  617. }
  618. },
  619. // 保存按钮
  620. preserve() {
  621. if (this.flag) {
  622. this.updateSettleFn();
  623. this.updateSettleSummaryFn();
  624. this.updateSettleWorkFn();
  625. } else {
  626. this.addSettleFn();
  627. }
  628. },
  629. submitNextFlow() {
  630. this.$refs["settleForm"].validate(vaild => {
  631. if (vaild) {
  632. this.preserve();
  633. if (this.taskName == '结算发起') {
  634. this.getNextFlowNodeFn(17);
  635. } else if (this.taskName == '综合事务部处理') {
  636. this.getNextFlowNodeFn(52);
  637. } else if (this.taskName == '技术质量部审核') {
  638. this.getNextFlowNodeFn(32);
  639. } else if (this.taskName == '项目管理部结算') {
  640. this.getNextFlowNodeFn();
  641. } else if (this.taskName == '结算发起人确认') {
  642. this.getNextFlowNodeFn(13);
  643. } else if (this.taskName == '经营发展部校核') {
  644. this.getNextFlowNodeFn(null, this.deptId);
  645. } else if (this.taskName == '分管审核') {
  646. this.getNextFlowNodeFn();
  647. } else if (this.taskName == '总经理审批') {
  648. this.getNextFlowNodeFn();
  649. }
  650. }
  651. })
  652. },
  653. getNextFlowNodeFn(userId, deptId) {
  654. const params = { taskId: this.taskForm.taskId };
  655. getNextFlowNode(params).then(res => {
  656. if (userId) {
  657. this.$set(this.taskForm.variables, "approval", userId);
  658. complete(this.taskForm).then(response => {
  659. this.$modal.msgSuccess(response.msg);
  660. this.$emit('goBack');
  661. });
  662. } else {
  663. if (deptId) {
  664. getUsersManageLeaderByDept({ deptId }).then(res => {
  665. let id = res.data.userId;
  666. this.$set(this.taskForm.variables, "approval", id);
  667. complete(this.taskForm).then(response => {
  668. this.$modal.msgSuccess(response.msg);
  669. this.$emit('goBack');
  670. });
  671. })
  672. } else {
  673. complete(this.taskForm).then(response => {
  674. this.$modal.msgSuccess(response.msg);
  675. this.$emit('goBack');
  676. });
  677. }
  678. }
  679. })
  680. },
  681. // 查询项目列表
  682. getProjectList() {
  683. listProject({
  684. pageNum: 1,
  685. pageSize: 99999999,
  686. }).then(response => {
  687. this.projectList = response.rows;
  688. });
  689. },
  690. // 选择项目
  691. handleSelectProject(val) {
  692. if (val != "" && val != undefined && val != null) {
  693. getProject(val).then(res => {
  694. this.chooseProject = res.data;
  695. this.isSelect = true;
  696. });
  697. } else {
  698. this.isSelect = false;
  699. }
  700. },
  701. isEmptyObject(obj) {
  702. for (var key in obj) {
  703. if (obj.hasOwnProperty(key)) {
  704. return false;
  705. }
  706. }
  707. return true;
  708. },
  709. getContractDataList() {
  710. listProjectContract({ projectId: this.taskForm.formId }).then(res => {
  711. if (res.rows) {
  712. for (let row of res.rows) {
  713. getContract(row.contractId).then(res => {
  714. if (res.data) {
  715. if (this.form.contractCode != "") {
  716. this.form.contractCode =
  717. this.form.contractCode + "、" + res.data.contractCode;
  718. } else {
  719. this.form.contractCode = res.data.contractCode;
  720. }
  721. if (this.form.contractNumber != "") {
  722. this.form.contractNumber =
  723. this.form.contractNumber + "、" + res.data.contractNumber;
  724. } else {
  725. this.form.contractNumber = res.data.contractNumber;
  726. }
  727. }
  728. });
  729. }
  730. }
  731. });
  732. },
  733. addWorkList() {
  734. this.settleWorkList.push({
  735. content: "",
  736. priceId: "",
  737. scale: "",
  738. unit: "",
  739. groundType: "0",
  740. price: "",
  741. workload: 0,
  742. coefficient: 1,
  743. settle: 0,
  744. remark: "",
  745. });
  746. },
  747. addSumWorkList() {
  748. this.settleSumList.push({
  749. content: "",
  750. amount: 0,
  751. remark: "",
  752. tableNumber: '0'
  753. });
  754. },
  755. addDeptSettleList() {
  756. this.deptSettleList.push({
  757. content: "",
  758. amount: 0,
  759. remark: "",
  760. tableNumber: '1'
  761. });
  762. },
  763. deletWorkItem(index, arr) {
  764. // let arr = this.settleWorkList;
  765. if (arr.length == 1) {
  766. return;
  767. }
  768. if (index >= 0 && index < arr.length) {
  769. arr.splice(index, 1);
  770. }
  771. },
  772. calculateSettle(work) {
  773. let sum = work.workload * work.coefficient * work.price;
  774. work.settle = Number(sum).toFixed(2);
  775. this.calculateSumSettle();
  776. this.calculateActualSumSettle();
  777. },
  778. calculateSumSettle() {
  779. let sum = 0;
  780. let arr = this.settleWorkList;
  781. for (let a of arr) {
  782. sum = sum + Number(a.settle);
  783. }
  784. this.settleSumTr.amount = sum.toFixed(2);
  785. },
  786. calculateActualSumSettle() {
  787. let sum = 0;
  788. let arr = this.settleSumList;
  789. for (let a of arr) {
  790. sum = sum + Number(a.amount);
  791. }
  792. this.actualSumSettle = Number(this.settleSumTr.amount) - sum;
  793. },
  794. calculateDeptAmount(index){
  795. debugger
  796. let num = 0
  797. let len = this.deptSettleList.length
  798. if (len > 1){
  799. if(index == len - 1){
  800. for(let i = 0; i< index ;i ++){
  801. num = num + this.deptSettleList[i].amount
  802. }
  803. this.deptSettleList[index].amount = this.actualSumSettle - num
  804. }
  805. }
  806. },
  807. handleChoosePrice(work, index) {
  808. this.clickWork = work;
  809. this.clickWork.index = index;
  810. this.drawer = true;
  811. },
  812. getPrice(val) {
  813. let index = this.clickWork.index;
  814. this.setValue(this.settleWorkList[index], "scale", val.scaleGrade);
  815. this.setValue(this.settleWorkList[index], "unit", val.unit);
  816. this.setValue(this.settleWorkList[index], "groundType", val.groundType);
  817. this.setValue(this.settleWorkList[index], "price", val.price);
  818. this.setValue(this.settleWorkList[index], "priceId", val.priceId);
  819. this.setValue(this.settleWorkList[index], "content", val.content);
  820. this.calculateSettle(this.settleWorkList[index]);
  821. this.drawer = false;
  822. },
  823. setValue(key, name, val) {
  824. this.$set(key, name, val);
  825. },
  826. // 增加数据
  827. addSettleFn() {
  828. let settleId = this.taskForm.formId;
  829. this.form.settleId = settleId;
  830. getSettle(this.taskForm.formId).then(res=>{
  831. if(res.data){
  832. updateSettle(this.form);
  833. this.addSettleWorkFn(settleId);
  834. this.addSettleSummaryFn(settleId);
  835. }else{
  836. addSettle(this.form).then(res => {
  837. this.addSettleWorkFn(settleId);
  838. this.addSettleSummaryFn(settleId);
  839. });
  840. }
  841. })
  842. },
  843. addSettleWorkFn(settleId) {
  844. for (let work of this.settleWorkList) {
  845. work.settleId = settleId;
  846. setTimeout(() => {
  847. addSettleWork(work);
  848. }, 500)
  849. }
  850. },
  851. addSettleSummaryFn(settleId) {
  852. this.settleSumTr.settleId = settleId
  853. addSettleSummary(this.settleSumTr);
  854. for (let item of this.settleSumList) {
  855. item.settleId = settleId;
  856. setTimeout(() => {
  857. addSettleSummary(item).then(res=>{
  858. console.log(item);
  859. });
  860. }, 1000)
  861. }
  862. for (let item of this.deptSettleList) {
  863. item.settleId = settleId;
  864. setTimeout(() => {
  865. addSettleSummary(item).then(res=>{
  866. console.log(item);
  867. });
  868. }, 1000)
  869. }
  870. },
  871. // 获取数据
  872. listSettleWorkFn() {
  873. listSettleWork({ settleId: this.taskForm.formId }).then(res => {
  874. this.settleWorkList = res.rows;
  875. for (let work of this.settleWorkList) {
  876. getPrice(work.priceId).then(res => {
  877. if (res.data) {
  878. this.setValue(work, "scale", res.data.scaleGrade);
  879. this.setValue(work, "unit", res.data.unit);
  880. if (work.groundType == "0") {
  881. work.price = res.data.commonPrice;
  882. } else {
  883. work.price = res.data.complexPrice;
  884. }
  885. }
  886. });
  887. }
  888. });
  889. },
  890. listSettleSummaryFn() {
  891. listSettleSummary({ settleId: this.taskForm.formId }).then(res => {
  892. this.oldSettleSumList = res.rows;
  893. for (let s of res.rows) {
  894. if (s.content == "结算费用合计") {
  895. this.settleSumTr = s;
  896. break;
  897. }
  898. }
  899. this.settleSumList = res.rows.filter(
  900. item => item.tableNumber == "0"
  901. );
  902. this.deptSettleList = res.rows.filter(
  903. item => item.tableNumber == "1"
  904. );
  905. this.calculateActualSumSettle();
  906. });
  907. },
  908. // 更新数据
  909. updateSettleFn() {
  910. updateSettle(this.form).then(res => {
  911. if (res.code == 200)
  912. this.$message.success('保存成功')
  913. })
  914. },
  915. updateSettleWorkFn() {
  916. delSettleWork([this.taskForm.formId]).then(res => {
  917. this.addSettleWorkFn(this.taskForm.formId);
  918. })
  919. },
  920. updateSettleSummaryFn() {
  921. delSettleSummary([this.taskForm.formId]).then(res => {
  922. this.addSettleSummaryFn(this.taskForm.formId)
  923. })
  924. },
  925. },
  926. };
  927. </script>
  928. <style lang="scss" scoped>
  929. @import "@/assets/styles/element-reset.scss";
  930. .headers {
  931. position: relative;
  932. font-weight: bold;
  933. font-size: 18px;
  934. padding-left: 40px;
  935. padding-bottom: 40px;
  936. .line {
  937. position: absolute;
  938. left: 22px;
  939. top: 5px;
  940. width: 5px;
  941. height: 14px;
  942. border-radius: 10px;
  943. background-color: #2893e5;
  944. }
  945. }
  946. table {
  947. /*边框*/
  948. /* border: 1px solid black; */
  949. text-align: center;
  950. border-collapse: collapse;
  951. /*设置背景颜色*/
  952. /* background-color: #bfa; */
  953. }
  954. h3 {
  955. font-family: '黑体';
  956. font-weight: bold;
  957. }
  958. </style>