projectDetail.vue 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. <template>
  2. <section>
  3. <!--工具条-->
  4. <el-col :span="24" class="toolbar" style="padding-bottom: 0px;">
  5. <el-form :inline="true">
  6. <el-form-item>
  7. <el-button type="text" @click="backToList" icon="el-icon-back" class="back">返回</el-button>
  8. </el-form-item>
  9. <el-form-item class="divLine">
  10. </el-form-item>
  11. <el-form-item>
  12. <span class="projectTitle">{{proDetail.projectName}}</span>
  13. </el-form-item>
  14. </el-form>
  15. </el-col>
  16. <el-col :span="24" :style="allDetail">
  17. <el-col :span="24" class="title">项目基本信息
  18. <i class="el-icon-edit editDetail" v-if="user.parentId == 1 || user.isManager == 1" @click="edit"></i>
  19. </el-col>
  20. <el-col :span="24" class="main">
  21. <el-col :span="6" class="detail">
  22. 项目编号:
  23. <span class="info">{{proDetail.projectNo}}</span>
  24. </el-col>
  25. <el-col :span="6" class="detail">
  26. 项目经理:
  27. <span class="info">{{proDetail.manager}}</span>
  28. </el-col>
  29. <el-col :span="6" class="detail">
  30. 资产方审批人:
  31. <span class="info">{{proDetail.ownerApprover}}</span>
  32. </el-col>
  33. <el-col :span="6" class="detail">
  34. 生产方审批人:
  35. <span class="info">{{proDetail.customerApprover}}</span>
  36. </el-col>
  37. <el-col :span="24" class="detail">
  38. 生产方公司:
  39. <span class="info" v-for="(item, index) in proDetail.customCompanies">
  40. {{item.companyName}}
  41. <span v-if="index != proDetail.customCompanies.length-1">、</span>
  42. </span>
  43. </el-col>
  44. <el-col :span="24" class="detail">
  45. 项目模具:
  46. <span class="info model" v-for="(item, index) in proDetail.models">
  47. <span @click="toMold(item.id)">{{item.modelName}}({{item.modelNo}})</span>
  48. <span v-if="index != proDetail.models.length-1">、</span>
  49. </span>
  50. </el-col>
  51. <el-col :span="24" class="detail">
  52. 资产方人员:
  53. <span class="info" v-for="(item, index) in proDetail.ownerUsers">
  54. {{item.username}}
  55. <span v-if="index != proDetail.ownerUsers.length-1">、</span>
  56. </span>
  57. </el-col>
  58. <el-col :span="24" class="detail">
  59. 生产方人员:
  60. <span class="info" v-for="(item, index) in proDetail.customUsers">
  61. {{item.username}}
  62. <span v-if="index != proDetail.customUsers.length-1">、</span>
  63. </span>
  64. </el-col>
  65. </el-col>
  66. <el-col :span="24" class="title">项目文档
  67. <el-upload class="upload-demo" action="customize" :http-request="uploadFile" :show-file-list="false" multiple :limit="5" style="float:right;">
  68. <el-button size="small" type="primary">点击上传</el-button>
  69. </el-upload>
  70. </el-col>
  71. <el-col :span="24">
  72. <el-table :data="files" highlight-current-row v-loading="listLoading" height="400" style="width: 100%;">
  73. <el-table-column type="index" width="40"></el-table-column>
  74. <el-table-column prop="fileName" label="名称" sortable></el-table-column>
  75. <el-table-column prop="fileSize" label="大小" width="150" align="center" sortable></el-table-column>
  76. <el-table-column prop="uploader" label="上传者" width="120" align="center" sortable></el-table-column>
  77. <el-table-column prop="indate" label="上传时间" width="200" align="center" sortable></el-table-column>
  78. <el-table-column label="操作" width="220" align="center" sortable>
  79. <template slot-scope="scope">
  80. <el-button size="small" @click="dowloadFile(scope.row.id)">
  81. <a :href="scope.row.url" :download="scope.row.fileName">下载</a></el-button>
  82. <el-button size="small" type="danger" @click="fileDel(scope.row.id)" v-if="scope.row.uploaderId == user.id">删除</el-button>
  83. </template>
  84. </el-table-column>
  85. </el-table>
  86. </el-col>
  87. <el-col :span="24" class="title">操作记录</el-col>
  88. <el-table :data="operations" highlight-current-row v-loading="listLoading" height="400" style="width: 100%;">
  89. <el-table-column type="index" width="40"></el-table-column>
  90. <el-table-column prop="name" label="姓名" width="400" sortable></el-table-column>
  91. <el-table-column prop="document" label="文档名称" sortable></el-table-column>
  92. <el-table-column label="操作" width="400" sortable>
  93. <template slot-scope="scope">
  94. <span v-if="scope.row.operations == 0">浏览</span>
  95. <span v-else-if="scope.row.operations == 1">下载</span>
  96. <span v-else>删除</span>
  97. </template>
  98. </el-table-column>
  99. <el-table-column prop="time" label="时间" width="400" sortable></el-table-column>
  100. </el-table>
  101. </el-col>
  102. <!--编辑界面-->
  103. <el-dialog title="编辑项目" v-if="editFormVisible" :visible.sync="editFormVisible" :close-on-click-modal="false" customClass='customWidth'>
  104. <el-form :model="editForm" label-width="120px" :rules="formRules" ref="editForm">
  105. <el-col :span="24">
  106. <el-form-item label="项目名称" prop="projectName">
  107. <el-input v-model="editForm.projectName" autocomplete="off" placeholder="请输入项目名称" style="width:510px"></el-input>
  108. </el-form-item>
  109. </el-col>
  110. <el-col :span="24">
  111. <el-form-item label="生产方公司" prop="customerCompany">
  112. <el-select v-model="editForm.customerCompany" clearable filterable multiple placeholder="请选择生产方公司" @change="companyChange" value-key='id' style="width:510px">
  113. <el-option v-for="item in company" :key="item.companyName" :label="item.companyName" :value="item">
  114. </el-option>
  115. </el-select>
  116. </el-form-item>
  117. </el-col>
  118. <el-col :span="24">
  119. <el-form-item label="项目经理" prop="managerId">
  120. <el-select v-model="editForm.managerId" clearable filterable placeholder="请选择项目经理" value-key='id' style="width:510px">
  121. <el-option v-for="item in charger" :key="item.id" :label="item.username" :value="item">
  122. </el-option>
  123. </el-select>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="12">
  127. <el-form-item label="资产方审批人" prop="ownerApproverId">
  128. <el-select v-model="editForm.ownerApproverId" clearable filterable placeholder="请选择资产方审批人" value-key='id' style="width:190px">
  129. <el-option v-for="item in assets" :key="item.id" :label="item.username" :value="item.id">
  130. </el-option>
  131. </el-select>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="12">
  135. <el-form-item label="生产方审批人" prop="customerApproverId">
  136. <el-select v-model="editForm.customerApproverId" clearable filterable placeholder="请选择生产方审批人" value-key='id' style="width:190px">
  137. <el-option v-for="item in produce" :key="item.id" :label="item.username" :value="item.id">
  138. </el-option>
  139. </el-select>
  140. </el-form-item>
  141. </el-col>
  142. <el-col :span="24">
  143. <el-form-item label="项目模具">
  144. <el-select v-model="editForm.modelIds" clearable filterable multiple placeholder="请选择项目模具" style="width:510px">
  145. <el-option v-for="item in molds" :key="item.id" :label="item.modelName" :value="item.id">
  146. </el-option>
  147. </el-select>
  148. </el-form-item>
  149. </el-col>
  150. <el-col :span="24">
  151. <el-form-item label="资产方参与人">
  152. <el-select v-model="editForm.assets" clearable filterable multiple placeholder="请选择资产方参与人" style="width:510px">
  153. <el-option v-for="item in assets" :key="item.id" :label="item.username" :value="item.id">
  154. </el-option>
  155. </el-select>
  156. </el-form-item>
  157. </el-col>
  158. <el-col :span="24">
  159. <el-form-item label="生产方参与人">
  160. <el-select v-model="editForm.produce" clearable filterable multiple placeholder="请选择生产方参与人" style="width:510px">
  161. <el-option v-for="item in produce" :key="item.id" :label="item.username" :value="item.id">
  162. </el-option>
  163. </el-select>
  164. </el-form-item>
  165. </el-col>
  166. </el-form>
  167. <div slot="footer" class="dialog-footer">
  168. <el-button @click.native="editFormVisible = false">取消</el-button>
  169. <el-button type="primary" @click.native="addSubmit" :loading="editLoading">提交</el-button>
  170. </div>
  171. </el-dialog>
  172. </section>
  173. </template>
  174. <script>
  175. import util from "../../common/js/util";
  176. export default {
  177. data() {
  178. return {
  179. detailId: this.$route.params.id,
  180. user: JSON.parse(sessionStorage.getItem('user')),
  181. //临时数据
  182. proDetail: {},
  183. files: [],
  184. allDetail: {
  185. overflow: 'auto',
  186. padding: '0px 5px',
  187. height: 0
  188. },
  189. listLoading: false,
  190. activePage: 0,
  191. company:[],
  192. assets: [],
  193. produce: [],
  194. charger: [],
  195. formRules: {
  196. projectName: [
  197. { required: true, message: '请输入项目名称', trigger: 'blur' }
  198. ],
  199. customerCompany: [
  200. { required: true, message: '请选择客户公司', trigger: 'blur' }
  201. ],
  202. managerId: [
  203. { required: true, message: '请选择项目经理', trigger: ['blur','change'] }
  204. ],
  205. ownerApproverId: [
  206. { required: true, message: '请选择资产方审批人', trigger: ['blur','change'] }
  207. ],
  208. customerApproverId: [
  209. { required: true, message: '请选择生产方审批人', trigger: ['blur','change'] }
  210. ]
  211. },
  212. editFormVisible: false,//新增界面是否显示
  213. editLoading: false,
  214. //新增界面数据
  215. editForm: {
  216. projectName: '',
  217. customerCompany: [],
  218. managerId: '',
  219. ownerApproverId: '',
  220. customerApproverId: '',
  221. modelIds: [],
  222. assets: [],
  223. produce: []
  224. }
  225. };
  226. },
  227. methods: {
  228. //返回
  229. backToList() {
  230. this.$router.push("/project");
  231. },
  232. toMold(id) {
  233. this.$router.push('/moldList/' + id);
  234. },
  235. handleClick(tab, event) {
  236. },
  237. //获取详情
  238. getDetail() {
  239. this.http.post(this.port.project.projectDetail, {
  240. id: this.detailId
  241. }, res => {
  242. if (res.code == "ok") {
  243. var list = res.data.vo;
  244. var approves = res.data.vo.approves;
  245. for(var i in approves){
  246. if(approves[i].subordinateType == 0){
  247. list.ownerApprover = approves[i].approverName;
  248. } else {
  249. list.customerApprover = approves[i].approverName;
  250. }
  251. }
  252. this.proDetail = list;
  253. if(this.user.parentId != 0){
  254. this.getMsg();
  255. }
  256. } else {
  257. this.$message({
  258. message: res.msg,
  259. type: 'error'
  260. });
  261. }
  262. }, error => {
  263. this.$message({
  264. message: error,
  265. type: 'error'
  266. });
  267. })
  268. },
  269. getFileList() {
  270. this.listLoading = true;
  271. // 获取文档列表
  272. this.http.post(this.port.project.fileList, {
  273. projectId: this.detailId
  274. }, res => {
  275. this.listLoading = false;
  276. if (res.code == "ok") {
  277. this.files = res.data;
  278. } else {
  279. this.$message({
  280. message: res.msg,
  281. type: 'error'
  282. });
  283. }
  284. }, error => {
  285. this.listLoading = false;
  286. this.$message({
  287. message: error,
  288. type: 'error'
  289. });
  290. })
  291. },
  292. //获取信息
  293. getMsg() {
  294. // 获取公司
  295. var compIds = this.user.companyId;
  296. for(var i in this.proDetail.customCompanies){
  297. compIds += "," + this.proDetail.customCompanies[i].companyId;
  298. }
  299. this.http.post(this.port.project.getUserById, {
  300. companyIds: compIds,
  301. id: this.user.id
  302. } , res => {
  303. if (res.code == "ok") {
  304. var list = res.data , assets = [] , produce = [];
  305. for(var i in list) {
  306. if(list[i].companyId == this.user.companyId){
  307. assets.push(list[i])
  308. } else {
  309. produce.push(list[i])
  310. }
  311. }
  312. this.charger = res.data;
  313. this.assets = assets;
  314. this.produce = produce;
  315. } else {
  316. this.$message({
  317. message: res.msg,
  318. type: 'error'
  319. });
  320. }
  321. }, error => {
  322. this.$message({
  323. message: error,
  324. type: 'error'
  325. });
  326. })
  327. // 获取人员
  328. this.http.post(this.port.base.companys, {
  329. parentId: this.user.parentId,
  330. id: this.user.id
  331. }, res => {
  332. if (res.code == "ok") {
  333. var list = res.data , array = [];
  334. for(var i in list){
  335. if(list[i].id != this.user.companyId){
  336. array.push(list[i])
  337. }
  338. }
  339. this.company = array;
  340. } else {
  341. this.$message({
  342. message: res.msg,
  343. type: 'error'
  344. });
  345. }
  346. }, error => {
  347. this.$message({
  348. message: error,
  349. type: 'error'
  350. });
  351. })
  352. // 获取模具
  353. this.http.post(this.port.mold.modelList, {
  354. parentId: this.user.parentId,
  355. id: this.user.id
  356. }, res => {
  357. if (res.code == "ok") {
  358. this.molds = res.data;
  359. } else {
  360. this.$message({
  361. message: res.msg,
  362. type: 'error'
  363. });
  364. }
  365. }, error => {
  366. this.$message({
  367. message: error,
  368. type: 'error'
  369. });
  370. })
  371. },
  372. //选择公司切换人员
  373. companyChange() {
  374. var param = {} ,
  375. str = this.user.companyId;
  376. for(var i in this.editForm.customerCompany){
  377. str += "," + this.editForm.customerCompany[i].id;
  378. }
  379. param.companyIds = str;
  380. param.id = this.user.id
  381. this.http.post(this.port.project.getUserById, param , res => {
  382. if (res.code == "ok") {
  383. var list = res.data , assets = [] , produce = [];
  384. for(var i in list) {
  385. if(list[i].companyId == this.user.companyId){
  386. assets.push(list[i])
  387. } else {
  388. produce.push(list[i])
  389. }
  390. }
  391. this.charger = res.data;
  392. this.assets = assets;
  393. this.produce = produce;
  394. } else {
  395. this.$message({
  396. message: res.msg,
  397. type: 'error'
  398. });
  399. }
  400. }, error => {
  401. this.$message({
  402. message: error,
  403. type: 'error'
  404. });
  405. })
  406. },
  407. //打开编辑页面
  408. edit() {
  409. this.editFormVisible = true;
  410. var compArr = [] ,
  411. manager = {} ,
  412. ownerApproverId = '' ,
  413. customerApproverId = '' ,
  414. moldArr = [] ,
  415. assets = [] ,
  416. produce = [];
  417. for(var i in this.proDetail.customCompanies){
  418. for(var j in this.company){
  419. if(this.company[j].id == this.proDetail.customCompanies[i].companyId){
  420. compArr.push(this.company[j])
  421. }
  422. }
  423. }
  424. for(var i in this.charger){
  425. if(this.charger[i].id == this.proDetail.managerId){
  426. manager = this.charger[i];
  427. }
  428. }
  429. for(var i in this.proDetail.approves) {
  430. if(this.proDetail.approves[i].subordinateType == 0){
  431. ownerApproverId = this.proDetail.approves[i].approverId;
  432. } else {
  433. customerApproverId = this.proDetail.approves[i].approverId;
  434. }
  435. }
  436. for(var i in this.molds){
  437. for(var j in this.proDetail.models){
  438. if(this.molds[i].id == this.proDetail.models[j].id){
  439. moldArr.push(this.molds[i].id)
  440. }
  441. }
  442. }
  443. for(var i in this.proDetail.ownerUsers){
  444. assets.push(this.proDetail.ownerUsers[i].id)
  445. }
  446. for(var i in this.proDetail.customUsers){
  447. produce.push(this.proDetail.customUsers[i].id)
  448. }
  449. this.editForm = {
  450. id: this.proDetail.id,
  451. projectName: this.proDetail.projectName,
  452. customerCompany: compArr,
  453. managerId: manager,
  454. ownerApproverId: ownerApproverId,
  455. customerApproverId: customerApproverId,
  456. modelIds: moldArr,
  457. assets: assets,
  458. produce: produce
  459. }
  460. },
  461. //提交
  462. addSubmit() {
  463. this.$refs.editForm.validate((valid) => {
  464. if (valid) {
  465. var cId = "",
  466. cName = "",
  467. modelIds = "",
  468. userIds = "";
  469. for(var i in this.editForm.customerCompany){
  470. cId += this.editForm.customerCompany[i].id + ",";
  471. cName += this.editForm.customerCompany[i].companyName + ",";
  472. }
  473. cId = cId.substring(0,cId.length-1);
  474. cName = cName.substring(0,cName.length-1);
  475. for(var i in this.editForm.modelIds){
  476. modelIds += this.editForm.modelIds[i] + ","
  477. }
  478. modelIds = modelIds.substring(0,modelIds.length-1);
  479. for(var i in this.editForm.assets){
  480. if(i == this.editForm.assets.length -1){
  481. userIds += this.editForm.assets[i]
  482. } else {
  483. userIds += this.editForm.assets[i] + ","
  484. }
  485. }
  486. if(userIds != "" && this.editForm.produce.length != 0){
  487. userIds += ","
  488. }
  489. for(var i in this.editForm.produce){
  490. if(i == this.editForm.produce.length -1){
  491. userIds += this.editForm.produce[i]
  492. } else {
  493. userIds += this.editForm.produce[i] + ","
  494. }
  495. }
  496. this.editLoading = true;
  497. this.http.post(this.port.project.addProject, {
  498. id: this.editForm.id,
  499. projectName: this.editForm.projectName,
  500. customerCompanyIds: cId,
  501. customerCompanyNames: cName,
  502. manager: this.editForm.managerId.username,
  503. managerId: this.editForm.managerId.id,
  504. ownerApproverId: this.editForm.ownerApproverId,
  505. customerApproverId: this.editForm.customerApproverId,
  506. modelIds: modelIds,
  507. userIds: userIds,
  508. flag: 1
  509. } , res => {
  510. this.editLoading = false;
  511. this.editFormVisible = false;
  512. if (res.code == "ok") {
  513. this.$message({
  514. message: '修改成功',
  515. type: 'success'
  516. });
  517. this.getDetail();
  518. } else {
  519. this.$message({
  520. message: res.msg,
  521. type: 'error'
  522. });
  523. }
  524. }, error => {
  525. this.editLoading = false;
  526. this.editFormVisible = false;
  527. this.$message({
  528. message: error,
  529. type: 'error'
  530. });
  531. })
  532. }
  533. });
  534. },
  535. //上传
  536. uploadFile(params) {
  537. var fileObj = params.file;
  538. var form = new FormData();
  539. form.append("projectId", this.proDetail.id);
  540. form.append("file", fileObj);
  541. this.http.uploadFile(this.port.project.uploadFile, form , res => {
  542. if (res.code == "ok") {
  543. this.$message({
  544. message: '上传成功',
  545. type: 'success'
  546. });
  547. this.getFileList();
  548. } else {
  549. this.$message({
  550. message: res.msg,
  551. type: 'error'
  552. });
  553. }
  554. }, error => {
  555. this.$message({
  556. message: error,
  557. type: 'error'
  558. });
  559. })
  560. },
  561. //下载
  562. dowloadFile(id) {
  563. this.http.post(this.port.project.dowloadFile, {
  564. projectId: id
  565. }, res => {
  566. }, error => {
  567. })
  568. },
  569. //删除上传文件
  570. fileDel(id) {
  571. this.$confirm('确认删除该文档吗?', '提示', {
  572. type: 'warning'
  573. }).then(() => {
  574. this.http.post(this.port.project.delFile, {
  575. id: id
  576. }, res => {
  577. if (res.code == "ok") {
  578. this.$message({
  579. message: '删除成功',
  580. type: 'success'
  581. });
  582. this.getFileList();
  583. } else {
  584. this.$message({
  585. message: res.msg,
  586. type: 'error'
  587. });
  588. }
  589. }, error => {
  590. this.$message({
  591. message: error,
  592. type: 'error'
  593. });
  594. })
  595. });
  596. },
  597. },
  598. created() {
  599. let height = window.innerHeight;
  600. this.allDetail.height = height - 170 + "px";
  601. const that = this;
  602. window.onresize = function temp() {
  603. that.allDetail.height = window.innerHeight - 210;
  604. };
  605. },
  606. mounted() {
  607. this.getDetail();
  608. this.getFileList();
  609. }
  610. };
  611. </script>
  612. <style scoped>
  613. a {
  614. text-decoration:none;
  615. color: #333;
  616. }
  617. .allDetail {
  618. overflow-y: auto;
  619. }
  620. .toolbar .el-form-item {
  621. font-size: 14px;
  622. vertical-align: middle;
  623. }
  624. .back {
  625. font-size:16px;
  626. }
  627. .divLine {
  628. width: 2px;
  629. background: #c3c3c3;
  630. height: 100%;
  631. }
  632. .projectTitle {
  633. font-size: 18px;
  634. color: #333;
  635. }
  636. .title {
  637. padding-left: 10px;
  638. padding-bottom: 0px;
  639. margin: 20px 0;
  640. font-size: 16px;
  641. line-height: 24px;
  642. border-left: 1px #20a0ff solid;
  643. position: relative;
  644. }
  645. .upload-demo {
  646. position: absolute;
  647. right: 0;
  648. top: -5px;
  649. }
  650. .editDetail {
  651. margin-left: 10px;
  652. color:#20a0ff;
  653. cursor: pointer;
  654. }
  655. .info {
  656. color: grey;
  657. }
  658. .model {
  659. cursor: pointer;
  660. color:#20a0ff;
  661. }
  662. .main {
  663. padding-left: 10px;
  664. }
  665. .detail {
  666. margin-bottom: 20px;
  667. }
  668. </style>