detail.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976
  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
  329. type="primary"
  330. @click="rputerPush()"
  331. >创建新用户</el-button>
  332. <el-button
  333. type="danger"
  334. @click="handleDeletes"
  335. >全部删除</el-button>
  336. </div>
  337. <el-divider></el-divider>
  338. </div>
  339. </el-tab-pane>
  340. </el-tabs>
  341. <div class="flexEnd">
  342. <el-button
  343. type="success"
  344. size="medium"
  345. :loading="btnLoad"
  346. @click="saveQuit"
  347. >保存并退出</el-button>
  348. <el-button
  349. type="info"
  350. size="medium"
  351. :loading="btnLoad"
  352. v-if="activeType != 1"
  353. @click="saveNext('p')"
  354. >保存并返回上一步</el-button>
  355. <el-button
  356. type="info"
  357. size="medium"
  358. :loading="btnLoad"
  359. v-if="activeType != 3"
  360. @click="saveNext('n')"
  361. >保存并进入下一步</el-button>
  362. </div>
  363. </div>
  364. </basic-container>
  365. </template>
  366. <script>
  367. import {
  368. submitProject, getProjectDeatil, findWbsTreeList, findProjectTree,
  369. submitWbsTreeInProject, getProjectDeatilWbsId
  370. } from "@/api/manager/projectinfo";
  371. import {
  372. findContractByProjectId, saveUserInfoByProject, findUserListByCondition,
  373. findUserByName, removeUsersByIds
  374. } from "@/api/manager/contractinfo";
  375. import { getRoleTree } from "@/api/system/role";
  376. import { getAlltree } from "@/api/manager/wbstree";
  377. import { getDictionary } from "@/api/system/dict";
  378. import { mapGetters } from "vuex";
  379. import treeTree from "@/components/tree-tree/main"
  380. import { findUserList } from "../../../api/manager/contractinfo";
  381. export default {
  382. components: {
  383. treeTree
  384. },
  385. data () {
  386. var checkDate = (rule, value, callback) => {
  387. if (value && this.projectForm.planStartTime) {
  388. if (Date.parse(value) < Date.parse(this.projectForm.planStartTime)) {
  389. callback(new Error('计划完工日期不能小于开工日期'));
  390. }
  391. }
  392. callback();
  393. };
  394. var checkDate2 = (rule, value, callback) => {
  395. if (value && this.projectForm.actualStartTime) {
  396. if (Date.parse(value) < Date.parse(this.projectForm.actualStartTime)) {
  397. callback(new Error('实际完工日期不能小于开工日期'));
  398. }
  399. }
  400. callback();
  401. };
  402. var checkIsNumber = (rule, value, callback) => {
  403. if (value != Number(value)) {
  404. callback(new Error('金额必须是数字'));
  405. }
  406. if (value && 999999999999999999 < Number(value)) {
  407. callback(new Error('数字过大'));
  408. }
  409. callback();
  410. };
  411. var checkMileage = (rule, value, callback) => {
  412. if (this.projectForm.projectPavement || this.projectForm.projectSubgrade) {
  413. if (this.projectForm.projectPavement) {
  414. if (this.projectForm.projectPavement > value) {
  415. callback(new Error('总里程必须是最大的'));
  416. }
  417. } else if (this.projectForm.projectSubgrade) {
  418. if (this.projectForm.projectSubgrade > value) {
  419. callback(new Error('总里程必须是最大的'));
  420. }
  421. }
  422. if (this.projectForm.projectPavement && this.projectForm.projectSubgrade) {
  423. if ((this.projectForm.projectPavement + this.projectForm.projectSubgrade) > value) {
  424. callback(new Error('总里程必须大于两项总和'));
  425. }
  426. }
  427. }
  428. callback();
  429. };
  430. return {
  431. //#region
  432. pageindx: 1,
  433. pagesize: 10,
  434. total: 0,
  435. //#endregion
  436. activeType: '1',
  437. typeChang: {
  438. 1: false,
  439. 2: false,
  440. 3: false,
  441. },
  442. btnLoad: false,
  443. id: '',
  444. highwayGradeList: [],
  445. radioType: '总里程',
  446. projectForm: {
  447. estimatedAmount: 0
  448. },
  449. projectRules: {
  450. projectName: [
  451. { required: true, message: '请输入项目名称', trigger: 'blur' },
  452. ],
  453. projectAlias: [
  454. { required: true, message: '请输入项目别名', trigger: 'blur' },
  455. ],
  456. planStartTime: [{ required: true, message: '请选择计划开工日期', trigger: 'blur' },],
  457. planEndTime: [
  458. { validator: checkDate, trigger: 'blur' }
  459. ],
  460. actualEndTime: [
  461. { validator: checkDate2, trigger: 'blur' }
  462. ],
  463. estimatedAmount: [
  464. { validator: checkIsNumber, trigger: 'blur' }
  465. ],
  466. projectAllMileage: [
  467. { validator: checkMileage, trigger: 'blur' }
  468. ]
  469. },
  470. contractList: [],
  471. cId: '',
  472. rId: '',
  473. roleList: [],
  474. userId: '',
  475. userList: [],
  476. contractUserList: [],
  477. treeProps: {
  478. label: "dictValue",
  479. value: "id"
  480. },
  481. templateType: 1,
  482. treeList: [],
  483. wbsId: '',
  484. selected: false,
  485. leftTreeData: [],
  486. }
  487. },
  488. computed: {
  489. ...mapGetters(["userInfo"]),
  490. },
  491. watch: {
  492. projectForm: {
  493. handler: function () { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  494. this.typeChang['1'] = true;
  495. },
  496. deep: true
  497. },
  498. activeType: function (newValue) {
  499. console.log('ss');
  500. if (newValue == '3') {
  501. this.getContractList();
  502. this.getRoleList();
  503. this.getUserByCondition();
  504. this.getUserByName();
  505. } else if (newValue == '2') {
  506. this.treeInit();
  507. }
  508. }
  509. },
  510. created () {
  511. this.init();
  512. //console.log(this.userInfo)
  513. },
  514. mounted () {
  515. this.$nextTick(() => {
  516. this.typeChang = {
  517. 1: false,
  518. 2: false,
  519. 3: false,
  520. }
  521. })
  522. },
  523. methods: {
  524. //#region //后加分页
  525. handleSizeChange (val) {
  526. this.pagesize = val
  527. this.getUserByCondition();
  528. },
  529. handleCurrentChange (val) {
  530. this.pageindx = val
  531. this.getUserByCondition();
  532. },
  533. rputerPush () {
  534. this.$router.push({
  535. path: '/system/user',
  536. query: { tankai: true }
  537. })
  538. },
  539. //#endregion
  540. init () {
  541. this.getHighwayGradeList();
  542. this.id = this.$route.query.id;
  543. if (this.id) {
  544. this.getProjectDeatil();
  545. }
  546. },
  547. beforeLeave (activeName, oldActiveName) {
  548. return new Promise((resolve, reject) => {
  549. if (oldActiveName == '1' && !this.projectForm.id) {
  550. this.$message({
  551. type: "warning",
  552. message: "请先保存项目后,再进行项目的分配"
  553. });
  554. reject();
  555. }
  556. if (this.typeChang[oldActiveName]) {
  557. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  558. confirmButtonText: '确定',
  559. cancelButtonText: '不用',
  560. type: 'warning'
  561. }).then(() => {
  562. switch (oldActiveName) {
  563. case '1':
  564. this.saveProject().then((res) => {
  565. this.projectForm.id = res.data.data.id;
  566. resolve();
  567. this.$message({
  568. type: "success",
  569. message: "保存成功!"
  570. });
  571. });
  572. break;
  573. case '2':
  574. this.saveWbsTree().then(() => {
  575. resolve();
  576. this.$message({
  577. type: "success",
  578. message: "保存成功!"
  579. });
  580. })
  581. break;
  582. }
  583. }).catch(() => {
  584. this.typeChang[oldActiveName] = false;
  585. resolve();
  586. })
  587. } else {
  588. resolve();
  589. }
  590. })
  591. },
  592. getProjectDeatil () {
  593. getProjectDeatil(this.id).then((res) => {
  594. this.projectForm = res.data.data;
  595. if (Number(this.projectForm.estimatedAmount) < 0) {
  596. this.projectForm.estimatedAmount = 0
  597. }
  598. this.$nextTick(() => {
  599. this.typeChang['1'] = false;
  600. })
  601. let templateType = 'public';
  602. if (this.projectForm.referenceWbsTemplateType) {
  603. templateType = this.projectForm.referenceWbsTemplateType;
  604. }
  605. getProjectDeatilWbsId(this.id, this.projectForm.referenceWbsTemplateId, templateType).then((res) => {
  606. this.projectForm.wbsType = res.data.data.wbsType;
  607. })
  608. })
  609. },
  610. async saveQuit () {
  611. this.btnLoad = true;
  612. try {
  613. if (this.activeType == '1') {
  614. await this.saveProject();
  615. } else if (this.activeType == '2') {
  616. await this.saveWbsTree();
  617. }
  618. } catch (error) {
  619. this.btnLoad = false;
  620. return;
  621. }
  622. this.$message({
  623. type: "success",
  624. message: "保存成功!"
  625. });
  626. this.btnLoad = false;
  627. this.$router.go(-1);
  628. },
  629. async saveNext (type) {
  630. this.btnLoad = true;
  631. try {
  632. if (this.activeType == '1') {
  633. let res = await this.saveProject();
  634. this.projectForm.id = res.data.data.id;
  635. } else if (this.activeType == '2') {
  636. await this.saveWbsTree();
  637. }
  638. } catch (error) {
  639. this.btnLoad = false;
  640. return;
  641. }
  642. this.$message({
  643. type: "success",
  644. message: "保存成功!"
  645. });
  646. this.typeChang[this.activeType] = false;
  647. let num = Number(this.activeType);
  648. if (type == 'n') {
  649. num++;
  650. } else if (type == 'p') {
  651. num--;
  652. }
  653. this.activeType = num.toString();
  654. this.btnLoad = false;
  655. },
  656. saveProject () {
  657. return new Promise((resolve, reject) => {
  658. this.$refs['projectForm'].validate((valid) => {
  659. if (valid) {
  660. resolve(submitProject(this.projectForm))
  661. } else {
  662. reject('验证失败')
  663. }
  664. })
  665. })
  666. },
  667. saveWbsTree () {
  668. let obj = {};
  669. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  670. obj = {
  671. wbsId: this.wbsId,
  672. projectId: this.projectForm.id,
  673. wbsType: this.templateType,
  674. wbsTreeIds: ids
  675. }
  676. if (this.wbsId.toString().indexOf(',') >= 0) {
  677. //私有库
  678. obj.referenceType = "private";
  679. let ids = this.wbsId.toString().split(',');
  680. obj.wbsId = ids[0];
  681. obj.referencePrivateWbsProjectId = ids[1];
  682. obj.primaryKeyId = this.leftTreeData[0].primaryKeyId;
  683. } else {
  684. //公有库
  685. obj.referenceType = "public";
  686. }
  687. return submitWbsTreeInProject(obj);
  688. },
  689. addUserToProject () {
  690. if (!this.userId) {
  691. this.$message({
  692. type: "warning",
  693. message: "请先选择用户再进行添加"
  694. });
  695. return;
  696. }
  697. if (!this.rId) {
  698. this.$message({
  699. type: "warning",
  700. message: "请先选择维护人员角色再进行添加"
  701. });
  702. return;
  703. }
  704. let list = [{
  705. projectId: this.projectForm.id,
  706. contractId: this.cId ? this.cId : undefined,
  707. userId: this.userId,
  708. roleId: this.rId
  709. }];
  710. saveUserInfoByProject(list).then(() => {
  711. this.getUserByCondition();
  712. })
  713. },
  714. getUserByCondition () {
  715. findUserListByCondition({
  716. cId: this.cId,
  717. pId: this.projectForm.id,
  718. postId: '',
  719. rId: this.rId,
  720. size: this.pagesize,
  721. current: this.pageindx
  722. }).then((res) => {
  723. this.contractUserList = res.data.data.records;
  724. this.total = res.data.data.total
  725. })
  726. },
  727. getUserByName () {
  728. findUserList('').then((res) => {
  729. this.userList = res.data.data;
  730. })
  731. },
  732. handleDelete (index, row) {
  733. this.$confirm('是否将该用户移除出合同段', '提示', {
  734. confirmButtonText: '确定',
  735. cancelButtonText: '取消',
  736. type: 'warning'
  737. }).then(() => {
  738. removeUsersByIds(row.id).then(() => {
  739. this.contractUserList.splice(index, 1);
  740. this.$message({
  741. type: "success",
  742. message: "删除成功!"
  743. });
  744. })
  745. })
  746. },
  747. handleDeletes () {
  748. this.$confirm('是否将所有用户移除出合同段', '提示', {
  749. confirmButtonText: '确定',
  750. cancelButtonText: '取消',
  751. type: 'warning'
  752. }).then(() => {
  753. let ids = [];
  754. this.contractUserList.forEach((element) => {
  755. ids.push(element.id);
  756. })
  757. removeUsersByIds(ids.join(',')).then(() => {
  758. this.contractUserList = [];
  759. this.$message({
  760. type: "success",
  761. message: "删除成功!"
  762. });
  763. })
  764. })
  765. },
  766. getHighwayGradeList () {
  767. if (this.highwayGradeList.length > 1) {
  768. return;
  769. }
  770. getDictionary({
  771. code: 'highway_grade'
  772. }).then((res) => {
  773. // res.data.data.forEach(element => {
  774. // element.dictKey = Number(element.dictKey)
  775. // });
  776. this.highwayGradeList = res.data.data;
  777. })
  778. },
  779. getContractList () {
  780. if (this.contractList.length < 1) {
  781. findContractByProjectId(this.projectForm.id).then((res) => {
  782. this.contractList = res.data.data;
  783. })
  784. }
  785. },
  786. getRoleList () {
  787. if (this.roleList.length > 1) {
  788. return;
  789. }
  790. getRoleTree().then((res) => {
  791. this.roleList = res.data.data
  792. })
  793. },
  794. wbsChange (value) {
  795. //console.log(value)
  796. if (value.toString().indexOf(',') >= 0) {
  797. //私有库
  798. let ids = value.toString().split(',');
  799. findProjectTree(ids[1], ids[0]).then((res) => {
  800. if (Array.isArray(res.data.data)) {
  801. this.leftTreeData = res.data.data;
  802. } else {
  803. this.leftTreeData = [];
  804. }
  805. })
  806. } else {
  807. //公有库
  808. getAlltree(this.userInfo.tenant_id, '1', value).then((res) => {
  809. if (Array.isArray(res.data.data)) {
  810. this.leftTreeData = res.data.data;
  811. } else {
  812. this.leftTreeData = [];
  813. }
  814. })
  815. }
  816. },
  817. getTreeList () {
  818. return new Promise((resolve) => {
  819. if (this.treeList.length) {
  820. resolve();
  821. }
  822. findWbsTreeList(this.templateType).then((res) => {
  823. let arr = [{
  824. label: '公有库',
  825. options: [],
  826. },
  827. {
  828. label: '私有库',
  829. options: [],
  830. }];
  831. let data = res.data.data;
  832. if (data.wbsInfos && data.wbsInfos.length) {
  833. data.wbsInfos.forEach((element) => {
  834. element.label = element.wbsName;
  835. element.value = element.id;
  836. })
  837. arr[0].options = data.wbsInfos;
  838. }
  839. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  840. data.wbsTreePrivates.forEach((element) => {
  841. element.label = element.projectName;
  842. element.value = element.wbsId + ',' + element.projectId;
  843. })
  844. arr[1].options = data.wbsTreePrivates;
  845. }
  846. this.treeList = arr;
  847. }).finally(() => {
  848. resolve();
  849. })
  850. })
  851. },
  852. treeChang () {
  853. this.typeChang[2] = true;
  854. },
  855. templateTypeChange () {
  856. findWbsTreeList(this.templateType).then((res) => {
  857. let arr = [{
  858. label: '公有库',
  859. options: [],
  860. },
  861. {
  862. label: '私有库',
  863. options: [],
  864. }];
  865. let data = res.data.data;
  866. if (data.wbsInfos && data.wbsInfos.length) {
  867. data.wbsInfos.forEach((element) => {
  868. element.label = element.wbsName;
  869. element.value = element.id;
  870. })
  871. arr[0].options = data.wbsInfos;
  872. }
  873. if (data.wbsTreePrivates && data.wbsTreePrivates.length) {
  874. data.wbsTreePrivates.forEach((element) => {
  875. element.label = element.projectName;
  876. element.value = element.wbsId + ',' + element.projectId;
  877. })
  878. arr[1].options = data.wbsTreePrivates;
  879. }
  880. this.treeList = arr;
  881. })
  882. this.wbsId = '';
  883. this.leftTreeData = [];
  884. },
  885. async treeInit () {
  886. let refId = this.projectForm.referenceWbsTemplateId;
  887. //引用被删会出现 wbsType -1
  888. if (refId && refId > 0 && Number(this.projectForm.wbsType) > 0) {
  889. //有引用id,回显
  890. //this.selected = true;
  891. this.templateType = this.projectForm.wbsType;
  892. await this.getTreeList();
  893. let priv = {};
  894. if (this.projectForm.referenceWbsTemplateType == 'private') {
  895. //私有
  896. let list = this.treeList[1].options;
  897. for (let i = 0; i < list.length; i++) {
  898. if (list[i].pkeyId == refId) {
  899. this.wbsId = list[i].wbsId + ',' + list[i].projectId;
  900. priv.wbsId = list[i].wbsId;
  901. priv.projectId = list[i].projectId;
  902. break;
  903. }
  904. }
  905. } else {
  906. //公有
  907. this.wbsId = refId;
  908. }
  909. let projectTree = await findProjectTree(this.projectForm.id, refId)
  910. if (Array.isArray(projectTree.data.data)) {
  911. if (this.projectForm.referenceWbsTemplateType == 'private') {
  912. //私有
  913. let leftData = await findProjectTree(priv.projectId, priv.wbsId)
  914. if (Array.isArray(leftData.data.data)) {
  915. this.leftTreeData = leftData.data.data;
  916. } else {
  917. this.leftTreeData = [];
  918. }
  919. } else {
  920. //公有
  921. let leftData = await getAlltree(this.userInfo.tenant_id, '1', refId)
  922. if (Array.isArray(leftData.data.data)) {
  923. this.leftTreeData = leftData.data.data;
  924. } else {
  925. this.leftTreeData = [];
  926. }
  927. }
  928. this.$refs.treetotree.setRightTree(projectTree.data.data);
  929. }
  930. } else {
  931. this.getTreeList();
  932. }
  933. }
  934. }
  935. };
  936. </script>
  937. <style scoped lang="scss">
  938. </style>