detail.vue 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216
  1. <template>
  2. <basic-container>
  3. <div class="h-100p">
  4. <el-tabs
  5. v-model="activeType"
  6. :before-leave="beforeLeave"
  7. >
  8. <el-tab-pane
  9. label="项目基本信息"
  10. name="1"
  11. :disabled="btnLoad"
  12. >
  13. <div>
  14. <el-form
  15. :model="projectForm"
  16. :rules="projectRules"
  17. ref="projectForm"
  18. label-width="120px"
  19. >
  20. <el-row>
  21. <el-col :span="12">
  22. <el-form-item
  23. label="项目名称"
  24. prop="projectName"
  25. >
  26. <el-input v-model="projectForm.projectName"></el-input>
  27. </el-form-item>
  28. <el-form-item
  29. label="项目别名"
  30. prop="projectAlias"
  31. >
  32. <el-input v-model="projectForm.projectAlias"></el-input>
  33. </el-form-item>
  34. <el-form-item
  35. label="项目编号"
  36. prop="projectNumber"
  37. >
  38. <el-input v-model="projectForm.projectNumber"></el-input>
  39. </el-form-item>
  40. <el-form-item
  41. label="公路等级"
  42. prop="projectGrade"
  43. >
  44. <el-select
  45. v-model="projectForm.projectGrade"
  46. placeholder="请选择"
  47. class="w-100p"
  48. >
  49. <el-option
  50. v-for="item in highwayGradeList"
  51. :key="item.id"
  52. :label="item.dictValue"
  53. :value="item.dictKey"
  54. ></el-option>
  55. </el-select>
  56. </el-form-item>
  57. <el-form-item
  58. label="计划开工日期"
  59. prop="planStartTime"
  60. >
  61. <el-date-picker
  62. v-model="projectForm.planStartTime"
  63. type="date"
  64. format="yyyy 年 MM 月 dd 日"
  65. value-format="yyyy-MM-dd HH:mm:ss"
  66. placeholder="选择日期"
  67. ></el-date-picker>
  68. </el-form-item>
  69. <el-form-item
  70. label="实际开工日期"
  71. prop="actualStartTime"
  72. >
  73. <el-date-picker
  74. v-model="projectForm.actualStartTime"
  75. type="date"
  76. format="yyyy 年 MM 月 dd 日"
  77. value-format="yyyy-MM-dd HH:mm:ss"
  78. placeholder="选择日期"
  79. ></el-date-picker>
  80. </el-form-item>
  81. <el-form-item
  82. label="项目预算投资"
  83. prop="estimatedAmount"
  84. >
  85. <el-input v-model="projectForm.estimatedAmount">
  86. <template slot="append">万元</template>
  87. </el-input>
  88. </el-form-item>
  89. </el-col>
  90. <el-col :span="12">
  91. <el-form-item
  92. label="项目概况"
  93. prop="projectGist"
  94. >
  95. <el-input
  96. v-model="projectForm.projectGist"
  97. type="textarea"
  98. :rows="7"
  99. ></el-input>
  100. </el-form-item>
  101. <el-form-item
  102. label="内置里程"
  103. prop="projectAllMileage"
  104. >
  105. <el-radio-group v-model="radioType">
  106. <el-radio-button label="总里程"></el-radio-button>
  107. <el-radio-button label="路面"></el-radio-button>
  108. <el-radio-button label="路基"></el-radio-button>
  109. </el-radio-group>
  110. <el-input-number
  111. v-model="projectForm.projectAllMileage"
  112. v-show="radioType == '总里程'"
  113. :min="0"
  114. label="总里程"
  115. ></el-input-number>
  116. <el-input-number
  117. v-model="projectForm.projectPavement"
  118. v-show="radioType == '路面'"
  119. :min="0"
  120. label="路面"
  121. ></el-input-number>
  122. <el-input-number
  123. v-model="projectForm.projectSubgrade"
  124. v-show="radioType == '路基'"
  125. :min="0"
  126. label="路基"
  127. ></el-input-number>
  128. <span>公里(KM)</span>
  129. </el-form-item>
  130. <el-form-item
  131. label="计划完工日期"
  132. prop="planEndTime"
  133. >
  134. <el-date-picker
  135. v-model="projectForm.planEndTime"
  136. type="date"
  137. format="yyyy 年 MM 月 dd 日"
  138. value-format="yyyy-MM-dd HH:mm:ss"
  139. placeholder="选择日期"
  140. ></el-date-picker>
  141. </el-form-item>
  142. <el-form-item
  143. label="实际完工日期"
  144. prop="actualEndTime"
  145. >
  146. <el-date-picker
  147. v-model="projectForm.actualEndTime"
  148. type="date"
  149. format="yyyy 年 MM 月 dd 日"
  150. value-format="yyyy-MM-dd HH:mm:ss"
  151. placeholder="选择日期"
  152. ></el-date-picker>
  153. </el-form-item>
  154. <el-form-item
  155. label="开启随机数"
  156. prop="isOpenRandomNumber"
  157. >
  158. <el-radio-group v-model="projectForm.isOpenRandomNumber">
  159. <el-radio :label="0">不开启</el-radio>
  160. <el-radio :label="1">开启</el-radio>
  161. </el-radio-group>
  162. </el-form-item>
  163. </el-col>
  164. </el-row>
  165. </el-form>
  166. </div>
  167. </el-tab-pane>
  168. <el-tab-pane
  169. label="分配WBS模版"
  170. name="2"
  171. :disabled="btnLoad"
  172. >
  173. <div>
  174. <div class="text-align-c">
  175. <el-radio-group
  176. v-model="templateType"
  177. @change="templateTypeChange"
  178. :disabled="selected"
  179. >
  180. <el-radio :label="2">试验</el-radio>
  181. <el-radio :label="1">质检</el-radio>
  182. </el-radio-group>
  183. </div>
  184. <div class="text-align-c mg-t-20">
  185. <span class="mg-r-20">选择WBS</span>
  186. <el-select
  187. v-model="wbsId"
  188. @change="wbsChange"
  189. :disabled="selected"
  190. placeholder="请选择WBS"
  191. style="width:500px;"
  192. >
  193. <el-option-group
  194. v-for="group in treeList"
  195. :key="group.label"
  196. :label="group.label"
  197. >
  198. <el-option
  199. v-for="(item,index) in group.options"
  200. :key="index"
  201. :label="item.label"
  202. :value="item.value"
  203. >
  204. </el-option>
  205. </el-option-group>
  206. </el-select>
  207. </div>
  208. <tree-tree
  209. :left-tree-data="leftTreeData"
  210. scrollbarStyle="height:calc(100vh - 500px)"
  211. ref="treetotree"
  212. :show-all-check="true"
  213. @onAddTree="treeChang"
  214. @onDelTree="treeChang"
  215. @onCheckAll="treeChang"
  216. :leftloading="leftloading"
  217. :rightloading="rightloading"
  218. ></tree-tree>
  219. </div>
  220. </el-tab-pane>
  221. <el-tab-pane
  222. label="分配日志WBS"
  223. name="3"
  224. :disabled="btnLoad"
  225. >
  226. <div>
  227. <div class="text-align-c mg-t-20">
  228. <span class="mg-r-20">选择WBS</span>
  229. <el-select
  230. v-model="logWbsId"
  231. @change="logWbsChange"
  232. :disabled="selected"
  233. placeholder="请选择WBS"
  234. style="width:500px;"
  235. >
  236. <el-option-group
  237. v-for="group in logTreeList"
  238. :key="group.label"
  239. :label="group.label"
  240. >
  241. <el-option
  242. v-for="(item,index) in group.options"
  243. :key="index"
  244. :label="item.label"
  245. :value="item.value"
  246. >
  247. </el-option>
  248. </el-option-group>
  249. </el-select>
  250. </div>
  251. <tree-tree
  252. :left-tree-data="logLeftTreeData"
  253. ref="treetotree2"
  254. :show-all-check="true"
  255. @onAddTree="treeChang3"
  256. @onDelTree="treeChang3"
  257. @onCheckAll="treeChang3"
  258. :leftloading="logleftloading"
  259. :rightloading="logrightloading"
  260. scrollbarStyle="height:calc(100vh - 500px)"
  261. ></tree-tree>
  262. </div>
  263. </el-tab-pane>
  264. <el-tab-pane
  265. label="分配系统维护人员"
  266. name="4"
  267. :disabled="btnLoad"
  268. >
  269. <div>
  270. <div class="flex jc-al-c">
  271. <span class="mg-r-10">项目名称</span>
  272. <el-input
  273. v-model="projectForm.projectName"
  274. disabled
  275. style="width:300px;margin-right:30px;"
  276. ></el-input>
  277. <span class="mg-r-10">合同段名称</span>
  278. <el-select
  279. v-model="cId"
  280. placeholder="请选择"
  281. @change="getUserByCondition"
  282. >
  283. <el-option
  284. label="全部"
  285. value=""
  286. ></el-option>
  287. <el-option
  288. v-for="item in contractList"
  289. :key="item.id"
  290. :label="item.contractName"
  291. :value="item.id"
  292. ></el-option>
  293. </el-select>
  294. </div>
  295. <el-divider></el-divider>
  296. <div class="flex jc-al-c mg-b-10">
  297. <span>维护人员角色</span>
  298. <avue-input-tree
  299. class="marleft10"
  300. :check-strictly="true"
  301. v-model="rId"
  302. placeholder="请选择"
  303. type="tree"
  304. :dic="roleList"
  305. :props="treeProps"
  306. @change="getUserByCondition"
  307. ></avue-input-tree>
  308. <!-- <el-select v-model="rId" clearable placeholder="请选择" @change="getUserByCondition">
  309. <el-option v-for="item in roleList" :key="item.id" :label="item.title" :value="item.id"></el-option>
  310. </el-select> -->
  311. </div>
  312. <div>
  313. <el-table
  314. :data="contractUserList"
  315. border
  316. height="420"
  317. style="width: 100%"
  318. >
  319. <el-table-column
  320. prop="name"
  321. label="姓名"
  322. align="center"
  323. ></el-table-column>
  324. <el-table-column
  325. prop="contractName"
  326. label="合同段名称"
  327. align="center"
  328. ></el-table-column>
  329. <el-table-column
  330. prop="postName"
  331. label="岗位"
  332. align="center"
  333. ></el-table-column>
  334. <el-table-column
  335. prop="phone"
  336. label="电话"
  337. align="center"
  338. ></el-table-column>
  339. <el-table-column
  340. label="操作"
  341. align="center"
  342. >
  343. <template slot-scope="scope">
  344. <el-button
  345. size="mini"
  346. type="danger"
  347. @click="handleDelete(scope.$index, scope.row)"
  348. >删除</el-button>
  349. </template>
  350. </el-table-column>
  351. </el-table>
  352. </div>
  353. <div class="martop10 flexEnd">
  354. <el-pagination
  355. background
  356. @size-change="handleSizeChange"
  357. @current-change="handleCurrentChange"
  358. :current-page.sync="pageindx"
  359. :page-size="pagesize"
  360. layout="total, prev, pager, next"
  361. :total="total"
  362. >
  363. </el-pagination>
  364. </div>
  365. <div class="flex jc-al-c mg-t-20">
  366. <span>添加系统内部人员</span>
  367. <el-select
  368. class="marleft10"
  369. v-model="userId"
  370. filterable
  371. placeholder="请输入搜索"
  372. >
  373. <el-option
  374. v-for="item in userList"
  375. :key="item.id"
  376. :label="item.name"
  377. :value="item.id"
  378. ></el-option>
  379. </el-select>
  380. <el-button
  381. type="success"
  382. class="marleft10"
  383. @click="addUserToProject"
  384. >添加</el-button>
  385. <el-button
  386. type="primary"
  387. @click="rputerPush()"
  388. >创建新用户</el-button>
  389. <el-button
  390. type="danger"
  391. @click="handleDeletes"
  392. >全部删除</el-button>
  393. </div>
  394. <el-divider></el-divider>
  395. </div>
  396. </el-tab-pane>
  397. </el-tabs>
  398. <div class="flexEnd">
  399. <el-button
  400. :type="activeType != 4?'info':'success'"
  401. size="medium"
  402. :disabled="saveBtnDisabled
  403. || leftloading || logleftloading
  404. || rightloading || logrightloading"
  405. :loading="saveBtnLoad"
  406. @click="saveQuit"
  407. >保存并退出</el-button>
  408. <el-button
  409. type="info"
  410. size="medium"
  411. :disabled="saveBtnBackDisabled
  412. || leftloading || logleftloading
  413. || rightloading || logrightloading"
  414. :loading="saveBtnBackLoad"
  415. v-if="activeType != 1"
  416. @click="saveNext('p')"
  417. >保存并返回上一步</el-button>
  418. <el-button
  419. type="success"
  420. size="medium"
  421. :disabled="saveBtnNextDisabled
  422. || leftloading || logleftloading
  423. || rightloading || logrightloading"
  424. :loading="saveBtnNextLoad"
  425. v-if="activeType != 4"
  426. @click="saveNext('n')"
  427. >保存并进入下一步</el-button>
  428. </div>
  429. </div>
  430. </basic-container>
  431. </template>
  432. <script>
  433. import {
  434. submitProject, getProjectDeatil, findWbsTreeList, findProjectTree,
  435. submitWbsTreeInProject, getProjectDeatilWbsId, findLogWbsTreeList, submitLogWbsTreeInProject
  436. } from "@/api/manager/projectinfo";
  437. import {
  438. findContractByProjectId, saveUserInfoByProject, findUserListByCondition,
  439. findUserByName, removeUsersByIds
  440. } from "@/api/manager/contractinfo";
  441. import { getRoleTree } from "@/api/system/role";
  442. import { getAlltree } from "@/api/manager/wbstree";
  443. import { getDictionary } from "@/api/system/dict";
  444. import { mapGetters } from "vuex";
  445. import treeTree from "@/components/tree-tree/main"
  446. import { findUserList } from "@/api/manager/contractinfo";
  447. export default {
  448. components: {
  449. treeTree
  450. },
  451. data () {
  452. var checkDate = (rule, value, callback) => {
  453. if (value && this.projectForm.planStartTime) {
  454. if (Date.parse(value) < Date.parse(this.projectForm.planStartTime)) {
  455. callback(new Error('计划完工日期不能小于开工日期'));
  456. }
  457. }
  458. callback();
  459. };
  460. var checkDate2 = (rule, value, callback) => {
  461. if (value && this.projectForm.actualStartTime) {
  462. if (Date.parse(value) < Date.parse(this.projectForm.actualStartTime)) {
  463. callback(new Error('实际完工日期不能小于开工日期'));
  464. }
  465. }
  466. callback();
  467. };
  468. var checkIsNumber = (rule, value, callback) => {
  469. if (value != Number(value)) {
  470. callback(new Error('金额必须是数字'));
  471. }
  472. if (value && 999999999999999999 < Number(value)) {
  473. callback(new Error('数字过大'));
  474. }
  475. callback();
  476. };
  477. var checkMileage = (rule, value, callback) => {
  478. if (this.projectForm.projectPavement || this.projectForm.projectSubgrade) {
  479. if (this.projectForm.projectPavement) {
  480. if (this.projectForm.projectPavement > value) {
  481. callback(new Error('总里程必须是最大的'));
  482. }
  483. } else if (this.projectForm.projectSubgrade) {
  484. if (this.projectForm.projectSubgrade > value) {
  485. callback(new Error('总里程必须是最大的'));
  486. }
  487. }
  488. if (this.projectForm.projectPavement && this.projectForm.projectSubgrade) {
  489. if ((this.projectForm.projectPavement + this.projectForm.projectSubgrade) > value) {
  490. callback(new Error('总里程必须大于两项总和'));
  491. }
  492. }
  493. }
  494. callback();
  495. };
  496. return {
  497. //#region
  498. pageindx: 1,
  499. pagesize: 10,
  500. total: 0,
  501. //#endregion
  502. activeType: '1',
  503. typeChang: {
  504. 1: false,
  505. 2: false,
  506. 3: false,
  507. 4: false,
  508. },
  509. btnLoad: false,
  510. saveBtnLoad: false,
  511. saveBtnDisabled: false,
  512. saveBtnBackLoad: false,
  513. saveBtnBackDisabled: false,
  514. saveBtnNextLoad: false,
  515. saveBtnNextDisabled: false,
  516. id: '',
  517. highwayGradeList: [],
  518. radioType: '总里程',
  519. projectForm: {
  520. estimatedAmount: 0,
  521. isOpenRandomNumber:1
  522. },
  523. projectRules: {
  524. projectName: [
  525. { required: true, message: '请输入项目名称', trigger: 'blur' },
  526. ],
  527. projectAlias: [
  528. { required: true, message: '请输入项目别名', trigger: 'blur' },
  529. ],
  530. planStartTime: [{ required: true, message: '请选择计划开工日期', trigger: 'blur' },],
  531. planEndTime: [
  532. { validator: checkDate, trigger: 'blur' }
  533. ],
  534. actualEndTime: [
  535. { validator: checkDate2, trigger: 'blur' }
  536. ],
  537. estimatedAmount: [
  538. { validator: checkIsNumber, trigger: 'blur' }
  539. ],
  540. projectAllMileage: [
  541. { validator: checkMileage, trigger: 'blur' }
  542. ]
  543. },
  544. contractList: [],
  545. cId: '',
  546. rId: '',
  547. roleList: [],
  548. userId: '',
  549. userList: [],
  550. contractUserList: [],
  551. treeProps: {
  552. label: "dictValue",
  553. value: "id"
  554. },
  555. templateType: 1,
  556. treeList: [],
  557. logTreeList: [],
  558. wbsId: '',
  559. logWbsId: '',
  560. selected: false,
  561. leftTreeData: [],
  562. logLeftTreeData: [],
  563. leftloading:false,
  564. rightloading:false,
  565. logleftloading:false,
  566. logrightloading:false,
  567. }
  568. },
  569. computed: {
  570. ...mapGetters(["userInfo"]),
  571. },
  572. watch: {
  573. projectForm: {
  574. handler: function () { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  575. this.typeChang['1'] = true;
  576. },
  577. deep: true
  578. },
  579. activeType: function (newValue) {
  580. if (newValue == '4') {
  581. this.getContractList();
  582. this.getRoleList();
  583. this.getUserByCondition();
  584. this.getUserByName();
  585. } else if (newValue == '2') {
  586. this.treeInit();
  587. } else if (newValue == '3') {
  588. this.treeLogInit();
  589. }
  590. }
  591. },
  592. created () {
  593. this.init();
  594. //console.log(this.userInfo)
  595. },
  596. mounted () {
  597. this.$nextTick(() => {
  598. this.typeChang = {
  599. 1: false,
  600. 2: false,
  601. 3: false,
  602. 4: false,
  603. }
  604. })
  605. },
  606. methods: {
  607. //#region //后加分页
  608. handleSizeChange (val) {
  609. this.pagesize = val
  610. this.getUserByCondition();
  611. },
  612. handleCurrentChange (val) {
  613. this.pageindx = val
  614. this.getUserByCondition();
  615. },
  616. rputerPush () {
  617. this.$router.push({
  618. path: '/system/user',
  619. query: { tankai: true }
  620. })
  621. },
  622. //#endregion
  623. init () {
  624. this.getHighwayGradeList();
  625. this.id = this.$route.query.id;
  626. if (this.id) {
  627. this.getProjectDeatil();
  628. }
  629. },
  630. beforeLeave (activeName, oldActiveName) {
  631. return new Promise((resolve, reject) => {
  632. if (oldActiveName == '1' && !this.projectForm.id) {
  633. this.$message({
  634. type: "warning",
  635. message: "请先保存项目后,再进行项目的分配"
  636. });
  637. reject();
  638. }
  639. if (this.typeChang[oldActiveName]) {
  640. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  641. confirmButtonText: '确定',
  642. cancelButtonText: '不用',
  643. type: 'warning'
  644. }).then(() => {
  645. switch (oldActiveName) {
  646. case '1':
  647. this.saveProject().then((res) => {
  648. this.projectForm.id = res.data.data.id;
  649. this.typeChang[oldActiveName] = false;
  650. resolve();
  651. this.$message({
  652. type: "success",
  653. message: "保存成功!"
  654. });
  655. });
  656. break;
  657. case '2':
  658. this.saveWbsTree().then(() => {
  659. this.typeChang[oldActiveName] = false;
  660. resolve();
  661. this.$message({
  662. type: "success",
  663. message: "保存成功!"
  664. });
  665. }).catch(() => {
  666. this.getRightTree();
  667. reject();
  668. })
  669. break;
  670. }
  671. }).catch(() => {
  672. this.typeChang[oldActiveName] = false;
  673. resolve();
  674. })
  675. } else {
  676. resolve();
  677. }
  678. })
  679. },
  680. getProjectDeatil () {
  681. getProjectDeatil(this.id).then((res) => {
  682. const data = res.data.data
  683. console.log(data)
  684. this.projectForm = data;
  685. if (Number(this.projectForm.estimatedAmount) < 0) {
  686. this.projectForm.estimatedAmount = 0
  687. }
  688. this.$nextTick(() => {
  689. this.typeChang['1'] = false;
  690. })
  691. let templateType = 'public';
  692. if (this.projectForm.referenceWbsTemplateType) {
  693. templateType = this.projectForm.referenceWbsTemplateType;
  694. }
  695. getProjectDeatilWbsId(this.id, this.projectForm.referenceWbsTemplateId, templateType).then((res) => {
  696. this.projectForm.wbsType = res.data.data.wbsType;
  697. })
  698. })
  699. },
  700. async saveQuit () {
  701. this.btnLoad = true;
  702. this.saveBtnLoad = true;
  703. this.saveBtnBackDisabled = true
  704. this.saveBtnNextDisabled = true
  705. try {
  706. if (this.activeType == '1') {
  707. await this.saveProject();
  708. } else if (this.activeType == '2') {
  709. await this.saveWbsTree();
  710. } else if (this.activeType == '3'){
  711. await this.saveLogWbsTree();
  712. }
  713. } catch (error) {
  714. this.btnLoad = false;
  715. this.saveBtnLoad = false;
  716. this.saveBtnBackDisabled = false
  717. this.saveBtnNextDisabled = false
  718. if(this.activeType == '2'){
  719. this.getRightTree();
  720. }
  721. return;
  722. }
  723. this.$message({
  724. type: "success",
  725. message: "保存成功!"
  726. });
  727. this.btnLoad = false;
  728. this.saveBtnLoad = false;
  729. this.saveBtnBackDisabled = false
  730. this.saveBtnNextDisabled = false
  731. this.$router.go(-1);
  732. },
  733. async saveNext (type) {
  734. this.btnLoad = true;
  735. if (type == 'n') {
  736. this.saveBtnNextLoad = true;
  737. this.saveBtnBackDisabled = true
  738. this.saveBtnDisabled = true
  739. } else if (type == 'p') {
  740. this.saveBtnBackLoad = true;
  741. this.saveBtnNextDisabled = true
  742. this.saveBtnDisabled = true
  743. }
  744. try {
  745. if (this.activeType == '1') {
  746. let res = await this.saveProject();
  747. this.projectForm.id = res.data.data.id;
  748. } else if (this.activeType == '2') {
  749. await this.saveWbsTree();
  750. } else if (this.activeType == '3'){
  751. await this.saveLogWbsTree();
  752. }
  753. } catch (error) {
  754. this.btnLoad = false;
  755. if (type == 'n') {
  756. this.saveBtnNextLoad = false;
  757. this.saveBtnBackDisabled = false
  758. this.saveBtnDisabled = false
  759. } else if (type == 'p') {
  760. this.saveBtnBackLoad = false;
  761. this.saveBtnNextDisabled = false
  762. this.saveBtnDisabled = false
  763. }
  764. if(this.activeType == '2'){
  765. this.getRightTree();
  766. }
  767. return;
  768. }
  769. this.$message({
  770. type: "success",
  771. message: "保存成功!"
  772. });
  773. this.typeChang[this.activeType] = false;
  774. let num = Number(this.activeType);
  775. if (type == 'n') {
  776. num++;
  777. } else if (type == 'p') {
  778. num--;
  779. }
  780. this.activeType = num.toString();
  781. this.btnLoad = false;
  782. if (type == 'n') {
  783. this.saveBtnNextLoad = false;
  784. this.saveBtnBackDisabled = false
  785. this.saveBtnDisabled = false
  786. } else if (type == 'p') {
  787. this.saveBtnBackLoad = false;
  788. this.saveBtnNextDisabled = false
  789. this.saveBtnDisabled = false
  790. }
  791. },
  792. saveProject () {
  793. return new Promise((resolve, reject) => {
  794. this.$refs['projectForm'].validate((valid) => {
  795. if (valid) {
  796. resolve(submitProject(this.projectForm))
  797. } else {
  798. reject('验证失败')
  799. }
  800. })
  801. })
  802. },
  803. saveLogWbsTree() {
  804. let ids = this.$refs.treetotree2.getTreeAllId('rightTree');
  805. let obj = {
  806. wbsId: this.logWbsId,
  807. projectId: this.projectForm.id,
  808. wbsType: "4",
  809. wbsTreeIds: ids
  810. };
  811. return submitLogWbsTreeInProject(obj);
  812. },
  813. saveWbsTree () {
  814. let obj = {};
  815. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  816. obj = {
  817. wbsId: this.wbsId,
  818. projectId: this.projectForm.id,
  819. wbsType: this.templateType,
  820. wbsTreeIds: ids
  821. }
  822. if (this.wbsId.toString().indexOf(',') >= 0) {
  823. //私有库
  824. obj.referenceType = "private";
  825. let ids = this.wbsId.toString().split(',');
  826. obj.wbsId = ids[0];
  827. obj.referencePrivateWbsProjectId = ids[1];
  828. obj.primaryKeyId = this.leftTreeData[0].primaryKeyId;
  829. } else {
  830. //公有库
  831. obj.referenceType = "public";
  832. }
  833. return submitWbsTreeInProject(obj);
  834. },
  835. addUserToProject () {
  836. if (!this.userId) {
  837. this.$message({
  838. type: "warning",
  839. message: "请先选择用户再进行添加"
  840. });
  841. return;
  842. }
  843. if (!this.rId) {
  844. this.$message({
  845. type: "warning",
  846. message: "请先选择维护人员角色再进行添加"
  847. });
  848. return;
  849. }
  850. let list = [{
  851. projectId: this.projectForm.id,
  852. contractId: this.cId ? this.cId : undefined,
  853. userId: this.userId,
  854. roleId: this.rId
  855. }];
  856. saveUserInfoByProject(list).then(() => {
  857. this.getUserByCondition();
  858. })
  859. },
  860. getUserByCondition () {
  861. findUserListByCondition({
  862. cId: this.cId,
  863. pId: this.projectForm.id,
  864. postId: '',
  865. rId: this.rId,
  866. size: this.pagesize,
  867. current: this.pageindx
  868. }).then((res) => {
  869. this.contractUserList = res.data.data.records;
  870. this.total = res.data.data.total
  871. })
  872. },
  873. getUserByName () {
  874. findUserList('').then((res) => {
  875. this.userList = res.data.data;
  876. })
  877. },
  878. handleDelete (index, row) {
  879. this.$confirm('是否将该用户移除出合同段', '提示', {
  880. confirmButtonText: '确定',
  881. cancelButtonText: '取消',
  882. type: 'warning'
  883. }).then(() => {
  884. removeUsersByIds(row.id).then(() => {
  885. this.contractUserList.splice(index, 1);
  886. this.$message({
  887. type: "success",
  888. message: "删除成功!"
  889. });
  890. })
  891. })
  892. },
  893. handleDeletes () {
  894. this.$confirm('是否将所有用户移除出合同段', '提示', {
  895. confirmButtonText: '确定',
  896. cancelButtonText: '取消',
  897. type: 'warning'
  898. }).then(() => {
  899. let ids = [];
  900. this.contractUserList.forEach((element) => {
  901. ids.push(element.id);
  902. })
  903. removeUsersByIds(ids.join(',')).then(() => {
  904. this.contractUserList = [];
  905. this.$message({
  906. type: "success",
  907. message: "删除成功!"
  908. });
  909. })
  910. })
  911. },
  912. getHighwayGradeList () {
  913. if (this.highwayGradeList.length > 1) {
  914. return;
  915. }
  916. getDictionary({
  917. code: 'highway_grade'
  918. }).then((res) => {
  919. // res.data.data.forEach(element => {
  920. // element.dictKey = Number(element.dictKey)
  921. // });
  922. this.highwayGradeList = res.data.data;
  923. })
  924. },
  925. getContractList () {
  926. if (this.contractList.length < 1) {
  927. findContractByProjectId(this.projectForm.id).then((res) => {
  928. this.contractList = res.data.data;
  929. })
  930. }
  931. },
  932. getRoleList () {
  933. if (this.roleList.length > 1) {
  934. return;
  935. }
  936. getRoleTree().then((res) => {
  937. this.roleList = res.data.data
  938. })
  939. },
  940. logWbsChange(value){
  941. //公有库
  942. this.logleftloading = true;
  943. getAlltree(this.userInfo.tenant_id, '1', value).then((res) => {
  944. if (Array.isArray(res.data.data)) {
  945. this.logLeftTreeData = res.data.data;
  946. } else {
  947. this.logLeftTreeData = [];
  948. }
  949. this.logleftloading = false;
  950. })
  951. },
  952. wbsChange (value) {
  953. //console.log(value)
  954. this.leftloading = true;
  955. if (value.toString().indexOf(',') >= 0) {
  956. //私有库
  957. let ids = value.toString().split(',');
  958. findProjectTree(ids[1], ids[0]).then((res) => {
  959. if (Array.isArray(res.data.data)) {
  960. this.leftTreeData = res.data.data;
  961. } else {
  962. this.leftTreeData = [];
  963. }
  964. this.leftloading = false;
  965. })
  966. } else {
  967. //公有库
  968. getAlltree(this.userInfo.tenant_id, '1', value).then((res) => {
  969. if (Array.isArray(res.data.data)) {
  970. this.leftTreeData = res.data.data;
  971. } else {
  972. this.leftTreeData = [];
  973. }
  974. this.leftloading = false;
  975. })
  976. }
  977. this.getRightTree();
  978. },
  979. getLogTreeList(){
  980. return new Promise((resolve) => {
  981. if (this.logTreeList.length) {
  982. resolve();
  983. }
  984. findLogWbsTreeList().then((res) => {
  985. let arr = [{
  986. label: '公有库',
  987. options: [],
  988. }];
  989. let data = res.data.data;
  990. if (data && data.length) {
  991. data.forEach((element) => {
  992. element.label = element.wbsName;
  993. element.value = element.id;
  994. })
  995. arr[0].options = data;
  996. }
  997. this.logTreeList = arr;
  998. }).finally(() => {
  999. resolve();
  1000. })
  1001. })
  1002. },
  1003. getTreeList () {
  1004. return new Promise((resolve) => {
  1005. if (this.treeList.length) {
  1006. resolve();
  1007. }
  1008. findWbsTreeList(this.templateType).then((res) => {
  1009. let arr = [{
  1010. label: '公有库',
  1011. options: [],
  1012. },
  1013. {
  1014. label: '私有库',
  1015. options: [],
  1016. }];
  1017. let data = res.data.data;
  1018. if (data.wbsInfos && data.wbsInfos.length) {
  1019. data.wbsInfos.forEach((element) => {
  1020. element.label = element.wbsName;
  1021. element.value = element.id;
  1022. })
  1023. arr[0].options = data.wbsInfos;
  1024. }
  1025. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  1026. data.wbsTreePrivates.forEach((element) => {
  1027. element.label = element.projectName;
  1028. element.value = element.wbsId + ',' + element.projectId;
  1029. })
  1030. arr[1].options = data.wbsTreePrivates;
  1031. }
  1032. this.treeList = arr;
  1033. }).finally(() => {
  1034. resolve();
  1035. })
  1036. })
  1037. },
  1038. treeChang () {
  1039. this.typeChang[2] = true;
  1040. },
  1041. treeChang3 () {
  1042. this.typeChang[3] = true;
  1043. },
  1044. templateTypeChange () {
  1045. findWbsTreeList(this.templateType).then((res) => {
  1046. let arr = [
  1047. {label: '公有库', options: []},
  1048. {label: '私有库', options: []}
  1049. ];
  1050. let data = res.data.data;
  1051. if (data.wbsInfos && data.wbsInfos.length) {
  1052. data.wbsInfos.forEach((element) => {
  1053. element.label = element.wbsName;
  1054. element.value = element.id;
  1055. })
  1056. arr[0].options = data.wbsInfos;
  1057. }
  1058. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  1059. data.wbsTreePrivates.forEach((element) => {
  1060. element.label = element.projectName;
  1061. element.value = element.wbsId + ',' + element.projectId;
  1062. })
  1063. arr[1].options = data.wbsTreePrivates;
  1064. }
  1065. this.treeList = arr;
  1066. if(this.treeList[0].options.length > 0){
  1067. this.wbsId = this.treeList[0].options[0].value;
  1068. this.wbsChange(this.wbsId)
  1069. }else if(this.treeList[1].options.length > 0){
  1070. this.wbsId = this.treeList[1].options[0].value;
  1071. this.wbsChange(this.wbsId)
  1072. }else{
  1073. this.wbsId = '';
  1074. this.leftTreeData = [];
  1075. }
  1076. })
  1077. },
  1078. async treeLogInit(){
  1079. let refId = this.projectForm.referenceLogWbsTemplateId;
  1080. if(refId && refId > 0 && Number(this.projectForm.wbsType) > 0){
  1081. await this.getLogTreeList();
  1082. this.logWbsId = refId;
  1083. this.logleftloading = true;
  1084. let leftData = await getAlltree(this.userInfo.tenant_id, '1', refId);
  1085. if (Array.isArray(leftData.data.data)) {
  1086. this.logLeftTreeData = leftData.data.data;
  1087. } else {
  1088. this.logLeftTreeData = [];
  1089. }
  1090. this.logleftloading = false;
  1091. this.logrightloading = true;
  1092. let projectTree = await findProjectTree(this.projectForm.id, refId);
  1093. this.$refs.treetotree2.setRightTree(Array.isArray(projectTree.data.data)?projectTree.data.data:[]);
  1094. this.logrightloading = false;
  1095. } else {
  1096. await this.getLogTreeList();
  1097. }
  1098. },
  1099. async treeInit () {
  1100. let refId = this.projectForm.referenceWbsTemplateId;
  1101. //引用被删会出现 wbsType -1
  1102. if (refId && refId > 0 && Number(this.projectForm.wbsType) > 0) {
  1103. //有引用id,回显
  1104. //this.selected = true;
  1105. this.templateType = this.projectForm.wbsType;
  1106. await this.getTreeList();
  1107. let priv = {};
  1108. if (this.projectForm.referenceWbsTemplateType == 'private') {
  1109. //私有
  1110. let list = this.treeList[1].options;
  1111. for (let i = 0; i < list.length; i++) {
  1112. if (list[i].pkeyId == refId) {
  1113. this.wbsId = list[i].wbsId + ',' + list[i].projectId;
  1114. priv.wbsId = list[i].wbsId;
  1115. priv.projectId = list[i].projectId;
  1116. break;
  1117. }
  1118. }
  1119. } else {
  1120. //公有
  1121. this.wbsId = refId;
  1122. }
  1123. let projectTree = await findProjectTree(this.projectForm.id, refId)
  1124. if (Array.isArray(projectTree.data.data)) {
  1125. this.leftloading = true;
  1126. this.rightloading = true;
  1127. if (this.projectForm.referenceWbsTemplateType == 'private') {
  1128. //私有
  1129. let leftData = await findProjectTree(priv.projectId, priv.wbsId)
  1130. if (Array.isArray(leftData.data.data)) {
  1131. this.leftTreeData = leftData.data.data;
  1132. } else {
  1133. this.leftTreeData = [];
  1134. }
  1135. this.leftloading = false;
  1136. } else {
  1137. //公有
  1138. let leftData = await getAlltree(this.userInfo.tenant_id, '1', refId)
  1139. if (Array.isArray(leftData.data.data)) {
  1140. this.leftTreeData = leftData.data.data;
  1141. } else {
  1142. this.leftTreeData = [];
  1143. }
  1144. this.leftloading = false;
  1145. }
  1146. this.$refs.treetotree.setRightTree(projectTree.data.data);
  1147. this.rightloading = false;
  1148. }else{
  1149. this.wbsId = '';
  1150. }
  1151. } else {
  1152. this.getTreeList();
  1153. }
  1154. },
  1155. getRightTree() {
  1156. this.rightloading = true;
  1157. let WbsId = this.templateType === 1 ? this.projectForm.referenceWbsTemplateId : this.projectForm.referenceWbsTemplateIdTrial
  1158. findProjectTree(this.projectForm.id, WbsId).then((res) => {
  1159. if (Array.isArray(res.data.data)) {
  1160. this.$refs.treetotree.setRightTree(res.data.data);
  1161. } else {
  1162. this.$refs.treetotree.setRightTree([]);
  1163. }
  1164. this.rightloading = false;
  1165. })
  1166. },
  1167. }
  1168. };
  1169. </script>
  1170. <style scoped lang="scss">
  1171. </style>