detail.vue 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155
  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. <!-- table表 -->
  395. <div>
  396. <el-table
  397. :data="contractUserList"
  398. border
  399. height="420"
  400. style="width: 100%"
  401. >
  402. <el-table-column
  403. prop="name"
  404. label="姓名"
  405. align="center"
  406. ></el-table-column>
  407. <el-table-column
  408. prop="account"
  409. label="登录账号"
  410. align="center"
  411. ></el-table-column>
  412. <el-table-column
  413. prop="password"
  414. label="密码"
  415. align="center"
  416. ></el-table-column>
  417. <el-table-column
  418. label="操作"
  419. align="center"
  420. >
  421. <template slot-scope="scope">
  422. <el-link
  423. class="mg-r-20"
  424. type="primary"
  425. @click="copyAccPas(scope.row)"
  426. >复制</el-link>
  427. <el-link
  428. class="mg-r-20"
  429. type="primary"
  430. @click="resetPassword(scope.row)"
  431. >重置密码</el-link>
  432. <el-link
  433. type="danger"
  434. @click="handleDelete(scope.$index, scope.row)"
  435. >删除</el-link>
  436. </template>
  437. </el-table-column>
  438. </el-table>
  439. <el-input
  440. v-model="copyText"
  441. ref="copyInput"
  442. type="textarea"
  443. style='opacity: 0;position: absolute;height:1px;overflow:hidden;'
  444. ></el-input>
  445. </div>
  446. <div class="martop10 flexEnd">
  447. <el-pagination
  448. background
  449. @size-change="handleSizeChange"
  450. @current-change="handleCurrentChange"
  451. :current-page.sync="pageindx"
  452. :page-size="pagesize"
  453. layout="total, prev, pager, next"
  454. :total="total"
  455. >
  456. </el-pagination>
  457. </div>
  458. <div class="flex jc-al-c mg-t-20">
  459. <span>添加项目人员</span>
  460. <el-select
  461. class="marleft10"
  462. v-model="userId"
  463. filterable
  464. placeholder="请输入搜索"
  465. >
  466. <el-option
  467. v-for="item in userList"
  468. :key="item.id"
  469. :label="item.name"
  470. :value="item.id"
  471. ></el-option>
  472. </el-select>
  473. <el-button
  474. class="marleft10"
  475. type="success"
  476. @click="addUserToProject"
  477. >添加</el-button>
  478. <el-button
  479. type="primary"
  480. @click="rputerPush()"
  481. >创建新用户</el-button>
  482. <!--<el-button
  483. type="danger"
  484. @click="handleDeletes"
  485. >全部删除</el-button>-->
  486. </div>
  487. <el-divider></el-divider>
  488. </div>
  489. </el-tab-pane>
  490. </el-tabs>
  491. <div class="flexEnd marbottom20">
  492. <el-button
  493. type="success"
  494. size="medium"
  495. :loading="btnLoad"
  496. @click="saveQuit"
  497. >保存并退出</el-button>
  498. <el-button
  499. type="info"
  500. size="medium"
  501. :loading="btnLoad"
  502. v-if="activeType != 1"
  503. @click="saveNext('p')"
  504. >保存并返回上一步</el-button>
  505. <el-button
  506. type="info"
  507. size="medium"
  508. :loading="btnLoad"
  509. v-if="activeType != 3"
  510. @click="saveNext('n')"
  511. >保存并进入下一步</el-button>
  512. </div>
  513. </div>
  514. </basic-container>
  515. </template>
  516. <script>
  517. import { getProjectDeatil, findProjectTree } from "@/api/manager/projectinfo";
  518. import {
  519. submitContractInfo, getContractInfo, delFileFromUrl, searchRole, findAllUserByCondition, findUserByName,
  520. saveUserInfoByProjectTow, removeUsersByIds, resetPasswordByUserId,
  521. submitWbsTreeInContract, getContractInfoTree
  522. } from "@/api/manager/contractinfo";
  523. import { getDictionary } from "@/api/system/dict";
  524. import { getDictionary as getDictbiz } from "@/api/system/dictbiz";
  525. import { remove as removeFile } from "@/api/resource/attach";
  526. import website from '@/config/website';
  527. import { Base64 } from 'js-base64';
  528. import { getToken } from '@/util/auth';
  529. import { mapGetters } from "vuex";
  530. import treeTree from "@/components/tree-tree/main"
  531. export default {
  532. components: {
  533. treeTree
  534. },
  535. data () {
  536. var checkPlace = (rule, value, callback) => {
  537. if (this.flageData && this.flageData.length > 2 && this.flageData[2]) {
  538. callback();
  539. } else {
  540. callback(new Error('请选取项目地址'));
  541. }
  542. }
  543. var checkDate = (rule, value, callback) => {
  544. if (value && this.contractForm.planStartTime) {
  545. if (Date.parse(value) < Date.parse(this.contractForm.planStartTime)) {
  546. callback(new Error('计划完工日期不能小于开工日期'));
  547. }
  548. }
  549. callback();
  550. };
  551. var checkDate2 = (rule, value, callback) => {
  552. if (value && this.contractForm.actualStartTime) {
  553. if (Date.parse(value) < Date.parse(this.contractForm.actualStartTime)) {
  554. callback(new Error('实际完工日期不能小于开工日期'));
  555. }
  556. }
  557. callback();
  558. };
  559. var checkIsNumber = (rule, value, callback) => {
  560. if (value != Number(value)) {
  561. callback(new Error('金额必须是数字'));
  562. }
  563. callback();
  564. };
  565. return {
  566. //#region
  567. pageindx: 1,
  568. pagesize: 10,
  569. total: 0,
  570. //#endregion
  571. activeType: '1',
  572. typeChang: {
  573. 1: false,
  574. 2: false,
  575. 3: false,
  576. },
  577. btnLoad: false,
  578. pid: '',
  579. cid: '',
  580. projectInfo: {},
  581. contractTypeList: [],
  582. storagePeriodList: [],//保管期限
  583. securityLevelList: [],//保管密级
  584. fileList: [],
  585. headers: {},
  586. isBackShow: false,
  587. contractForm: {
  588. contractAmount: 0
  589. },
  590. contractRules: {
  591. contractName: [
  592. { required: true, message: '请输入合同段名称', trigger: 'blur' },
  593. ],
  594. contractType: [
  595. { required: true, message: '请选择合同段类型', trigger: 'change' }
  596. ],
  597. contractNumber: [
  598. { required: true, message: '请输入合同段编号', trigger: 'blur' },
  599. ],
  600. contractorUnitName: [
  601. { required: true, message: '请输入业主单位名称', trigger: 'blur' },
  602. ],
  603. constructionUnitName: [
  604. { required: true, message: '请输入施工单位名称', trigger: 'blur' },
  605. ],
  606. supervisionUnitName: [
  607. { required: true, message: '请输入监理单位名称', trigger: 'blur' },
  608. ],
  609. laboratoryName: [
  610. { required: true, message: '请输入实验室名称', trigger: 'blur' },
  611. ],
  612. startStation: [
  613. { required: true, message: '请输入起始桩号', trigger: 'blur' },
  614. ],
  615. endStation: [
  616. { required: true, message: '请输入结束桩号', trigger: 'blur' },
  617. ],
  618. projectPlace: [
  619. { required: true, validator: checkPlace, trigger: 'blur' },
  620. ],
  621. planEndTime: [
  622. { validator: checkDate, trigger: 'blur' },
  623. ],
  624. actualEndTime: [
  625. { validator: checkDate2, trigger: 'blur' },
  626. ],
  627. contractAmount: [
  628. { validator: checkIsNumber, trigger: 'blur' }
  629. ]
  630. },
  631. mapDialogVisible: false,
  632. params: {
  633. zoom: 10,
  634. // zoomEnable: false,
  635. // dragEnable: false,
  636. },
  637. flageData: [],
  638. rId: '',
  639. roleList: [],
  640. postId: '',
  641. postList: [],
  642. contractUserList: [],
  643. userId: '',
  644. userList: [],
  645. copyText: '',
  646. wbsId: '',
  647. leftTreeData: [],
  648. }
  649. },
  650. computed: {
  651. ...mapGetters(["userInfo"]),
  652. },
  653. watch: {
  654. contractForm: {
  655. handler: function () { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  656. this.typeChang['1'] = true;
  657. },
  658. deep: true
  659. },
  660. activeType: async function (newValue) {
  661. if (newValue == '3') {
  662. this.getUserByName();
  663. this.searchRole()
  664. } else if (newValue == '2') {
  665. await this.getLeftTree();
  666. this.getRightTree();
  667. }
  668. },
  669. rId: function (newValue) {
  670. this.postId = ''
  671. this.roleList.forEach(val => {
  672. if (val.id === this.rId) {
  673. if (val.children) {
  674. this.postList = val.children
  675. } else {
  676. this.postList = []
  677. }
  678. } else {
  679. this.findAllUserByCondition(this.rId)
  680. }
  681. })
  682. },
  683. postId: function (newValue) {
  684. if (newValue) {
  685. this.findAllUserByCondition();
  686. } else {
  687. this.contractUserList = [];
  688. }
  689. }
  690. },
  691. created () {
  692. this.init();
  693. //console.log(this.userInfo)
  694. },
  695. mounted () {
  696. this.$nextTick(() => {
  697. this.typeChang = {
  698. 1: false,
  699. 2: false,
  700. 3: false,
  701. }
  702. })
  703. },
  704. methods: {
  705. //#region //后加分页
  706. handleSizeChange (val) {
  707. this.pagesize = val
  708. this.findAllUserByCondition()
  709. },
  710. handleCurrentChange (val) {
  711. this.pageindx = val
  712. this.findAllUserByCondition()
  713. },
  714. rputerPush () {
  715. this.$router.push({
  716. path: '/system/user',
  717. query: { tankai: true }
  718. })
  719. },
  720. //#endregion
  721. //#region 甘云杰
  722. async searchRole () {
  723. const { data: res } = await searchRole()
  724. console.log(res);
  725. if (res.code === 200) {
  726. this.roleList = res.data
  727. }
  728. },
  729. async init () {
  730. this.pid = this.$route.query.pid;
  731. this.cid = this.$route.query.cid;
  732. if (!this.cid) {
  733. this.contractForm.pid = this.pid;
  734. } else {
  735. await this.getContractInfo();
  736. }
  737. await this.getProjectDeatil();
  738. if (this.$route.query.type) {
  739. this.activeType = this.$route.query.type;
  740. }
  741. this.getContractTypeList();
  742. this.getStoragePeriodList();
  743. this.getSecurityLevelList();
  744. this.setHeaders();
  745. },
  746. beforeLeave (activeName, oldActiveName) {
  747. return new Promise((resolve, reject) => {
  748. if (oldActiveName == '1' && !this.contractForm.id) {
  749. this.$message({
  750. type: "warning",
  751. message: "请先保存合同段后,再进行合同段的分配"
  752. });
  753. reject();
  754. }
  755. if (this.typeChang[oldActiveName]) {
  756. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  757. confirmButtonText: '确定',
  758. cancelButtonText: '不用',
  759. type: 'warning'
  760. }).then(() => {
  761. switch (oldActiveName) {
  762. case '1':
  763. this.savecontract().then((res) => {
  764. this.contractForm.id = res.data.data.id;
  765. resolve();
  766. this.$message({
  767. type: "success",
  768. message: "保存成功!"
  769. });
  770. });
  771. break;
  772. case '2':
  773. this.saveWbsTree().then(() => {
  774. resolve();
  775. this.$message({
  776. type: "success",
  777. message: "保存成功!"
  778. });
  779. })
  780. break;
  781. }
  782. }).catch(() => {
  783. this.typeChang[oldActiveName] = false;
  784. resolve();
  785. })
  786. } else {
  787. resolve();
  788. }
  789. })
  790. },
  791. getProjectDeatil () {
  792. return new Promise((resolve) => {
  793. getProjectDeatil(this.pid).then((res) => {
  794. this.projectInfo = res.data.data;
  795. this.wbsId = this.projectInfo.referenceWbsTemplateId;
  796. resolve();
  797. }).finally(() => {
  798. resolve();
  799. })
  800. })
  801. },
  802. getContractInfo () {
  803. return new Promise((resolve) => {
  804. getContractInfo(this.cid).then((res) => {
  805. this.contractForm = res.data.data;
  806. if (this.contractForm.startFileUrl) {
  807. this.isBackShow = true;
  808. }
  809. if (this.contractForm.projectPlace) {
  810. this.flageData = ['', '', this.contractForm.projectPlace]
  811. }
  812. if (Number(this.contractForm.contractAmount) < 0) {
  813. this.contractForm.contractAmount = 0;
  814. }
  815. this.$nextTick(() => {
  816. this.typeChang['1'] = false;
  817. })
  818. }).finally(() => {
  819. resolve();
  820. })
  821. })
  822. },
  823. async saveQuit () {
  824. this.btnLoad = true;
  825. try {
  826. if (this.activeType == '1') {
  827. await this.savecontract();
  828. } else if (this.activeType == '2') {
  829. await this.saveWbsTree();
  830. }
  831. } catch (error) {
  832. this.btnLoad = false;
  833. return;
  834. }
  835. this.$message({
  836. type: "success",
  837. message: "保存成功!"
  838. });
  839. this.btnLoad = false;
  840. this.$router.go(-1);
  841. },
  842. async saveNext (type) {
  843. this.btnLoad = true;
  844. try {
  845. if (this.activeType == '1') {
  846. let res = await this.savecontract();
  847. this.contractForm.id = res.data.data.id;
  848. } else if (this.activeType == '2') {
  849. await this.saveWbsTree();
  850. }
  851. } catch (error) {
  852. this.btnLoad = false;
  853. return;
  854. }
  855. this.$message({
  856. type: "success",
  857. message: "保存成功!"
  858. });
  859. this.typeChang[this.activeType] = false;
  860. let num = Number(this.activeType);
  861. if (type == 'n') {
  862. num++;
  863. } else if (type == 'p') {
  864. num--;
  865. }
  866. this.activeType = num.toString();
  867. this.btnLoad = false;
  868. },
  869. savecontract () {
  870. return new Promise((resolve, reject) => {
  871. this.$refs['contractForm'].validate((valid) => {
  872. if (valid) {
  873. if (this.flageData.length == 3) {
  874. this.contractForm.projectPlace = this.flageData[2];
  875. }
  876. resolve(submitContractInfo(this.contractForm))
  877. } else {
  878. reject('验证失败')
  879. }
  880. })
  881. })
  882. },
  883. handleRemove (file) {
  884. //console.log(file, fileList);
  885. removeFile(file.response.data.attachId).then(() => {
  886. this.contractForm.startFileUrl = '';
  887. })
  888. },
  889. handleExceed () {
  890. this.$message.warning(`当前限制选择 1 个文件,请先移除后,再次上传`);
  891. },
  892. handleSuccess (res) {
  893. this.contractForm.startFileUrl = res.data.link;
  894. },
  895. setHeaders () {
  896. this.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
  897. this.headers[website.tokenHeader] = 'bearer ' + getToken()
  898. },
  899. downloadFile () {
  900. window.open(this.contractForm.startFileUrl);
  901. },
  902. delFile () {
  903. this.$confirm('是否删除该文件?', '删除开工令', {
  904. distinguishCancelAndClose: true,
  905. confirmButtonText: '删除',
  906. cancelButtonText: '取消'
  907. }).then(() => {
  908. delFileFromUrl(this.contractForm.startFileUrl).then(() => {
  909. this.isBackShow = false;
  910. this.contractForm.startFileUrl = '';
  911. })
  912. })
  913. },
  914. addUserToProject () {
  915. if (!this.userId) {
  916. this.$message({
  917. type: "warning",
  918. message: "请先选择用户再进行添加"
  919. });
  920. return;
  921. }
  922. if (!this.postId) {
  923. this.$message({
  924. type: "warning",
  925. message: "请先选择岗位再进行添加"
  926. });
  927. return;
  928. }
  929. let list = [{
  930. projectId: this.pid,
  931. contractId: this.contractForm.id,
  932. userId: this.userId,
  933. roleId: this.postId,
  934. }];
  935. saveUserInfoByProjectTow(list).then(() => {
  936. // this.findAllUserByCondition();
  937. })
  938. },
  939. findAllUserByCondition (val) {
  940. let rId
  941. if (this.postId) {
  942. rId = this.postId
  943. } else {
  944. rId = val
  945. }
  946. findAllUserByCondition({
  947. cId: this.contractForm.id,
  948. pId: this.pid,
  949. // "postId": this.postId,
  950. rId: rId,
  951. },
  952. this.pagesize,
  953. this.pageindx,
  954. ).then((res) => {
  955. this.contractUserList = res.data.data.records;
  956. this.total = res.data.data.total
  957. })
  958. },
  959. handleDelete (index, row) {
  960. this.$confirm('是否将该用户移除出合同段', '提示', {
  961. confirmButtonText: '确定',
  962. cancelButtonText: '取消',
  963. type: 'warning'
  964. }).then(() => {
  965. removeUsersByIds(row.id).then(() => {
  966. this.contractUserList.splice(index, 1);
  967. this.$message({
  968. type: "success",
  969. message: "删除成功!"
  970. });
  971. })
  972. })
  973. },
  974. handleDeletes () {
  975. this.$confirm('是否将所有用户移除出合同段', '提示', {
  976. confirmButtonText: '确定',
  977. cancelButtonText: '取消',
  978. type: 'warning'
  979. }).then(() => {
  980. let ids = [];
  981. this.contractUserList.forEach((element) => {
  982. ids.push(element.id);
  983. })
  984. removeUsersByIds(ids.join(',')).then(() => {
  985. this.contractUserList = [];
  986. this.$message({
  987. type: "success",
  988. message: "删除成功!"
  989. });
  990. })
  991. })
  992. },
  993. copyAccPas (row) {
  994. this.copyText = `姓名:${row.name}
  995. 账号:${row.account}
  996. 密码:${row.password}`;
  997. this.$nextTick(() => {
  998. this.$refs.copyInput.select()
  999. document.execCommand('copy')
  1000. this.$message({
  1001. type: "success",
  1002. message: "成功复制在剪贴板!"
  1003. });
  1004. })
  1005. },
  1006. resetPassword (row) {
  1007. this.$confirm('是否将用户【' + row.name + '】密码重置为123456', '提示', {
  1008. confirmButtonText: '确定',
  1009. cancelButtonText: '取消',
  1010. type: 'warning'
  1011. }).then(() => {
  1012. resetPasswordByUserId(row.uid).then(() => {
  1013. row.password = '123456';
  1014. this.$message({
  1015. type: "success",
  1016. message: "重置成功!"
  1017. });
  1018. })
  1019. })
  1020. },
  1021. getContractTypeList () {
  1022. if (this.contractTypeList.length > 1) {
  1023. return;
  1024. }
  1025. getDictionary({
  1026. code: 'contract_type'
  1027. }).then((res) => {
  1028. res.data.data.forEach(element => {
  1029. element.dictKey = Number(element.dictKey)
  1030. });
  1031. this.contractTypeList = res.data.data;
  1032. })
  1033. },
  1034. getUserByName () {
  1035. findUserByName('').then((res) => {
  1036. this.userList = res.data.data;
  1037. })
  1038. },
  1039. getLeftTree () {
  1040. return new Promise((resolve) => {
  1041. if (!this.leftTreeData.length) {
  1042. findProjectTree(this.projectInfo.id, this.wbsId).then((res) => {
  1043. if (Array.isArray(res.data.data)) {
  1044. this.leftTreeData = res.data.data;
  1045. } else {
  1046. this.leftTreeData = [];
  1047. }
  1048. resolve();
  1049. }).finally(() => {
  1050. resolve();
  1051. })
  1052. }
  1053. resolve();
  1054. })
  1055. },
  1056. getRightTree () {
  1057. getContractInfoTree(this.wbsId, this.projectInfo.id, this.contractForm.id).then((res) => {
  1058. if (Array.isArray(res.data.data)) {
  1059. this.$refs.treetotree.setRightTree(res.data.data);
  1060. }
  1061. })
  1062. },
  1063. saveWbsTree () {
  1064. let obj = {};
  1065. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  1066. obj = {
  1067. wbsId: this.wbsId,
  1068. projectId: this.projectInfo.id,
  1069. contractId: this.contractForm.id,
  1070. wbsTreeIds: ids
  1071. }
  1072. return submitWbsTreeInContract(obj);
  1073. },
  1074. treeChang () {
  1075. this.typeChang[2] = true;
  1076. },
  1077. mapChange () {
  1078. this.$refs['contractForm'].validateField('projectPlace');
  1079. },
  1080. getStoragePeriodList () {
  1081. if (this.storagePeriodList.length > 1) {
  1082. return;
  1083. }
  1084. getDictbiz({
  1085. code: 'storage_period'
  1086. }).then((res) => {
  1087. res.data.data.forEach(element => {
  1088. element.dictKey = Number(element.dictKey)
  1089. });
  1090. this.storagePeriodList = res.data.data;
  1091. })
  1092. },
  1093. getSecurityLevelList () {
  1094. if (this.securityLevelList.length > 1) {
  1095. return;
  1096. }
  1097. getDictbiz({
  1098. code: 'security_level'
  1099. }).then((res) => {
  1100. res.data.data.forEach(element => {
  1101. element.dictKey = Number(element.dictKey)
  1102. });
  1103. this.securityLevelList = res.data.data;
  1104. })
  1105. },
  1106. //#endregion
  1107. }
  1108. };
  1109. </script>
  1110. <style scoped lang="scss">
  1111. .bm-view {
  1112. width: 100%;
  1113. height: 300px;
  1114. }
  1115. .head-font {
  1116. font-size: 20px;
  1117. font-weight: bold;
  1118. }
  1119. </style>