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

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