detail.vue 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318
  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. selectData:{}
  568. }
  569. },
  570. computed: {
  571. ...mapGetters(["userInfo"]),
  572. },
  573. watch: {
  574. projectForm: {
  575. handler: function () { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  576. this.typeChang['1'] = true;
  577. },
  578. deep: true
  579. },
  580. activeType: function (newValue) {
  581. if (newValue == '4') {
  582. this.getContractList();
  583. this.getRoleList();
  584. this.getUserByCondition();
  585. this.getUserByName();
  586. } else if (newValue == '2') {
  587. this.treeInit();
  588. } else if (newValue == '3') {
  589. this.treeLogInit();
  590. }
  591. }
  592. },
  593. created () {
  594. this.init();
  595. //console.log(this.userInfo)
  596. },
  597. mounted () {
  598. this.$nextTick(() => {
  599. this.typeChang = {
  600. 1: false,
  601. 2: false,
  602. 3: false,
  603. 4: false,
  604. }
  605. })
  606. },
  607. methods: {
  608. //#region //后加分页
  609. handleSizeChange (val) {
  610. this.pagesize = val
  611. this.getUserByCondition();
  612. },
  613. handleCurrentChange (val) {
  614. this.pageindx = val
  615. this.getUserByCondition();
  616. },
  617. rputerPush () {
  618. this.$router.push({
  619. path: '/system/user',
  620. query: { tankai: true }
  621. })
  622. },
  623. //#endregion
  624. init () {
  625. this.getHighwayGradeList();
  626. this.id = this.$route.query.id;
  627. if (this.id) {
  628. this.getProjectDeatil();
  629. }
  630. },
  631. beforeLeave (activeName, oldActiveName) {
  632. return new Promise((resolve, reject) => {
  633. if (oldActiveName == '1' && !this.projectForm.id) {
  634. this.$message({
  635. type: "warning",
  636. message: "请先保存项目后,再进行项目的分配"
  637. });
  638. reject();
  639. }
  640. if (this.typeChang[oldActiveName]) {
  641. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  642. confirmButtonText: '确定',
  643. cancelButtonText: '不用',
  644. type: 'warning'
  645. }).then(() => {
  646. switch (oldActiveName) {
  647. case '1':
  648. this.saveProject().then((res) => {
  649. this.projectForm.id = res.data.data.id;
  650. this.typeChang[oldActiveName] = false;
  651. resolve();
  652. this.$message({
  653. type: "success",
  654. message: "保存成功!"
  655. });
  656. });
  657. break;
  658. case '2':
  659. this.saveWbsTree().then(() => {
  660. this.typeChang[oldActiveName] = false;
  661. resolve();
  662. this.$message({
  663. type: "success",
  664. message: "保存成功!"
  665. });
  666. }).catch(() => {
  667. this.getRightTree();
  668. reject();
  669. })
  670. break;
  671. }
  672. }).catch(() => {
  673. this.typeChang[oldActiveName] = false;
  674. resolve();
  675. })
  676. } else {
  677. resolve();
  678. }
  679. })
  680. },
  681. getProjectDeatil () {
  682. getProjectDeatil(this.id).then((res) => {
  683. const data = res.data.data
  684. console.log(data)
  685. this.projectForm = data;
  686. this.selectData={
  687. referenceWbsTemplateId:data.referenceWbsTemplateId,//质检
  688. referenceWbsTemplateIdTrial:data.referenceWbsTemplateIdTrial//试验
  689. }
  690. if (Number(this.projectForm.estimatedAmount) < 0) {
  691. this.projectForm.estimatedAmount = 0
  692. }
  693. this.$nextTick(() => {
  694. this.typeChang['1'] = false;
  695. })
  696. let templateType = 'public';
  697. if (this.projectForm.referenceWbsTemplateType) {
  698. templateType = this.projectForm.referenceWbsTemplateType;
  699. }
  700. getProjectDeatilWbsId(this.id, this.projectForm.referenceWbsTemplateId, templateType).then((res) => {
  701. this.projectForm.wbsType = res.data.data.wbsType;
  702. })
  703. })
  704. },
  705. async saveQuit () {
  706. console.log('保存2',this.selectData);
  707. this.btnLoad = true;
  708. this.saveBtnLoad = true;
  709. this.saveBtnBackDisabled = true
  710. this.saveBtnNextDisabled = true
  711. try {
  712. if (this.activeType == '1') {
  713. await this.saveProject();
  714. } else if (this.activeType == '2') {
  715. await this.saveWbsTree();
  716. } else if (this.activeType == '3'){
  717. await this.saveLogWbsTree();
  718. }
  719. } catch (error) {
  720. this.btnLoad = false;
  721. this.saveBtnLoad = false;
  722. this.saveBtnBackDisabled = false
  723. this.saveBtnNextDisabled = false
  724. if(this.activeType == '2'){
  725. this.getRightTree();
  726. }
  727. return;
  728. }
  729. this.$message({
  730. type: "success",
  731. message: "保存成功!"
  732. });
  733. this.btnLoad = false;
  734. this.saveBtnLoad = false;
  735. this.saveBtnBackDisabled = false
  736. this.saveBtnNextDisabled = false
  737. this.$router.go(-1);
  738. },
  739. async saveNext (type) {
  740. console.log('保存',this.activeType,this.selectData);
  741. this.btnLoad = true;
  742. if (type == 'n') {
  743. this.saveBtnNextLoad = true;
  744. this.saveBtnBackDisabled = true
  745. this.saveBtnDisabled = true
  746. } else if (type == 'p') {
  747. this.saveBtnBackLoad = true;
  748. this.saveBtnNextDisabled = true
  749. this.saveBtnDisabled = true
  750. }
  751. try {
  752. if (this.activeType == '1') {
  753. let res = await this.saveProject();
  754. this.projectForm.id = res.data.data.id;
  755. } else if (this.activeType == '2') {
  756. await this.saveWbsTree();
  757. } else if (this.activeType == '3'){
  758. await this.saveLogWbsTree();
  759. }
  760. } catch (error) {
  761. this.btnLoad = false;
  762. if (type == 'n') {
  763. this.saveBtnNextLoad = false;
  764. this.saveBtnBackDisabled = false
  765. this.saveBtnDisabled = false
  766. } else if (type == 'p') {
  767. this.saveBtnBackLoad = false;
  768. this.saveBtnNextDisabled = false
  769. this.saveBtnDisabled = false
  770. }
  771. if(this.activeType == '2'){
  772. this.getRightTree();
  773. }
  774. return;
  775. }
  776. this.$message({
  777. type: "success",
  778. message: "保存成功!"
  779. });
  780. this.typeChang[this.activeType] = false;
  781. let num = Number(this.activeType);
  782. if (type == 'n') {
  783. num++;
  784. } else if (type == 'p') {
  785. num--;
  786. }
  787. this.activeType = num.toString();
  788. this.btnLoad = false;
  789. if (type == 'n') {
  790. this.saveBtnNextLoad = false;
  791. this.saveBtnBackDisabled = false
  792. this.saveBtnDisabled = false
  793. } else if (type == 'p') {
  794. this.saveBtnBackLoad = false;
  795. this.saveBtnNextDisabled = false
  796. this.saveBtnDisabled = false
  797. }
  798. },
  799. saveProject () {
  800. console.log('保存3',this.selectData);
  801. return new Promise((resolve, reject) => {
  802. this.$refs['projectForm'].validate((valid) => {
  803. if (valid) {
  804. resolve(submitProject(this.projectForm))
  805. } else {
  806. reject('验证失败')
  807. }
  808. })
  809. })
  810. },
  811. saveLogWbsTree() {
  812. let ids = this.$refs.treetotree2.getTreeAllId('rightTree');
  813. let obj = {
  814. wbsId: this.logWbsId,
  815. projectId: this.projectForm.id,
  816. wbsType: "4",
  817. wbsTreeIds: ids
  818. };
  819. return submitLogWbsTreeInProject(obj);
  820. },
  821. saveWbsTree () {
  822. let obj = {};
  823. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  824. obj = {
  825. wbsId: this.wbsId,
  826. projectId: this.projectForm.id,
  827. wbsType: this.templateType,
  828. wbsTreeIds: ids
  829. }
  830. if (this.wbsId.toString().indexOf(',') >= 0) {
  831. //私有库
  832. obj.referenceType = "private";
  833. let ids = this.wbsId.toString().split(',');
  834. obj.wbsId = ids[0];
  835. obj.referencePrivateWbsProjectId = ids[1];
  836. obj.primaryKeyId = this.leftTreeData[0].primaryKeyId;
  837. } else {
  838. //公有库
  839. obj.referenceType = "public";
  840. }
  841. return submitWbsTreeInProject(obj);
  842. },
  843. addUserToProject () {
  844. if (!this.userId) {
  845. this.$message({
  846. type: "warning",
  847. message: "请先选择用户再进行添加"
  848. });
  849. return;
  850. }
  851. if (!this.rId) {
  852. this.$message({
  853. type: "warning",
  854. message: "请先选择维护人员角色再进行添加"
  855. });
  856. return;
  857. }
  858. let list = [{
  859. projectId: this.projectForm.id,
  860. contractId: this.cId ? this.cId : undefined,
  861. userId: this.userId,
  862. roleId: this.rId
  863. }];
  864. saveUserInfoByProject(list).then(() => {
  865. this.getUserByCondition();
  866. })
  867. },
  868. getUserByCondition () {
  869. findUserListByCondition({
  870. cId: this.cId,
  871. pId: this.projectForm.id,
  872. postId: '',
  873. rId: this.rId,
  874. size: this.pagesize,
  875. current: this.pageindx
  876. }).then((res) => {
  877. this.contractUserList = res.data.data.records;
  878. this.total = res.data.data.total
  879. })
  880. },
  881. getUserByName () {
  882. findUserList('').then((res) => {
  883. this.userList = res.data.data;
  884. })
  885. },
  886. handleDelete (index, row) {
  887. this.$confirm('是否将该用户移除出合同段', '提示', {
  888. confirmButtonText: '确定',
  889. cancelButtonText: '取消',
  890. type: 'warning'
  891. }).then(() => {
  892. removeUsersByIds(row.id).then(() => {
  893. this.contractUserList.splice(index, 1);
  894. this.$message({
  895. type: "success",
  896. message: "删除成功!"
  897. });
  898. })
  899. })
  900. },
  901. handleDeletes () {
  902. this.$confirm('是否将所有用户移除出合同段', '提示', {
  903. confirmButtonText: '确定',
  904. cancelButtonText: '取消',
  905. type: 'warning'
  906. }).then(() => {
  907. let ids = [];
  908. this.contractUserList.forEach((element) => {
  909. ids.push(element.id);
  910. })
  911. removeUsersByIds(ids.join(',')).then(() => {
  912. this.contractUserList = [];
  913. this.$message({
  914. type: "success",
  915. message: "删除成功!"
  916. });
  917. })
  918. })
  919. },
  920. getHighwayGradeList () {
  921. if (this.highwayGradeList.length > 1) {
  922. return;
  923. }
  924. getDictionary({
  925. code: 'highway_grade'
  926. }).then((res) => {
  927. // res.data.data.forEach(element => {
  928. // element.dictKey = Number(element.dictKey)
  929. // });
  930. this.highwayGradeList = res.data.data;
  931. })
  932. },
  933. getContractList () {
  934. if (this.contractList.length < 1) {
  935. findContractByProjectId(this.projectForm.id).then((res) => {
  936. this.contractList = res.data.data;
  937. })
  938. }
  939. },
  940. getRoleList () {
  941. if (this.roleList.length > 1) {
  942. return;
  943. }
  944. getRoleTree().then((res) => {
  945. this.roleList = res.data.data
  946. })
  947. },
  948. logWbsChange(value){
  949. //公有库
  950. this.logleftloading = true;
  951. getAlltree(this.userInfo.tenant_id, '1', value).then((res) => {
  952. if (Array.isArray(res.data.data)) {
  953. this.logLeftTreeData = res.data.data;
  954. } else {
  955. this.logLeftTreeData = [];
  956. }
  957. this.logleftloading = false;
  958. })
  959. },
  960. wbsChange (value) {
  961. console.log(value,'WBS节点更换测试')
  962. console.log(this.templateType);
  963. if(this.templateType==1){
  964. this.selectData.referenceWbsTemplateId=value
  965. }else{
  966. this.selectData.referenceWbsTemplateIdTrial=value
  967. }
  968. this.leftloading = true;
  969. if (value.toString().indexOf(',') >= 0) {
  970. //私有库
  971. let ids = value.toString().split(',');
  972. findProjectTree(ids[1], ids[0]).then((res) => {
  973. if (Array.isArray(res.data.data)) {
  974. this.leftTreeData = res.data.data;
  975. } else {
  976. this.leftTreeData = [];
  977. }
  978. this.leftloading = false;
  979. })
  980. } else {
  981. //公有库
  982. getAlltree(this.userInfo.tenant_id, '1', value).then((res) => {
  983. if (Array.isArray(res.data.data)) {
  984. this.leftTreeData = res.data.data;
  985. console.log("this.leftTreeData", this.leftTreeData)
  986. } else {
  987. this.leftTreeData = [];
  988. }
  989. this.leftloading = false;
  990. })
  991. }
  992. this.getRightTree();
  993. },
  994. getLogTreeList(){
  995. return new Promise((resolve) => {
  996. if (this.logTreeList.length) {
  997. resolve();
  998. }
  999. findLogWbsTreeList().then((res) => {
  1000. let arr = [{
  1001. label: '公有库',
  1002. options: [],
  1003. }];
  1004. let data = res.data.data;
  1005. if (data && data.length) {
  1006. data.forEach((element) => {
  1007. element.label = element.wbsName;
  1008. element.value = element.id;
  1009. })
  1010. arr[0].options = data;
  1011. }
  1012. this.logTreeList = arr;
  1013. }).finally(() => {
  1014. resolve();
  1015. })
  1016. })
  1017. },
  1018. getTreeList () {
  1019. console.log('getTreeList');
  1020. return new Promise((resolve) => {
  1021. if (this.treeList.length) {
  1022. resolve();
  1023. }
  1024. findWbsTreeList(this.templateType).then((res) => {
  1025. let arr = [{
  1026. label: '公有库',
  1027. options: [],
  1028. },
  1029. {
  1030. label: '私有库',
  1031. options: [],
  1032. }];
  1033. let data = res.data.data;
  1034. if (data.wbsInfos && data.wbsInfos.length) {
  1035. data.wbsInfos.forEach((element) => {
  1036. element.label = element.wbsName;
  1037. element.value = element.id;
  1038. })
  1039. arr[0].options = data.wbsInfos;
  1040. }
  1041. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  1042. data.wbsTreePrivates.forEach((element) => {
  1043. element.label = element.projectName;
  1044. element.value = element.wbsId + ',' + element.projectId;
  1045. })
  1046. arr[1].options = data.wbsTreePrivates;
  1047. }
  1048. this.treeList = arr;
  1049. this.wbsChange(this.wbsId)
  1050. }).finally(() => {
  1051. resolve();
  1052. })
  1053. })
  1054. },
  1055. treeChang () {
  1056. this.typeChang[2] = true;
  1057. },
  1058. treeChang3 () {
  1059. this.typeChang[3] = true;
  1060. },
  1061. templateTypeChange () {
  1062. findWbsTreeList(this.templateType).then((res) => {
  1063. let arr = [
  1064. {label: '公有库', options: []},
  1065. {label: '私有库', options: []}
  1066. ];
  1067. let data = res.data.data;
  1068. console.log(data,'库数据');
  1069. if (data.wbsInfos && data.wbsInfos.length) {
  1070. data.wbsInfos.forEach((element) => {
  1071. element.label = element.wbsName;
  1072. element.value = element.id;
  1073. })
  1074. arr[0].options = data.wbsInfos;
  1075. }
  1076. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  1077. data.wbsTreePrivates.forEach((element) => {
  1078. element.label = element.projectName;
  1079. element.value = element.wbsId + ',' + element.projectId;
  1080. })
  1081. arr[1].options = data.wbsTreePrivates;
  1082. }
  1083. this.treeList = arr;
  1084. this.wbsId = this.templateType == 1 ? this.selectData.referenceWbsTemplateId : this.selectData.referenceWbsTemplateIdTrial
  1085. this.wbsChange(this.wbsId)
  1086. // if(this.treeList[0].options.length > 0){
  1087. // this.wbsId = this.treeList[0].options[0].value;
  1088. // this.wbsChange(this.wbsId)
  1089. // }else if(this.treeList[1].options.length > 0){
  1090. // this.wbsId = this.treeList[1].options[0].value;
  1091. // this.wbsChange(this.wbsId)
  1092. // }else{
  1093. // this.wbsId = '';
  1094. // this.leftTreeData = [];
  1095. // }
  1096. })
  1097. },
  1098. async treeLogInit(){
  1099. let refId = this.projectForm.referenceLogWbsTemplateId;
  1100. if(refId && refId > 0 && Number(this.projectForm.wbsType) > 0){
  1101. await this.getLogTreeList();
  1102. this.logWbsId = refId;
  1103. this.logleftloading = true;
  1104. let leftData = await getAlltree(this.userInfo.tenant_id, '1', refId);
  1105. if (Array.isArray(leftData.data.data)) {
  1106. this.logLeftTreeData = leftData.data.data;
  1107. } else {
  1108. this.logLeftTreeData = [];
  1109. }
  1110. this.logleftloading = false;
  1111. this.logrightloading = true;
  1112. let projectTree = await findProjectTree(this.projectForm.id, refId);
  1113. this.$refs.treetotree2.setRightTree(Array.isArray(projectTree.data.data)?projectTree.data.data:[]);
  1114. this.logrightloading = false;
  1115. } else {
  1116. await this.getLogTreeList();
  1117. }
  1118. },
  1119. async treeInit () {
  1120. console.log('treeInit');
  1121. let refId = this.projectForm.referenceWbsTemplateId;
  1122. //引用被删会出现 wbsType -1
  1123. if (refId && refId > 0 && Number(this.projectForm.wbsType) > 0) {
  1124. //有引用id,回显
  1125. //this.selected = true;
  1126. this.templateType = this.projectForm.wbsType;
  1127. await this.getTreeList();
  1128. let priv = {};
  1129. if (this.projectForm.referenceWbsTemplateType == 'private') {
  1130. //私有
  1131. let list = this.treeList[1].options;
  1132. for (let i = 0; i < list.length; i++) {
  1133. if (list[i].pkeyId == refId) {
  1134. this.wbsId = list[i].wbsId + ',' + list[i].projectId;
  1135. priv.wbsId = list[i].wbsId;
  1136. priv.projectId = list[i].projectId;
  1137. break;
  1138. }
  1139. }
  1140. } else {
  1141. //公有
  1142. this.wbsId = refId;
  1143. }
  1144. if(this.templateType == 1){
  1145. this.selectData.referenceWbsTemplateId =this.wbsId
  1146. }else{
  1147. this.selectData.referenceWbsTemplateIdTrial=this.wbsId
  1148. }
  1149. let projectTree = await findProjectTree(this.projectForm.id, refId)
  1150. if (Array.isArray(projectTree.data.data)) {
  1151. this.leftloading = true;
  1152. this.rightloading = true;
  1153. if (this.projectForm.referenceWbsTemplateType == 'private') {
  1154. //私有
  1155. let leftData = await findProjectTree(priv.projectId, priv.wbsId)
  1156. if (Array.isArray(leftData.data.data)) {
  1157. this.leftTreeData = leftData.data.data;
  1158. } else {
  1159. this.leftTreeData = [];
  1160. }
  1161. this.leftloading = false;
  1162. } else {
  1163. //公有
  1164. let leftData = await getAlltree(this.userInfo.tenant_id, '1', refId)
  1165. if (Array.isArray(leftData.data.data)) {
  1166. this.leftTreeData = leftData.data.data;
  1167. } else {
  1168. this.leftTreeData = [];
  1169. }
  1170. this.leftloading = false;
  1171. }
  1172. this.$refs.treetotree.setRightTree(projectTree.data.data);
  1173. this.rightloading = false;
  1174. }else{
  1175. this.wbsId = '';
  1176. }
  1177. } else {
  1178. this.getTreeList();
  1179. }
  1180. this.treeInitTrial()
  1181. },
  1182. //初始化试验
  1183. async treeInitTrial () {
  1184. let refId = this.projectForm.referenceWbsTemplateIdTrial;
  1185. //引用被删会出现 wbsType -1
  1186. if (refId && refId > 0 && Number(this.projectForm.wbsType) > 0) {
  1187. //有引用id,回显
  1188. //this.selected = true;
  1189. findWbsTreeList(2).then((res) => {
  1190. let arr = [{
  1191. label: '公有库',
  1192. options: [],
  1193. },
  1194. {
  1195. label: '私有库',
  1196. options: [],
  1197. }];
  1198. let data = res.data.data;
  1199. if (data.wbsInfos && data.wbsInfos.length) {
  1200. data.wbsInfos.forEach((element) => {
  1201. element.label = element.wbsName;
  1202. element.value = element.id;
  1203. })
  1204. arr[0].options = data.wbsInfos;
  1205. }
  1206. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  1207. data.wbsTreePrivates.forEach((element) => {
  1208. element.label = element.projectName;
  1209. element.value = element.wbsId + ',' + element.projectId;
  1210. })
  1211. arr[1].options = data.wbsTreePrivates;
  1212. }
  1213. let WbsId = 0;
  1214. if (this.projectForm.referenceWbsTemplateTypeTrial == 'private') {
  1215. //私有
  1216. let list = arr[1].options;
  1217. for (let i = 0; i < list.length; i++) {
  1218. if (list[i].pkeyId == refId) {
  1219. WbsId = list[i].wbsId + ',' + list[i].projectId;
  1220. break;
  1221. }
  1222. }
  1223. } else {
  1224. //公有
  1225. WbsId = refId;
  1226. }
  1227. this.selectData.referenceWbsTemplateIdTrial = WbsId
  1228. console.log("treeInitTrial", this.selectData)
  1229. })
  1230. } else {
  1231. this.getTreeList();
  1232. }
  1233. },
  1234. getRightTree() {
  1235. this.rightloading = true;
  1236. let WbsId = this.templateType === 1 ? this.selectData.referenceWbsTemplateId : this.selectData.referenceWbsTemplateIdTrial
  1237. findProjectTree(this.projectForm.id, WbsId).then((res) => {
  1238. if (Array.isArray(res.data.data)) {
  1239. this.$refs.treetotree.setRightTree(res.data.data);
  1240. } else {
  1241. this.$refs.treetotree.setRightTree([]);
  1242. }
  1243. this.rightloading = false;
  1244. })
  1245. findProjectTree(this.projectForm.id, WbsId).then((res) => {
  1246. console.log('findProjectTree');
  1247. if (Array.isArray(res.data.data)) {
  1248. this.$refs.treetotree.setRightTree(res.data.data);
  1249. } else {
  1250. this.$refs.treetotree.setRightTree([]);
  1251. }
  1252. this.rightloading = false;
  1253. })
  1254. },
  1255. }
  1256. };
  1257. </script>
  1258. <style scoped lang="scss">
  1259. </style>