detail.vue 36 KB

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