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

subContract.vue 52KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-05-10 15:31:57
  4. * @LastEditors: wrh
  5. * @LastEditTime: 2025-12-16 11:06:33
  6. -->
  7. <template>
  8. <div class="app-container">
  9. <el-row :gutter="20">
  10. <el-col :span="flowDisabled ? 18 : 24" :xs="24">
  11. <h2 class="text-center">分包合同评审表</h2>
  12. <div class="mt20 mb20" v-if="showAlter && flowDisabled">
  13. <el-alert title="任务被退回,请修改后重新提交" type="error" :closable="false">
  14. <return-comment :taskForm="taskForm" @isReturn="isReturn"></return-comment>
  15. </el-alert>
  16. </div>
  17. <el-form ref="form" :model="form" :rules="rules" label-width="130px" :formDisabled="formDisabled">
  18. <el-divider></el-divider>
  19. <el-form-item label="分包合同名称" prop="subContractName">
  20. <el-input type="textarea" :rows="3" v-model="form.subContractName" placeholder="请输入分包合同名称"
  21. :disabled="taskName != '合同拟稿'" />
  22. </el-form-item>
  23. <el-form-item label="分包合同金额" prop="subAmount">
  24. <el-input-number :controls="false" v-model="form.subAmount" placeholder="请输入分包合同金额"
  25. :disabled="taskName != '合同拟稿'" />(元)
  26. </el-form-item>
  27. <el-form-item label="承接单位" prop="partnerId">
  28. <el-select allow-create v-model="form.partnerId" multiple filterable placeholder="请选择"
  29. :style="taskName == '合同拟稿' ? { width: '84%' } : { width: '100%' }" disabled clearable>
  30. <el-option v-for="item in partnerList" :key="item.value" :label="item.partnerName" :value="item.partnerId">
  31. </el-option>
  32. </el-select>
  33. <el-button type="primary" @click="partnerOpen = true" size="mini" v-if="taskName == '合同拟稿'">选择单位</el-button>
  34. </el-form-item>
  35. <el-form-item label="联系人" prop="contactPerson">
  36. <el-input v-model="form.contactPerson" placeholder="请输入联系人" :disabled="taskName != '合同拟稿'" />
  37. </el-form-item>
  38. <el-form-item label="联系电话" prop="telephone">
  39. <el-input v-model="form.telephone" placeholder="请输入联系电话" :disabled="taskName != '合同拟稿'" />
  40. </el-form-item>
  41. <el-form-item label="合同文件" prop="contractDocument">
  42. <FileUpload v-if="taskName == '合同拟稿' && !form.contractDocument" :disabled="taskName != '合同拟稿'"
  43. ref="contractFile" :limit="1" :filePathName="'分包合同/合同文件'"
  44. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getContractPath">
  45. </FileUpload>
  46. <div v-if="form.contractDocument">
  47. <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.contractDocument}`)">
  48. {{ getFileName(form.contractDocument) }}
  49. </el-link>
  50. <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.contractDocument}`"
  51. :underline="false" target="_blank">
  52. <span class="el-icon-download">下载文件</span>
  53. </el-link>
  54. <FileUpload v-if="taskName == '合同拟稿'" :limit="1" :filePathName="'分包合同/合同文件'"
  55. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getContractPath"></FileUpload>
  56. </div>
  57. </el-form-item>
  58. <el-form-item label="关联项目" prop="projectId">
  59. <el-button type="primary" size="mini" @click="open = true" v-if="taskName == '合同拟稿'">选择项目</el-button>
  60. <el-table :data="chooseProjectList" border>
  61. <el-table-column type="index" width="50" label="序号" />
  62. <el-table-column label="项目编号" align="center" key="projectNumber" prop="projectNumber" />
  63. <el-table-column label="项目名称" align="center" key="projectName" prop="projectName" />
  64. <el-table-column label="项目负责人" align="center" key="projectLeaderName" prop="projectLeaderUser.nickName" />
  65. <el-table-column label="承担部门" align="center" prop="undertakingDeptName"></el-table-column>
  66. <el-table-column label="操作" align="center">
  67. <template slot-scope="scope">
  68. <el-button type="text" icon="el-icon-view" @click="clickProjectFn(scope.row)">查看</el-button>
  69. </template>
  70. </el-table-column>
  71. </el-table>
  72. </el-form-item>
  73. <el-form-item label="关联主合同:">
  74. <el-button type="primary" size="mini" @click="contractOpen = true" icon="el-icon-plus"
  75. v-if="taskName == '合同拟稿'">新增关联主合同</el-button>
  76. <el-table v-loading="contractloading" :data="connectContractList" border>
  77. <el-table-column label="合同名称" align="center" prop="contractName" width="220px" />
  78. <el-table-column label="合同金额" align="center" prop="amount" />
  79. <el-table-column label="甲方单位" align="center" prop="partyA.partyAName" width="220px" />
  80. <el-table-column label="合同编码" align="center" prop="contractCode" />
  81. <el-table-column label="合同编号" align="center" prop="contractNumber" />
  82. <el-table-column label="操作" align="center">
  83. <template slot-scope="scope">
  84. <el-button type="text" icon="el-icon-view" @click="clickContractFn(scope.row)">查看</el-button>
  85. </template>
  86. </el-table-column>
  87. </el-table>
  88. </el-form-item>
  89. <el-divider></el-divider>
  90. <!-- 表1:合同计划工作量 -->
  91. <work-table ref="workTableRef" :contractId="taskForm.formId" :taskName="taskName"></work-table>
  92. <p class="mb20 mt20"></p>
  93. <!-- 表2:合同回款计划 -->
  94. <payment-table ref="paymentRef" :contractId="taskForm.formId" :amount="form.subAmount" :titles="'付款'"
  95. :taskName="taskName"></payment-table>
  96. <el-form-item label="合同备注" prop="remark">
  97. <el-input type="textarea" v-model="form.remark" :autosize="{ minRows: 4 }" placeholder="请输入合同备注"
  98. :disabled="taskName != '合同拟稿'" />
  99. </el-form-item>
  100. <el-row>
  101. <el-col :span="6" :xs="24" :offset="11">
  102. <el-form-item label="拟稿人:" label-width="120px">
  103. <span class="auditor"> {{ form.draftUser ? form.draftUser.nickName : draftUser }} </span>
  104. </el-form-item>
  105. </el-col>
  106. <el-col :span="6">
  107. <el-form-item label="日期:" label-width="120px">
  108. <!-- <span> {{ form.draftTime ? form.draftTime : draftTime }} </span> -->
  109. <el-date-picker v-model="form.draftTime" :disabled="taskName != '合同拟稿'" type="date"
  110. value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
  111. </el-form-item>
  112. </el-col>
  113. </el-row>
  114. <el-form-item label="评审方式" prop="commentType">
  115. <el-radio-group v-model="form.commentType" @change="changeCommentType" :disabled="taskName != '合同拟稿'">
  116. <el-radio :label="'0'">无须评审</el-radio>
  117. <el-radio :label="'1'">会议评审</el-radio>
  118. <el-radio :label="'2'">线上会审</el-radio>
  119. </el-radio-group>
  120. </el-form-item>
  121. <el-form-item label="线上会审:" v-if="commentOpen">
  122. <table border="1" style="width:100%;">
  123. <tr>
  124. <td style="width: 50px;">序号</td>
  125. <td>会审部门</td>
  126. <td>会审人</td>
  127. <td>会审意见</td>
  128. <td style="width: 200px;">会审附件</td>
  129. <td style="width: 90px;">签名</td>
  130. <td style="width: 100px;">日期</td>
  131. </tr>
  132. <tr v-for="(comment, index) in commentList" :key="index">
  133. <td>
  134. {{ index + 1 }}
  135. </td>
  136. <td>
  137. <el-select v-model="comment.deptId" clearable style="width:120px"
  138. :disabled="(index < 4 && taskName == '合同拟稿') || taskName != '合同拟稿'" @change="getDeptLeader">
  139. <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId">
  140. </el-option>
  141. </el-select>
  142. </td>
  143. <td>
  144. <el-select v-model="comment.userId" clearable style="width:120px"
  145. :disabled="(index < 4 && taskName == '合同拟稿') || taskName != '合同拟稿'">
  146. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  147. </el-option>
  148. </el-select>
  149. </td>
  150. <td>
  151. <el-input v-model="comment.comment" type="textarea" clearable :autosize="{ minRows: 2 }"
  152. :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)"></el-input>
  153. </td>
  154. <!-- 线上会审附件 -->
  155. <td @click="clickFile(comment)">
  156. <FileUpload v-if="comment.document == '' || comment.document == null" ref="hs" :limit="1"
  157. :filePathName="'分包合同/线上会审意见'" :isShowTip="false"
  158. :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)"
  159. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setCommentDocument">
  160. </FileUpload>
  161. <div v-if="comment.document != '' && comment.document != null">
  162. <transition-group class="upload-file-list el-upload-list el-upload-list--text"
  163. name="el-fade-in-linear" tag="ul">
  164. <li key="li01" class="el-upload-list__item ele-upload-list__item-content">
  165. <el-link :href="`${baseUrl}${'/profile/upload' + comment.document}`" :underline="false"
  166. target="_blank">
  167. <span class="el-icon-document" style="color:#0011ff;text-decoration: underline;">
  168. {{ getFileName(comment.document) }}
  169. </span>
  170. </el-link>
  171. <div class="ele-upload-list__item-content-action"
  172. v-if="taskName == '线上会审' && comment.userId == userId">
  173. <el-link :underline="false" @click="handleFileDelete(comment, 'document')"
  174. type="danger">删除</el-link>
  175. </div>
  176. </li>
  177. </transition-group>
  178. </div>
  179. </td>
  180. <td>
  181. <span class="auditor"> {{ comment.commentUser ? comment.commentUser.nickName : '' }} </span>
  182. </td>
  183. <td>
  184. <el-date-picker v-model="comment.commentTime"
  185. :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)" type="date"
  186. value-format="yyyy-MM-dd" style="width:140px;" placeholder="选择日期"></el-date-picker>
  187. </td>
  188. <td v-show="taskName == '合同拟稿'">
  189. <div class="delete-btn" @click="deletCommentItem(index)">
  190. <i class="el-icon-circle-close"></i>
  191. </div>
  192. </td>
  193. </tr>
  194. </table>
  195. <el-button icon="el-icon-plus" size="mini" @click="addCommentList()" type="primary" plain
  196. :disabled="taskName != '合同拟稿'"></el-button>
  197. </el-form-item>
  198. <el-form-item label="会议评审:" v-if="meetingOpen">
  199. <table border="1">
  200. <tr>
  201. <td>评审时间</td>
  202. <td>
  203. <el-date-picker clearable v-model="meetingForm.meetingTime" type="date" value-format="yyyy-MM-dd"
  204. placeholder="请选择评审日期" :disabled="taskName != '合同拟稿'">
  205. </el-date-picker>
  206. </td>
  207. <td>评审地点</td>
  208. <td>
  209. <el-select v-model="meetingForm.place" clearable style="width:120px" :disabled="taskName != '合同拟稿'">
  210. <el-option v-for="item in placeList" :key="item.id" :label="item.name" :value="item.id">
  211. </el-option>
  212. </el-select>
  213. </td>
  214. <td>评审主持人</td>
  215. <td>
  216. <el-select v-model="meetingForm.hostId" clearable style="width:120px" :disabled="taskName != '合同拟稿'">
  217. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  218. </el-option>
  219. </el-select>
  220. </td>
  221. </tr>
  222. <tr>
  223. <td>参与评审人员</td>
  224. <td colspan="5">
  225. <el-select v-model="meetingForm.users" multiple clearable style="width:600px"
  226. :disabled="taskName != '合同拟稿'">
  227. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  228. </el-option>
  229. </el-select>
  230. </td>
  231. </tr>
  232. <tr>
  233. <td>评审意见表</td>
  234. <td colspan="5" style="text-align:left;">
  235. <FileUpload v-if="meetingForm.document == null || meetingForm.document == ''" ref="contractFile"
  236. :limit="1" :filePathName="'分包合同/会议评审意见'" :disabled="taskName != '会议评审'"
  237. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getMeetingPath">
  238. </FileUpload>
  239. <div v-if="meetingForm.document != null && meetingForm.document != ''">
  240. <file-item :document="meetingForm.document"></file-item>
  241. </div>
  242. </td>
  243. </tr>
  244. <tr>
  245. <td>评审结论</td>
  246. <td colspan="5">
  247. <el-input type="textarea" v-model="meetingForm.conclusion" clearable
  248. :disabled="taskName != '会议评审'"></el-input>
  249. </td>
  250. </tr>
  251. <tr>
  252. <td colspan="2"></td>
  253. <td>主持人签名</td>
  254. <td>
  255. <span class="auditor"> {{ meetingForm.hostUser ? meetingForm.hostUser.nickName : hostUser }} </span>
  256. </td>
  257. <td>日期</td>
  258. <td>
  259. <span> {{ meetingForm.commentTime ? meetingForm.commentTime : commentTime }} </span>
  260. </td>
  261. </tr>
  262. </table>
  263. </el-form-item>
  264. <el-form-item label="分管审批意见" prop="remark">
  265. <el-input v-model="form.managerComment" type="textarea" :autosize="{ minRows: 4 }" placeholder="请输入分管审批意见"
  266. :disabled="taskName != '分管审核'" />
  267. </el-form-item>
  268. <el-row>
  269. <el-col :span="6" :xs="24" :offset="11">
  270. <el-form-item label="签名:" label-width="120px">
  271. <span class="auditor"> {{ form.managerUser ? form.managerUser.nickName : managerUser }} </span>
  272. </el-form-item>
  273. </el-col>
  274. <el-col :span="6">
  275. <el-form-item label="日期:" label-width="120px">
  276. <!-- <span> {{ form.managerTime ? form.managerTime : managerTime }} </span> -->
  277. <el-date-picker v-model="form.managerTime" :disabled="taskName != '分管审核'" type="date"
  278. value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
  279. </el-form-item>
  280. </el-col>
  281. </el-row>
  282. <el-form-item label="总经理审批意见" prop="gmComment">
  283. <el-input v-model="form.gmComment" type="textarea" :autosize="{ minRows: 4 }" placeholder="请输入总经理审批意见"
  284. :disabled="taskName != '总经理审核'" />
  285. </el-form-item>
  286. <el-row>
  287. <el-col :span="6" :xs="24" :offset="11">
  288. <el-form-item label="签名:" label-width="120px">
  289. <span class="auditor"> {{ form.gmUser ? form.gmUser.nickName : gmUser }} </span>
  290. </el-form-item>
  291. </el-col>
  292. <el-col :span="6">
  293. <el-form-item label="日期:" label-width="120px">
  294. <!-- <span> {{ form.gmTime ? form.gmTime : gmTime }} </span> -->
  295. <el-date-picker v-model="form.gmTime" :disabled="taskName != '总经理审核'" type="date"
  296. value-format="yyyy-MM-dd" placeholder="选择日期"></el-date-picker>
  297. </el-form-item>
  298. </el-col>
  299. </el-row>
  300. <el-divider></el-divider>
  301. <el-form-item label="签订日期" prop="signDate">
  302. <el-date-picker clearable v-model="form.signDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择签订日期"
  303. :disabled="taskName != '合同签订'">
  304. </el-date-picker>
  305. </el-form-item>
  306. <el-form-item label="签订备注" prop="signRemark">
  307. <el-input v-model="form.signRemark" type="textarea" placeholder="请输入签订备注" :disabled="taskName != '合同签订'" />
  308. </el-form-item>
  309. <el-form-item label="签订扫描件" prop="signScan">
  310. <FileUpload :disabled="taskName != '合同签订'" v-if="form.signScan == null || form.signScan == ''" :limit="1"
  311. :filePathName="'分包合同文件'" :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']"
  312. @input="getSignScanPath">
  313. </FileUpload>
  314. <div v-if="form.signScan && taskName != '合同签订'">
  315. <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.signScan}`)">
  316. {{ getFileName(form.signScan) }}
  317. </el-link>
  318. <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.signScan}`"
  319. :underline="false" target="_blank">
  320. <span class="el-icon-download">下载文件</span>
  321. </el-link>
  322. </div>
  323. </el-form-item>
  324. </el-form>
  325. <div style="text-align: center;" v-if="flowDisabled">
  326. <el-button type="warning" @click="saves()" :disabled="formDisabled" v-if="taskName == '合同拟稿'">保 存</el-button>
  327. <el-button type="danger" @click="returnOpen = true" :disabled="formDisabled"
  328. v-if="taskName == '分管审核' || taskName == '总经理审核'">退
  329. 回</el-button>
  330. <el-button type="primary" @click="submitForm" :disabled="formDisabled">提 交</el-button>
  331. </div>
  332. </el-col>
  333. <el-col :span="6" :xs="24" v-if="flowDisabled">
  334. <el-card>
  335. <h2 style="text-align: center;">流程进度</h2>
  336. <div>
  337. <flow :flowData="flowData" />
  338. </div>
  339. </el-card>
  340. </el-col>
  341. </el-row>
  342. <el-dialog title="选择项目" :visible.sync="open" width="70%" append-to-body>
  343. <project-choose @chooseProject="confirmProject"></project-choose>
  344. </el-dialog>
  345. <el-dialog title="选择合作单位" :visible.sync="partnerOpen" width="70%" append-to-body>
  346. <choose-partner @confirm="confirmPartners"></choose-partner>
  347. </el-dialog>
  348. <el-dialog title="选择承接合同" :visible.sync="contractOpen" width="70%" append-to-body>
  349. <choose-contract @choose="confirmContract"></choose-contract>
  350. </el-dialog>
  351. <el-drawer :visible.sync="drawerOpen" title="" :size="'70%'" append-to-body>
  352. <projectInfo :needReturn="false"></projectInfo>
  353. </el-drawer>
  354. <el-drawer :visible.sync="formOpen" title="" :size="'55%'" append-to-body>
  355. <contract-form :taskForm="contractId" :taskName="''" :formDisabled="true" :flowDisabled="false"></contract-form>
  356. </el-drawer>
  357. <el-dialog title="退回" :visible.sync="returnOpen" width="40%" append-to-body>
  358. <return-btn :taskForm="taskForm" :comment="taskName == '分管审核' ? form.managerComment : form.gmComment"
  359. @goBack="$emit('goBack')" @saves="" @cancel="returnOpen = false"></return-btn>
  360. </el-dialog>
  361. </div>
  362. </template>
  363. <script>
  364. import { parseTime } from "@/utils/ruoyi";
  365. import { listProject, getProject } from "@/api/oa/project/project";
  366. import { listDept } from '@/api/system/dept'
  367. import { listUser } from '@/api/system/user'
  368. import { listPartner, getPartner } from "@/api/oa/partner/partner";
  369. import { listContractWork, addContractWork, delContractWork } from "@/api/oa/contract/contractWork";
  370. import { listContractPayment, addContractPayment, delContractPayment } from "@/api/oa/contract/contractPayment";
  371. import { listContractComment, addContractComment, updateContractComment, delContractComment } from "@/api/oa/contract/contractComment";
  372. import { getContractMeeting, addContractMeeting, updateContractMeeting, delContractMeeting } from "@/api/oa/contract/contractMeeting";
  373. import { listProjectContract } from "@/api/oa/contract/projectContract";
  374. import { getContract } from "@/api/oa/contract/contract";
  375. import { listSubContract, getSubContract, delSubContract, addSubContract, updateSubContract } from "@/api/oa/contract/subContract";
  376. import { listContractSubcontract, delContractSubcontract, addContractSubcontract } from "@/api/oa/contract/contractSubcontract"
  377. import { listProjectSubcontract, addProjectSubcontract, delProjectSubcontract } from '@/api/oa/contract/projectSubcontract'
  378. import { getUsersDeptLeader, getUsersManageLeader, getUsersDeptLeaderByDept, getUsersManageLeaderByDept, getUserByPost } from '@/api/system/post.js'
  379. import flow from '@/views/flowable/task/todo/detail/flow'
  380. import { flowXmlAndNode } from "@/api/flowable/definition";
  381. import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
  382. import { mapGetters } from "vuex";
  383. import projectInfo from '@/views/oa/project/info'
  384. import FileItem from './fileItem.vue';
  385. import workTable from './components/workTable.vue';
  386. import paymentTable from './components/paymentTable.vue';
  387. import projectChoose from '../components/chooseProject.vue';
  388. import ChoosePartner from '../components/choosePartner.vue';
  389. import ChooseContract from '@/views/flowable/form/components/chooseContract.vue';
  390. import contractForm from '@/views/flowable/form/business/contractForm.vue';
  391. import ReturnBtn from '@/views/flowable/form/components/flowBtn/returnBtn.vue';
  392. import ReturnComment from '@/views/flowable/form/components/flowBtn/returnComment.vue';
  393. export default {
  394. dicts: ['cmc_scale_grade', 'cmc_unit'],
  395. components: {
  396. flow,
  397. projectChoose,
  398. ChooseContract,
  399. FileItem,
  400. ChoosePartner,
  401. workTable,
  402. paymentTable,
  403. contractForm,
  404. projectInfo,
  405. ReturnComment,
  406. ReturnBtn
  407. },
  408. props: {
  409. taskName: {
  410. type: String,
  411. required: true
  412. },
  413. taskForm: {
  414. type: Object,
  415. required: true
  416. },
  417. formDisabled: {
  418. type: Boolean,
  419. default: false
  420. },
  421. flowDisabled: {
  422. type: Boolean,
  423. default: true
  424. }
  425. },
  426. computed: {
  427. ...mapGetters(["userId"]),
  428. },
  429. name: "SubContract",
  430. watch: {
  431. 'taskForm.formId'() {
  432. this.chooseProjectList = []
  433. this.initRules();
  434. this.initForm();
  435. }
  436. },
  437. data() {
  438. return {
  439. baseUrl: process.env.VUE_APP_BASE_API,
  440. draftUser: '',
  441. draftTime: undefined,
  442. managerUser: '',
  443. managerTime: undefined,
  444. gmUser: '',
  445. gmTime: undefined,
  446. hostUser: '',
  447. commentTime: undefined,
  448. // 遮罩层
  449. loading: true,
  450. // 选中数组
  451. ids: [],
  452. // 非单个禁用
  453. single: true,
  454. // 非多个禁用
  455. multiple: true,
  456. // 显示搜索条件
  457. showSearch: true,
  458. // 总条数
  459. total: 0,
  460. // cmc分包合同评审表格数据
  461. subContractList: [],
  462. // 弹出层标题
  463. title: "",
  464. // 是否显示弹出层
  465. open: false,
  466. partnerOpen: false,
  467. // 查询参数
  468. queryParams: {
  469. pageNum: 1,
  470. pageSize: 10,
  471. contractId: null,
  472. subContractName: null,
  473. subAmount: null,
  474. partnerId: null,
  475. contactPerson: null,
  476. drafter: null,
  477. draftTime: null,
  478. signDate: null,
  479. signRemark: null,
  480. signScan: null,
  481. commentType: null
  482. },
  483. // 表单参数
  484. form: {},
  485. meetingForm: {
  486. users: [],
  487. },
  488. // 表单校验
  489. rules: {},
  490. meetingOpen: false,
  491. commentOpen: false,
  492. projectList: [],
  493. partnerList: [],
  494. chooseProject: {},
  495. chooseProjectList: [],
  496. chooseContract: {
  497. contractCode: [],
  498. contractNumber: [],
  499. amount: []
  500. },
  501. contractCode: '',
  502. contractNumber: '',
  503. amount: '',
  504. deptList: [],
  505. userList: [],
  506. users: undefined,
  507. workList: [],
  508. paymentList: [],
  509. placeList: [{ id: '0', name: '301会议室' }, { id: '1', name: '216会议室' }],
  510. commentList: [
  511. {
  512. deptId: 105,
  513. userId: '',
  514. comment: '',
  515. document: '',
  516. commentTime: undefined
  517. },
  518. {
  519. deptId: 106,
  520. userId: '',
  521. comment: '',
  522. document: '',
  523. commentTime: undefined
  524. },
  525. // {
  526. // deptId: 107,
  527. // userId: '',
  528. // comment: '',
  529. // document: '',
  530. // commentTime: undefined
  531. // },
  532. {
  533. deptId: 109,
  534. userId: '',
  535. comment: '',
  536. document: '',
  537. commentTime: undefined
  538. },
  539. {
  540. deptId: 109,
  541. userId: '',
  542. comment: '',
  543. document: '',
  544. commentTime: undefined
  545. },
  546. ],
  547. isSelect: false,
  548. formTotal: 0,
  549. flowData: {},
  550. clickTd: {},
  551. contractOpen: false,
  552. connectContractList: [],
  553. contractloading: true,
  554. formOpen: false,
  555. contractId: {
  556. formId: ''
  557. },
  558. drawerOpen: false,
  559. showAlter: true,
  560. returnOpen: false,
  561. };
  562. },
  563. created() {
  564. if (this.taskName == '合同拟稿') {
  565. this.draftUser = this.$store.getters.name;
  566. this.draftTime = parseTime(new Date(), '{y}-{m}-{d}')
  567. }
  568. else if (this.taskName == '会议评审') {
  569. this.hostUser = this.$store.getters.name;
  570. this.commentTime = parseTime(new Date(), '{y}-{m}-{d}')
  571. }
  572. else if (this.taskName == '分管审核') {
  573. this.managerUser = this.$store.getters.name;
  574. this.form.managerUserId = this.$store.getters.userId;
  575. this.managerTime = parseTime(new Date(), '{y}-{m}-{d}')
  576. }
  577. else if (this.taskName == '总经理审核') {
  578. this.gmUser = this.$store.getters.name;
  579. this.form.gmUserId = this.$store.getters.userId;
  580. this.gmTime = parseTime(new Date(), '{y}-{m}-{d}')
  581. }
  582. this.getProjectList();
  583. this.getPartnerList();
  584. this.getDeptList();
  585. this.getUserList();
  586. this.getList();
  587. if (this.flowDisabled)
  588. flowXmlAndNode({ procInsId: this.taskForm.procInsId, deployId: this.taskForm.deployId }).then(res => {
  589. this.flowData = res.data;
  590. })
  591. },
  592. mounted() {
  593. this.initRules();
  594. this.initForm();
  595. },
  596. methods: {
  597. initRules() {
  598. if (this.taskName == '合同拟稿') {
  599. this.rules = {
  600. partnerId: [
  601. { required: true, message: '请选择承接单位', trigger: 'change' },
  602. ],
  603. subContractName: [
  604. { required: true, message: '请输入分包合同名称', trigger: 'blur' },
  605. ],
  606. subAmount: [
  607. { required: true, message: '请输入分包合同额', trigger: 'blur' },
  608. ],
  609. commentType: [
  610. { required: true, message: '请选择评审方式', trigger: 'change' },
  611. ],
  612. }
  613. } else if (this.taskName == '分管审核') {
  614. this.rules = {
  615. managerComment: [
  616. { required: true, message: '请输入分管审批意见', trigger: 'blur' }
  617. ]
  618. }
  619. }
  620. },
  621. initForm() {
  622. getSubContract(this.taskForm.formId).then(res => {
  623. this.getContractSubcontractList();
  624. if (this.isEmptyObject(res.data)) {
  625. this.formTotal = 0;
  626. this.form.drafter = this.$store.getters.userId;
  627. // this.form.draftTime = parseTime(new Date(), '{y}-{m}-{d}');
  628. }
  629. else {
  630. this.formTotal = 1;
  631. this.form = res.data;
  632. this.form.partnerId = this.form.partnerId ? this.form.partnerId.split(',') : null;
  633. if (this.form.commentType == '0') {
  634. this.commentOpen = false;
  635. this.meetingOpen = false;
  636. }
  637. else if (this.form.commentType == '1') {
  638. this.commentOpen = false;
  639. this.meetingOpen = true;
  640. }
  641. else if (this.form.commentType == '2') {
  642. this.commentOpen = true;
  643. this.meetingOpen = false;
  644. }
  645. listProjectSubcontract({ subContractId: res.data.subContractId }).then(res => {
  646. if (res.rows) {
  647. res.rows.forEach(project => {
  648. getProject(project.projectId).then(res => {
  649. if (res.data) {
  650. this.chooseProjectList.push(res.data);
  651. this.confirmProject(this.chooseProjectList)
  652. }
  653. })
  654. })
  655. }
  656. })
  657. listContractComment({ contractId: this.taskForm.formId }).then(res => {
  658. if (res.rows && res.rows.length != 0) {
  659. this.commentList = res.rows;
  660. for (let comment of this.commentList) {
  661. if (comment.commentTime == undefined) {
  662. if (comment.userId != this.$store.getters.userId) {
  663. comment.commentUser = undefined;
  664. }
  665. else {
  666. comment.commentTime = parseTime(new Date(), '{y}-{m}-{d}');
  667. }
  668. }
  669. }
  670. }
  671. else {
  672. this.commentList = [
  673. {
  674. deptId: 105,
  675. userId: '',
  676. comment: '',
  677. document: '',
  678. commentTime: undefined
  679. },
  680. {
  681. deptId: 106,
  682. userId: '',
  683. comment: '',
  684. document: '',
  685. commentTime: undefined
  686. },
  687. // {
  688. // deptId: 107,
  689. // userId: '',
  690. // comment: '',
  691. // document: '',
  692. // commentTime: undefined
  693. // },
  694. {
  695. deptId: 109,
  696. userId: '',
  697. comment: '',
  698. document: '',
  699. commentTime: undefined
  700. },
  701. {
  702. deptId: 109,
  703. userId: '',
  704. comment: '',
  705. document: '',
  706. commentTime: undefined
  707. },
  708. ]
  709. let num = 0;
  710. for (let comment of this.commentList) {
  711. num = num + 1;
  712. if (num <= 3) {
  713. getUsersDeptLeaderByDept({ deptId: comment.deptId }).then(res => {
  714. comment.userId = res.data.userId;
  715. })
  716. }
  717. else {
  718. getUserByPost({ postName: '专职安全员' }).then(res => {
  719. comment.userId = res.data[0].userId;
  720. })
  721. }
  722. }
  723. }
  724. });
  725. getContractMeeting(this.taskForm.formId).then(res => {
  726. if (res.data) {
  727. let data = res.data;
  728. if (res.data.users == null || res.data.users == undefined || res.data.users == "") {
  729. data.users = []
  730. } else {
  731. data.users = data.users.split(',');
  732. let arr = []
  733. for (let d of data.users) {
  734. arr.push(parseInt(d))
  735. }
  736. data.users = arr;
  737. }
  738. this.meetingForm = data;
  739. }
  740. });
  741. }
  742. })
  743. },
  744. /** 查询cmc分包合同评审列表 */
  745. getList() {
  746. this.loading = true;
  747. listSubContract(this.queryParams).then(response => {
  748. this.subContractList = response.rows;
  749. this.total = response.total;
  750. this.loading = false;
  751. });
  752. },
  753. // 获取关联承接合同
  754. getContractSubcontractList() {
  755. this.contractloading = true;
  756. const subContractId = this.taskForm.formId;
  757. listContractSubcontract({ subContractId: subContractId }).then(async res => {
  758. let list = []
  759. for (let r of res.rows) {
  760. let obj = await getContract(r.contractId)
  761. list.push(obj.data)
  762. }
  763. this.connectContractList = list
  764. this.contractloading = false;
  765. })
  766. },
  767. // 查询承接单位列表
  768. getPartnerList() {
  769. this.loading = true
  770. listPartner({
  771. pageNum: 1,
  772. pageSize: 99999999
  773. }).then(response => {
  774. this.partnerList = response.rows;
  775. })
  776. },
  777. // 查询项目列表
  778. getProjectList() {
  779. this.loading = true
  780. listProject({
  781. pageNum: 1,
  782. pageSize: 99999999
  783. }).then(response => {
  784. this.projectList = response.rows;
  785. })
  786. },
  787. getUserList() {
  788. listUser({ pageSize: 9999, pageNum: 1 }).then(res => {
  789. this.userList = res.rows
  790. })
  791. },
  792. getDeptList() {
  793. listDept({ pageSize: 9999, pageNum: 1 }).then(res => {
  794. this.deptList = res.data
  795. })
  796. },
  797. isEmptyObject(obj) {
  798. for (var key in obj) {
  799. if (obj.hasOwnProperty(key)) {
  800. return false;
  801. }
  802. }
  803. return true;
  804. },
  805. addCommentList() {
  806. this.commentList.push({
  807. deptId: "",
  808. userId: "",
  809. comment: "",
  810. document: "",
  811. commentTime: undefined,
  812. });
  813. },
  814. deletCommentItem(index) {
  815. let arr = this.commentList;
  816. if (arr.length == 1) {
  817. return;
  818. }
  819. if (index >= 0 && index < arr.length) {
  820. arr.splice(index, 1);
  821. }
  822. },
  823. changeCommentType(val) {
  824. if (val == '0') {
  825. this.commentOpen = false;
  826. this.meetingOpen = false;
  827. }
  828. else if (val == '1') {
  829. this.commentOpen = false;
  830. this.meetingOpen = true;
  831. }
  832. else if (val == '2') {
  833. this.commentOpen = true;
  834. this.meetingOpen = false;
  835. let num = 0;
  836. for (let comment of this.commentList) {
  837. num = num + 1;
  838. if (num <= 3) {
  839. getUsersDeptLeaderByDept({ deptId: comment.deptId }).then(res => {
  840. comment.userId = res.data.userId;
  841. })
  842. }
  843. else {
  844. getUserByPost({ postName: '专职安全员' }).then(res => {
  845. comment.userId = res.data[0].userId;
  846. })
  847. }
  848. }
  849. }
  850. },
  851. getDeptLeader(val) {
  852. getUsersDeptLeaderByDept({ deptId: Number(val) }).then(res => {
  853. for (let comment of this.commentList) {
  854. if (comment.deptId == val)
  855. comment.userId = res.data.userId;
  856. }
  857. })
  858. },
  859. validateDocument(doc) {
  860. // 这里添加你的验证逻辑
  861. // 例如,检查tenderId是否为空或者是否符合其他规则
  862. if (!doc || doc.trim() === '') {
  863. this.$message.error('请上传合同文件');
  864. return false;
  865. }
  866. return true;
  867. },
  868. // 保存信息
  869. async saves() {
  870. this.workList = this.$refs.workTableRef.workList;
  871. this.paymentList = this.$refs.paymentRef.paymentList;
  872. if (this.formTotal != 0) {
  873. if (this.form.partnerId && this.form.partnerId instanceof Array)
  874. this.form.partnerId = this.form.partnerId.join(',')
  875. updateSubContract(this.form).then(response => {
  876. this.$modal.msgSuccess("表单修改成功");
  877. this.open = false;
  878. this.getList();
  879. this.updateChooseProjectList()
  880. });
  881. } else {
  882. this.form.subContractId = this.taskForm.formId;
  883. if (this.form.partnerId && this.form.partnerId.length)
  884. this.form.partnerId = this.form.partnerId.join(',')
  885. addSubContract(this.form).then(response => {
  886. this.$modal.msgSuccess("表单新增成功");
  887. this.open = false;
  888. this.getList();
  889. this.formTotal = 1;
  890. });
  891. const subContractId = this.form.subContractId;
  892. this.chooseProjectList.forEach(item => {
  893. addProjectSubcontract({ subContractId: subContractId, projectId: item.projectId })
  894. })
  895. this.connectContractList.forEach(item => {
  896. addContractSubcontract({ subContractId: subContractId, contractId: item.contractId })
  897. })
  898. for (let work of this.workList) {
  899. work.contractId = subContractId;
  900. await addContractWork(work);
  901. }
  902. for (let payment of this.paymentList) {
  903. payment.contractId = subContractId;
  904. await addContractPayment(payment);
  905. }
  906. const params = { taskId: this.taskForm.taskId };
  907. getNextFlowNode(params).then(res => {
  908. this.contractDraftSubmit(handleComplete)
  909. })
  910. }
  911. },
  912. /** 提交按钮 */
  913. submitForm() {
  914. this.workList = this.$refs.workTableRef.workList;
  915. this.paymentList = this.$refs.paymentRef.paymentList;
  916. // let isProjectValid = this.validateManual(this.chooseProjectList);
  917. let isDocValid = this.validateDocument(this.form.contractDocument)
  918. if (!isDocValid) {
  919. // 无效,阻止提交
  920. return;
  921. }
  922. this.$refs["form"].validate(valid => {
  923. if (valid) {
  924. const handleComplete = (taskForm) => {
  925. complete(taskForm).then(response => {
  926. this.$modal.msgSuccess(response.msg);
  927. this.$emit('goBack');
  928. })
  929. };
  930. if (this.formTotal != 0) {
  931. if (this.form.partnerId)
  932. this.form.partnerId = this.form.partnerId.join(',')
  933. if (this.taskName == '分管审核') {
  934. this.form.managerUserId = this.$store.getters.userId;
  935. }
  936. else if (this.taskName == '总经理审核') {
  937. this.form.gmUserId = this.$store.getters.userId;
  938. }
  939. updateSubContract(this.form).then(response => {
  940. this.$modal.msgSuccess("表单修改成功");
  941. this.open = false;
  942. this.getList();
  943. this.updateChooseProjectList()
  944. });
  945. const params = { taskId: this.taskForm.taskId };
  946. getNextFlowNode(params).then(res => {
  947. if (this.taskName == '分管审核') {
  948. getUserByPost({ postName: '总经理' }).then(res => {
  949. this.$set(this.taskForm.variables, "approval", res.data[0].userId);
  950. handleComplete(this.taskForm);
  951. })
  952. }
  953. else if (this.taskName == '合同拟稿') {
  954. this.contractDraftSubmit(handleComplete)
  955. }
  956. else if (this.taskName == '线上会审') {
  957. for (let comment of this.commentList) {
  958. updateContractComment(comment);
  959. }
  960. getUsersManageLeader({ userId: this.form.drafter }).then(res => {
  961. let userIdList = [];
  962. userIdList.push(res.data[0].userId)
  963. this.$set(this.taskForm.variables, "approvalList", userIdList);
  964. handleComplete(this.taskForm);
  965. })
  966. }
  967. else if (this.taskName == '会议评审') {
  968. this.meetingForm.contractId = this.form.subContractId;
  969. let formData = new FormData();
  970. let jsonForm = JSON.stringify(this.meetingForm);
  971. formData.append("form", jsonForm);
  972. updateContractMeeting(formData);
  973. getUsersManageLeader({ userId: this.form.drafter }).then(res => {
  974. let userIdList = [];
  975. userIdList.push(res.data[0].userId)
  976. this.$set(this.taskForm.variables, "approvalList", userIdList);
  977. handleComplete(this.taskForm);
  978. })
  979. }
  980. else if (this.taskName == '总经理审核') {
  981. handleComplete(this.taskForm);
  982. }
  983. else if (this.taskName == '合同签订') {
  984. this.$modal.confirm('最后一个节点,提交将结束流程,是否提交?').then(() => {
  985. handleComplete(this.taskForm);
  986. })
  987. }
  988. })
  989. } else {
  990. this.form.subContractId = this.taskForm.formId;
  991. if (this.form.partnerId)
  992. this.form.partnerId = this.form.partnerId.join(',')
  993. addSubContract(this.form).then(response => {
  994. this.$modal.msgSuccess("新增成功");
  995. this.open = false;
  996. this.getList();
  997. });
  998. const subContractId = this.form.subContractId;
  999. this.chooseProjectList.forEach(item => {
  1000. addProjectSubcontract({ subContractId: subContractId, projectId: item.projectId })
  1001. })
  1002. this.connectContractList.forEach(item => {
  1003. addContractSubcontract({ subContractId: subContractId, contractId: item.contractId })
  1004. })
  1005. for (let work of this.workList) {
  1006. work.contractId = subContractId;
  1007. addContractWork(work);
  1008. }
  1009. for (let payment of this.paymentList) {
  1010. payment.contractId = subContractId;
  1011. addContractPayment(payment);
  1012. }
  1013. const params = { taskId: this.taskForm.taskId };
  1014. getNextFlowNode(params).then(res => {
  1015. this.contractDraftSubmit(handleComplete)
  1016. })
  1017. }
  1018. } else {
  1019. this.$message.error('必填项未填写完毕')
  1020. }
  1021. });
  1022. },
  1023. // 合同拟稿提交事件
  1024. contractDraftSubmit(handleComplete) {
  1025. if (this.commentOpen == false && this.meetingOpen == false) {
  1026. getUsersManageLeaderByDept({ deptId: 105 }).then(res => {
  1027. let userIdList = [];
  1028. userIdList.push(res.data[0].userId)
  1029. this.$set(this.taskForm.variables, "approvalList", userIdList);
  1030. this.$set(this.taskForm.variables, "commentType", '0');
  1031. handleComplete(this.taskForm);
  1032. })
  1033. }
  1034. else if (this.commentOpen == true && this.meetingOpen == false) {
  1035. let approvalList = [];
  1036. for (let comment of this.commentList) {
  1037. comment.contractId = this.form.subContractId
  1038. if (!this.showAlter) {
  1039. if (comment.commentId) {
  1040. updateContractComment(comment)
  1041. } else {
  1042. addContractComment(comment)
  1043. }
  1044. }
  1045. approvalList.push(comment.userId)
  1046. }
  1047. this.$set(this.taskForm.variables, "approvalList", approvalList);
  1048. this.$set(this.taskForm.variables, "commentType", '2');
  1049. handleComplete(this.taskForm);
  1050. }
  1051. else if (this.commentOpen == false && this.meetingOpen == true) {
  1052. this.meetingForm.contractId = this.form.subContractId;
  1053. let formData = new FormData();
  1054. let jsonForm = JSON.stringify(this.meetingForm);
  1055. formData.append("form", jsonForm);
  1056. addContractMeeting(formData);
  1057. this.$set(this.taskForm.variables, "approval", this.meetingForm.hostId);
  1058. this.$set(this.taskForm.variables, "commentType", '1');
  1059. handleComplete(this.taskForm);
  1060. }
  1061. },
  1062. async updateChooseProjectList() {
  1063. this.workList = this.$refs.workTableRef.workList;
  1064. this.paymentList = this.$refs.paymentRef.paymentList;
  1065. const subContractId = this.taskForm.formId;
  1066. try {
  1067. // 删除项目分包合同
  1068. await delProjectSubcontract(subContractId);
  1069. // 添加新的项目分包合同
  1070. for (let item of this.chooseProjectList) {
  1071. await addProjectSubcontract({ subContractId: subContractId, projectId: item.projectId });
  1072. }
  1073. // 删除承接分包合同
  1074. await delContractSubcontract(subContractId);
  1075. // 添加新的承接分包合同
  1076. for (let item of this.connectContractList) {
  1077. await addContractSubcontract({ subContractId: subContractId, contractId: item.contractId });
  1078. }
  1079. // 删除合同工作
  1080. await delContractWork(subContractId);
  1081. // 添加新的合同工作
  1082. for (let work of this.workList) {
  1083. work.contractId = subContractId;
  1084. await addContractWork(work);
  1085. }
  1086. // 删除合同付款
  1087. await delContractPayment(subContractId);
  1088. // 添加新的合同付款
  1089. for (let payment of this.paymentList) {
  1090. payment.contractId = subContractId;
  1091. await addContractPayment(payment);
  1092. }
  1093. this.$modal.msgSuccess("更新成功");
  1094. } catch (error) {
  1095. console.error("更新选择项目列表时出错:", error);
  1096. this.$modal.msgError("更新失败");
  1097. }
  1098. },
  1099. // 确定合作单位
  1100. confirmPartners(val) {
  1101. this.partnerOpen = false
  1102. if (val) {
  1103. let ids = []
  1104. let contactPerson = []
  1105. let telephone = []
  1106. val.map(item => {
  1107. ids.push(item.partnerId)
  1108. if (item.contactPerson)
  1109. contactPerson.push(item.contactPerson)
  1110. if (item.telephone)
  1111. telephone.push(item.telephone)
  1112. })
  1113. this.$set(this.form, 'contactPerson', contactPerson.join(','));
  1114. this.$set(this.form, 'telephone', telephone.join(','));
  1115. this.form.partnerId = ids
  1116. }
  1117. },
  1118. confirmProject(val) {
  1119. this.open = false
  1120. if (val) {
  1121. this.chooseProjectList = val;
  1122. this.isSelect = true
  1123. val.map(item => {
  1124. this.fetchContracts(item.projectId)
  1125. .then(contractData => {
  1126. let [contractCode, contractNumber, amount] = this.processContractData(contractData);
  1127. this.$set(item, 'contractCode', contractCode)
  1128. this.$set(item, 'contractNumber', contractNumber)
  1129. this.$set(item, 'amount', amount)
  1130. })
  1131. })
  1132. }
  1133. },
  1134. async confirmContract(val) {
  1135. let isSame = this.haveSameIds([val], this.connectContractList, 'contractId');
  1136. if (isSame) {
  1137. this.$message.error('请勿重复添加已有的合同');
  1138. return
  1139. }
  1140. this.contractOpen = false;
  1141. this.connectContractList.push(val)
  1142. },
  1143. haveSameIds(arr1, arr2, key) {
  1144. return arr1.some(obj1 => arr2.some(obj2 => obj1[key] === obj2[key]))
  1145. },
  1146. // 获取合同详情
  1147. fetchContracts(projectId) {
  1148. return new Promise((resolve, reject) => {
  1149. listProjectContract({ projectId: projectId }).then(response => {
  1150. if (response.rows) {
  1151. const contractIds = response.rows.map(row => row.contractId);
  1152. Promise.all(contractIds.map(contractId => getContract(contractId)))
  1153. .then(contractData => {
  1154. resolve(contractData);
  1155. })
  1156. .catch(error => {
  1157. reject(error);
  1158. });
  1159. } else {
  1160. resolve([]); // 如果没有合同,返回一个空数组
  1161. }
  1162. }).catch(error => {
  1163. reject(error);
  1164. });
  1165. });
  1166. },
  1167. // 处理合同编码、合同编号的格式
  1168. processContractData(contractData) {
  1169. let chooseContract = {
  1170. amount: [],
  1171. contractCode: [],
  1172. contractNumber: []
  1173. }
  1174. contractData.forEach(contract => {
  1175. if (contract.data) {
  1176. chooseContract.amount.push(contract.data.amount);
  1177. chooseContract.contractCode.push(contract.data.contractCode);
  1178. chooseContract.contractNumber.push(contract.data.contractNumber);
  1179. }
  1180. });
  1181. let amount = chooseContract.amount.join('、');
  1182. let contractCode = chooseContract.contractCode.join('、');
  1183. let contractNumber = chooseContract.contractNumber.join('、');
  1184. return [contractCode, contractNumber, amount]
  1185. },
  1186. getFileName(name) {
  1187. if (name) {
  1188. let arr = name.split('/')
  1189. return arr[arr.length - 1];
  1190. }
  1191. },
  1192. getContractPath(val) {
  1193. let arr = val.split('/upload')
  1194. this.form.contractDocument = arr[1]
  1195. if (val == "") {
  1196. this.form.contractDocument = ""
  1197. }
  1198. },
  1199. getMeetingPath(val) {
  1200. let arr = val.split('/upload')
  1201. this.meetingForm.document = arr[1]
  1202. if (val == "") {
  1203. this.meetingForm.document = ""
  1204. }
  1205. },
  1206. getSignScanPath(val) {
  1207. let arr = val.split('/upload')
  1208. this.form.signScan = arr[1]
  1209. if (val == "") {
  1210. this.form.signScan = ""
  1211. }
  1212. },
  1213. handleFileDelete(key, val) {
  1214. key[val] = ''
  1215. },
  1216. setCommentDocument(val) {
  1217. let arr = val.split('/upload');
  1218. this.clickTd.document = arr[1];
  1219. },
  1220. clickFile(val) {
  1221. this.clickTd = val
  1222. },
  1223. // 手动验证tenderId的方法
  1224. validateManual(name) {
  1225. // 这里添加你的验证逻辑
  1226. // 例如,检查tenderId是否为空或者是否符合其他规则
  1227. if (name && name.length == 0) {
  1228. this.$message.error('请选择至少一个有效项目');
  1229. return false;
  1230. }
  1231. return true;
  1232. },
  1233. clickContractFn(row) {
  1234. this.formOpen = true;
  1235. this.contractId.formId = row.contractId
  1236. },
  1237. clickProjectFn(row) {
  1238. this.$router.replace({ query: { ...this.$route.query, projectId: row.projectId } });
  1239. this.drawerOpen = true;
  1240. },
  1241. isReturn(val) {
  1242. this.showAlter = val
  1243. }
  1244. }
  1245. };
  1246. </script>
  1247. <style lang="scss" scoped>
  1248. @import "@/assets/styles/element-reset.scss";
  1249. .delete-btn {
  1250. color: #F56C6C;
  1251. cursor: pointer;
  1252. i {
  1253. font-size: 25px;
  1254. }
  1255. }
  1256. table {
  1257. /*边框*/
  1258. /* border: 1px solid black; */
  1259. text-align: center;
  1260. border-collapse: collapse;
  1261. /*设置背景颜色*/
  1262. /* background-color: #bfa; */
  1263. td {
  1264. padding: 5px;
  1265. }
  1266. }
  1267. .upload-file-uploader {
  1268. margin-bottom: 5px;
  1269. }
  1270. .upload-file-list .el-upload-list__item {
  1271. border: 1px solid #e4e7ed;
  1272. line-height: 2;
  1273. margin-bottom: 10px;
  1274. position: relative;
  1275. }
  1276. .upload-file-list .ele-upload-list__item-content {
  1277. display: flex;
  1278. justify-content: space-between;
  1279. align-items: center;
  1280. color: inherit;
  1281. }
  1282. .ele-upload-list__item-content-action .el-link {
  1283. margin-right: 10px;
  1284. }
  1285. </style>