detail.vue 34 KB

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