综合办公系统
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

contractForm.vue 43KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080
  1. <!--
  2. * @Author: ysh
  3. * @Date: 2024-05-10 15:31:57
  4. * @LastEditors: Please set LastEditors
  5. * @LastEditTime: 2024-05-14 17:46:47
  6. -->
  7. <template>
  8. <div class="app-container">
  9. <el-row :gutter="20">
  10. <el-col :span="18" :xs="24">
  11. <h2 class="text-center">承接合同评审表</h2>
  12. <el-divider></el-divider>
  13. <el-form ref="form" :model="form" :rules="rules" label-width="130px" :disabled="formDisabled">
  14. <el-row :gutter="20">
  15. <el-col :span="12" :xs="24">
  16. <el-form-item label="投标项目名称:" prop="tenderId">
  17. <el-button type="primary" size="mini" @click="tbOpen = true"
  18. v-if="taskName == '合同拟稿'">选择投标项目</el-button>
  19. <!-- <el-select v-model="form.tenderId" filterable placeholder="请选择" @change="handleSelectTender"
  20. :disabled="taskName != '合同拟稿'" clearable>
  21. <el-option v-for="item in tenderList" :key="item.value" :label="item.projectName"
  22. :value="item.tenderId">
  23. </el-option>
  24. </el-select> -->
  25. <el-descriptions border v-if="isSelect" style="margin-top: 10px;" :column="2" direction="vertical">
  26. <el-descriptions-item label="投标项目名称" label-class-name="my-label" :span="2">{{ chooseTender.projectName
  27. }}</el-descriptions-item>
  28. <el-descriptions-item label="项目来源" label-class-name="my-label">{{ getProjectSource(chooseTender)
  29. }}</el-descriptions-item>
  30. <el-descriptions-item label="招标业主" label-class-name="my-label">{{ chooseTender.partyA
  31. }}</el-descriptions-item>
  32. <el-descriptions-item label="联系人" label-class-name="my-label">{{ chooseTender.aPerson
  33. }}</el-descriptions-item>
  34. <el-descriptions-item label="联系电话" label-class-name="my-label">{{ chooseTender.aPhone
  35. }}</el-descriptions-item>
  36. </el-descriptions>
  37. </el-form-item>
  38. <el-row :gutter="20">
  39. <el-col :span="12" :xs="24">
  40. <el-form-item label="合同编码" prop="contractCode">
  41. <el-input v-model="form.contractCode" placeholder="请输入合同编码"
  42. :disabled="taskName != '合同拟稿'"></el-input>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="12" :xs="24">
  46. <el-form-item label="合同编号" prop="contractNumber">
  47. <el-input v-model="form.contractNumber" placeholder="请输入合同编号"
  48. :disabled="taskName != '合同拟稿'"></el-input>
  49. </el-form-item>
  50. </el-col>
  51. </el-row>
  52. <el-row :gutter="20">
  53. <el-col :span="12" :xs="24">
  54. <el-form-item label="合同金额" prop="amount">
  55. <el-input v-model="form.amount" placeholder="请输入合同金额" :disabled="taskName != '合同拟稿'" />
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="12" :xs="24">
  59. <el-form-item label="履约保证金" prop="deposit">
  60. <el-input v-model="form.deposit" placeholder="请输入履约保证金" :disabled="taskName != '合同拟稿'" />
  61. </el-form-item>
  62. </el-col>
  63. </el-row>
  64. </el-col>
  65. <el-col :span="12" :xs="24">
  66. <el-form-item label="关联项目:" prop="projectIds">
  67. <!-- <el-select v-model="projectContractForm.projectIds" multiple filterable placeholder="请选择"
  68. @change="handleSelectProject" :disabled="taskName != '合同拟稿'" clearable>
  69. <el-option v-for="item in projectList" :key="item.value"
  70. :label="item.projectNumber + item.projectName" :value="item.projectId">
  71. </el-option>
  72. </el-select> -->
  73. <el-button type="primary" size="mini" @click="open = true" v-if="taskName == '合同拟稿'">选择项目</el-button>
  74. </el-form-item>
  75. <el-table v-loading="loading" :data="chooseProjectList">
  76. <el-table-column label="项目编号" align="center" prop="projectNumber"></el-table-column>
  77. <el-table-column label="项目名称" align="center" prop="projectName"></el-table-column>
  78. <el-table-column label="项目负责人" align="center" prop="projectLeaderUser.nickName"></el-table-column>
  79. <el-table-column label="承担部门" align="center" prop="undertakingDeptName"></el-table-column>
  80. </el-table>
  81. </el-col>
  82. </el-row>
  83. <el-form-item label="合同文件" prop="contractDocument">
  84. <FileUpload v-if="taskName == '合同拟稿'" ref="contractFile" :limit="1" :filePathName="'合同文件'"
  85. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf']" @input="getContractPath"></FileUpload>
  86. <div v-if="taskName != '合同拟稿'">
  87. <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear"
  88. tag="ul">
  89. <li key="li01" class="el-upload-list__item ele-upload-list__item-content">
  90. <el-link :href="`${baseUrl}${'/profile/upload' + form.contractDocument}`" :underline="false"
  91. target="_blank">
  92. <span class="el-icon-document" style="color:#0011ff;text-decoration: underline;">
  93. {{ getFileName(form.contractDocument) }}
  94. </span>
  95. </el-link>
  96. </li>
  97. </transition-group>
  98. </div>
  99. </el-form-item>
  100. <el-divider></el-divider>
  101. <el-form-item label="合同计划工作量:">
  102. <table border="1">
  103. <tr>
  104. <td style="width: 50px;">序号</td>
  105. <td>工作内容</td>
  106. <td>等级或比例尺</td>
  107. <td>单位</td>
  108. <td>工作量</td>
  109. <td>要求完成时间</td>
  110. <td>备注</td>
  111. </tr>
  112. <tr v-for="(work, index) in workList" :key="index">
  113. <td>
  114. {{ index + 1 }}
  115. </td>
  116. <td>
  117. <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
  118. :disabled="taskName != '合同拟稿'"></el-input>
  119. </td>
  120. <td>
  121. <el-select v-model="work.scale" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
  122. <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
  123. :value="dict.label" />
  124. </el-select>
  125. </td>
  126. <td>
  127. <el-select v-model="work.unit" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
  128. <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label"
  129. :value="dict.label" />
  130. </el-select>
  131. </td>
  132. <td>
  133. <el-input v-model="work.workload" clearable :disabled="taskName != '合同拟稿'"></el-input>
  134. </td>
  135. <td>
  136. <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
  137. placeholder="选择日期" :disabled="taskName != '合同拟稿'">
  138. </el-date-picker>
  139. </td>
  140. <td>
  141. <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
  142. :disabled="taskName != '合同拟稿'"></el-input>
  143. </td>
  144. <td>
  145. <el-button type="danger" icon="el-icon-minus" size="mini" circle @click="deletWorkItem(index)"
  146. :disabled="taskName != '合同拟稿'"></el-button>
  147. </td>
  148. </tr>
  149. </table>
  150. <el-button icon="el-icon-plus" size="mini" @click="addWorkList()" type="primary" plain
  151. :disabled="taskName != '合同拟稿'"></el-button>
  152. </el-form-item>
  153. <el-form-item label="合同回款计划:">
  154. <table border="1">
  155. <tr>
  156. <td style="width: 50px;">序号</td>
  157. <td>回款条件</td>
  158. <td>回款比例(%)</td>
  159. <td>回款金额(元)</td>
  160. <td>预计时间</td>
  161. <td>备注</td>
  162. </tr>
  163. <tr v-for="(payment, index) in paymentList" :key="index">
  164. <td>
  165. {{ index + 1 }}
  166. </td>
  167. <td>
  168. <el-input v-model="payment.paymentCondition" type="textarea" clearable
  169. :autosize="{ minRows: 4, maxRows: 10 }" :disabled="taskName != '合同拟稿'"></el-input>
  170. </td>
  171. <td>
  172. <el-input v-model="payment.paymentPercentage" clearable :disabled="taskName != '合同拟稿'"></el-input>
  173. </td>
  174. <td>
  175. <el-input v-model="payment.paymentAmount" clearable :disabled="taskName != '合同拟稿'"></el-input>
  176. </td>
  177. <td>
  178. <el-date-picker style="width: 140px" v-model="payment.paymentTime" value-format="yyyy-MM-dd"
  179. type="date" placeholder="选择日期" :disabled="taskName != '合同拟稿'">
  180. </el-date-picker>
  181. </td>
  182. <td>
  183. <el-input v-model="payment.remark" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
  184. :disabled="taskName != '合同拟稿'"></el-input>
  185. </td>
  186. <td>
  187. <el-button type="danger" icon="el-icon-minus" size="mini" circle @click="deletPaymentItem(index)"
  188. :disabled="taskName != '合同拟稿'"></el-button>
  189. </td>
  190. </tr>
  191. </table>
  192. <el-button icon="el-icon-plus" size="mini" @click="addPaymentList()" type="primary" plain
  193. :disabled="taskName != '合同拟稿'"></el-button>
  194. </el-form-item>
  195. <el-form-item label="合同备注" prop="remark">
  196. <el-input v-model="form.remark" type="textarea" placeholder="请输入合同备注" :disabled="taskName != '合同拟稿'" />
  197. </el-form-item>
  198. <el-row>
  199. <el-col :span="6" :xs="24" :offset="12">
  200. <el-form-item label="拟稿人:" label-width="120px">
  201. <span class="auditor"> {{ form.draftUser ? form.draftUser.nickName : draftUser }} </span>
  202. </el-form-item>
  203. </el-col>
  204. <el-col :span="6">
  205. <el-form-item label="日期:" label-width="120px">
  206. <span> {{ form.draftTime ? form.draftTime : draftTime }} </span>
  207. </el-form-item>
  208. </el-col>
  209. </el-row>
  210. <el-divider></el-divider>
  211. <el-form-item label="评审方式" prop="commentType">
  212. <el-radio-group v-model="form.commentType" @change="changeCommentType" :disabled="taskName != '合同拟稿'">
  213. <el-radio :label="'0'">无须评审</el-radio>
  214. <el-radio :label="'1'">会议评审</el-radio>
  215. <el-radio :label="'2'">线上会审</el-radio>
  216. </el-radio-group>
  217. </el-form-item>
  218. <el-form-item label="线上会审:" v-if="commentOpen">
  219. <table border="1">
  220. <tr>
  221. <td style="width: 50px;">序号</td>
  222. <td>会审部门</td>
  223. <td>会审人</td>
  224. <td>会审意见</td>
  225. <td style="width: 200px;">会审附件</td>
  226. <td style="width: 90px;">签名</td>
  227. <td style="width: 100px;">日期</td>
  228. </tr>
  229. <tr v-for="(comment, index) in commentList" :key="index">
  230. <td>
  231. {{ index + 1 }}
  232. </td>
  233. <td>
  234. <el-select v-model="comment.deptId" clearable style="width:120px"
  235. :disabled="(index < 4 && taskName == '合同拟稿') || taskName != '合同拟稿'" @change="getDeptLeader">
  236. <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId">
  237. </el-option>
  238. </el-select>
  239. </td>
  240. <td>
  241. <el-select v-model="comment.userId" clearable style="width:120px"
  242. :disabled="(index < 4 && taskName == '合同拟稿') || taskName != '合同拟稿'">
  243. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  244. </el-option>
  245. </el-select>
  246. </td>
  247. <td>
  248. <el-input v-model="comment.comment" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
  249. :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)"></el-input>
  250. </td>
  251. <td style="text-align:left;" @click="clickFile(comment)">
  252. <FileUpload v-if="comment.document == ''" ref="hs" :limit="1" :filePathName="'合同文件'"
  253. :disabled="taskName != '线上会审' || (taskName == '线上会审' && !comment.commentUser)"
  254. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf']" @input="setCommentDocument">
  255. </FileUpload>
  256. <!-- <el-input v-model="comment.document" clearable
  257. :disabled="taskName != '线上会审' || (taskName == '线上会审' && !comment.commentUser)"></el-input> -->
  258. <div v-if="comment.document != ''">
  259. <transition-group class="upload-file-list el-upload-list el-upload-list--text"
  260. name="el-fade-in-linear" tag="ul">
  261. <li key="li01" class="el-upload-list__item ele-upload-list__item-content">
  262. <el-link :href="`${baseUrl}${'/profile/upload' + comment.document}`" :underline="false"
  263. target="_blank">
  264. <span class="el-icon-document" style="color:#0011ff;text-decoration: underline;">
  265. {{ getFileName(comment.document) }}
  266. </span>
  267. </el-link>
  268. <div class="ele-upload-list__item-content-action" v-if="comment.userId == userId">
  269. <el-link :underline="false" @click="handleFileDelete(comment, 'document')"
  270. type="danger">删除</el-link>
  271. </div>
  272. </li>
  273. </transition-group>
  274. </div>
  275. </td>
  276. <td>
  277. <span class="auditor"> {{ comment.commentUser ? comment.commentUser.nickName : '' }} </span>
  278. </td>
  279. <td>
  280. <span> {{ comment.commentTime }} </span>
  281. </td>
  282. <td>
  283. <el-button type="danger" icon="el-icon-minus" size="mini" circle @click="deletCommentItem(index)"
  284. :disabled="taskName != '合同拟稿'"></el-button>
  285. </td>
  286. </tr>
  287. </table>
  288. <el-button icon="el-icon-plus" size="mini" @click="addCommentList()" type="primary" plain
  289. :disabled="taskName != '合同拟稿'"></el-button>
  290. </el-form-item>
  291. <el-form-item label="会议评审:" v-if="meetingOpen">
  292. <table border="1">
  293. <tr>
  294. <td>评审时间</td>
  295. <td>
  296. <el-date-picker clearable v-model="meetingForm.meetingTime" type="date" value-format="yyyy-MM-dd"
  297. placeholder="请选择评审日期" :disabled="taskName != '合同拟稿'">
  298. </el-date-picker>
  299. </td>
  300. <td>评审地点</td>
  301. <td>
  302. <el-select v-model="meetingForm.place" clearable style="width:120px" :disabled="taskName != '合同拟稿'">
  303. <el-option v-for="item in placeList" :key="item.id" :label="item.name" :value="item.id">
  304. </el-option>
  305. </el-select>
  306. </td>
  307. <td>评审主持人</td>
  308. <td>
  309. <el-select v-model="meetingForm.hostId" clearable style="width:120px" :disabled="taskName != '合同拟稿'">
  310. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  311. </el-option>
  312. </el-select>
  313. </td>
  314. </tr>
  315. <tr>
  316. <td>参与评审人员</td>
  317. <td colspan="5">
  318. <el-select v-model="meetingForm.users" multiple clearable style="width:600px"
  319. :disabled="taskName != '合同拟稿'">
  320. <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId">
  321. </el-option>
  322. </el-select>
  323. </td>
  324. </tr>
  325. <tr>
  326. <td>评审意见表</td>
  327. <td colspan="5">
  328. <FileUpload v-if="taskName == '会议评审'" ref="contractFile" :limit="1" :filePathName="'合同文件'"
  329. :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf']" @input="getMeetingPath"></FileUpload>
  330. <!-- <el-input v-model="meetingForm.document" clearable :disabled="taskName != '会议评审'"></el-input> -->
  331. </td>
  332. </tr>
  333. <tr>
  334. <td>评审结论</td>
  335. <td colspan="5">
  336. <el-input type="textarea" v-model="meetingForm.conclusion" clearable
  337. :disabled="taskName != '会议评审'"></el-input>
  338. </td>
  339. </tr>
  340. <tr>
  341. <td colspan="2"></td>
  342. <td>主持人签名</td>
  343. <td>
  344. <span class="auditor"> {{ meetingForm.hostUser ? meetingForm.hostUser.nickName : hostUser }} </span>
  345. </td>
  346. <td>日期</td>
  347. <td>
  348. <span> {{ meetingForm.commentTime ? meetingForm.commentTime : commentTime }} </span>
  349. </td>
  350. </tr>
  351. </table>
  352. </el-form-item>
  353. <el-form-item label="分管审批意见" prop="remark">
  354. <el-input v-model="form.managerComment" type="textarea" placeholder="请输入审批意见"
  355. :disabled="taskName != '分管审核'" />
  356. </el-form-item>
  357. <el-row>
  358. <el-col :span="6" :xs="24" :offset="12">
  359. <el-form-item label="签名:" label-width="120px" v-if="taskName == '分管审核'">
  360. <span class="auditor"> {{ form.managerUser ? form.managerUser.nickName : managerUser }} </span>
  361. </el-form-item>
  362. </el-col>
  363. <el-col :span="6">
  364. <el-form-item label="日期:" label-width="120px" v-if="taskName == '分管审核'">
  365. <span> {{ form.managerTime ? form.managerTime : managerTime }} </span>
  366. </el-form-item>
  367. </el-col>
  368. </el-row>
  369. <el-divider></el-divider>
  370. <el-form-item label="签订日期" prop="signDate">
  371. <el-date-picker clearable v-model="form.signDate" type="date" value-format="yyyy-MM-dd"
  372. placeholder="请选择签订日期" :disabled="taskName != '合同签订'">
  373. </el-date-picker>
  374. </el-form-item>
  375. <el-form-item label="签订备注" prop="signRemark">
  376. <el-input v-model="form.signRemark" type="textarea" placeholder="请输入签订备注" :disabled="taskName != '合同签订'" />
  377. </el-form-item>
  378. <el-form-item label="签订扫描件" prop="signScan">
  379. <!-- <el-input v-model="form.signScan" placeholder="请输入签订扫描件" :disabled="taskName != '合同签订'" /> -->
  380. <FileUpload v-if="form.signScan == null || form.signScan == ''" ref="contractFile" :limit="1"
  381. :filePathName="'合同文件'" :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf']" @input="getSignScanPath">
  382. </FileUpload>
  383. <div v-if="form.signScan != null && form.signScan != ''">
  384. <transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear"
  385. tag="ul">
  386. <li key="li01" class="el-upload-list__item ele-upload-list__item-content">
  387. <el-link :href="`${baseUrl}${'/profile/upload' + form.signScan}`" :underline="false" target="_blank">
  388. <span class="el-icon-document" style="color:#0011ff;text-decoration: underline;">
  389. {{ getFileName(form.signScan) }}
  390. </span>
  391. </el-link>
  392. <div class="ele-upload-list__item-content-action" v-if="taskName != ''">
  393. <el-link :underline="false" @click="handleFileDelete(form, 'signScan')" type="danger">删除</el-link>
  394. </div>
  395. </li>
  396. </transition-group>
  397. </div>
  398. </el-form-item>
  399. </el-form>
  400. <div style="text-align: center;">
  401. <el-button type="primary" @click="submitForm" :disabled="formDisabled">提 交</el-button>
  402. <!-- <el-button @click="cancel">取 消</el-button> -->
  403. </div>
  404. </el-col>` `
  405. <el-col :span="6" :xs="24">
  406. <el-card>
  407. <h2 style="text-align: center;">流程进度</h2>
  408. <div>
  409. <flow :flowData="flowData" />
  410. </div>
  411. </el-card>
  412. </el-col>
  413. </el-row>
  414. <el-dialog title="选择项目" :visible.sync="open" width="70%" append-to-body>
  415. <choose-project @chooseProject="confirmProject"></choose-project>
  416. </el-dialog>
  417. <el-dialog title="选择投标项目" :visible.sync="tbOpen" width="70%" append-to-body>
  418. <choose-tender @choose="confirmTender"></choose-tender>
  419. </el-dialog>
  420. </div>
  421. </template>
  422. <script>
  423. import { parseTime } from "@/utils/ruoyi";
  424. import { listProject, getProject } from "@/api/oa/project/project";
  425. import { listDept } from '@/api/system/dept'
  426. import { listUser } from '@/api/system/user'
  427. import { listContract, getContract, delContract, addContract, updateContract } from "@/api/oa/contract/contract";
  428. import { listContractWork, addContractWork } from "@/api/oa/contract/contractWork";
  429. import { listContractPayment, addContractPayment } from "@/api/oa/contract/contractPayment";
  430. import { listContractComment, addContractComment, updateContractComment } from "@/api/oa/contract/contractComment";
  431. import { getContractMeeting, addContractMeeting, updateContractMeeting } from "@/api/oa/contract/contractMeeting";
  432. import { listProjectContract, addProjectContract } from "@/api/oa/contract/projectContract";
  433. import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
  434. import { listTender, getTender } from "@/api/oa/tender/tender";
  435. import { getUsersDeptLeader, getUsersManageLeader, getUsersDeptLeaderByDept } from '@/api/system/post.js'
  436. import flow from '@/views/flowable/task/todo/detail/flow'
  437. import { flowXmlAndNode } from "@/api/flowable/definition";
  438. import ChooseProject from '../components/chooseProject.vue';
  439. import ChooseTender from '../components/chooseTender.vue';
  440. import { mapGetters } from "vuex";
  441. export default {
  442. dicts: ['cmc_scale_grade', 'cmc_unit'],
  443. components: {
  444. flow,
  445. ChooseProject,
  446. ChooseTender
  447. },
  448. props: {
  449. taskName: {
  450. type: String,
  451. required: true
  452. },
  453. taskForm: {
  454. type: Object,
  455. required: true
  456. },
  457. formDisabled: {
  458. type: Boolean,
  459. default: false
  460. }
  461. },
  462. computed: {
  463. ...mapGetters(["userId"]),
  464. },
  465. name: "Contract",
  466. data() {
  467. return {
  468. baseUrl: process.env.VUE_APP_BASE_API,
  469. draftUser: '',
  470. draftTime: undefined,
  471. managerUser: '',
  472. managerTime: undefined,
  473. hostUser: '',
  474. commentTime: undefined,
  475. // 遮罩层
  476. loading: true,
  477. // 选中数组
  478. ids: [],
  479. // 非单个禁用
  480. single: true,
  481. // 非多个禁用
  482. multiple: true,
  483. // 显示搜索条件
  484. showSearch: true,
  485. // 总条数
  486. total: 0,
  487. // cmc合同评审表格数据
  488. contractList: [],
  489. // 弹出层标题
  490. title: "",
  491. // 是否显示弹出层
  492. open: false,
  493. tbOpen: false,
  494. // 查询参数
  495. queryParams: {
  496. pageNum: 1,
  497. pageSize: 10,
  498. contractNumber: null,
  499. amount: null,
  500. deposit: null,
  501. contractDocument: null,
  502. drafter: null,
  503. draftTime: null,
  504. signDate: null,
  505. signRemark: null,
  506. signScan: null,
  507. commentType: ''
  508. },
  509. // 表单参数
  510. form: {},
  511. meetingForm: {
  512. users: [],
  513. },
  514. projectContractForm: {
  515. projectIds: [],
  516. },
  517. // 表单校验
  518. rules: {
  519. tenderId: [
  520. { required: true, message: '请选择投标项目', trigger: 'blur' },
  521. ],
  522. contractCode: [
  523. { required: true, message: '请输入合同编码', trigger: 'blur' },
  524. ],
  525. commentType: [
  526. { required: true, message: '请选择评审方式', trigger: 'blur' },
  527. ],
  528. },
  529. meetingOpen: false,
  530. commentOpen: false,
  531. chooseProjectList: [],
  532. projectList: [],
  533. deptList: [],
  534. userList: [],
  535. users: undefined,
  536. workList: [{
  537. content: "",
  538. scale: "",
  539. unit: "",
  540. workload: "",
  541. deadline: undefined,
  542. remark: "",
  543. }],
  544. paymentList: [{
  545. paymentCondition: "",
  546. paymentPercentage: "",
  547. paymentAmount: "",
  548. paymentTime: undefined,
  549. remark: "",
  550. }],
  551. placeList: [{ id: '0', name: '301会议室' }, { id: '1', name: '216会议室' }],
  552. commentList: [
  553. {
  554. deptId: 105,
  555. userId: '',
  556. comment: '',
  557. document: '',
  558. commentTime: undefined
  559. },
  560. {
  561. deptId: 110,
  562. userId: '',
  563. comment: '',
  564. document: '',
  565. commentTime: undefined
  566. },
  567. {
  568. deptId: 107,
  569. userId: '',
  570. comment: '',
  571. document: '',
  572. commentTime: undefined
  573. },
  574. {
  575. deptId: 106,
  576. userId: '',
  577. comment: '',
  578. document: '',
  579. commentTime: undefined
  580. },
  581. ],
  582. tenderList: [],
  583. chooseTender: {},
  584. isSelect: false,
  585. formTotal: 0,
  586. flowData: {},
  587. clickTd: {},
  588. };
  589. },
  590. created() {
  591. if (this.taskName == '合同拟稿') {
  592. this.draftUser = this.$store.getters.name;
  593. this.draftTime = parseTime(new Date(), '{y}-{m}-{d}')
  594. }
  595. else if (this.taskName == '会议评审') {
  596. this.hostUser = this.$store.getters.name;
  597. this.commentTime = parseTime(new Date(), '{y}-{m}-{d}')
  598. }
  599. else if (this.taskName == '分管审核') {
  600. this.managerUser = this.$store.getters.name;
  601. this.managerTime = parseTime(new Date(), '{y}-{m}-{d}')
  602. }
  603. this.getProjectList();
  604. this.getDeptList();
  605. this.getTenderList();
  606. this.getUserList();
  607. this.getList();
  608. flowXmlAndNode({ procInsId: this.taskForm.procInsId, deployId: this.taskForm.deployId }).then(res => {
  609. this.flowData = res.data;
  610. })
  611. },
  612. mounted() {
  613. this.initForm();
  614. },
  615. methods: {
  616. initForm() {
  617. getContract(this.taskForm.formId).then(res => {
  618. if (this.isEmptyObject(res.data)) {
  619. this.formTotal = 0;
  620. this.form.drafter = this.$store.getters.userId;
  621. this.form.draftTime = parseTime(new Date(), '{y}-{m}-{d}');
  622. }
  623. else {
  624. this.formTotal = 1;
  625. this.form = res.data;
  626. if (this.form.commentType == '0') {
  627. this.commentOpen = false;
  628. this.meetingOpen = false;
  629. }
  630. else if (this.form.commentType == '1') {
  631. this.commentOpen = false;
  632. this.meetingOpen = true;
  633. }
  634. else if (this.form.commentType == '2') {
  635. this.commentOpen = true;
  636. this.meetingOpen = false;
  637. }
  638. if (res.data.tenderId) {
  639. getTender(res.data.tenderId).then(response => {
  640. this.chooseTender = response.data;
  641. this.isSelect = true
  642. })
  643. }
  644. listContractWork({ contractId: this.taskForm.formId }).then(res => {
  645. if (res.rows)
  646. this.workList = res.rows;
  647. });
  648. listContractPayment({ contractId: this.taskForm.formId }).then(res => {
  649. if (res.rows)
  650. this.paymentList = res.rows;
  651. });
  652. listContractComment({ contractId: this.taskForm.formId }).then(res => {
  653. if (res.rows)
  654. this.commentList = res.rows;
  655. for (let comment of this.commentList) {
  656. if (comment.commentTime == undefined) {
  657. if (comment.userId != this.$store.getters.userId) {
  658. comment.commentUser = undefined;
  659. }
  660. else {
  661. comment.commentTime = parseTime(new Date(), '{y}-{m}-{d}');
  662. }
  663. }
  664. }
  665. });
  666. getContractMeeting(this.taskForm.formId).then(res => {
  667. if (res.data) {
  668. let data = res.data;
  669. if (res.data.users == null || res.data.users == undefined || res.data.users == "") {
  670. data.users = []
  671. } else {
  672. data.users = data.users.split(',');
  673. let arr = []
  674. for (let d of data.users) {
  675. arr.push(parseInt(d))
  676. }
  677. data.users = arr;
  678. }
  679. this.meetingForm = data;
  680. }
  681. });
  682. listProjectContract({ contractId: this.taskForm.formId }).then(res => {
  683. if (res.rows) {
  684. for (let row of res.rows) {
  685. this.projectContractForm.projectIds.push(row.projectId);
  686. getProject(row.projectId).then(response => {
  687. this.chooseProjectList.push(response.data)
  688. })
  689. }
  690. }
  691. })
  692. }
  693. })
  694. },
  695. /** 查询cmc合同评审列表 */
  696. getList() {
  697. this.loading = true;
  698. listContract(this.queryParams).then(response => {
  699. this.contractList = response.rows;
  700. this.total = response.total;
  701. this.loading = false;
  702. });
  703. },
  704. // 查询项目列表
  705. getProjectList() {
  706. this.loading = true
  707. listProject({
  708. pageNum: 1,
  709. pageSize: 99999999
  710. }).then(response => {
  711. this.projectList = response.rows;
  712. })
  713. },
  714. getUserList() {
  715. listUser({ pageSize: 9999, pageNum: 1 }).then(res => {
  716. this.userList = res.rows
  717. })
  718. },
  719. getDeptList() {
  720. listDept({ pageSize: 9999, pageNum: 1 }).then(res => {
  721. this.deptList = res.data
  722. })
  723. },
  724. // 查询项目列表
  725. getTenderList() {
  726. this.loading = true
  727. listTender({
  728. pageNum: 1,
  729. pageSize: 99999999
  730. }).then(response => {
  731. this.tenderList = response.rows;
  732. })
  733. },
  734. // 选择项目
  735. handleSelectTender(val) {
  736. if (val != "" && val != undefined && val != null) {
  737. getTender(val).then(res => {
  738. this.chooseTender = res.data;
  739. this.isSelect = true;
  740. })
  741. } else {
  742. this.isSelect = false
  743. }
  744. },
  745. // 取消按钮
  746. cancel() {
  747. this.open = false;
  748. this.reset();
  749. },
  750. isEmptyObject(obj) {
  751. for (var key in obj) {
  752. if (obj.hasOwnProperty(key)) {
  753. return false;
  754. }
  755. }
  756. return true;
  757. },
  758. getProjectSource(chooseTender) {
  759. return chooseTender.partyA.indexOf('中国电建集团成都勘测设计研究院有限公司') != -1 ? '院内' : '院外';
  760. },
  761. addWorkList() {
  762. this.workList.push({
  763. content: "",
  764. scale: "",
  765. unit: "",
  766. workload: "",
  767. deadline: undefined,
  768. remark: "",
  769. });
  770. },
  771. addPaymentList() {
  772. this.paymentList.push({
  773. paymentCondition: "",
  774. paymentPercentage: "",
  775. paymentAmount: "",
  776. paymentTime: undefined,
  777. remark: "",
  778. });
  779. },
  780. addCommentList() {
  781. this.commentList.push({
  782. deptId: "",
  783. userId: "",
  784. comment: "",
  785. document: "",
  786. commentTime: undefined,
  787. });
  788. },
  789. deletWorkItem(index) {
  790. let arr = this.workList;
  791. if (arr.length == 1) {
  792. return;
  793. }
  794. if (index >= 0 && index < arr.length) {
  795. arr.splice(index, 1);
  796. }
  797. },
  798. deletPaymentItem(index) {
  799. let arr = this.paymentList;
  800. if (arr.length == 1) {
  801. return;
  802. }
  803. if (index >= 0 && index < arr.length) {
  804. arr.splice(index, 1);
  805. }
  806. },
  807. setCommentDocument(val) {
  808. let arr = val.split('/upload');
  809. this.clickTd.document = arr[1];
  810. },
  811. handleFileDelete(key, val) {
  812. key[val] = ''
  813. },
  814. clickFile(val) {
  815. this.clickTd = val
  816. },
  817. deletCommentItem(index) {
  818. let arr = this.commentList;
  819. if (arr.length == 1) {
  820. return;
  821. }
  822. if (index >= 0 && index < arr.length) {
  823. arr.splice(index, 1);
  824. }
  825. },
  826. changeCommentType(val) {
  827. if (val == '0') {
  828. this.commentOpen = false;
  829. this.meetingOpen = false;
  830. }
  831. else if (val == '1') {
  832. this.commentOpen = false;
  833. this.meetingOpen = true;
  834. }
  835. else if (val == '2') {
  836. this.commentOpen = true;
  837. this.meetingOpen = false;
  838. for (let comment of this.commentList) {
  839. getUsersDeptLeaderByDept({ deptId: comment.deptId }).then(res => {
  840. comment.userId = res.data.userId;
  841. })
  842. }
  843. }
  844. },
  845. getDeptLeader(val) {
  846. getUsersDeptLeaderByDept({ deptId: Number(val) }).then(res => {
  847. for (let comment of this.commentList) {
  848. if (comment.deptId == val)
  849. comment.userId = res.data.userId;
  850. }
  851. })
  852. },
  853. handleSelectProject() {
  854. this.chooseProjectList = [];
  855. for (let projectId of this.projectContractForm.projectIds) {
  856. getProject(projectId).then(res => {
  857. this.chooseProjectList.push(res.data)
  858. })
  859. }
  860. },
  861. // 表单重置
  862. reset() {
  863. this.form = {
  864. contractId: null,
  865. contractCode: null,
  866. contractNumber: null,
  867. amount: null,
  868. deposit: null,
  869. contractDocument: null,
  870. drafter: null,
  871. draftTime: null,
  872. remark: null,
  873. signDate: null,
  874. signRemark: null,
  875. signScan: null,
  876. commentType: ''
  877. };
  878. this.resetForm("form");
  879. },
  880. /** 提交按钮 */
  881. submitForm() {
  882. this.$refs["form"].validate(valid => {
  883. if (valid) {
  884. if (this.formTotal != 0) {
  885. updateContract(this.form).then(response => {
  886. this.$modal.msgSuccess("修改成功");
  887. this.open = false;
  888. this.getList();
  889. });
  890. const params = { taskId: this.taskForm.taskId };
  891. getNextFlowNode(params).then(res => {
  892. if (this.taskName == '分管审核') {
  893. complete(this.taskForm).then(response => {
  894. this.$modal.msgSuccess(response.msg);
  895. this.$emit('goBack')
  896. });
  897. }
  898. else if (this.taskName == '线上会审') {
  899. for (let comment of this.commentList) {
  900. updateContractComment(comment);
  901. }
  902. getUsersManageLeader({ userId: this.form.drafter }).then(res => {
  903. let userId = res.data.userId;
  904. this.$set(this.taskForm.variables, "approval", userId);
  905. complete(this.taskForm).then(response => {
  906. this.$modal.msgSuccess(response.msg);
  907. this.$emit('goBack')
  908. });
  909. })
  910. }
  911. else if (this.taskName == '会议评审') {
  912. this.meetingForm.contractId = this.form.contractId;
  913. let formData = new FormData();
  914. let jsonForm = JSON.stringify(this.meetingForm);
  915. formData.append("form", jsonForm);
  916. updateContractMeeting(formData);
  917. getUsersManageLeader({ userId: this.form.drafter }).then(res => {
  918. let userId = res.data.userId;
  919. this.$set(this.taskForm.variables, "approval", userId);
  920. complete(this.taskForm).then(response => {
  921. this.$modal.msgSuccess(response.msg);
  922. this.$emit('goBack')
  923. });
  924. })
  925. }
  926. else if (this.taskName == '合同签订') {
  927. complete(this.taskForm).then(response => {
  928. this.$modal.msgSuccess(response.msg);
  929. this.$emit('goBack')
  930. });
  931. }
  932. })
  933. } else {
  934. this.form.contractId = this.taskForm.formId;
  935. addContract(this.form).then(response => {
  936. this.$modal.msgSuccess("新增成功");
  937. this.open = false;
  938. this.getList();
  939. });
  940. for (let work of this.workList) {
  941. work.contractId = this.form.contractId
  942. addContractWork(work);
  943. }
  944. for (let payment of this.paymentList) {
  945. payment.contractId = this.form.contractId
  946. addContractPayment(payment);
  947. }
  948. for (let projectId of this.projectContractForm.projectIds) {
  949. addProjectContract({ projectId: projectId, contractId: this.form.contractId });
  950. }
  951. const params = { taskId: this.taskForm.taskId };
  952. getNextFlowNode(params).then(res => {
  953. if (this.commentOpen == false && this.meetingOpen == false) {
  954. getUsersManageLeader({ userId: this.$store.getters.userId }).then(res => {
  955. let userId = res.data.userId;
  956. this.$set(this.taskForm.variables, "approval", userId);
  957. this.$set(this.taskForm.variables, "commentType", '0');
  958. complete(this.taskForm).then(response => {
  959. this.$modal.msgSuccess(response.msg);
  960. this.$emit('goBack')
  961. });
  962. })
  963. }
  964. else if (this.commentOpen == true && this.meetingOpen == false) {
  965. let approvalList = [];
  966. for (let comment of this.commentList) {
  967. comment.contractId = this.form.contractId
  968. addContractComment(comment);
  969. approvalList.push(comment.userId)
  970. }
  971. this.$set(this.taskForm.variables, "approvalList", approvalList);
  972. this.$set(this.taskForm.variables, "commentType", '2');
  973. complete(this.taskForm).then(response => {
  974. this.$modal.msgSuccess(response.msg);
  975. this.$emit('goBack')
  976. });
  977. }
  978. else if (this.commentOpen == false && this.meetingOpen == true) {
  979. this.meetingForm.contractId = this.form.contractId;
  980. let formData = new FormData();
  981. let jsonForm = JSON.stringify(this.meetingForm);
  982. formData.append("form", jsonForm);
  983. addContractMeeting(formData);
  984. this.$set(this.taskForm.variables, "approval", this.meetingForm.hostId);
  985. this.$set(this.taskForm.variables, "commentType", '1');
  986. complete(this.taskForm).then(response => {
  987. this.$modal.msgSuccess(response.msg);
  988. this.$emit('goBack')
  989. });
  990. }
  991. })
  992. }
  993. }
  994. });
  995. },
  996. getContractPath(val) {
  997. let arr = val.split('/upload')
  998. this.form.contractDocument = arr[1]
  999. if (val == "") {
  1000. this.form.contractDocument = ""
  1001. }
  1002. },
  1003. getSignScanPath(val) {
  1004. let arr = val.split('/upload')
  1005. this.form.signScan = arr[1]
  1006. if (val == "") {
  1007. this.form.signScan = ""
  1008. }
  1009. },
  1010. getMeetingPath(val){
  1011. },
  1012. getFileName(name) {
  1013. if (name) {
  1014. let arr = name.split('/')
  1015. return arr[arr.length - 1];
  1016. }
  1017. },
  1018. confirmProject(val) {
  1019. this.open = false
  1020. for (let v of val) {
  1021. this.projectContractForm.projectIds.push(v.projectId);
  1022. }
  1023. this.chooseProjectList = val
  1024. },
  1025. confirmTender(val) {
  1026. this.tbOpen = false
  1027. this.form.tenderId = val.tenderId
  1028. this.chooseTender = val
  1029. this.isSelect = true
  1030. }
  1031. }
  1032. }
  1033. </script>
  1034. <style lang="scss" scoped>
  1035. @import "@/assets/styles/element-reset.scss";
  1036. table {
  1037. /*边框*/
  1038. /* border: 1px solid black; */
  1039. text-align: center;
  1040. border-collapse: collapse;
  1041. /*设置背景颜色*/
  1042. /* background-color: #bfa; */
  1043. td {
  1044. padding: 5px;
  1045. }
  1046. }
  1047. .upload-file-uploader {
  1048. margin-bottom: 5px;
  1049. }
  1050. .upload-file-list .el-upload-list__item {
  1051. border: 1px solid #e4e7ed;
  1052. line-height: 2;
  1053. margin-bottom: 10px;
  1054. position: relative;
  1055. }
  1056. .upload-file-list .ele-upload-list__item-content {
  1057. display: flex;
  1058. justify-content: space-between;
  1059. align-items: center;
  1060. color: inherit;
  1061. }
  1062. .ele-upload-list__item-content-action .el-link {
  1063. margin-right: 10px;
  1064. }
  1065. </style>