detail.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866
  1. <template>
  2. <basic-container>
  3. <div>
  4. <el-tabs v-model="activeType" :before-leave="beforeLeave">
  5. <el-tab-pane label="合同段信息" name="1">
  6. <div>
  7. <el-form :model="contractForm" :rules="contractRules" ref="contractForm" label-width="120px">
  8. <el-form-item label="项目名称">
  9. <el-input v-model="projectInfo.projectName" disabled></el-input>
  10. </el-form-item>
  11. <el-row>
  12. <el-col :span="12">
  13. <el-form-item label="合同段类型" prop="contractType">
  14. <el-select v-model="contractForm.contractType" placeholder="请选择" class="w-100p">
  15. <el-option v-for="item in contractTypeList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. </el-col>
  19. <el-col :span="12">
  20. <el-form-item label="合同段编号" prop="contractNumber">
  21. <el-input v-model="contractForm.contractNumber"></el-input>
  22. </el-form-item>
  23. </el-col>
  24. </el-row>
  25. <el-row>
  26. <el-col :span="12">
  27. <el-form-item label="合同段名称" prop="contractName">
  28. <el-input v-model="contractForm.contractName"></el-input>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="12">
  32. <el-form-item label="参与方进场日期" prop="contractorJoinTime">
  33. <el-date-picker v-model="contractForm.contractorJoinTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"></el-date-picker>
  34. </el-form-item>
  35. </el-col>
  36. </el-row>
  37. <el-row>
  38. <el-col :span="12">
  39. <el-form-item label="计划开工日期" prop="planStartTime">
  40. <el-date-picker v-model="contractForm.planStartTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"></el-date-picker>
  41. </el-form-item>
  42. </el-col>
  43. <el-col :span="12">
  44. <el-form-item label="计划完工日期" prop="planEndTime">
  45. <el-date-picker v-model="contractForm.planEndTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"></el-date-picker>
  46. </el-form-item>
  47. </el-col>
  48. </el-row>
  49. <el-row>
  50. <el-col :span="12">
  51. <el-form-item label="实际开工日期" prop="actualStartTime">
  52. <el-date-picker v-model="contractForm.actualStartTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"></el-date-picker>
  53. </el-form-item>
  54. </el-col>
  55. <el-col :span="12">
  56. <el-form-item label="实际完工日期" prop="actualEndTime">
  57. <el-date-picker v-model="contractForm.actualEndTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyy-MM-dd HH:mm:ss" placeholder="选择日期"></el-date-picker>
  58. </el-form-item>
  59. </el-col>
  60. </el-row>
  61. <el-row>
  62. <el-col :span="12">
  63. <el-form-item label="业主单位名称" prop="contractorUnitName">
  64. <el-input v-model="contractForm.contractorUnitName"></el-input>
  65. </el-form-item>
  66. </el-col>
  67. <el-col :span="12">
  68. <el-form-item label="合同金额" prop="contractAmount">
  69. <el-input v-model="contractForm.contractAmount">
  70. <template slot="append">万元</template>
  71. </el-input>
  72. </el-form-item>
  73. </el-col>
  74. </el-row>
  75. <el-row>
  76. <el-col :span="12">
  77. <el-form-item label="施工单位名称" prop="constructionUnitName">
  78. <el-input v-model="contractForm.constructionUnitName"></el-input>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="12">
  82. <el-form-item label="上传开工令" prop="startFileUrl">
  83. <template v-if="isBackShow">
  84. <el-link type="primary" @click="downloadFile">开工令</el-link>
  85. <el-button @click="delFile" class="mg-l-10" style="color:red" type="text" icon="el-icon-circle-close"></el-button>
  86. </template>
  87. <template v-else>
  88. <el-upload
  89. action="/api/blade-resource/oss/endpoint/put-file-attach"
  90. :on-remove="handleRemove"
  91. :limit="1" :headers=headers
  92. :on-exceed="handleExceed"
  93. :on-success="handleSuccess"
  94. :file-list="fileList">
  95. <el-button size="small" type="primary">点击上传</el-button>
  96. </el-upload>
  97. </template>
  98. </el-form-item>
  99. </el-col>
  100. </el-row>
  101. <el-row>
  102. <el-col :span="12">
  103. <el-form-item label="监理单位名称" prop="supervisionUnitName">
  104. <el-input v-model="contractForm.supervisionUnitName"></el-input>
  105. </el-form-item>
  106. </el-col>
  107. <el-col :span="12">
  108. <el-form-item label="实验室名称" prop="laboratoryName">
  109. <el-input v-model="contractForm.laboratoryName"></el-input>
  110. </el-form-item>
  111. </el-col>
  112. </el-row>
  113. <el-divider></el-divider>
  114. <el-row :gutter="20">
  115. <el-col :span="12">
  116. <div class="head-font">组卷归档默认信息</div>
  117. <el-row>
  118. <el-col :span="12">
  119. <el-form-item label="立卷人" prop="filer">
  120. <el-input v-model="contractForm.filer"></el-input>
  121. </el-form-item>
  122. </el-col>
  123. <el-col :span="12">
  124. <el-form-item label="保管期限" prop="storagePeriod">
  125. <el-select v-model="contractForm.storagePeriod" placeholder="请选择" class="w-100p">
  126. <el-option v-for="item in storagePeriodList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  127. </el-select>
  128. </el-form-item>
  129. </el-col>
  130. </el-row>
  131. <el-row>
  132. <el-col :span="12">
  133. <el-form-item label="审核人" prop="reviewer">
  134. <el-input v-model="contractForm.reviewer"></el-input>
  135. </el-form-item>
  136. </el-col>
  137. <el-col :span="12">
  138. <el-form-item label="保管密级" prop="securityLevel">
  139. <el-select v-model="contractForm.securityLevel" placeholder="请选择" class="w-100p">
  140. <el-option v-for="item in securityLevelList" :key="item.id" :label="item.dictValue" :value="item.dictKey"></el-option>
  141. </el-select>
  142. </el-form-item>
  143. </el-col>
  144. </el-row>
  145. <el-row>
  146. <el-col :span="12">
  147. <el-form-item label="档案前缀" prop="prefix">
  148. <el-input v-model="contractForm.prefix"></el-input>
  149. </el-form-item>
  150. </el-col>
  151. <el-col :span="12">
  152. </el-col>
  153. </el-row>
  154. </el-col>
  155. <el-col :span="12">
  156. <div class="head-font">附加信息</div>
  157. <el-form-item label="项目地址" prop="projectPlace">
  158. <!-- <el-input v-model="contractForm.projectPlace" placeholder="点击后面地图选取地址">
  159. <el-button slot="append" icon="el-icon-map-location" @click="mapDialogVisible = true"></el-button>
  160. </el-input> -->
  161. <avue-input-map :params="params" placeholder="请选择地图" v-model="flageData" @change="mapChange"></avue-input-map>
  162. </el-form-item>
  163. <el-form-item label="起始桩号" prop="startStation">
  164. <el-input v-model="contractForm.startStation"></el-input>
  165. </el-form-item>
  166. <el-form-item label="结束桩号" prop="endStation">
  167. <el-input v-model="contractForm.endStation"></el-input>
  168. </el-form-item>
  169. </el-col>
  170. </el-row>
  171. </el-form>
  172. </div>
  173. </el-tab-pane>
  174. <el-tab-pane label="分配WBS" name="2">
  175. <div>
  176. <div v-if="!wbsId" class="text-align-c">项目暂未分配wbs树</div>
  177. <tree-tree :left-tree-data="leftTreeData" ref="treetotree" @onAddTree="treeChang" @onDelTree="treeChang" ></tree-tree>
  178. </div>
  179. </el-tab-pane>
  180. <el-tab-pane label="分配项目人员" name="3">
  181. <div>
  182. <div class="flex jc-al-c">
  183. <span class="mg-r-10">项目名称</span>
  184. <el-input v-model="projectInfo.projectName" disabled style="width:300px;margin-right:30px;"></el-input>
  185. <span class="mg-r-10">合同段名称</span>
  186. <el-input v-model="contractForm.contractName" disabled style="width:300px;"></el-input>
  187. </div>
  188. <el-divider></el-divider>
  189. <div class="flex jc-al-c mg-b-10">
  190. <div>
  191. <span class="mg-r-10">角色方</span>
  192. <el-radio-group v-model="rId">
  193. <el-radio-button v-for="(item) in roleList" :label="item.id" :key="item.key">{{item.title}}</el-radio-button>
  194. </el-radio-group>
  195. </div>
  196. <div>
  197. <span class="mg-r-10 mg-l-20">请选择岗位</span>
  198. <el-select v-model="postId" filterable placeholder="请输入搜索">
  199. <el-option v-for="item in postList" :key="item.id" :label="item.postName" :value="item.id"></el-option>
  200. </el-select>
  201. </div>
  202. </div>
  203. <div>
  204. <el-table :data="contractUserList" border height="500" style="width: 100%">
  205. <el-table-column prop="name" label="姓名" align="center"></el-table-column>
  206. <el-table-column prop="account" label="登录账号" align="center"></el-table-column>
  207. <el-table-column prop="password" label="密码" align="center"></el-table-column>
  208. <el-table-column label="操作" align="center">
  209. <template slot-scope="scope">
  210. <el-link class="mg-r-20" type="primary" @click="copyAccPas(scope.row)">复制</el-link>
  211. <el-link class="mg-r-20" type="primary" @click="resetPassword(scope.row)">重置密码</el-link>
  212. <el-link type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-link>
  213. </template>
  214. </el-table-column>
  215. </el-table>
  216. <el-input v-model="copyText" ref="copyInput" type="textarea" style='opacity: 0;position: absolute;height:1px;overflow:hidden;'></el-input>
  217. </div>
  218. <div class="flex jc-al-c mg-t-20">
  219. <span>添加项目人员</span>
  220. <el-select v-model="userId" filterable placeholder="请输入搜索">
  221. <el-option v-for="item in userList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  222. </el-select>
  223. <el-button type="success" @click="addUserToProject">添加</el-button>
  224. <el-button type="primary">创建新用户</el-button>
  225. <el-button type="danger" @click="handleDeletes">全部删除</el-button>
  226. </div>
  227. <el-divider></el-divider>
  228. </div>
  229. </el-tab-pane>
  230. </el-tabs>
  231. <div class="flex jc-sb">
  232. <div></div>
  233. <div>
  234. <el-button type="success" size="medium" :loading="btnLoad" @click="saveQuit">保存并退出</el-button>
  235. <el-button type="info" size="medium" :loading="btnLoad" v-if="activeType != 1" @click="saveNext('p')">保存并返回上一步</el-button>
  236. <el-button type="info" size="medium" :loading="btnLoad" v-if="activeType != 3" @click="saveNext('n')">保存并进入下一步</el-button>
  237. </div>
  238. </div>
  239. </div>
  240. </basic-container>
  241. </template>
  242. <script>
  243. import {getProjectDeatil,findProjectTree} from "@/api/manager/projectinfo";
  244. import {submitContractInfo,getContractInfo,delFileFromUrl,
  245. findJobByRoleId,findAllUserByCondition,findUserByName,
  246. saveUserInfoByProject,removeUsersByIds,resetPasswordByUserId,
  247. submitWbsTreeInContract,getContractInfoTree} from "@/api/manager/contractinfo";
  248. import {getRoleTree} from "@/api/system/role";
  249. import {getDictionary} from "@/api/system/dict";
  250. import {getDictionary as getDictbiz} from "@/api/system/dictbiz";
  251. import {remove as removeFile} from "@/api/resource/attach";
  252. import website from '@/config/website';
  253. import {Base64} from 'js-base64';
  254. import {getToken} from '@/util/auth';
  255. import {mapGetters} from "vuex";
  256. import treeTree from "@/components/tree-tree/main"
  257. export default {
  258. components: {
  259. treeTree
  260. },
  261. data() {
  262. var checkPlace = (rule, value, callback) => {
  263. if (this.flageData && this.flageData.length >2 && this.flageData[2]) {
  264. callback();
  265. } else {
  266. callback(new Error('请选取项目地址'));
  267. }
  268. }
  269. var checkDate = (rule, value, callback) => {
  270. if (value && this.contractForm.planStartTime) {
  271. if(Date.parse(value) < Date.parse(this.contractForm.planStartTime)){
  272. callback(new Error('计划完工日期不能小于开工日期'));
  273. }
  274. }
  275. callback();
  276. };
  277. var checkDate2 = (rule, value, callback) => {
  278. if (value && this.contractForm.actualStartTime) {
  279. if(Date.parse(value) < Date.parse(this.contractForm.actualStartTime)){
  280. callback(new Error('实际完工日期不能小于开工日期'));
  281. }
  282. }
  283. callback();
  284. };
  285. var checkIsNumber = (rule, value, callback) => {
  286. if (value != Number(value)) {
  287. callback(new Error('金额必须是数字'));
  288. }
  289. callback();
  290. };
  291. return {
  292. activeType:'1',
  293. typeChang:{
  294. 1:false,
  295. 2:false,
  296. 3:false,
  297. },
  298. btnLoad:false,
  299. pid:'',
  300. cid:'',
  301. projectInfo:{},
  302. contractTypeList:[],
  303. storagePeriodList:[],//保管期限
  304. securityLevelList:[],//保管密级
  305. fileList:[],
  306. headers:{},
  307. isBackShow:false,
  308. contractForm:{
  309. contractAmount:0
  310. },
  311. contractRules:{
  312. contractName: [
  313. { required: true, message: '请输入合同段名称', trigger: 'blur' },
  314. ],
  315. contractType: [
  316. { required: true, message: '请选择合同段类型', trigger: 'change' }
  317. ],
  318. contractNumber: [
  319. { required: true, message: '请输入合同段编号', trigger: 'blur' },
  320. ],
  321. contractorUnitName: [
  322. { required: true, message: '请输入业主单位名称', trigger: 'blur' },
  323. ],
  324. constructionUnitName: [
  325. { required: true, message: '请输入施工单位名称', trigger: 'blur' },
  326. ],
  327. supervisionUnitName: [
  328. { required: true, message: '请输入监理单位名称', trigger: 'blur' },
  329. ],
  330. laboratoryName: [
  331. { required: true, message: '请输入实验室名称', trigger: 'blur' },
  332. ],
  333. startStation: [
  334. { required: true, message: '请输入起始桩号', trigger: 'blur' },
  335. ],
  336. endStation: [
  337. { required: true, message: '请输入结束桩号', trigger: 'blur' },
  338. ],
  339. projectPlace: [
  340. { required: true,validator: checkPlace, trigger: 'blur' },
  341. ],
  342. planEndTime:[
  343. {validator: checkDate,trigger: 'blur'},
  344. ],
  345. actualEndTime:[
  346. {validator: checkDate2,trigger: 'blur'},
  347. ],
  348. contractAmount:[
  349. {validator: checkIsNumber,trigger: 'blur'}
  350. ]
  351. },
  352. mapDialogVisible:false,
  353. params:{
  354. zoom: 10,
  355. // zoomEnable: false,
  356. // dragEnable: false,
  357. },
  358. flageData:[],
  359. rId:'',
  360. roleList:[],
  361. postId:'',
  362. postList:[],
  363. contractUserList:[],
  364. userId:'',
  365. userList:[],
  366. copyText:'',
  367. wbsId:'',
  368. leftTreeData:[],
  369. }
  370. },
  371. computed: {
  372. ...mapGetters(["userInfo"]),
  373. },
  374. watch:{
  375. contractForm:{
  376. handler: function() { // 此处注意,handler函数不能为箭头函数,this会取上下文,而不是组件里的this,此外,深度监听,必须为handler函数名,否则会无效果
  377. this.typeChang['1'] = true;
  378. },
  379. deep: true
  380. },
  381. activeType: async function (newValue) {
  382. if(newValue == '3'){
  383. this.getRoleList();
  384. this.getUserByName();
  385. }else if(newValue == '2'){
  386. await this.getLeftTree();
  387. this.getRightTree();
  388. }
  389. },
  390. rId:function(newValue){
  391. findJobByRoleId(newValue).then((res)=>{
  392. this.postList = res.data.data;
  393. }).catch(()=>{
  394. this.postList = [];
  395. }).finally(()=>{
  396. this.postId = '';
  397. })
  398. },
  399. postId:function(newValue){
  400. if(newValue){
  401. this.findAllUserByCondition();
  402. }else{
  403. this.contractUserList = [];
  404. }
  405. }
  406. },
  407. created() {
  408. this.init();
  409. //console.log(this.userInfo)
  410. },
  411. mounted(){
  412. this.$nextTick(()=>{
  413. this.typeChang = {
  414. 1:false,
  415. 2:false,
  416. 3:false,
  417. }
  418. })
  419. },
  420. methods: {
  421. async init(){
  422. this.pid = this.$route.query.pid;
  423. this.cid = this.$route.query.cid;
  424. if(!this.cid){
  425. this.contractForm.pid = this.pid;
  426. }else{
  427. await this.getContractInfo();
  428. }
  429. await this.getProjectDeatil();
  430. if(this.$route.query.type){
  431. this.activeType = this.$route.query.type;
  432. }
  433. this.getContractTypeList();
  434. this.getStoragePeriodList();
  435. this.getSecurityLevelList();
  436. this.setHeaders();
  437. },
  438. beforeLeave(activeName, oldActiveName){
  439. return new Promise((resolve,reject)=>{
  440. if(oldActiveName == '1' && !this.contractForm.id){
  441. this.$message({
  442. type: "warning",
  443. message: "请先保存合同段后,再进行合同段的分配"
  444. });
  445. reject();
  446. }
  447. if(this.typeChang[oldActiveName]){
  448. this.$confirm('检测到新编辑内容, 是否保存?', '提示', {
  449. confirmButtonText: '确定',
  450. cancelButtonText: '不用',
  451. type: 'warning'
  452. }).then(() => {
  453. switch (oldActiveName) {
  454. case '1':
  455. this.savecontract().then((res)=>{
  456. this.contractForm.id = res.data.data.id;
  457. resolve();
  458. this.$message({
  459. type: "success",
  460. message: "保存成功!"
  461. });
  462. });
  463. break;
  464. case '2':
  465. this.saveWbsTree().then(()=>{
  466. resolve();
  467. this.$message({
  468. type: "success",
  469. message: "保存成功!"
  470. });
  471. })
  472. break;
  473. }
  474. }).catch(()=>{
  475. this.typeChang[oldActiveName] = false;
  476. resolve();
  477. })
  478. }else{
  479. resolve();
  480. }
  481. })
  482. },
  483. getProjectDeatil(){
  484. return new Promise((resolve)=>{
  485. getProjectDeatil(this.pid).then((res)=>{
  486. this.projectInfo = res.data.data;
  487. this.wbsId = this.projectInfo.referenceWbsTemplateId;
  488. resolve();
  489. }).finally(()=>{
  490. resolve();
  491. })
  492. })
  493. },
  494. getContractInfo(){
  495. return new Promise((resolve)=>{
  496. getContractInfo(this.cid).then((res)=>{
  497. this.contractForm = res.data.data;
  498. if(this.contractForm.startFileUrl){
  499. this.isBackShow = true;
  500. }
  501. if(this.contractForm.projectPlace){
  502. this.flageData = ['','',this.contractForm.projectPlace]
  503. }
  504. if(Number(this.contractForm.contractAmount) < 0){
  505. this.contractForm.contractAmount = 0;
  506. }
  507. this.$nextTick(()=>{
  508. this.typeChang['1'] = false;
  509. })
  510. }).finally(()=>{
  511. resolve();
  512. })
  513. })
  514. },
  515. async saveQuit(){
  516. this.btnLoad = true;
  517. try {
  518. if(this.activeType == '1'){
  519. await this.savecontract();
  520. }else if(this.activeType == '2'){
  521. await this.saveWbsTree();
  522. }
  523. } catch (error) {
  524. this.btnLoad = false;
  525. return;
  526. }
  527. this.$message({
  528. type: "success",
  529. message: "保存成功!"
  530. });
  531. this.btnLoad = false;
  532. this.$router.go(-1);
  533. },
  534. async saveNext(type){
  535. this.btnLoad = true;
  536. try {
  537. if(this.activeType == '1'){
  538. let res = await this.savecontract();
  539. this.contractForm.id = res.data.data.id;
  540. }else if(this.activeType == '2'){
  541. await this.saveWbsTree();
  542. }
  543. } catch (error) {
  544. this.btnLoad = false;
  545. return;
  546. }
  547. this.$message({
  548. type: "success",
  549. message: "保存成功!"
  550. });
  551. this.typeChang[this.activeType] = false;
  552. let num = Number(this.activeType);
  553. if(type == 'n'){
  554. num++;
  555. }else if(type == 'p'){
  556. num--;
  557. }
  558. this.activeType = num.toString();
  559. this.btnLoad = false;
  560. },
  561. savecontract(){
  562. return new Promise((resolve, reject) => {
  563. this.$refs['contractForm'].validate((valid) => {
  564. if (valid) {
  565. if(this.flageData.length ==3){
  566. this.contractForm.projectPlace = this.flageData[2];
  567. }
  568. resolve(submitContractInfo(this.contractForm))
  569. }else{
  570. reject('验证失败')
  571. }
  572. })
  573. })
  574. },
  575. handleRemove(file) {
  576. //console.log(file, fileList);
  577. removeFile(file.response.data.attachId).then(()=>{
  578. this.contractForm.startFileUrl = '';
  579. })
  580. },
  581. handleExceed() {
  582. this.$message.warning(`当前限制选择 1 个文件,请先移除后,再次上传`);
  583. },
  584. handleSuccess(res){
  585. this.contractForm.startFileUrl = res.data.link;
  586. },
  587. setHeaders(){
  588. this.headers['Authorization'] = `Basic ${Base64.encode(`${website.clientId}:${website.clientSecret}`)}`;
  589. this.headers[website.tokenHeader] = 'bearer ' + getToken()
  590. },
  591. downloadFile(){
  592. window.open(this.contractForm.startFileUrl);
  593. },
  594. delFile(){
  595. this.$confirm('是否删除该文件?', '删除开工令', {
  596. distinguishCancelAndClose: true,
  597. confirmButtonText: '删除',
  598. cancelButtonText: '取消'
  599. }).then(() => {
  600. delFileFromUrl(this.contractForm.startFileUrl).then(()=>{
  601. this.isBackShow = false;
  602. this.contractForm.startFileUrl = '';
  603. })
  604. })
  605. },
  606. addUserToProject(){
  607. if(!this.userId){
  608. this.$message({
  609. type: "warning",
  610. message: "请先选择用户再进行添加"
  611. });
  612. return;
  613. }
  614. if(!this.postId){
  615. this.$message({
  616. type: "warning",
  617. message: "请先选择岗位再进行添加"
  618. });
  619. return;
  620. }
  621. if(!this.rId){
  622. this.$message({
  623. type: "warning",
  624. message: "请先选择角色再进行添加"
  625. });
  626. return;
  627. }
  628. let list = [{
  629. projectId:this.pid,
  630. contractId:this.contractForm.id,
  631. userId:this.userId,
  632. postId:this.postId,
  633. roleId:this.rId
  634. }];
  635. saveUserInfoByProject(list).then(()=>{
  636. this.findAllUserByCondition();
  637. })
  638. },
  639. findAllUserByCondition(){
  640. findAllUserByCondition({
  641. "cId": this.contractForm.id,
  642. "pId": this.pid,
  643. "postId": this.postId,
  644. "rId": this.rId
  645. }).then((res)=>{
  646. this.contractUserList = res.data.data;
  647. })
  648. },
  649. handleDelete(index,row){
  650. this.$confirm('是否将该用户移除出合同段', '提示', {
  651. confirmButtonText: '确定',
  652. cancelButtonText: '取消',
  653. type: 'warning'
  654. }).then(() => {
  655. removeUsersByIds(row.id).then(()=>{
  656. this.contractUserList.splice(index,1);
  657. this.$message({
  658. type: "success",
  659. message: "删除成功!"
  660. });
  661. })
  662. })
  663. },
  664. handleDeletes(){
  665. this.$confirm('是否将所有用户移除出合同段', '提示', {
  666. confirmButtonText: '确定',
  667. cancelButtonText: '取消',
  668. type: 'warning'
  669. }).then(() => {
  670. let ids = [];
  671. this.contractUserList.forEach((element)=>{
  672. ids.push(element.id);
  673. })
  674. removeUsersByIds(ids.join(',')).then(()=>{
  675. this.contractUserList = [];
  676. this.$message({
  677. type: "success",
  678. message: "删除成功!"
  679. });
  680. })
  681. })
  682. },
  683. copyAccPas(row){
  684. this.copyText = `姓名:${row.name}
  685. 账号:${row.account}
  686. 密码:${row.password}`;
  687. this.$nextTick(()=>{
  688. this.$refs.copyInput.select()
  689. document.execCommand('copy')
  690. this.$message({
  691. type: "success",
  692. message: "成功复制在剪贴板!"
  693. });
  694. })
  695. },
  696. resetPassword(row){
  697. this.$confirm('是否将用户【'+row.name+'】密码重置为123456', '提示', {
  698. confirmButtonText: '确定',
  699. cancelButtonText: '取消',
  700. type: 'warning'
  701. }).then(() => {
  702. resetPasswordByUserId(row.uId).then(()=>{
  703. row.password = '123456';
  704. this.$message({
  705. type: "success",
  706. message: "重置成功!"
  707. });
  708. })
  709. })
  710. },
  711. getContractTypeList(){
  712. if(this.contractTypeList.length >1){
  713. return;
  714. }
  715. getDictionary({
  716. code:'contract_type'
  717. }).then((res)=>{
  718. res.data.data.forEach(element => {
  719. element.dictKey = Number(element.dictKey)
  720. });
  721. this.contractTypeList = res.data.data;
  722. })
  723. },
  724. getRoleList(){
  725. if(this.roleList.length > 1){
  726. return;
  727. }
  728. getRoleTree().then((res)=>{
  729. let list = [];
  730. res.data.data.forEach((element)=>{
  731. if(element.title == '监理方'||
  732. element.title == '业主方'){
  733. list.push(element);
  734. }else if(element.title == '施工方'){
  735. //给个默认
  736. this.rId = element.id;
  737. list.push(element);
  738. }
  739. })
  740. this.roleList = list;
  741. })
  742. },
  743. getUserByName(){
  744. findUserByName('').then((res)=>{
  745. this.userList = res.data.data;
  746. })
  747. },
  748. getLeftTree(){
  749. return new Promise((resolve)=>{
  750. if(!this.leftTreeData.length){
  751. findProjectTree(this.projectInfo.id,this.wbsId).then((res)=>{
  752. if(Array.isArray(res.data.data)){
  753. this.leftTreeData = res.data.data;
  754. }else{
  755. this.leftTreeData = [];
  756. }
  757. resolve();
  758. }).finally(()=>{
  759. resolve();
  760. })
  761. }
  762. resolve();
  763. })
  764. },
  765. getRightTree(){
  766. getContractInfoTree(this.wbsId,this.projectInfo.id,this.contractForm.id).then((res)=>{
  767. if(Array.isArray(res.data.data)){
  768. this.$refs.treetotree.setRightTree(res.data.data);
  769. }
  770. })
  771. },
  772. saveWbsTree(){
  773. let obj = {};
  774. let ids = this.$refs.treetotree.getTreeAllId('rightTree');
  775. obj = {
  776. wbsId:this.wbsId,
  777. projectId:this.projectInfo.id,
  778. contractId:this.contractForm.id,
  779. wbsTreeIds:ids
  780. }
  781. return submitWbsTreeInContract(obj);
  782. },
  783. treeChang(){
  784. this.typeChang[2] = true;
  785. },
  786. mapChange(){
  787. this.$refs['contractForm'].validateField('projectPlace');
  788. },
  789. getStoragePeriodList(){
  790. if(this.storagePeriodList.length >1){
  791. return;
  792. }
  793. getDictbiz({
  794. code:'storage_period'
  795. }).then((res)=>{
  796. res.data.data.forEach(element => {
  797. element.dictKey = Number(element.dictKey)
  798. });
  799. this.storagePeriodList = res.data.data;
  800. })
  801. },
  802. getSecurityLevelList(){
  803. if(this.securityLevelList.length >1){
  804. return;
  805. }
  806. getDictbiz({
  807. code:'security_level'
  808. }).then((res)=>{
  809. res.data.data.forEach(element => {
  810. element.dictKey = Number(element.dictKey)
  811. });
  812. this.securityLevelList = res.data.data;
  813. })
  814. }
  815. }
  816. };
  817. </script>
  818. <style scoped lang="scss">
  819. .bm-view {
  820. width: 100%;
  821. height: 300px;
  822. }
  823. .head-font{
  824. font-size: 20px;
  825. font-weight:bold;
  826. }
  827. </style>