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

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