综合办公系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

info.vue 26KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. <template>
  2. <div class="app-container">
  3. <div class="header">
  4. <el-button icon="el-icon-d-arrow-left" plain type="primary" class="back" @click="goBack">返回</el-button>
  5. <h1>{{ '【' + project.projectNumber + '】' + project.projectName }}</h1>
  6. </div>
  7. <el-divider></el-divider>
  8. <div class="content">
  9. <!-- 项目基本信息 -->
  10. <div class="box1">
  11. <div class="title">项目基本信息
  12. <div class="line"></div>
  13. </div>
  14. <div class="info mt20">
  15. <el-descriptions class="descriptions" border :column="column" style="text-align: center;">
  16. <el-descriptions-item>
  17. <template slot="label">
  18. <svg-icon slot="prefix" icon-class="number" />
  19. 项目编号
  20. </template>
  21. {{ project.projectNumber }}
  22. </el-descriptions-item>
  23. <el-descriptions-item>
  24. <template slot="label">
  25. <svg-icon slot="prefix" icon-class="clipboard" />
  26. 项目名称
  27. </template>
  28. {{ project.projectName }}
  29. </el-descriptions-item>
  30. <el-descriptions-item>
  31. <template slot="label">
  32. <svg-icon slot="prefix" icon-class="JamYelpSquare" />
  33. 项目类型
  34. </template>
  35. {{ project.projectType }}
  36. </el-descriptions-item>
  37. <el-descriptions-item>
  38. <template slot="label">
  39. <svg-icon slot="prefix" icon-class="guide" />
  40. 项目来源
  41. </template>
  42. {{ project.projectSource == '0' ? '院内' : '院外' }}
  43. </el-descriptions-item>
  44. <el-descriptions-item>
  45. <template slot="label">
  46. <svg-icon slot="prefix" icon-class="pmLevel" />
  47. 项目级别
  48. </template>
  49. <el-tag :type="project.projectLevel ? (project.projectLevel === '0' ? 'info' : 'danger') : 'info'">
  50. {{ project.projectLevel ? (project.projectLevel == '0' ? '一般项目' : '重大项目') : '一般项目'}}
  51. </el-tag>
  52. </el-descriptions-item>
  53. <el-descriptions-item>
  54. <template slot="label">
  55. <svg-icon slot="prefix" icon-class="school" />
  56. 甲方单位
  57. </template>
  58. {{ project.partyA ? project.partyA.partyAName : '' }}
  59. </el-descriptions-item>
  60. <el-descriptions-item>
  61. <template slot="label">
  62. <svg-icon slot="prefix" icon-class="peoples" />
  63. 联系人
  64. </template>
  65. {{ project.contactPerson }}
  66. </el-descriptions-item>
  67. <el-descriptions-item>
  68. <template slot="label">
  69. <svg-icon slot="prefix" icon-class="phone" />
  70. 联系电话
  71. </template>
  72. {{ project.telephone }}
  73. </el-descriptions-item>
  74. <el-descriptions-item>
  75. <template slot="label">
  76. <svg-icon slot="prefix" icon-class="contractSign" />
  77. 合同编码
  78. </template>
  79. {{ contractCode }}
  80. </el-descriptions-item>
  81. <el-descriptions-item>
  82. <template slot="label">
  83. <svg-icon slot="prefix" icon-class="number" />
  84. 合同编号
  85. </template>
  86. {{ contractNumber }}
  87. </el-descriptions-item>
  88. <el-descriptions-item>
  89. <template slot="label">
  90. <svg-icon slot="prefix" icon-class="dept" />
  91. 承担部门
  92. </template>
  93. {{ project.undertakingDeptName }}
  94. </el-descriptions-item>
  95. <el-descriptions-item>
  96. <template slot="label">
  97. <svg-icon slot="prefix" icon-class="user" />
  98. 项目登记人
  99. </template>
  100. {{ getUserName(project.projectRegistrant) }}
  101. </el-descriptions-item>
  102. <el-descriptions-item>
  103. <template slot="label">
  104. <svg-icon slot="prefix" icon-class="date" />
  105. 项目登记时间
  106. </template>
  107. {{ project.registerTime }}
  108. </el-descriptions-item>
  109. <el-descriptions-item :span="3">
  110. <template slot="label">
  111. <svg-icon slot="prefix" icon-class="file" />
  112. 项目任务书
  113. </template>
  114. <div v-if="project.taskDocument">
  115. <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + project.taskDocument}`)">
  116. {{ getFileName(project.taskDocument) }}
  117. </el-link>
  118. <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + project.taskDocument}`"
  119. :underline="false" target="_blank">
  120. <span class="el-icon-download">下载文件</span>
  121. </el-link>
  122. </div>
  123. </el-descriptions-item>
  124. <el-descriptions-item :span="3">
  125. <template slot="label">
  126. <svg-icon slot="prefix" icon-class="build" />
  127. 项目概况
  128. </template>
  129. <div>
  130. <el-table :data="workList">
  131. <el-table-column type="index" width="50" />
  132. <el-table-column label="工作内容" prop="content" />
  133. <el-table-column label="比例尺" prop="scale" />
  134. <el-table-column label="单位" prop="unit" />
  135. <el-table-column label="工作量" prop="workload" />
  136. <el-table-column label="要求完成时间" prop="deadline" />
  137. </el-table>
  138. </div>
  139. </el-descriptions-item>
  140. <el-descriptions-item>
  141. <template slot="label">
  142. <svg-icon slot="prefix" icon-class="edit" />
  143. 项目备注
  144. </template>
  145. {{ project.remark }}
  146. </el-descriptions-item>
  147. </el-descriptions>
  148. </div>
  149. </div>
  150. <!-- 项目管理部安排 -->
  151. <div class="box1 mt20">
  152. <div class="title">项目管理部安排
  153. <div class="line"></div>
  154. </div>
  155. <div class="info mt20">
  156. <el-descriptions class="descriptions" border :column="4" style="text-align: center;">
  157. <el-descriptions-item>
  158. <template slot="label">
  159. <svg-icon slot="prefix" icon-class="dept" />
  160. 承担部门
  161. </template>
  162. {{ project.undertakingDeptName }}
  163. </el-descriptions-item>
  164. <el-descriptions-item>
  165. <template slot="label">
  166. <svg-icon slot="prefix" icon-class="peoples" />
  167. 部门负责人
  168. </template>
  169. {{ deptLeaderList.join(',') }}
  170. </el-descriptions-item>
  171. <el-descriptions-item>
  172. <template slot="label">
  173. <svg-icon slot="prefix" icon-class="user" />
  174. 项目负责人
  175. </template>
  176. <div style="display: flex;justify-content:space-between;">
  177. <div>{{ project.projectLeaderUser ? project.projectLeaderUser.nickName : "" }}</div>
  178. <div>
  179. <el-button class="ml20" type="warning" plain size="mini" icon="el-icon-plus"
  180. @click="prLeaderOpen = true" v-hasPermi="['oa:project:edit']">
  181. 更换项目负责人
  182. </el-button>
  183. </div>
  184. </div>
  185. </el-descriptions-item>
  186. <el-descriptions-item>
  187. <template slot="label">
  188. <svg-icon slot="prefix" icon-class="user" />
  189. 现场负责人
  190. </template>
  191. {{ getUserName(project.siteLeader) }}
  192. </el-descriptions-item>
  193. <el-descriptions-item>
  194. <template slot="label">
  195. <svg-icon slot="prefix" icon-class="date" />
  196. 组织交底时间
  197. </template>
  198. {{ project.organizeTime }}
  199. </el-descriptions-item>
  200. <el-descriptions-item>
  201. <template slot="label">
  202. <svg-icon slot="prefix" icon-class="date" />
  203. 项目预算
  204. </template>
  205. <!-- v-hasPermi="['oa:project:edit']" -->
  206. <el-link type="primary" @click="openBudget = true">预算表</el-link>
  207. </el-descriptions-item>
  208. <el-descriptions-item>
  209. <template slot="label">
  210. <svg-icon slot="prefix" icon-class="documentation" />
  211. 组织交底文档
  212. </template>
  213. <div v-if="project.organizeDocument">
  214. <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + project.organizeDocument}`)">
  215. {{ getFileName(project.organizeDocument) }}
  216. </el-link>
  217. <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + project.organizeDocument}`"
  218. :underline="false" target="_blank">
  219. <span class="el-icon-download">下载文件</span>
  220. </el-link>
  221. </div>
  222. </el-descriptions-item>
  223. </el-descriptions>
  224. </div>
  225. </div>
  226. <!-- 任务审核情况 -->
  227. <div class="box1 mt20">
  228. <div class="title">任务审核情况
  229. <div class="line"></div>
  230. </div>
  231. <div class="info mt20">
  232. <el-descriptions class="descriptions" border :column="1" style="text-align: center;">
  233. <el-descriptions-item>
  234. <template slot="label">
  235. <svg-icon slot="prefix" icon-class="user" />
  236. 经营发展部审核
  237. </template>
  238. <div>
  239. <el-input disabled type="textarea" v-model="projectComment.jyComment"></el-input>
  240. <div class="sign mt10">
  241. <div class="mr20">签名:<span class="auditor">{{ projectComment.jyUser ? projectComment.jyUser.nickName :
  242. ''
  243. }}</span>
  244. </div>
  245. <div class="ml20"><span>审核时间:{{ projectComment.jyApprovalTime }}</span></div>
  246. </div>
  247. </div>
  248. </el-descriptions-item>
  249. <el-descriptions-item>
  250. <template slot="label">
  251. <svg-icon slot="prefix" icon-class="user" />
  252. 分管领导批准
  253. </template>
  254. <div>
  255. <el-input disabled type="textarea" v-model="projectComment.manageComment"></el-input>
  256. <div class="sign mt10">
  257. <div class="mr20">签名:<span class="auditor">{{ projectComment.managerUser ?
  258. projectComment.managerUser.nickName : '' }}</span>
  259. </div>
  260. <div class="ml20"><span>审核时间:{{ projectComment.manageApprovalTime }}</span></div>
  261. </div>
  262. </div>
  263. </el-descriptions-item>
  264. <el-descriptions-item>
  265. <template slot="label">
  266. <svg-icon slot="prefix" icon-class="user" />
  267. 生产部门确认
  268. </template>
  269. <div>
  270. <el-input disabled type="textarea" v-model="projectComment.scComment"></el-input>
  271. <div class="sign mt10">
  272. <div class="mr20">签名:<span class="auditor">{{ projectComment.scApproverName }}</span>
  273. </div>
  274. <div class="ml20"><span>审核时间:{{ projectComment.scApprovalTime }}</span></div>
  275. </div>
  276. </div>
  277. </el-descriptions-item>
  278. </el-descriptions>
  279. </div>
  280. </div>
  281. <div class="box1 mt20">
  282. <div class="title">项目生产情况
  283. <div class="line"></div>
  284. </div>
  285. <div class="info mt20">
  286. <el-descriptions class="descriptions xmsc" border :column="2" style="text-align: center;">
  287. <el-descriptions-item :span="2">
  288. <template slot="label">
  289. <svg-icon slot="prefix" icon-class="form" />
  290. 安全交底记录表
  291. </template>
  292. <el-link type="primary" @click="openSafe = true">安全交底记录表</el-link>
  293. </el-descriptions-item>
  294. <el-descriptions-item :span="2">
  295. <template slot="label">
  296. <svg-icon slot="prefix" icon-class="form" />
  297. 技术交底记录表
  298. </template>
  299. <el-link type="primary" @click="openTech = true">技术交底记录表</el-link>
  300. </el-descriptions-item>
  301. <el-descriptions-item :span="2">
  302. <template slot="label">
  303. <svg-icon slot="prefix" icon-class="equipment" />
  304. 申请设备
  305. </template>
  306. <el-select v-model="devices" multiple disabled style="width:100%">
  307. <el-option v-for="item in deviceList" :key="item.deviceId" :label="item.name + '【' + (item.brand != null ? item.brand : '') + (item.series != null ? '-' + item.series + '】' : '')
  308. + (item.code != null ? '(设备编号:' + item.code + ')' : '') + '📍' + item.place" :value="item.deviceId">
  309. </el-option>
  310. </el-select>
  311. </el-descriptions-item>
  312. <el-descriptions-item :span="2">
  313. <template slot="label">
  314. <svg-icon slot="prefix" icon-class="car" />
  315. 使用车辆
  316. </template>
  317. <el-select v-model="cars" multiple disabled style="width:100%">
  318. <el-option v-for="item in carList" :label="item.licensePlate + item.brand" :value="item.carId"
  319. :key="item.carId">
  320. </el-option>
  321. </el-select>
  322. </el-descriptions-item>
  323. <el-descriptions-item :span="2">
  324. <template slot="label">
  325. <svg-icon slot="prefix" icon-class="peoples" />
  326. 驾驶员
  327. </template>
  328. <el-select v-model="drivers" multiple disabled style="width:100%">
  329. <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId">
  330. </el-option>
  331. </el-select>
  332. </el-descriptions-item>
  333. <el-descriptions-item :span="2">
  334. <template slot="label">
  335. <svg-icon slot="prefix" icon-class="dept" />
  336. 参与人员
  337. </template>
  338. <el-select v-model="participates" multiple disabled style="width:100%">
  339. <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId">
  340. </el-option>
  341. </el-select>
  342. </el-descriptions-item>
  343. <el-descriptions-item>
  344. <template slot="label">
  345. <svg-icon slot="prefix" icon-class="date" />
  346. 进场时间
  347. </template>
  348. {{ project.entryTime }}
  349. </el-descriptions-item>
  350. <el-descriptions-item>
  351. <template slot="label">
  352. <svg-icon slot="prefix" icon-class="date" />
  353. 撤场时间
  354. </template>
  355. {{ project.exitTime }}
  356. </el-descriptions-item>
  357. <el-descriptions-item :span="2">
  358. <template slot="label">
  359. <svg-icon slot="prefix" icon-class="date" />
  360. 项目进度
  361. </template>
  362. <div>
  363. <el-table :data="progressList">
  364. <el-table-column type="index" width="50" />
  365. <el-table-column label="截至日期" prop="date" />
  366. <el-table-column label="累计总进度(%)" prop="percentage" />
  367. <el-table-column label="情况说明" prop="situation" />
  368. </el-table>
  369. </div>
  370. </el-descriptions-item>
  371. <el-descriptions-item :span="2">
  372. <template slot="label">
  373. <svg-icon slot="prefix" icon-class="date" />
  374. 项目借款
  375. </template>
  376. <borrow-data :taskForm="taskForm"></borrow-data>
  377. </el-descriptions-item>
  378. <el-descriptions-item :span="2">
  379. <template slot="label">
  380. <svg-icon slot="prefix" icon-class="date" />
  381. 成果汇交
  382. </template>
  383. <achi-data :taskForm="taskForm" class="table-warpper"></achi-data>
  384. </el-descriptions-item>
  385. <el-descriptions-item :span="2">
  386. <template slot="label">
  387. <svg-icon slot="prefix" icon-class="date" />
  388. 产值结算
  389. </template>
  390. <settle-data :taskForm="taskForm"></settle-data>
  391. </el-descriptions-item>
  392. </el-descriptions>
  393. </div>
  394. </div>
  395. </div>
  396. <el-dialog title="项目预算" :visible.sync="openBudget" width="1000px" append-to-body>
  397. <budget-tab :taskForm="taskForm"></budget-tab>
  398. </el-dialog>
  399. <el-dialog title="安全交底记录表" :visible.sync="openSafe" width="1000px" append-to-body>
  400. <safe-tab :taskForm="taskForm"></safe-tab>
  401. </el-dialog>
  402. <el-dialog title="技术交底记录表" :visible.sync="openTech" width="1000px" append-to-body>
  403. <technical-tab :taskForm="taskForm"></technical-tab>
  404. </el-dialog>
  405. <el-dialog title="更换项目负责人" :visible.sync="prLeaderOpen" width="1000px" append-to-body>
  406. <choose-people :multiple="false" @chooseUser="changeProjectLeader"></choose-people>
  407. </el-dialog>
  408. </div>
  409. </template>
  410. <script>
  411. import { getDept } from "@/api/system/dept";
  412. import { getUsersDeptLeaderByDept } from '@/api/system/post'
  413. import { listUser, getUser } from "@/api/system/user";
  414. import { getProject, updateProject } from "@/api/oa/project/project";
  415. import { listProjectWork, addProjectWork } from "@/api/oa/project/projectWork";
  416. import { listProjectComment, getProjectComment } from "@/api/oa/project/projectComment";
  417. import { listProjectProgress, getProjectProgress } from "@/api/oa/project/projectProgress";
  418. import { listProjectContract, addProjectContract } from "@/api/oa/contract/projectContract";
  419. import { listContract, getContract, delContract, addContract, updateContract } from "@/api/oa/contract/contract";
  420. import { listDevice } from "@/api/oa/device/device";
  421. import { listCar } from '@/api/oa/car/car';
  422. import budgetInfo from '@/views/flowable/form/budget/budgetInfo.vue';
  423. import SafeTab from '@/views/flowable/form/projectProcess/safeTab.vue';
  424. import TechnicalTab from '@/views/flowable/form/projectProcess/technicalTab.vue';
  425. import SettleData from '@/views/flowable/form/inProgress/settleData.vue';
  426. import BorrowData from '@/views/flowable/form/inProgress/borrowData.vue';
  427. import BudgetTab from '@/views/flowable/form/projectProcess/budgetTab.vue';
  428. import achiData from "@/views/flowable/form/inProgress/achiData.vue";
  429. import choosePeople from '@/views/flowable/form/budget/components/choosePeople.vue'
  430. export default {
  431. components: { budgetInfo, SafeTab, TechnicalTab, SettleData, BorrowData, BudgetTab, achiData, choosePeople },
  432. created() {
  433. this.getUserList();
  434. this.getDeviceList();
  435. this.getCarList();
  436. if (this.$route.query) {
  437. this.taskForm.formId = this.$route.query.projectId
  438. let projectId = this.$route.query.projectId
  439. this.getProjectInfo(projectId)
  440. this.getProjectWorkList(projectId)
  441. this.getProjectCommentList(projectId)
  442. this.getContractDataList(projectId);
  443. this.getProjectProgressList(projectId);
  444. }
  445. },
  446. data() {
  447. return {
  448. baseUrl: process.env.VUE_APP_BASE_API,
  449. project: {},
  450. activeName: '1',
  451. column: 3,
  452. userList: [],
  453. deviceList: [],
  454. carList: [],
  455. workList: [],
  456. deptLeaderList: [],
  457. progressList: [],
  458. contractCode: "",
  459. contractNumber: "",
  460. openBudget: false,
  461. openSafe: false,
  462. openTech: false,
  463. prLeaderOpen: false,
  464. taskForm: {
  465. formId: ''
  466. },
  467. projectComment: {},
  468. devices: [],
  469. cars: [],
  470. drivers: [],
  471. participates: []
  472. }
  473. },
  474. methods: {
  475. getProjectInfo(projectId) {
  476. getProject(projectId).then(res => {
  477. if (res.data) {
  478. this.project = res.data;
  479. let deptArr = this.project.undertakingDept.split(',');
  480. let undertakingDept = []
  481. for (let dept of deptArr) {
  482. getUsersDeptLeaderByDept({ deptId: Number(dept) }).then(res => {
  483. this.deptLeaderList.push(res.data.nickName);
  484. })
  485. }
  486. if (this.project.devices && this.project.devices.trim() !== '') {
  487. this.devices = (this.project.devices.split(',')).map(Number)
  488. }
  489. if (this.project.cars && this.project.cars.trim() !== '') {
  490. this.cars = (this.project.cars.split(',')).map(Number)
  491. }
  492. if (this.project.drivers && this.project.drivers.trim() !== '') {
  493. this.drivers = (this.project.drivers.split(',')).map(Number)
  494. }
  495. if (this.project.participates && this.project.participates.trim() !== '') {
  496. this.participates = (this.project.participates.split(',')).map(Number)
  497. }
  498. }
  499. })
  500. },
  501. getUserList() {
  502. listUser({
  503. pageNum: 1,
  504. pageSize: 9999
  505. }).then(res => {
  506. if (res.code == 200) {
  507. this.userList = res.rows
  508. }
  509. })
  510. },
  511. getDeviceList() {
  512. listDevice({
  513. pageNum: 1,
  514. pageSize: 99999999,
  515. type: '仪器设备'
  516. }).then(res => {
  517. this.deviceList = res.rows
  518. })
  519. },
  520. getCarList() {
  521. listCar({ pageSize: 9999, pageNum: 1 }).then(res => {
  522. this.carList = res.rows
  523. })
  524. },
  525. getProjectProgressList(projectId) {
  526. getProjectProgress(projectId).then(res => {
  527. if (res.data) {
  528. this.progressList = res.data;
  529. }
  530. });
  531. },
  532. // 获取项目相关合同编号
  533. getContractDataList(projectId) {
  534. listProjectContract({ projectId }).then(res => {
  535. if (res.rows) {
  536. for (let row of res.rows) {
  537. getContract(row.contractId).then(res => {
  538. if (res.data) {
  539. if (this.contractCode != '') {
  540. this.contractCode = this.contractCode + '、' + res.data.contractCode;
  541. } else {
  542. this.contractCode = res.data.contractCode;
  543. }
  544. if (this.contractNumber != '') {
  545. this.contractNumber = this.contractNumber + '、' + res.data.contractNumber;
  546. } else {
  547. this.contractNumber = res.data.contractNumber;
  548. }
  549. }
  550. })
  551. }
  552. }
  553. })
  554. },
  555. getProjectWorkList(projectId) {
  556. listProjectWork({ projectId }).then(res => {
  557. this.workList = res.rows;
  558. })
  559. },
  560. getProjectCommentList(projectId) {
  561. getProjectComment(projectId).then(res => {
  562. if (res.data) {
  563. this.projectComment = res.data
  564. }
  565. })
  566. },
  567. getUserName(userId) {
  568. if (userId) {
  569. let arr = this.userList.filter(item => item.userId == userId)
  570. if (arr.length == 1) {
  571. let name = arr[0].nickName
  572. return name
  573. }
  574. }
  575. },
  576. getUserListName(userIdArr) {
  577. if (userIdArr) {
  578. for (let user of userIdArr) {
  579. }
  580. }
  581. },
  582. getFileName(name) {
  583. if (name != null) {
  584. let arr = name.split('/')
  585. return arr[arr.length - 1];
  586. }
  587. },
  588. goBack() {
  589. let obj = { path: "/project/info" }
  590. this.$tab.closeOpenPage(obj);
  591. this.$router.push({ path: '/product/project' });
  592. },
  593. reviewWord(url) {
  594. this.$router.push({
  595. path: '/preview',
  596. query: {
  597. url: url
  598. }
  599. })
  600. },
  601. changeProjectLeader(val) {
  602. let preLeader = this.getUserName(this.project.projectLeader);
  603. let curLeader = val.nickName;
  604. this.$confirm('项目负责人将由' + preLeader + '变更为' + curLeader + ',是否确认', '提示', {
  605. confirmButtonText: '确定',
  606. cancelButtonText: '取消',
  607. type: 'warning'
  608. }).then(() => {
  609. updateProject(
  610. { projectId: this.project.projectId, projectLeader: val.userId }
  611. ).then(res => {
  612. this.$message.success('项目负责人修改成功');
  613. this.prLeaderOpen = false;
  614. this.$router.go(0);
  615. })
  616. }).catch(() => { });
  617. }
  618. },
  619. }
  620. </script>
  621. <style lang="scss" scoped>
  622. @import "@/assets/styles/element-reset.scss";
  623. .header {
  624. position: relative;
  625. text-align: center;
  626. .back {
  627. position: absolute;
  628. left: 12px;
  629. top: -10px;
  630. }
  631. }
  632. .content {
  633. background-color: #f3f5f7;
  634. padding: 20px 20px 40px 20px;
  635. .box1 {
  636. width: 100%;
  637. background-color: #ffffff;
  638. }
  639. .info {
  640. padding: 20px;
  641. }
  642. .title {
  643. font-size: 18px;
  644. font-weight: bold;
  645. padding: 20px 35px 0px;
  646. position: relative;
  647. .line {
  648. position: absolute;
  649. top: 22px;
  650. left: 20px;
  651. width: 4px;
  652. height: 20px;
  653. border-radius: 20px;
  654. background-color: #303133;
  655. }
  656. }
  657. }
  658. .sign {
  659. display: flex;
  660. justify-content: flex-end;
  661. align-items: center;
  662. padding-right: 80px;
  663. /* 如果需要垂直居中 */
  664. }
  665. .table-warpper {
  666. max-width: 1422px;
  667. }
  668. ::v-deep .el-descriptions-item__label.is-bordered-label {
  669. color: #5a5757;
  670. background: rgba($color: #a9adb3, $alpha: 0.1);
  671. width: 150px;
  672. min-width: 150px;
  673. }
  674. ::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell {
  675. border: 1px solid #cdd0d3;
  676. }
  677. </style>