detail.vue 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402
  1. <template>
  2. <basic-container>
  3. <div>
  4. <el-tabs
  5. v-model="activeType"
  6. :before-leave="beforeLeave"
  7. >
  8. <!-- 合同段信息 -->
  9. <el-tab-pane
  10. label="合同段信息"
  11. name="1"
  12. >
  13. <div>
  14. <el-form
  15. :model="contractForm"
  16. :rules="contractRules"
  17. ref="contractForm"
  18. label-width="140px"
  19. >
  20. <el-form-item label="项目名称">
  21. <el-input
  22. v-model="projectInfo.projectName"
  23. disabled
  24. ></el-input>
  25. </el-form-item>
  26. <el-row>
  27. <el-col :span="12">
  28. <el-form-item
  29. label="合同段类型"
  30. prop="contractType"
  31. >
  32. <el-select
  33. :disabled="contractForm.id?true:false"
  34. v-model="contractForm.contractType"
  35. placeholder="请选择"
  36. class="w-100p"
  37. >
  38. <el-option
  39. v-for="item in contractTypeList"
  40. :key="item.id"
  41. :label="item.dictValue"
  42. :value="item.dictKey"
  43. ></el-option>
  44. </el-select>
  45. </el-form-item>
  46. </el-col>
  47. <el-col :span="12">
  48. <el-form-item
  49. label="合同段编号"
  50. prop="contractNumber"
  51. >
  52. <el-input v-model="contractForm.contractNumber"></el-input>
  53. </el-form-item>
  54. </el-col>
  55. </el-row>
  56. <el-row>
  57. <el-col :span="12">
  58. <el-form-item
  59. label="合同段名称"
  60. prop="contractName"
  61. >
  62. <el-input v-model="contractForm.contractName"></el-input>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="12">
  66. <el-form-item
  67. label="参与方进场日期"
  68. prop="contractorJoinTime"
  69. >
  70. <el-date-picker
  71. v-model="contractForm.contractorJoinTime"
  72. type="date"
  73. format="yyyy 年 MM 月 dd 日"
  74. value-format="yyyy-MM-dd HH:mm:ss"
  75. placeholder="选择日期"
  76. ></el-date-picker>
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. <div class="flexBetween">
  81. <el-form-item
  82. style="width:25%;"
  83. label="是否开启电签"
  84. prop="isElectronicSignature"
  85. >
  86. <el-radio-group v-model="contractForm.isElectronicSignature">
  87. <el-radio :label="0">关闭</el-radio>
  88. <el-radio :label="1">开启</el-radio>
  89. </el-radio-group>
  90. </el-form-item>
  91. <el-form-item
  92. style="width:25%;"
  93. label="是否开启试验模块"
  94. prop="isTestModule"
  95. >
  96. <el-radio-group v-model="contractForm.isTestModule">
  97. <el-radio :label="0">关闭</el-radio>
  98. <el-radio :label="1">开启</el-radio>
  99. </el-radio-group>
  100. </el-form-item>
  101. <el-form-item
  102. style="width:25%;"
  103. label="是否引用编号"
  104. prop="isReferenceNumber"
  105. >
  106. <el-radio-group v-model="contractForm.isReferenceNumber">
  107. <el-radio :label="0">否</el-radio>
  108. <el-radio :label="1">是</el-radio>
  109. </el-radio-group>
  110. </el-form-item>
  111. <el-form-item
  112. style="width:25%;"
  113. label="是否开启复制数据"
  114. prop="isCopyData"
  115. >
  116. <el-radio-group v-model="contractForm.isCopyData">
  117. <el-radio :label="0">否</el-radio>
  118. <el-radio :label="1">是</el-radio>
  119. </el-radio-group>
  120. </el-form-item>
  121. </div>
  122. <el-row>
  123. <el-col :span="12">
  124. <el-form-item
  125. label="计划开工日期"
  126. prop="planStartTime"
  127. >
  128. <el-date-picker
  129. v-model="contractForm.planStartTime"
  130. type="date"
  131. format="yyyy 年 MM 月 dd 日"
  132. value-format="yyyy-MM-dd HH:mm:ss"
  133. placeholder="选择日期"
  134. ></el-date-picker>
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="12">
  138. <el-form-item
  139. label="计划完工日期"
  140. prop="planEndTime"
  141. >
  142. <el-date-picker
  143. v-model="contractForm.planEndTime"
  144. type="date"
  145. format="yyyy 年 MM 月 dd 日"
  146. value-format="yyyy-MM-dd HH:mm:ss"
  147. placeholder="选择日期"
  148. ></el-date-picker>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. <el-row>
  153. <el-col :span="12">
  154. <el-form-item
  155. label="实际开工日期"
  156. prop="actualStartTime"
  157. >
  158. <el-date-picker
  159. v-model="contractForm.actualStartTime"
  160. type="date"
  161. format="yyyy 年 MM 月 dd 日"
  162. value-format="yyyy-MM-dd HH:mm:ss"
  163. placeholder="选择日期"
  164. ></el-date-picker>
  165. </el-form-item>
  166. </el-col>
  167. <el-col :span="12">
  168. <el-form-item
  169. label="实际完工日期"
  170. prop="actualEndTime"
  171. >
  172. <el-date-picker
  173. v-model="contractForm.actualEndTime"
  174. type="date"
  175. format="yyyy 年 MM 月 dd 日"
  176. value-format="yyyy-MM-dd HH:mm:ss"
  177. placeholder="选择日期"
  178. ></el-date-picker>
  179. </el-form-item>
  180. </el-col>
  181. </el-row>
  182. <el-row>
  183. <el-col :span="12">
  184. <el-form-item
  185. label="业主单位名称"
  186. v-if="contractForm.contractType==1"
  187. prop="contractorUnitName"
  188. >
  189. <el-input v-model="contractForm.contractorUnitName"></el-input>
  190. </el-form-item>
  191. <el-form-item
  192. v-if="contractForm.contractType==2"
  193. label="监理单位名称"
  194. prop="supervisionUnitName"
  195. >
  196. <el-input v-model="contractForm.supervisionUnitName"></el-input>
  197. </el-form-item>
  198. <el-form-item
  199. v-if="contractForm.contractType==3"
  200. label="建设单位名称"
  201. prop="supervisionUnitName"
  202. >
  203. <el-input v-model="contractForm.supervisionUnitName"></el-input>
  204. </el-form-item>
  205. </el-col>
  206. <el-col :span="12">
  207. <el-form-item
  208. label="合同金额"
  209. prop="contractAmount"
  210. >
  211. <el-input v-model="contractForm.contractAmount">
  212. <template slot="append">万元</template>
  213. </el-input>
  214. </el-form-item>
  215. </el-col>
  216. </el-row>
  217. <el-row v-if="contractForm.contractType==1">
  218. <el-col :span="12">
  219. <el-form-item
  220. label="施工单位名称"
  221. prop="constructionUnitName"
  222. >
  223. <el-input v-model="contractForm.constructionUnitName"></el-input>
  224. </el-form-item>
  225. </el-col>
  226. <el-col :span="12">
  227. <el-form-item
  228. label="上传开工令"
  229. prop="startFileUrl"
  230. >
  231. <template v-if="isBackShow">
  232. <el-link
  233. type="primary"
  234. @click="downloadFile"
  235. >开工令
  236. </el-link>
  237. <el-button
  238. @click="delFile"
  239. class="mg-l-10"
  240. style="color:red"
  241. type="text"
  242. icon="el-icon-circle-close"
  243. ></el-button>
  244. </template>
  245. <template v-else>
  246. <el-upload
  247. action="/api/blade-resource/oss/endpoint/put-file-attach"
  248. :on-remove="handleRemove"
  249. :limit="1"
  250. :headers=headers
  251. :on-exceed="handleExceed"
  252. :on-success="handleSuccess"
  253. :file-list="fileList"
  254. >
  255. <el-button
  256. size="small"
  257. type="primary"
  258. >点击上传
  259. </el-button>
  260. </el-upload>
  261. </template>
  262. </el-form-item>
  263. </el-col>
  264. </el-row>
  265. <el-row v-if="contractForm.contractType==1">
  266. <el-col :span="12">
  267. <el-form-item
  268. label="监理单位名称"
  269. prop="supervisionUnitName"
  270. >
  271. <el-input v-model="contractForm.supervisionUnitName"></el-input>
  272. </el-form-item>
  273. </el-col>
  274. <el-col :span="12">
  275. <el-form-item
  276. label="试验室名称"
  277. prop="laboratoryName"
  278. >
  279. <el-input v-model="contractForm.laboratoryName"></el-input>
  280. </el-form-item>
  281. </el-col>
  282. </el-row>
  283. <el-divider></el-divider>
  284. <el-row :gutter="20">
  285. <el-col
  286. :span="12"
  287. v-show="contractForm.contractType!=1"
  288. >
  289. <div class="head-font">合同段权限配置</div>
  290. <el-checkbox-group
  291. v-model="idList"
  292. class="martop15"
  293. >
  294. <el-checkbox
  295. :label="item.contractId"
  296. :key="key"
  297. v-for="(item,key) in checkList"
  298. >{{ item.contractName }}
  299. </el-checkbox>
  300. </el-checkbox-group>
  301. </el-col>
  302. <el-col :span="12">
  303. <div class="head-font">组卷归档默认信息</div>
  304. <el-row class="martop15">
  305. <el-col :span="12">
  306. <el-form-item
  307. label="立卷人"
  308. prop="filer"
  309. >
  310. <el-input v-model="contractForm.filer"></el-input>
  311. </el-form-item>
  312. </el-col>
  313. <el-col :span="12">
  314. <el-form-item
  315. label="保管期限"
  316. prop="storagePeriod"
  317. >
  318. <el-select
  319. v-model="contractForm.storagePeriod"
  320. placeholder="请选择"
  321. class="w-100p"
  322. >
  323. <el-option
  324. v-for="item in storagePeriodList"
  325. :key="item.id"
  326. :label="item.dictValue"
  327. :value="item.dictKey"
  328. ></el-option>
  329. </el-select>
  330. </el-form-item>
  331. </el-col>
  332. </el-row>
  333. <el-row>
  334. <el-col :span="12">
  335. <el-form-item
  336. label="审核人"
  337. prop="reviewer"
  338. >
  339. <el-input v-model="contractForm.reviewer"></el-input>
  340. </el-form-item>
  341. </el-col>
  342. <el-col :span="12">
  343. <el-form-item
  344. label="保管密级"
  345. prop="securityLevel"
  346. >
  347. <el-select
  348. v-model="contractForm.securityLevel"
  349. placeholder="请选择"
  350. class="w-100p"
  351. >
  352. <el-option
  353. v-for="item in securityLevelList"
  354. :key="item.id"
  355. :label="item.dictValue"
  356. :value="item.dictKey"
  357. ></el-option>
  358. </el-select>
  359. </el-form-item>
  360. </el-col>
  361. </el-row>
  362. <el-row>
  363. <el-col :span="12">
  364. <el-form-item
  365. label="档案前缀"
  366. prop="prefix"
  367. >
  368. <el-input v-model="contractForm.prefix"></el-input>
  369. </el-form-item>
  370. </el-col>
  371. <el-col :span="12">
  372. </el-col>
  373. </el-row>
  374. </el-col>
  375. <el-col
  376. :span="12"
  377. v-if="contractForm.contractType==1"
  378. >
  379. <div class="head-font">附加信息</div>
  380. <el-form-item
  381. label="项目地址"
  382. prop="projectPlace"
  383. >
  384. <!-- <el-input v-model="contractForm.projectPlace" placeholder="点击后面地图选取地址">
  385. <el-button slot="append" icon="el-icon-map-location" @click="mapDialogVisible = true"></el-button>
  386. </el-input> -->
  387. <avue-input-map
  388. :params="params"
  389. placeholder="请选择地图"
  390. v-model="flageData"
  391. @change="mapChange"
  392. ></avue-input-map>
  393. </el-form-item>
  394. <el-form-item
  395. label="起始桩号"
  396. prop="startStation"
  397. >
  398. <el-input v-model="contractForm.startStation"></el-input>
  399. </el-form-item>
  400. <el-form-item
  401. label="结束桩号"
  402. prop="endStation"
  403. >
  404. <el-input v-model="contractForm.endStation"></el-input>
  405. </el-form-item>
  406. </el-col>
  407. </el-row>
  408. </el-form>
  409. </div>
  410. </el-tab-pane>
  411. <el-tab-pane
  412. v-if="contractForm.contractType == 1"
  413. label="分配WBS"
  414. name="2"
  415. >
  416. <div>
  417. <div
  418. v-if="!wbsId"
  419. class="text-align-c"
  420. >项目暂未分配wbs树
  421. </div>
  422. <tree-tree
  423. :left-tree-data="leftTreeData"
  424. ref="treetotree"
  425. @onAddTree="treeChang"
  426. @onDelTree="treeChang"
  427. ></tree-tree>
  428. </div>
  429. </el-tab-pane>
  430. <el-tab-pane
  431. label="分配项目人员"
  432. name="3"
  433. >
  434. <div>
  435. <div class="flex jc-al-c">
  436. <span class="mg-r-10">项目名称</span>
  437. <el-input
  438. v-model="projectInfo.projectName"
  439. disabled
  440. style="width:300px;margin-right:30px;"
  441. ></el-input>
  442. <span class="mg-r-10">合同段名称</span>
  443. <el-input
  444. v-model="contractForm.contractName"
  445. disabled
  446. style="width:300px;"
  447. ></el-input>
  448. </div>
  449. <el-divider></el-divider>
  450. <div class="flex jc-al-c mg-b-10">
  451. <div>
  452. <span class="mg-r-10">角色方</span>
  453. <el-radio-group v-model="rId">
  454. <el-radio-button
  455. v-for="(item,key) in roleList"
  456. :label="item.id"
  457. :key="key"
  458. >{{ item.roleName }}
  459. </el-radio-button>
  460. </el-radio-group>
  461. </div>
  462. <div>
  463. <span class="mg-r-10 mg-l-20">请选择岗位</span>
  464. <el-select
  465. v-model="postId"
  466. filterable
  467. placeholder="请输入搜索"
  468. >
  469. <el-option
  470. v-for="item in postList"
  471. :key="item.id"
  472. :label="item.roleName"
  473. :value="item.id"
  474. ></el-option>
  475. </el-select>
  476. </div>
  477. </div>
  478. <!-- table表 -->
  479. <div>
  480. <el-table
  481. :data="contractUserList"
  482. border
  483. height="420"
  484. style="width: 100%"
  485. >
  486. <el-table-column
  487. prop="name"
  488. label="姓名"
  489. align="center"
  490. ></el-table-column>
  491. <el-table-column
  492. prop="account"
  493. label="登录账号"
  494. align="center"
  495. ></el-table-column>
  496. <el-table-column
  497. prop="password"
  498. label="密码"
  499. align="center"
  500. ></el-table-column>
  501. <el-table-column
  502. label="操作"
  503. align="center"
  504. >
  505. <template slot-scope="scope">
  506. <el-link
  507. class="mg-r-20"
  508. type="primary"
  509. @click="copyAccPas(scope.row)"
  510. >复制
  511. </el-link>
  512. <el-link
  513. class="mg-r-20"
  514. type="primary"
  515. @click="resetPassword(scope.row)"
  516. >重置密码
  517. </el-link>
  518. <el-link
  519. type="danger"
  520. @click="handleDelete(scope.$index, scope.row)"
  521. >删除
  522. </el-link>
  523. </template>
  524. </el-table-column>
  525. </el-table>
  526. <el-input
  527. v-model="copyText"
  528. ref="copyInput"
  529. type="textarea"
  530. style='opacity: 0;position: absolute;height:1px;overflow:hidden;'
  531. ></el-input>
  532. </div>
  533. <div class="martop10 flexEnd">
  534. <el-pagination
  535. background
  536. @size-change="handleSizeChange"
  537. @current-change="handleCurrentChange"
  538. :current-page.sync="pageindx"
  539. :page-size="pagesize"
  540. layout="total, prev, pager, next"
  541. :total="total"
  542. >
  543. </el-pagination>
  544. </div>
  545. <div class="flex jc-al-c mg-t-20">
  546. <span>添加项目人员</span>
  547. <el-select
  548. class="marleft10"
  549. v-model="userId"
  550. filterable
  551. placeholder="请输入搜索"
  552. >
  553. <el-option
  554. v-for="item in userList"
  555. :key="item.id"
  556. :label="item.name"
  557. :value="item.id"
  558. ></el-option>
  559. </el-select>
  560. <el-button
  561. class="marleft10"
  562. type="success"
  563. @click="addUserToProject"
  564. >添加
  565. </el-button>
  566. <el-button
  567. type="primary"
  568. @click="rputerPush()"
  569. >创建新用户
  570. </el-button>
  571. <el-button
  572. type="danger"
  573. @click="handleDeletes"
  574. >全部删除
  575. </el-button>
  576. </div>
  577. <el-divider></el-divider>
  578. </div>
  579. </el-tab-pane>
  580. </el-tabs>
  581. <div class="flexEnd marbottom20">
  582. <el-button
  583. type="success"
  584. size="medium"
  585. :loading="btnLoad"
  586. @click="saveQuit"
  587. >保存并退出
  588. </el-button>
  589. <el-button
  590. type="info"
  591. size="medium"
  592. :loading="btnLoad"
  593. v-if="activeType != 1"
  594. @click="saveNext('p')"
  595. >保存并返回上一步
  596. </el-button>
  597. <el-button
  598. type="info"
  599. size="medium"
  600. :loading="btnLoad"
  601. v-if="activeType != 3"
  602. @click="saveNext('n')"
  603. >保存并进入下一步
  604. </el-button>
  605. </div>
  606. </div>
  607. </basic-container>
  608. </template>
  609. <script>
  610. import {getProjectDeatil, findProjectTree, treeAllConstruction, getContractRelation} from "@/api/manager/projectinfo";
  611. import {
  612. submitContractInfo,
  613. getContractInfo,
  614. getContractInfo2,
  615. delFileFromUrl,
  616. searchRole,
  617. findAllUserByCondition,
  618. findUserList,
  619. saveUserInfoByProjectTow,
  620. removeUsersByIds,
  621. resetPasswordByUserId,
  622. submitWbsTreeInContract,
  623. getContractInfoTree
  624. } from "@/api/manager/contractinfo";
  625. import {getDictionary} from "@/api/system/dict";
  626. import {getDictionary as getDictbiz} from "@/api/system/dictbiz";
  627. import {remove as removeFile} from "@/api/resource/attach";
  628. import website from '@/config/website';
  629. import {Base64} from 'js-base64';
  630. import {getToken} from '@/util/auth';
  631. import {mapGetters} from "vuex";
  632. import treeTree from "@/components/tree-tree/main"
  633. export default {
  634. components: {
  635. treeTree
  636. },
  637. data() {
  638. var checkPlace = (rule, value, callback) => {
  639. if (this.flageData && this.flageData.length > 2 && this.flageData[2]) {
  640. callback();
  641. } else {
  642. callback(new Error('请选取项目地址'));
  643. }
  644. }
  645. var checkDate = (rule, value, callback) => {
  646. if (value && this.contractForm.planStartTime) {
  647. if (Date.parse(value) < Date.parse(this.contractForm.planStartTime)) {
  648. callback(new Error('计划完工日期不能小于开工日期'));
  649. }
  650. }
  651. callback();
  652. };
  653. var checkDate2 = (rule, value, callback) => {
  654. if (value && this.contractForm.actualStartTime) {
  655. if (Date.parse(value) < Date.parse(this.contractForm.actualStartTime)) {
  656. callback(new Error('实际完工日期不能小于开工日期'));
  657. }
  658. }
  659. callback();
  660. };
  661. var checkIsNumber = (rule, value, callback) => {
  662. if (value != Number(value)) {
  663. callback(new Error('金额必须是数字'));
  664. }
  665. callback();
  666. };
  667. return {
  668. idList: [],
  669. checkList: [],
  670. postIdss: '',
  671. //#region
  672. pageindx: 1,
  673. pagesize: 10,
  674. total: 0,
  675. //#endregion
  676. activeType: '1',
  677. typeChang: {
  678. 1: false,
  679. 2: false,
  680. 3: false,
  681. },
  682. btnLoad: false,
  683. pid: '',
  684. cid: '',
  685. projectInfo: {},
  686. contractTypeList: [],
  687. storagePeriodList: [],//保管期限
  688. securityLevelList: [],//保管密级
  689. fileList: [],
  690. headers: {},
  691. isBackShow: false,
  692. contractForm: {
  693. contractType: 1,
  694. contractAmount: 0,
  695. isElectronicSignature: 0,
  696. isTestModule: 0,
  697. isReferenceNumber: 0,
  698. isCopyData: 0,
  699. },
  700. contractRules: {
  701. contractName: [
  702. {required: true, message: '请输入合同段名称', trigger: 'blur'},
  703. ],
  704. contractType: [
  705. {required: true, message: '请选择合同段类型', trigger: 'change'}
  706. ],
  707. contractNumber: [
  708. {required: true, message: '请输入合同段编号', trigger: 'blur'},
  709. ],
  710. isElectronicSignature: [
  711. {required: true, message: '请设置电签状态', trigger: 'change'},
  712. ],
  713. isTestModule: [
  714. {required: true, message: '请设置试验模块状态', trigger: 'change'},
  715. ],
  716. isReferenceNumber: [
  717. {required: true, message: '请设置是否引用编号', trigger: 'change'},
  718. ],
  719. isCopyData: [
  720. {required: true, message: '请设置是否复制数据', trigger: 'change'},
  721. ],
  722. contractorUnitName: [
  723. {required: true, message: '请输入业主单位名称', trigger: 'blur'},
  724. ],
  725. constructionUnitName: [
  726. {required: true, message: '请输入施工单位名称', trigger: 'blur'},
  727. ],
  728. supervisionUnitName: [
  729. {required: true, message: '请输入监理单位名称', trigger: 'blur'},
  730. ],
  731. startStation: [
  732. {required: true, message: '请输入起始桩号', trigger: 'blur'},
  733. ],
  734. endStation: [
  735. {required: true, message: '请输入结束桩号', trigger: 'blur'},
  736. ],
  737. projectPlace: [
  738. {required: true, validator: checkPlace, trigger: 'blur'},
  739. ],
  740. planEndTime: [
  741. {validator: checkDate, trigger: 'blur'},
  742. ],
  743. actualEndTime: [
  744. {validator: checkDate2, trigger: 'blur'},
  745. ],
  746. contractAmount: [
  747. {validator: checkIsNumber, trigger: 'blur'}
  748. ]
  749. },
  750. mapDialogVisible: false,
  751. params: {
  752. zoom: 10,
  753. // zoomEnable: false,
  754. // dragEnable: false,
  755. },
  756. flageData: [],
  757. rId: '',
  758. roleList: [],
  759. postId: '',
  760. postList: [],
  761. contractUserList: [],
  762. userId: '',
  763. userList: [],
  764. copyText: '',
  765. wbsId: '',
  766. leftTreeData: [],
  767. }
  768. },
  769. computed: {
  770. ...mapGetters(["userInfo"]),
  771. },
  772. watch: {
  773. contractForm: {
  774. handler: function () { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  775. this.typeChang['1'] = true;
  776. },
  777. deep: true
  778. },
  779. activeType: async function (newValue) {
  780. if (newValue == '3') {
  781. this.getUserByName();
  782. this.searchRole()
  783. } else if (newValue == '2') {
  784. await this.getLeftTree();
  785. this.getRightTree();
  786. }
  787. },
  788. rId: function () {
  789. this.postIdss = ''
  790. this.postId = ''
  791. this.contractUserList = [];//从超级管理员,切到其他角色,不会清空列表
  792. this.roleList.forEach(val => {
  793. if (val.id === this.rId) {
  794. if (val.children) {
  795. this.postList = val.children
  796. this.postId = this.postList[0].id;//切换的时候默认选中第一个岗位
  797. } else {
  798. this.postList = []
  799. }
  800. if (val.roleName === '超级管理员') {
  801. this.postIdss = this.rId
  802. this.findAllUserByCondition(this.rId)
  803. }
  804. }
  805. })
  806. },
  807. postId: function (newValue) {
  808. if (newValue) {
  809. this.findAllUserByCondition();
  810. } else {
  811. this.contractUserList = [];
  812. }
  813. },
  814. 'contractForm.contractType'(newValue) {
  815. if (newValue != 1) {
  816. this.treeAllConstruction()
  817. }
  818. }
  819. },
  820. created() {
  821. this.init();
  822. //console.log(this.userInfo)
  823. },
  824. mounted() {
  825. this.$nextTick(() => {
  826. this.typeChang = {
  827. 1: false,
  828. 2: false,
  829. 3: false,
  830. }
  831. })
  832. },
  833. methods: {
  834. //#region //后加分页
  835. handleSizeChange(val) {
  836. this.pagesize = val
  837. this.findAllUserByCondition()
  838. },
  839. handleCurrentChange(val) {
  840. this.pageindx = val
  841. this.findAllUserByCondition()
  842. },
  843. rputerPush() {
  844. this.$router.push({
  845. path: '/system/user',
  846. query: {tankai: true}
  847. })
  848. },
  849. //#endregion
  850. //#region 甘云杰
  851. async searchRole() {
  852. const {data: res} = await searchRole()
  853. console.log(res);
  854. if (res.code === 200) {
  855. this.roleList = res.data
  856. }
  857. },
  858. async init() {
  859. this.pid = this.$route.query.pid;
  860. this.cid = this.$route.query.cid;
  861. if (!this.cid) {
  862. this.contractForm.pid = this.pid;
  863. } else {
  864. if (this.$route.query.contractType == 1) {
  865. await this.getContractInfo();//获取合同段基本信息
  866. } else if (this.$route.query.contractType == 2 || this.$route.query.contractType == 3) {
  867. await this.getContractInfo2()
  868. await this.getContractRelation(); //监理、业主关联施工
  869. }
  870. }
  871. await this.getProjectDeatil();//获取项目详情
  872. if (this.$route.query.type) {
  873. console.log(this.$route.query.type);
  874. this.activeType = this.$route.query.type;
  875. }
  876. this.getContractTypeList();//获取合同类型
  877. this.getStoragePeriodList();//获取业务字典
  878. this.getSecurityLevelList();//获取安全等级
  879. this.setHeaders();
  880. },
  881. beforeLeave(activeName, oldActiveName) {
  882. return new Promise((resolve, reject) => {
  883. if (oldActiveName == '1' && !this.contractForm.id) {
  884. this.$message({
  885. type: "warning",
  886. message: "请先保存合同段后,再进行合同段的分配"
  887. });
  888. reject();
  889. }
  890. if (this.typeChang[oldActiveName]) {
  891. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  892. confirmButtonText: '确定',
  893. cancelButtonText: '不用',
  894. type: 'warning'
  895. }).then(() => {
  896. switch (oldActiveName) {
  897. case '1':
  898. this.savecontract().then((res) => {
  899. this.contractForm.id = res.data.data.id;
  900. resolve();
  901. this.$message({
  902. type: "success",
  903. message: "保存成功!"
  904. });
  905. });
  906. break;
  907. case '2':
  908. this.saveWbsTree().then(() => {
  909. resolve();
  910. this.$message({
  911. type: "success",
  912. message: "保存成功!"
  913. });
  914. }).catch(() => {
  915. this.getRightTree();
  916. reject();
  917. })
  918. break;
  919. }
  920. }).catch(() => {
  921. this.typeChang[oldActiveName] = false;
  922. resolve();
  923. })
  924. } else {
  925. resolve();
  926. }
  927. })
  928. },
  929. getProjectDeatil() {
  930. return new Promise((resolve) => {
  931. getProjectDeatil(this.pid).then((res) => {
  932. this.projectInfo = res.data.data;
  933. this.wbsId = this.projectInfo.referenceWbsTemplateId;
  934. resolve();
  935. }).finally(() => {
  936. resolve();
  937. })
  938. })
  939. },
  940. getContractRelation() {
  941. return new Promise((resolve) => {
  942. getContractRelation(this.cid).then((res) => {
  943. console.log("ids", res)
  944. this.idList = res.data.data && res.data.data.map(item => {
  945. return item.id
  946. })
  947. resolve();
  948. }).finally(() => {
  949. resolve();
  950. })
  951. })
  952. },
  953. getContractInfo() {
  954. return new Promise((resolve) => {
  955. getContractInfo(this.cid).then((res) => {
  956. this.contractForm = res.data.data;
  957. if (this.contractForm.startFileUrl) {
  958. this.isBackShow = true;
  959. }
  960. if (this.contractForm.projectPlace) {
  961. this.flageData = ['', '', this.contractForm.projectPlace]
  962. }
  963. if (Number(this.contractForm.contractAmount) < 0) {
  964. this.contractForm.contractAmount = 0;
  965. }
  966. if (Number(this.contractForm.securityLevel) < 0) {
  967. this.contractForm.securityLevel = 0;
  968. }
  969. if (Number(this.contractForm.storagePeriod) < 0) {
  970. this.contractForm.storagePeriod = 0;
  971. }
  972. this.$nextTick(() => {
  973. this.typeChang['1'] = false;
  974. })
  975. }).finally(() => {
  976. resolve();
  977. })
  978. })
  979. },
  980. getContractInfo2() {
  981. return new Promise((resolve) => {
  982. getContractInfo2({id: this.cid, contractType: this.contractType}).then((res) => {
  983. this.contractForm = res.data.data.contractInfo
  984. if (res.data.data.wbsTreeContractList.length > 0) {
  985. this.idList = []
  986. res.data.data.wbsTreeContractList.forEach(val => {
  987. if (val.contractIdRelation) {
  988. this.idList.push(val.contractIdRelation)
  989. }
  990. })
  991. }
  992. if (this.contractForm.startFileUrl) {
  993. this.isBackShow = true;
  994. }
  995. if (this.contractForm.projectPlace) {
  996. this.flageData = ['', '', this.contractForm.projectPlace]
  997. }
  998. if (Number(this.contractForm.contractAmount) < 0) {
  999. this.contractForm.contractAmount = 0;
  1000. }
  1001. if (Number(this.contractForm.securityLevel) < 0) {
  1002. this.contractForm.securityLevel = 0;
  1003. }
  1004. if (Number(this.contractForm.storagePeriod) < 0) {
  1005. this.contractForm.storagePeriod = 0;
  1006. }
  1007. this.$nextTick(() => {
  1008. this.typeChang['1'] = false;
  1009. })
  1010. }).finally(() => {
  1011. resolve();
  1012. })
  1013. })
  1014. },
  1015. async saveQuit() {
  1016. this.btnLoad = true;
  1017. try {
  1018. if (this.activeType == '1') {
  1019. await this.savecontract();
  1020. } else if (this.activeType == '2') {
  1021. await this.saveWbsTree();
  1022. }
  1023. } catch (error) {
  1024. this.btnLoad = false;
  1025. if(this.activeType == '2'){
  1026. this.getRightTree();
  1027. }
  1028. return;
  1029. }
  1030. this.$message({
  1031. type: "success",
  1032. message: "保存成功!"
  1033. });
  1034. this.btnLoad = false;
  1035. this.$router.go(-1);
  1036. },
  1037. async saveNext(type) {
  1038. this.btnLoad = true;
  1039. try {
  1040. if (this.activeType == '1') {
  1041. let res = await this.savecontract();
  1042. this.contractForm.id = res.data.data.id;
  1043. } else if (this.activeType == '2') {
  1044. await this.saveWbsTree();
  1045. }
  1046. } catch (error) {
  1047. this.btnLoad = false;
  1048. if(this.activeType == '2'){
  1049. this.getRightTree();
  1050. }
  1051. return;
  1052. }
  1053. this.$message({
  1054. type: "success",
  1055. message: "保存成功!"
  1056. });
  1057. this.typeChang[this.activeType] = false;
  1058. let num = Number(this.activeType);
  1059. if (this.contractForm.contractType == 1) {
  1060. if (type == 'n') {
  1061. num++;
  1062. } else if (type == 'p') {
  1063. num--;
  1064. }
  1065. } else {
  1066. if (type == 'n') {
  1067. num = num + 2;
  1068. } else if (type == 'p') {
  1069. num = num - 2
  1070. }
  1071. }
  1072. this.activeType = num.toString();
  1073. this.btnLoad = false;
  1074. },
  1075. getIds() {
  1076. },
  1077. savecontract() {
  1078. return new Promise((resolve, reject) => {
  1079. this.$refs['contractForm'].validate((valid) => {
  1080. if (valid) {
  1081. if (this.flageData.length == 3) {
  1082. this.contractForm.projectPlace = this.flageData[2];
  1083. }
  1084. let das = this.contractForm
  1085. if (this.contractForm.contractType != 1) {
  1086. if (this.idList.length > 0) {
  1087. delete das.startStation
  1088. delete das.endStation
  1089. delete das.projectPlace
  1090. das.idList = []
  1091. this.idList.forEach(val => {
  1092. das.idList.push({contractId: val})
  1093. })
  1094. resolve(submitContractInfo(das))
  1095. this.btnLoad = false
  1096. } else {
  1097. this.$message({
  1098. type: "error",
  1099. message: "请先选择合同段权限配置"
  1100. })
  1101. this.btnLoad = false
  1102. }
  1103. } else {
  1104. resolve(submitContractInfo(das))
  1105. this.btnLoad = false
  1106. }
  1107. } else {
  1108. reject('验证失败')
  1109. this.btnLoad = false
  1110. }
  1111. })
  1112. })
  1113. },
  1114. handleRemove(file) {
  1115. //console.log(file, fileList);
  1116. removeFile(file.response.data.attachId).then(() => {
  1117. this.contractForm.startFileUrl = '';
  1118. })
  1119. },
  1120. handleExceed() {
  1121. this.$message.warning(`当前限制选择 1 个文件,请先移除后,再次上传`);
  1122. },
  1123. handleSuccess(res) {
  1124. this.contractForm.startFileUrl = res.data.link;
  1125. },
  1126. setHeaders() {
  1127. this.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
  1128. this.headers[website.tokenHeader] = 'bearer ' + getToken()
  1129. },
  1130. downloadFile() {
  1131. window.open(this.contractForm.startFileUrl);
  1132. },
  1133. delFile() {
  1134. this.$confirm('是否删除该文件?', '删除开工令', {
  1135. distinguishCancelAndClose: true,
  1136. confirmButtonText: '删除',
  1137. cancelButtonText: '取消'
  1138. }).then(() => {
  1139. delFileFromUrl(this.contractForm.startFileUrl).then(() => {
  1140. this.isBackShow = false;
  1141. this.contractForm.startFileUrl = '';
  1142. })
  1143. })
  1144. },
  1145. addUserToProject() {
  1146. if (!this.userId) {
  1147. this.$message({
  1148. type: "warning",
  1149. message: "请先选择用户再进行添加"
  1150. });
  1151. return;
  1152. }
  1153. let roleId = ''
  1154. if (!this.postIdss) {
  1155. if (!this.postId) {
  1156. this.$message({
  1157. type: "warning",
  1158. message: "请先选择岗位再进行添加"
  1159. });
  1160. return;
  1161. } else {
  1162. roleId = this.postId
  1163. }
  1164. } else {
  1165. roleId = this.postIdss
  1166. }
  1167. let list = [{
  1168. projectId: this.pid,
  1169. contractId: this.contractForm.id,
  1170. userId: this.userId,
  1171. roleId: roleId,
  1172. }];
  1173. saveUserInfoByProjectTow(list).then(() => {
  1174. this.findAllUserByCondition(this.rId);
  1175. })
  1176. },
  1177. findAllUserByCondition(val) {
  1178. let rId
  1179. if (this.postId) {
  1180. rId = this.postId
  1181. } else {
  1182. rId = val
  1183. }
  1184. findAllUserByCondition({
  1185. cId: this.contractForm.id,
  1186. pId: this.pid,
  1187. // "postId": this.postId,
  1188. rId: rId,
  1189. },
  1190. this.pagesize,
  1191. this.pageindx,
  1192. ).then((res) => {
  1193. this.contractUserList = res.data.data.records;
  1194. this.total = res.data.data.total
  1195. })
  1196. },
  1197. handleDelete(index, row) {
  1198. this.$confirm('是否将该用户移除出合同段', '提示', {
  1199. confirmButtonText: '确定',
  1200. cancelButtonText: '取消',
  1201. type: 'warning'
  1202. }).then(() => {
  1203. removeUsersByIds(row.id).then(() => {
  1204. this.contractUserList.splice(index, 1);
  1205. this.$message({
  1206. type: "success",
  1207. message: "删除成功!"
  1208. });
  1209. })
  1210. })
  1211. },
  1212. handleDeletes() {
  1213. this.$confirm('是否将所有用户移除出合同段', '提示', {
  1214. confirmButtonText: '确定',
  1215. cancelButtonText: '取消',
  1216. type: 'warning'
  1217. }).then(() => {
  1218. let ids = [];
  1219. this.contractUserList.forEach((element) => {
  1220. ids.push(element.id);
  1221. })
  1222. removeUsersByIds(ids.join(',')).then(() => {
  1223. this.contractUserList = [];
  1224. this.$message({
  1225. type: "success",
  1226. message: "删除成功!"
  1227. });
  1228. })
  1229. })
  1230. },
  1231. copyAccPas(row) {
  1232. this.copyText = `姓名:${row.name}
  1233. 账号:${row.account}
  1234. 密码:${row.password}`;
  1235. this.$nextTick(() => {
  1236. this.$refs.copyInput.select()
  1237. document.execCommand('copy')
  1238. this.$message({
  1239. type: "success",
  1240. message: "成功复制在剪贴板!"
  1241. });
  1242. })
  1243. },
  1244. resetPassword(row) {
  1245. this.$confirm('是否将用户【' + row.name + '】密码重置为123456', '提示', {
  1246. confirmButtonText: '确定',
  1247. cancelButtonText: '取消',
  1248. type: 'warning'
  1249. }).then(() => {
  1250. resetPasswordByUserId(row.uid).then(() => {
  1251. row.password = '123456';
  1252. this.$message({
  1253. type: "success",
  1254. message: "重置成功!"
  1255. });
  1256. })
  1257. })
  1258. },
  1259. getContractTypeList() {
  1260. if (this.contractTypeList.length > 1) {
  1261. return;
  1262. }
  1263. getDictionary({
  1264. code: 'contract_type'
  1265. }).then((res) => {
  1266. res.data.data.forEach(element => {
  1267. element.dictKey = Number(element.dictKey)
  1268. });
  1269. this.contractTypeList = res.data.data;
  1270. })
  1271. },
  1272. getUserByName() {
  1273. findUserList('').then((res) => {
  1274. this.userList = res.data.data;
  1275. })
  1276. },
  1277. getLeftTree() {
  1278. return new Promise((resolve) => {
  1279. if (!this.leftTreeData.length) {
  1280. findProjectTree(this.projectInfo.id, this.wbsId).then((res) => {
  1281. if (Array.isArray(res.data.data)) {
  1282. this.leftTreeData = res.data.data;
  1283. } else {
  1284. this.leftTreeData = [];
  1285. }
  1286. resolve();
  1287. }).finally(() => {
  1288. resolve();
  1289. })
  1290. }
  1291. resolve();
  1292. })
  1293. },
  1294. getRightTree() {
  1295. console.log(this.wbsId, this.projectInfo.id, this.contractForm.id);
  1296. getContractInfoTree(this.wbsId, this.projectInfo.id, this.contractForm.id).then((res) => {
  1297. if (Array.isArray(res.data.data)) {
  1298. this.$refs.treetotree.setRightTree(res.data.data);
  1299. }
  1300. })
  1301. },
  1302. saveWbsTree() {
  1303. let obj = {};
  1304. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  1305. obj = {
  1306. wbsId: this.wbsId,
  1307. projectId: this.projectInfo.id,
  1308. contractId: this.contractForm.id,
  1309. wbsTreeIds: ids
  1310. }
  1311. return submitWbsTreeInContract(obj);
  1312. },
  1313. treeChang() {
  1314. this.typeChang[2] = true;
  1315. },
  1316. mapChange() {
  1317. this.$refs['contractForm'].validateField('projectPlace');
  1318. },
  1319. getStoragePeriodList() {
  1320. if (this.storagePeriodList.length > 1) {
  1321. return;
  1322. }
  1323. getDictbiz({
  1324. code: 'storage_period'
  1325. }).then((res) => {
  1326. res.data.data.forEach(element => {
  1327. element.dictKey = Number(element.dictKey)
  1328. });
  1329. this.storagePeriodList = res.data.data;
  1330. })
  1331. },
  1332. getSecurityLevelList() {
  1333. if (this.securityLevelList.length > 1) {
  1334. return;
  1335. }
  1336. getDictbiz({
  1337. code: 'security_level'
  1338. }).then((res) => {
  1339. res.data.data.forEach(element => {
  1340. element.dictKey = Number(element.dictKey)
  1341. });
  1342. this.securityLevelList = res.data.data;
  1343. })
  1344. },
  1345. //#endregion
  1346. //#region 合同段信息
  1347. async treeAllConstruction() {
  1348. const {data: res} = await treeAllConstruction({projectId: this.$route.query.pid})
  1349. console.log(res);
  1350. if (res.code == 200) {
  1351. this.checkList = res.data
  1352. }
  1353. },
  1354. //#endregion
  1355. }
  1356. };
  1357. </script>
  1358. <style scoped lang="scss">
  1359. .bm-view {
  1360. width: 100%;
  1361. height: 300px;
  1362. }
  1363. .head-font {
  1364. font-size: 20px;
  1365. font-weight: bold;
  1366. }
  1367. </style>