Browse Source

项目模块功能优化

ljb 9 months ago
parent
commit
3b591ac193

+ 1 - 1
src/api/projectManage/projectList.js

@@ -45,7 +45,7 @@ export const add = (row) => {
 
 export const update = (row) => {
   return request({
-    url: '/api/kd-scientific/xm/save',
+    url: '/api/kd-scientific/xm/update',
     method: 'post',
     data: row
   })

+ 38 - 8
src/components/second-unit-cascader/index.vue

@@ -1,5 +1,5 @@
 <template>
-  <avue-cascader placeholder="请选择" check-strictly v-model="cascaderVal" :dic="list"></avue-cascader>
+  <avue-cascader placeholder="请选择" check-strictly v-model="cascaderVal" :dic="treeData" :disabled="disabled"></avue-cascader>
 </template>
 
 <script>
@@ -19,12 +19,18 @@ export default {
   data() {
     return {
       cascaderVal: [],
-      list: []
+      list: [],
+      treeData: []
     }
   },
   watch: {
     cascaderVal(newVal) {
       this.$emit('input', newVal);
+      this.$emit('change', this.cascaderVal, this.findValName(this.value))
+    },
+    value(newVal) {
+      console.log(newVal, this.findValArr(newVal))
+      // this.cascaderVal = this.findValArr(newVal);
     },
     yearAndMonth(newVal) {
       this.getListFunc();
@@ -77,19 +83,43 @@ export default {
         return item;
       });
     },
+    findValName(val) {
+      let nameArr = [];
+      let _valObj = this.list.find(item => item.id === val);
+      if (!!_valObj) {
+        if (_valObj.parentId) {
+          let _parentObj = this.list.find(item => item.id === _valObj.parentId);
+          nameArr = [_parentObj.name, _valObj.name];
+        } else {
+          nameArr = [_valObj.name];
+        }
+      }
+
+      return nameArr;
+    },
+    findValArr(val) {
+      let _valObj = this.list.find(item => item.id === val);
+      let valueArr = [];
+      if (!!_valObj) {
+        if (_valObj.parentId) {
+          valueArr = [_valObj.parentId, _valObj.id];
+        } else {
+          valueArr = [_valObj.id];
+        }
+      }
+      return valueArr;
+    },
     getListFunc() {
       if (!this.yearAndMonth) {
         return;
       }
       getList({ yearAndMonth: this.yearAndMonth }).then(({ data }) => {
         if (data.success) {
-          let treeData = this.buildTree(data.data);
-
-          this.list = this.loopData(treeData);
-
-          console.log(data.data, this.value)
+          this.list = data.data;
+          this.treeData = this.loopData(this.buildTree(data.data));
 
-          this.cascaderVal = this.value || [];
+          
+          this.cascaderVal = this.findValArr(this.value);
         }
       })
     },

+ 6 - 1
src/views/project-manage/apply.vue

@@ -1,6 +1,6 @@
 <template>
   <basic-container>
-    <applyForm></applyForm>
+    <applyForm @success="handleApplySucc"></applyForm>
   </basic-container>
 </template>
 
@@ -10,6 +10,11 @@ import applyForm from './components/apply-form.vue';
 export default {
   components: {
     applyForm
+  },
+  methods: {
+    handleApplySucc() {
+      this.$router.push({ path: '/project-manage/project-list' });
+    }
   }
 }
 </script>

+ 153 - 85
src/views/project-manage/components/apply-form.vue

@@ -6,7 +6,7 @@
     <div class="project-basic-info">
       <div class="info-row">{{ `研发项目名称:${ formData.xmmc || '' }` }}</div>
       <div class="info-row">{{ `项目负责人:${ getXmfzrName || '' }` }}</div>
-      <div class="info-row">{{ `项目申请单位:${ formData.xmsqdw || '' }` }}</div>
+      <div class="info-row">{{ `项目申请单位:${ xmsqdwName }` }}</div>
       <div class="info-row">{{ `项目执行期:${ getXmDateRange || '' }` }}</div>
     </div>
 
@@ -14,30 +14,42 @@
     <table>
       <tbody>
         <tr>
-          <td class="doc-label">研发项目名称</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>研发项目名称
+          </td>
           <td class="doc-input">
-            <el-input v-model="formData.xmmc" placeholder="请输入项目名称" />
+            <el-input v-model="formData.xmmc" placeholder="请输入项目名称" :disabled="isEdit" />
+          </td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目编号
           </td>
-          <td class="doc-label">项目编号</td>
           <td class="doc-input">
-            <el-input
-              v-model="formData.xmbh"
-              placeholder="请输入项目编号"
-            />
+            <el-input v-model="formData.xmbh" placeholder="请输入项目编号" :disabled="isEdit" />
           </td>
         </tr>
         <tr>
-          <td class="doc-label">项目申请单位</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目申请单位
+          </td>
           <td colspan="3">
             <!-- <el-input
               v-model="formData.xmsqdw"
               placeholder="请选择项目申请单位"
             /> -->
-            <second-unit-cascader v-model="formData.xmsqdwid" :yearAndMonth="yearAndMonth" style="width: 100%;"></second-unit-cascader>
+            <second-unit-cascader
+              v-model="formData.xmsqdwid"
+              :yearAndMonth="yearAndMonth"
+              style="width: 100%;"
+              :disabled="isEdit"
+              @change="handleSecondUnitChange"
+            >
+            </second-unit-cascader>
           </td>
         </tr>
         <tr>
-          <td class="doc-label">研发开始时间</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>研发开始时间
+          </td>
           <td class="doc-input">
             <el-date-picker
               v-model="formData.xmkssj"
@@ -45,9 +57,12 @@
               value-format="yyyy-MM-dd"
               placeholder="请选择日期"
               style="width: 100%"
+              :disabled="isEdit"
             ></el-date-picker>
           </td>
-          <td class="doc-label">研发结束时间</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>研发结束时间
+          </td>
           <td class="doc-input">
             <el-date-picker
               v-model="formData.xmjssj"
@@ -55,20 +70,26 @@
               value-format="yyyy-MM-dd"
               placeholder="请选择日期"
               style="width: 100%"
+              :disabled="isEdit"
             ></el-date-picker>
           </td>
         </tr>
         <tr>
-          <td class="doc-label">项目负责人</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目负责人
+          </td>
           <td class="doc-input">
             <avue-select
               v-model="formData.xmfzr"
               placeholder="请选择"
               :dic="fzrList"
               style="width: 100%"
+              :disabled="isEdit"
             ></avue-select>
           </td>
-          <td class="doc-label">研究类型</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>研究类型
+          </td>
           <td class="doc-input">
             <avue-select
               v-model="formData.yjlx"
@@ -79,7 +100,9 @@
           </td>
         </tr>
         <tr>
-          <td class="doc-label">项目来源</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目来源
+          </td>
           <td class="doc-input">
             <avue-select
               v-model="formData.xmly"
@@ -88,7 +111,9 @@
               style="width: 100%"
             ></avue-select>
           </td>
-          <td class="doc-label">项目开展形式</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目开展形式
+          </td>
           <td class="doc-input">
             <avue-select
               v-model="formData.xmkzxs"
@@ -99,7 +124,9 @@
           </td>
         </tr>
         <tr>
-          <td class="doc-label">预期成果形式</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>预期成果形式
+          </td>
           <td class="doc-input">
             <avue-select
               multiple
@@ -109,7 +136,9 @@
               style="width: 100%"
             ></avue-select>
           </td>
-          <td class="doc-label">项目技术经济目标</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目技术经济目标
+          </td>
           <td class="doc-input">
             <avue-select
               multiple
@@ -121,17 +150,22 @@
           </td>
         </tr>
         <tr>
-          <td class="doc-label">项目预算总额(万元)</td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>项目预算总额(万元)
+          </td>
           <td class="doc-input">
-              <el-input-number v-model="formData.xmysze" type="number" :min="0" controls-position="right" />
+              <!-- <el-input-number v-model="formData.xmysze" type="number" :min="0" controls-position="right" :disabled="isEdit" /> -->
+               {{ getXmysze }}
+          </td>
+          <td class="doc-label">
+            <span style="color: red; padding-right: 3px; font-size: 16px;">*</span>其中
           </td>
-          <td class="doc-label">其中</td>
           <td class="doc-input">
             <div class="year-list">
               <div class="year-list-item" v-for="year of yearList" :key="year" :style="{ height: yearList.length == 1 ? '51px' : '32px', lineHeight: yearList.length == 1 ? '51px' : '32px' }">
                 <div class="year" >{{ year }}</div>
                 <div class="year-input">
-                  <input v-model="formData[year]" type="number" :class="{ 'red': budgetIsExceed }" @input="handleYearInput" style="padding: 0 6px;" />
+                  <input v-model="formData[year]" type="number" :class="{ 'red': budgetIsExceed }" @input="handleYearInput" style="padding: 0 6px;" :disabled="isEdit" />
                 </div>
               </div>
             </div>
@@ -169,12 +203,15 @@ import { getList as getTechnicanRosterList } from "@/api/basicResource/technicia
 import { add, update, getDetail } from "@/api/projectManage/projectList";
 import moment from "moment";
 import { deepClone } from "@/util/util";
+import Decimal from "decimal.js";
 
 export default {
   components: {
     secondUnitCascader
   },
   props: {
+    // add or edit
+    operateType: String,
     projectId: [String, Number]
   },
   data() {
@@ -200,7 +237,43 @@ export default {
       // 经济目标
       economicObjectivesList: [],
 
-      option: {
+      xmsqdwName: ''
+
+    };
+  },
+  watch: {
+    'formData.xmkssj'(newVal) {
+      this.yearList = this.getDateRangeYear(newVal, this.formData.xmjssj);
+      if (!newVal) {
+        return;
+      }
+      let cMonth = moment(newVal).format('yyyyMM');
+      if (cMonth != this.xmStartDateYearAndMonth) {
+        this.xmStartDateYearAndMonth = cMonth;
+        this.getTechnicanRosterListFunc(cMonth)
+      }
+    },
+    'formData.xmjssj'(newVal) {
+      this.yearList = this.getDateRangeYear(this.formData.xmkssj, newVal);
+    },
+    'formData.xmysze'(newVal) {
+      this.calcBudgetIsExceed(newVal);
+    }
+  },
+  computed: {
+    isEdit() {
+      return this.operateType == 'edit';
+    },
+    // 获取项目预算总额
+    getXmysze() {
+      let total = new Decimal(0);
+      this.yearList.forEach(year => {
+        total = total.add (new Decimal(this.formData[year] || 0));
+      });
+      return total.toFixed(2);
+    },
+    option() {
+      return {
         submitBtn: false,
         emptyBtn: false,
         submitText: '保存',
@@ -212,6 +285,7 @@ export default {
             type: "upload",
             multiple: true,
             span: 24,
+            disabled: this.isEdit,
             dataType: "object",
             propsHttp: {
               url: "link",
@@ -241,6 +315,7 @@ export default {
               res: "data",
             },
             action: '/api/kd-resource/oss/endpoint/put-file',
+            disabled: this.isEdit,
             uploadPreview: (file, column, done) => {
               window.open(file.url, "_blank");
               return;
@@ -257,6 +332,7 @@ export default {
             multiple: true,
             span: 24,
             action: '/api/kd-resource/oss/endpoint/put-file',
+            disabled: this.isEdit,
             uploadPreview: (file, column, done) => {
               window.open(file.url, "_blank");
               return;
@@ -269,29 +345,8 @@ export default {
             },
           },
         ],
-      },
-    };
-  },
-  watch: {
-    'formData.xmkssj'(newVal) {
-      this.yearList = this.getDateRangeYear(newVal, this.formData.xmjssj);
-      if (!newVal) {
-        return;
-      }
-      let cMonth = moment(newVal).format('yyyyMM');
-      if (cMonth != this.xmStartDateYearAndMonth) {
-        this.xmStartDateYearAndMonth = cMonth;
-        this.getTechnicanRosterListFunc(cMonth)
       }
     },
-    'formData.xmjssj'(newVal) {
-      this.yearList = this.getDateRangeYear(this.formData.xmkssj, newVal);
-    },
-    'formData.xmysze'(newVal) {
-      this.calcBudgetIsExceed(newVal);
-    }
-  },
-  computed: {
     getDocTile() {
       let tit = '研发项目资料';
       if (this.formData.xmmc) {
@@ -330,6 +385,9 @@ export default {
     }
   },
   methods: {
+    handleSecondUnitChange(val, nameArr) {
+      this.xmsqdwName = nameArr.join('/');
+    },
     getProjectDetail(xmId) {
       this.loading = true;
       getDetail({ id: xmId }).then(({ data }) => {
@@ -346,7 +404,7 @@ export default {
           beanData.xmyszemx.forEach(item => {
             beanData[item.year] = item.amount;
           });
-          console.log(beanData)
+
           this.formData = { ...beanData };
         }
       }).catch(err => {
@@ -421,69 +479,79 @@ export default {
         errorText = '请输入项目编号';
       } else if (!this.formData.xmsqdwid || !this.formData.xmsqdwid.length) {
         errorText = '请选择项目申请单位';
-      } else if (!this.formData.yjlx) {
-        errorText = '请选择研究类型'
-      } else if (!this.formData.xmfzr) {
-        errorText = '请选择项目负责人';
       } else if (!this.formData.xmkssj) {
         errorText = '请选择项目开始时间';
       } else if (!this.formData.xmjssj) {
         errorText = '请选择项目结束时间';
+      } else if (!this.formData.yjlx) {
+        errorText = '请选择研究类型'
+      } else if (!this.formData.xmfzr) {
+        errorText = '请选择项目负责人';
+      } else if (!this.formData.xmly) {
+        errorText = '请选择项目来源';
+      } else if (!this.formData.xmkzxs) {
+        errorText = '请选择项目开展形式';
+      } else if (!this.formData.yqcgxs) {
+        errorText = '请选择预期成果形式';
+      } else if (!this.formData.xmjsjjmb) {
+        errorText = '请选择项目技术经济目标';
       } else if (!this.formData.xmysze) {
         errorText = '请输入项目预算总额';
       }
-      // else if (!this.formData.lxpw.length) {
-      //   errorText = '请上传立项批文!';
-      // } else if (!this.formData.lxbg.length) {
-      //   errorText = '请上传立项报告!';
-      // }
       else {
-        let yearAmount = 0;
         this.yearList.forEach(year => {
-          let account = this.formData[year] || 0;
-          yearAmount += account;
+          if (this.formData[year] === null || this.formData[year] === undefined || this.formData[year] === '') {
+            errorText = `${year}年的预算不能为空`;
+          }
         });
-        if (yearAmount > this.budgetAmount) {
-          errorText = '所有年份的预算不等于项目预算总额,请重新填写!';
-        }
       }
 
       return errorText;
     },
     handleSaveBtn() {
-      let errorText = this.validForm();
-      if (errorText) {
-        this.$message.error(errorText+'!');
-        return;
-      }
+      if (this.operateType === 'add') {
+        let errorText = this.validForm();
+        if (errorText) {
+          this.$message.error(errorText+'!');
+          return;
+        }
 
-      let params = deepClone(this.formData);
-      params.yqcgxs = params.yqcgxs ? params.yqcgxs.join(',') : '';
-      params.xmjsjjmb = params.xmjsjjmb ? params.xmjsjjmb.join(',') : '';
-      params.xmsqdwid = params.xmsqdwid ? params.xmsqdwid[params.xmsqdwid.length - 1] : '';
-      params.lxbg = JSON.stringify(params.lxbg);
-      params.lxpw = JSON.stringify(params.lxpw);
-      params.qtzl = JSON.stringify(params.qtzl);
-      let yearAmountList = [];
-      this.yearList.forEach(year => {
-        yearAmountList.push({ year: Number(year), amount: params[year] || 0 });
-        delete params[year];
-      });
-      params.xmyszemx = JSON.stringify(yearAmountList);
+        let params = deepClone(this.formData);
+        params.yqcgxs = params.yqcgxs ? params.yqcgxs.join(',') : '';
+        params.xmjsjjmb = params.xmjsjjmb ? params.xmjsjjmb.join(',') : '';
+        params.xmsqdwid = params.xmsqdwid ? params.xmsqdwid[params.xmsqdwid.length - 1] : '';
+        params.lxbg = JSON.stringify(params.lxbg);
+        params.lxpw = JSON.stringify(params.lxpw);
+        params.qtzl = JSON.stringify(params.qtzl);
+        let yearAmountList = [];
+        this.yearList.forEach(year => {
+          yearAmountList.push({ year: Number(year), amount: params[year] || 0 });
+          delete params[year];
+        });
+        params.xmyszemx = JSON.stringify(yearAmountList);
 
-      this.addOrUpdate(params);
+        this.addOrUpdate(params);
+      } else if (this.operateType === 'edit') {
+        let params = {
+          xmId: this.formData.id,
+          yjlx: this.formData.yjlx,
+          xmly: this.formData.xmly,
+          xmkzxs: this.formData.xmkzxs,
+          yqcgxs: this.formData.yqcgxs.join(','),
+          xmjsjjmb: this.formData.xmjsjjmb.join(',')
+        };
+        this.addOrUpdate(params);
+      }
+      
     },
     addOrUpdate(params) {
-      let func = params.id ? update : add;
+      let func = this.operateType === 'edit' ? update : add;
       this.loading = true;
       func(params).then(({ data }) => {
         this.loading = false;
         if (data.code == 200) {
-          if (!params.id) {
-            this.$emit('success', data.data);
-            this.formData.id = data.data.xmId;
-          }
-          this.$message.success(params.id ? '修改成功!' : '保存成功!');
+          this.$emit('success', data.data);
+          this.$message.success(this.operateType === 'edit' ? '修改成功!' : '保存成功!');
         }
       }).catch(err => {
         this.loading = false;

+ 8 - 4
src/views/project-manage/project-list.vue

@@ -55,7 +55,7 @@
     >
       <el-tabs type="border-card">
         <el-tab-pane label="1、项目立项" lazy>
-          <apply-form :projectId="currProjectId" @success="handleApplySuccess"></apply-form>
+          <apply-form :projectId="currProjectId" :operateType="operateType" @success="handleApplySuccess"></apply-form>
         </el-tab-pane>
         <el-tab-pane label="2、科研预算" lazy>
           <project-budget :projectId="currProjectId"></project-budget>
@@ -117,26 +117,30 @@ export default window.$crudCommon({
 
       drawerVisible: false,
 
+      applyType: '', // add || edit
       currProjectId: '',
     };
   },
   watch: {
     'params.yearAndMonth'(newVal) {
       this.page.currentPage = 1;
-      this.getList(this.page);
+      this.loadData(this.page);
     }
   },
   methods: {
     handleCreateClick() {
+      this.operateType = 'add',
       this.currProjectId = '';
       this.drawerVisible = true;
     },
     handleRowDbClick(data) {
+      this.operateType = 'edit';
       this.currProjectId = data.id;
       this.drawerVisible = true;
     },
-    handleApplySuccess({ xmId }) {
-      this.currProjectId = xmId;
+    handleApplySuccess() {
+      this.drawerVisible = false;
+      this.loadData();
     },
     handleExport() {
       exportBloByPost(`/api/kd-scientific/technician/export?${this.website.tokenHeader}=${getToken()}`, this.params).then(res => {