detail.vue 29 KB

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