Explorar o código

lizhuo submits AnnualSaleGoal at 2023-7-27 17:00

002637 hai 1 ano
pai
achega
8cd886cb1c

+ 32 - 10
src/views/business/spd/goal_management/AnnualSaleGoal.vue

@@ -256,16 +256,17 @@
         </el-row>
         <el-table v-loading="loading" :data="annualSaleGoalDetailsList" @selection-change="handleSelectionChange">
           <el-table-column type="selection" width="55" align="center" fixed />
-          <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
+          <el-table-column label="销售组织" align="center" prop="saleOrg" width="180" :render-header="addRedStar">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="annualSaleGoalDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
                                     referName="CUSTOMER_PARAM"
+                                    @blur="validateField(scope.row, 'saleOrg')"
                                     :dataMapping="{ saleOrgCode: 'code', saleOrg: 'name'}"
                                     :source.sync="annualSaleGoalDetailsList[scope.$index]" placeholder="请输入销售组织">
               </el-popover-select-v2>
             </template>
           </el-table-column>
-          <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
+          <el-table-column label="销售区域" align="center" prop="saleZone" width="180" :render-header="addRedStar">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="annualSaleGoalDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
                                     referName="CUSTOMER_PARAM"
@@ -274,7 +275,7 @@
               </el-popover-select-v2>
             </template>
           </el-table-column>
-          <el-table-column label="客户" align="center" prop="custom" width="180">
+          <el-table-column label="客户" align="center" prop="custom" width="180" :render-header="addRedStar">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="annualSaleGoalDetailsList[scope.$index].custom" title="客户" valueKey="name"
                                     referName="CUSTOMER_PARAM"
@@ -283,7 +284,7 @@
               </el-popover-select-v2>
             </template>
           </el-table-column>
-          <el-table-column label="负责人" align="center" prop="creator" width="180">
+          <el-table-column label="负责人" align="center" prop="creator" width="180" :render-header="addRedStar">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="annualSaleGoalDetailsList[scope.$index].creator" title="负责人" valueKey="name"
                                     referName="CONTACTS_PARAM"
@@ -292,7 +293,7 @@
               </el-popover-select-v2>
             </template>
           </el-table-column>
-          <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220">
+          <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220" :render-header="addRedStar">
             <template slot-scope="scope">
               <el-select v-model="annualSaleGoalDetailsList[scope.$index].oneLevelClassify" size="mini" clearable
                          @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '一级物料分类', scope.$index)"
@@ -673,17 +674,17 @@ export default {
       let list = {
         id: null,
         code: null,
-        saleOrg: null,
-        saleZone: null,
-        custom: null,
-        creator: null,
+        saleOrg: this.form.saleZone,
+        saleZone: this.form.saleZone,
+        custom: this.form.custom,
+        creator: this.form.creator,
         oneLevelClassifyCode: null,
         oneLevelClassify: null,
         twoLevelClassifyCode: null,
         twoLevelClassify: null,
         materialCode: null,
         material: null,
-        totalGoal: null,
+        totalGoal: 0,
         januaryGoal: null,
         februaryGoal: null,
         marchGoal: null,
@@ -698,6 +699,7 @@ export default {
         decemberGoal: null
       }
       this.annualSaleGoalDetailsList.push(list)
+      this.computeTotal()
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -719,6 +721,9 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
+      if (!this.justiceDetailsList()) {
+        return this.$message.error('子表有必填字段没有赋值')
+      }
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
@@ -872,6 +877,23 @@ export default {
         this.annualSaleGoalDetailsList[this.referCondition.index].twoLevelClassify = selection.name
       }
     },
+    // 给table添加必填项
+    addRedStar(h, { column }) {
+      return [
+        h('span', { style: 'color: #F56C6C' }, '*'),
+        h('span', '' + column.label)
+      ]
+    },
+    // 判断子表的字段是否都填了
+    justiceDetailsList() {
+      const arr = JSON.parse(JSON.stringify(this.annualSaleGoalDetailsList))
+      for (const element of arr) {
+        if (element.saleOrg === null || element.saleZone === null || element.custom === null || element.creator === null || element.oneLevelClassify === null) {
+          return false
+        }
+      }
+      return true
+    }
   }
 };
 </script>

+ 35 - 17
src/views/business/spd/goal_management/AnnualSaleGoalMerge.vue

@@ -214,7 +214,7 @@
                 <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
               </el-select>
             </el-form-item>
-            <el-form-item v-if="form.goalCategory === '二级分类'" label="二级分类" prop="custom">
+            <el-form-item v-if="form.goalCategory === '二级分类'" label="二级分类" prop="twoLevelClassify">
               <el-select v-model="form.twoLevelClassify" clearable
                          @focus="chooseTreeReferForMain('MATERIALCLASSIFY_PARAM', false, '二级物料分类')"
                          style="width: 200px">
@@ -236,24 +236,21 @@
         </el-row>
       </el-form>
       <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
+<!--        <el-col :span="1.5">
           <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddDetails">增 行</el-button>
-        </el-col>
+        </el-col>-->
         <el-col :span="1.5">
           <el-button type="primary" plain icon="el-icon-folder-opened" size="mini" @click="clickMerge">合 并</el-button>
         </el-col>
-        <el-col :span="1.5">
-          <el-button type="primary" plain icon="el-icon-folder-opened" size="mini" @click="getNewTwoArray">编程题</el-button>
-        </el-col>
       </el-row>
       <el-tabs v-model="activeName" @tab-click="getNewTwoArray">
         <el-tab-pane label="年销售目标合并明细" name="annualSaleGoalMergeDetails">
-          <el-table v-loading="loading" :data="annualSaleGoalMergeDetailsList" @selection-change="handleSelectionChange">
-            <el-table-column type="selection" width="55" align="center" fixed />
+          <el-table v-loading="loading" :data="annualSaleGoalMergeDetailsList">
+            <el-table-column label="序号" type="index" width="55" align="center" fixed />
             <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="annualSaleGoalMergeDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{saleOrg: 'name'}"
                                       :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入销售组织">
                 </el-popover-select-v2>
@@ -262,7 +259,7 @@
             <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="annualSaleGoalMergeDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{saleZone: 'name'}"
                                       :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入销售区域">
                 </el-popover-select-v2>
@@ -271,7 +268,7 @@
             <el-table-column label="客户" align="center" prop="custom" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="annualSaleGoalMergeDetailsList[scope.$index].custom" title="客户" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{custom: 'name'}"
                                       :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入客户">
                 </el-popover-select-v2>
@@ -280,7 +277,7 @@
             <el-table-column label="负责人" align="center" prop="creator" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="annualSaleGoalMergeDetailsList[scope.$index].creator" title="负责人" valueKey="name"
-                                      referName="CONTACTS_PARAM"
+                                      referName="CONTACTS_PARAM" disabled
                                       :dataMapping="{creator: 'name'}"
                                       :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入负责人">
                 </el-popover-select-v2>
@@ -290,7 +287,7 @@
               <template slot-scope="scope">
                 <el-select v-model="annualSaleGoalMergeDetailsList[scope.$index].oneLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '一级物料分类', scope.$index)"
-                           style="width: 200px">
+                           style="width: 200px" disabled>
                   <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
               </template>
@@ -299,7 +296,7 @@
               <template slot-scope="scope">
                 <el-select v-model="annualSaleGoalMergeDetailsList[scope.$index].twoLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '二级物料分类', scope.$index)"
-                           style="width: 200px">
+                           style="width: 200px" disabled>
                   <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
               </template>
@@ -369,7 +366,7 @@
                 <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].decemberGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
               </template>
             </el-table-column>
-            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
+<!--            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
               <template slot-scope="scope">
                 <el-button
                   size="mini"
@@ -384,7 +381,7 @@
                   @click="handleCopyDetails(scope.row)"
                 >复制</el-button>
               </template>
-            </el-table-column>
+            </el-table-column>-->
           </el-table>
         </el-tab-pane>
         <el-tab-pane label="区域目标汇总(年)" name="zoneGoalSum(year)">
@@ -713,7 +710,16 @@ export default {
         delFlag: null
       },
       // 表单校验
-      rules: {},
+      rules: {
+        documentDate: [{ required: true, message: '单据日期不能为空', trigger: 'blur' }],
+        annual: [{ required: true, message: '年度不能为空', trigger: 'blur' }],
+        creator: [{ required: true, message: '制单人不能为空', trigger: 'blur' }],
+        dept: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
+        goalCategory: [{ required: true, message: '目标类型不能为空', trigger: 'blur' }],
+        saleZone: [],
+        oneLevelClassify: [],
+        twoLevelClassify: []
+      },
       // 树形参照
       referCondition: {type: '', isPage: true, title: '', index: null},
       classOptions: [],
@@ -1003,16 +1009,25 @@ export default {
         this.form.oneLevelClassify = null
         this.form.twoLevelClassifyCode = null
         this.form.twoLevelClassify = null
+        this.rules.saleZone = [{ required: true, message: '销售区域不能为空', trigger: 'blur' }]
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = []
       } else if (condition === '一级分类') {
         this.form.saleZoneCode = null
         this.form.saleZone = null
         this.form.twoLevelClassifyCode = null
         this.form.twoLevelClassify = null
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = [{ required: true, message: '一级分类不能为空', trigger: 'blur' }]
+        this.rules.twoLevelClassify = []
       } else if (condition === '二级分类') {
         this.form.saleZoneCode = null
         this.form.saleZone = null
         this.form.oneLevelClassifyCode = null
         this.form.oneLevelClassify = null
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = [{ required: true, message: '二级分类不能为空', trigger: 'blur' }]
       } else {
         this.form.saleZoneCode = null
         this.form.saleZone = null
@@ -1020,6 +1035,9 @@ export default {
         this.form.oneLevelClassify = null
         this.form.twoLevelClassifyCode = null
         this.form.twoLevelClassify = null
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = []
       }
     },
     // 关闭抽屉

+ 47 - 16
src/views/business/spd/goal_management/MonthGoalMerge.vue

@@ -277,7 +277,7 @@
             </el-form-item>
             <el-form-item v-if="form.goalCategory === '销售区域'" label="销售区域" prop="saleZone">
               <el-popover-select-v2 v-model="form.saleZoneCode" title="销售区域" valueKey="name"
-                                    referName="DEPT_PARAM"
+                                    referName="ORG_PARAM"
                                     :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
                                     :source.sync="form" placeholder="请输入销售区域">
               </el-popover-select-v2>
@@ -307,9 +307,9 @@
       </el-form>
 
       <el-row :gutter="10" class="mb8">
-        <el-col :span="1.5">
+<!--        <el-col :span="1.5">
           <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddDetails">增 行</el-button>
-        </el-col>
+        </el-col>-->
         <el-col :span="1.5">
           <el-button type="primary" plain icon="el-icon-folder-opened" size="mini" @click="clickMerge">合 并</el-button>
         </el-col>
@@ -321,7 +321,7 @@
             <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{ saleOrgCode: 'code', saleOrg: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入销售组织">
                 </el-popover-select-v2>
@@ -330,7 +330,7 @@
             <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入销售区域">
                 </el-popover-select-v2>
@@ -339,7 +339,7 @@
             <el-table-column label="客户" align="center" prop="custom" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].custom" title="客户" valueKey="name"
-                                      referName="CUSTOMER_PARAM"
+                                      referName="CUSTOMER_PARAM" disabled
                                       :dataMapping="{ customCode: 'code', custom: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入客户">
                 </el-popover-select-v2>
@@ -348,7 +348,7 @@
             <el-table-column label="部门" align="center" prop="dept" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].dept" title="部门" valueKey="name"
-                                      referName="DEPT_PARAM"
+                                      referName="DEPT_PARAM" disabled
                                       :dataMapping="{ deptCode: 'code', dept: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入客户">
                 </el-popover-select-v2>
@@ -357,7 +357,7 @@
             <el-table-column label="制单人" align="center" prop="creator" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].creator" title="负责人" valueKey="name"
-                                      referName="CONTACTS_PARAM"
+                                      referName="CONTACTS_PARAM" disabled
                                       :dataMapping="{ creatorCode: 'code', creator: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入负责人">
                 </el-popover-select-v2>
@@ -365,14 +365,14 @@
             </el-table-column>
             <el-table-column label="科室" align="center" prop="department" width="180">
               <template slot-scope="scope">
-                <el-input v-model="monthGoalMergeDetailsList[scope.$index].department" placeholder="请输入科室"></el-input>
+                <el-input v-model="monthGoalMergeDetailsList[scope.$index].department" placeholder="请输入科室" disabled></el-input>
               </template>
             </el-table-column>
             <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220">
               <template slot-scope="scope">
                 <el-select v-model="monthGoalMergeDetailsList[scope.$index].oneLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '一级物料分类', scope.$index)"
-                           style="width: 200px">
+                           style="width: 200px" disabled>
                   <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
               </template>
@@ -381,7 +381,7 @@
               <template slot-scope="scope">
                 <el-select v-model="monthGoalMergeDetailsList[scope.$index].twoLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '二级物料分类', scope.$index)"
-                           style="width: 200px">
+                           style="width: 200px" disabled>
                   <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
                 </el-select>
               </template>
@@ -389,7 +389,7 @@
             <el-table-column label="物料" align="center" prop="material" width="180">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthGoalMergeDetailsList[scope.$index].material" title="物料" valueKey="name"
-                                      referName="MATERIAL_PARAM"
+                                      referName="MATERIAL_PARAM" disabled
                                       :dataMapping="{ materialCode: 'code', material: 'name'}"
                                       :source.sync="monthGoalMergeDetailsList[scope.$index]" placeholder="请输入物料">
                 </el-popover-select-v2>
@@ -397,7 +397,7 @@
             </el-table-column>
             <el-table-column label="月份" align="center" prop="monthly" width="250">
               <template slot-scope="scope">
-                <el-date-picker v-model="monthGoalMergeDetailsList[scope.$index].monthly" value-format="yyyy-MM" type="month" placeholder="选择月份">
+                <el-date-picker disabled v-model="monthGoalMergeDetailsList[scope.$index].monthly" value-format="yyyy-MM" type="month" placeholder="选择月份">
                 </el-date-picker>
               </template>
             </el-table-column>
@@ -406,7 +406,7 @@
                 <el-input-number @change="computeTotal" v-model="monthGoalMergeDetailsList[scope.$index].goalValue" :precision="2" :step="1" :min="0"></el-input-number>
               </template>
             </el-table-column>
-            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
+<!--            <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
               <template slot-scope="scope">
                 <el-button
                   size="mini"
@@ -421,7 +421,7 @@
                   @click="handleCopyDetails(scope.row)"
                 >复制</el-button>
               </template>
-            </el-table-column>
+            </el-table-column>-->
           </el-table>
         </el-tab-pane>
       </el-tabs>
@@ -574,7 +574,18 @@ export default {
         goalValue: null
       },
       // 表单校验
-      rules: {},
+      rules: {
+        documentDate: [{ required: true, message: '单据日期不能为空', trigger: 'blur' }],
+        annual: [{ required: true, message: '年度不能为空', trigger: 'blur' }],
+        monthly: [{ required: true, message: '月份不能为空', trigger: 'blur' }],
+        creator: [{ required: true, message: '制单人不能为空', trigger: 'blur' }],
+        dept: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
+        goalCategory: [{ required: true, message: '目标类型不能为空', trigger: 'blur' }],
+        custom: [],
+        saleZone: [],
+        oneLevelClassify: [],
+        twoLevelClassify: []
+      },
       // 目标类型列表
       goalCategoryList: [
         { value: '客户维度', label: '客户维度' },
@@ -887,6 +898,10 @@ export default {
         this.form.oneLevelClassifyCode = null
         this.form.twoLevelClassify = null
         this.form.twoLevelClassifyCode = null
+        this.rules.custom = []
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = []
       } else if (condition === '客户维度') {
         this.form.saleZone = null
         this.form.saleZoneCode = null
@@ -894,6 +909,10 @@ export default {
         this.form.oneLevelClassifyCode = null
         this.form.twoLevelClassify = null
         this.form.twoLevelClassifyCode = null
+        this.rules.custom = [{ required: true, message: '客户不能为空', trigger: 'blur' }]
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = []
       } else if (condition === '销售区域') {
         this.form.custom = null
         this.form.customCode = null
@@ -901,6 +920,10 @@ export default {
         this.form.oneLevelClassifyCode = null
         this.form.twoLevelClassify = null
         this.form.twoLevelClassifyCode = null
+        this.rules.custom = []
+        this.rules.saleZone = [{ required: true, message: '销售区域不能为空', trigger: 'blur' }]
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = []
       } else if (condition === '一级分类') {
         this.form.custom = null
         this.form.customCode = null
@@ -908,6 +931,10 @@ export default {
         this.form.saleZoneCode = null
         this.form.twoLevelClassify = null
         this.form.twoLevelClassifyCode = null
+        this.rules.custom = []
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = [{ required: true, message: '一级分类不能为空', trigger: 'blur' }]
+        this.rules.twoLevelClassify = []
       } else if (condition === '二级分类') {
         this.form.custom = null
         this.form.customCode = null
@@ -915,6 +942,10 @@ export default {
         this.form.saleZoneCode = null
         this.form.oneLevelClassify = null
         this.form.oneLevelClassifyCode = null
+        this.rules.custom = []
+        this.rules.saleZone = []
+        this.rules.oneLevelClassify = []
+        this.rules.twoLevelClassify = [{ required: true, message: '二级分类不能为空', trigger: 'blur' }]
       }
     },
     // 关闭抽屉

+ 47 - 15
src/views/business/spd/goal_management/MonthReturnGoal.vue

@@ -263,7 +263,7 @@
 <!--          v-loading="loading"-->
           <el-table :data="monthReturnGoalDetailsList" @selection-change="handleSelectionChange">
             <el-table-column type="selection" width="55" align="center" fixed />
-            <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
+            <el-table-column label="销售组织" align="center" prop="saleOrg" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthReturnGoalDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -272,7 +272,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
+            <el-table-column label="销售区域" align="center" prop="saleZone" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthReturnGoalDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -281,7 +281,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="客户" align="center" prop="custom" width="180">
+            <el-table-column label="客户" align="center" prop="custom" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthReturnGoalDetailsList[scope.$index].custom" title="客户" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -290,7 +290,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="部门" align="center" prop="dept" width="180">
+            <el-table-column label="部门" align="center" prop="dept" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthReturnGoalDetailsList[scope.$index].dept" title="部门" valueKey="name"
                                       referName="DEPT_PARAM"
@@ -299,7 +299,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="制单人" align="center" prop="creator" width="180">
+            <el-table-column label="制单人" align="center" prop="creator" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthReturnGoalDetailsList[scope.$index].creator" title="负责人" valueKey="name"
                                       referName="CONTACTS_PARAM"
@@ -308,13 +308,13 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="月份" align="center" prop="monthly" width="250">
+            <el-table-column label="月份" align="center" prop="monthly" width="250" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-date-picker v-model="monthReturnGoalDetailsList[scope.$index].monthly" value-format="yyyy-MM" type="month" placeholder="选择月份">
                 </el-date-picker>
               </template>
             </el-table-column>
-            <el-table-column label="目标值" align="center" prop="goalSum" width="220">
+            <el-table-column label="目标值" align="center" prop="goalSum" width="220" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-input-number @change="computeTotal" v-model="monthReturnGoalDetailsList[scope.$index].goalSum" :precision="2" :step="1" :min="0"></el-input-number>
               </template>
@@ -439,7 +439,14 @@ export default {
         goalSum: null
       },
       // 表单校验
-      rules: {},
+      rules: {
+        documentDate: [{ required: true, message: '单据日期不能为空', trigger: 'blur' }],
+        annual: [{ required: true, message: '年度不能为空', trigger: 'blur' }],
+        custom: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
+        creator: [{ required: true, message: '制单人不能为空', trigger: 'blur' }],
+        saleZone: [{ required: true, message: '销售区域不能为空', trigger: 'blur' }],
+        dept: [{ required: true, message: '部门不能为空', trigger: 'blur' }],
+      },
       // 子表导航名
       activeName: 'monthReturnGoalDetails',
       documentDateRange: null,
@@ -543,6 +550,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.monthReturnGoalDetailsList = []
       this.open = true;
       this.title = "添加--月回款目标填报";
     },
@@ -550,14 +558,16 @@ export default {
       let list = {
         id: null,
         code: null,
-        saleOrg: null,
-        saleZone: null,
-        custom: null,
-        creator: null,
+        saleOrg: this.form.saleZone,
+        saleZone: this.form.saleZone,
+        custom: this.form.custom,
+        dept: this.form.dept,
+        creator: this.form.creator,
         monthly: null,
-        goalSum: null
+        goalSum: 0
       }
       this.monthReturnGoalDetailsList.push(list)
+      this.computeTotal()
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -565,13 +575,17 @@ export default {
       const id = row.id || this.ids
       getMonthReturnGoal(id).then(response => {
         this.form = response.data;
-        this.monthReturnGoalDetailsList = this.form.monthReturnGoalDetailsList
+        console.log(this.form);
+        this.monthReturnGoalDetailsList = JSON.parse(JSON.stringify(this.form.monthReturnGoalDetailsList))
         this.open = true;
-        this.title = "修改--月销售目标填报";
+        this.title = "修改--月回款目标填报";
       });
     },
     /** 提交按钮 */
     submitForm() {
+      if (!this.justiceDetailsList()) {
+        return this.$message.error('子表中有必填字段未填')
+      }
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
@@ -656,6 +670,7 @@ export default {
         saleOrg: row.saleOrg,
         saleZone: row.saleZone,
         custom: row.custom,
+        dept: row.dept,
         creator: row.creator,
         monthly: row.monthly,
         goalSum: row.goalSum
@@ -672,6 +687,23 @@ export default {
         this.queryParams.beginTime = null
         this.queryParams.endTime = null
       }
+    },
+    // 给table添加必填项
+    addRedStar(h, { column }) {
+      return [
+        h('span', { style: 'color: #F56C6C' }, '*'),
+        h('span', '' + column.label)
+      ]
+    },
+    // 判断子表的字段是否都填了
+    justiceDetailsList() {
+      const arr = JSON.parse(JSON.stringify(this.monthReturnGoalDetailsList))
+      for (const element of arr) {
+        if (element.saleOrg === null || element.saleZone === null || element.custom === null || element.dept === null || element.creator === null || element.monthly === null || element.goalSum === null) {
+          return false
+        }
+      }
+      return true
     }
   }
 }

+ 24 - 17
src/views/business/spd/goal_management/MonthReturnMerge.vue

@@ -269,22 +269,21 @@
       </el-row>
     </el-form>
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
+<!--      <el-col :span="1.5">
         <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddDetails">增 行</el-button>
-      </el-col>
+      </el-col>-->
       <el-col :span="1.5">
         <el-button type="primary" plain icon="el-icon-folder-opened" size="mini" @click="clickMerge">合 并</el-button>
       </el-col>
     </el-row>
     <el-tabs v-model="activeName" @tab-click="getNewTwoArray">
       <el-tab-pane label="月回款目标合并明细" name="monthReturnMergeDetails">
-<!--        v-loading="loading"-->
-        <el-table :data="monthReturnMergeDetailsList" @selection-change="handleSelectionChange">
-          <el-table-column type="selection" width="55" align="center" fixed />
+        <el-table v-loading="loading" :data="monthReturnMergeDetailsList">
+          <el-table-column label="序号" type="index" width="55" align="center" fixed />
           <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="monthReturnMergeDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
-                                    referName="CUSTOMER_PARAM"
+                                    referName="CUSTOMER_PARAM" disabled
                                     :dataMapping="{ saleOrgCode: 'code', saleOrg: 'name'}"
                                     :source.sync="monthReturnMergeDetailsList[scope.$index]" placeholder="请输入销售组织">
               </el-popover-select-v2>
@@ -293,7 +292,7 @@
           <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="monthReturnMergeDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
-                                    referName="CUSTOMER_PARAM"
+                                    referName="CUSTOMER_PARAM" disabled
                                     :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
                                     :source.sync="monthReturnMergeDetailsList[scope.$index]" placeholder="请输入销售区域">
               </el-popover-select-v2>
@@ -302,7 +301,7 @@
           <el-table-column label="客户" align="center" prop="custom" width="180">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="monthReturnMergeDetailsList[scope.$index].custom" title="客户" valueKey="name"
-                                    referName="CUSTOMER_PARAM"
+                                    referName="CUSTOMER_PARAM" disabled
                                     :dataMapping="{ customCode: 'code', custom: 'name'}"
                                     :source.sync="monthReturnMergeDetailsList[scope.$index]" placeholder="请输入客户">
               </el-popover-select-v2>
@@ -311,7 +310,7 @@
           <el-table-column label="部门" align="center" prop="dept" width="180">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="monthReturnMergeDetailsList[scope.$index].dept" title="部门" valueKey="name"
-                                    referName="DEPT_PARAM"
+                                    referName="DEPT_PARAM" disabled
                                     :dataMapping="{ deptCode: 'code', dept: 'name'}"
                                     :source.sync="monthReturnMergeDetailsList[scope.$index]" placeholder="请输入客户">
               </el-popover-select-v2>
@@ -320,7 +319,7 @@
           <el-table-column label="制单人" align="center" prop="creator" width="180">
             <template slot-scope="scope">
               <el-popover-select-v2 v-model="monthReturnMergeDetailsList[scope.$index].creator" title="制单人" valueKey="name"
-                                    referName="CONTACTS_PARAM"
+                                    referName="CONTACTS_PARAM" disabled
                                     :dataMapping="{ creatorCode: 'code', creator: 'name'}"
                                     :source.sync="monthReturnMergeDetailsList[scope.$index]" placeholder="请输入制单人">
               </el-popover-select-v2>
@@ -328,7 +327,7 @@
           </el-table-column>
           <el-table-column label="月份" align="center" prop="monthly" width="250">
             <template slot-scope="scope">
-              <el-date-picker v-model="monthReturnMergeDetailsList[scope.$index].monthly" value-format="yyyy-MM" type="month" placeholder="选择月份">
+              <el-date-picker disabled v-model="monthReturnMergeDetailsList[scope.$index].monthly" value-format="yyyy-MM" type="month" placeholder="选择月份">
               </el-date-picker>
             </template>
           </el-table-column>
@@ -337,7 +336,7 @@
               <el-input-number @change="computeTotal" v-model="monthReturnMergeDetailsList[scope.$index].goalSum" :precision="2" :step="1" :min="0"></el-input-number>
             </template>
           </el-table-column>
-          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
+<!--          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120px" fixed="right">
             <template slot-scope="scope">
               <el-button
                 size="mini"
@@ -352,12 +351,12 @@
                 @click="handleCopyDetails(scope.row)"
               >复制</el-button>
             </template>
-          </el-table-column>
+          </el-table-column>-->
         </el-table>
       </el-tab-pane>
       <el-tab-pane label="区域目标汇总(月回款)" name="zoneGoalSum(monthReturn)">
-        <el-table :data="zoneGoalSumList" @selection-change="handleSelectionChange">
-          <el-table-column type="selection" width="55" align="center" fixed />
+        <el-table :data="zoneGoalSumList">
+          <el-table-column label="序号" type="index" width="55" align="center" fixed />
           <el-table-column label="销售组织" align="center" prop="saleOrg" width="180" />
           <el-table-column label="区域" align="center" prop="saleZone" width="180" />
           <el-table-column label="制单人" align="center" prop="creator" width="180" />
@@ -472,7 +471,15 @@ export default {
         delFlag: null
       },
       // 表单校验
-      rules: {},
+      rules: {
+        documentDate: [{ required: true, message: '单据日期不能为空', trigger: 'blur' }],
+        annual: [{ required: true, message: '年度不能为空', trigger: 'blur' }],
+        monthly: [{ required: true, message: '月份不能为空', trigger: 'blur' }],
+        custom: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
+        saleZone: [{ required: true, message: '销售区域不能为空', trigger: 'blur' }],
+        creator: [{ required: true, message: '制单人不能为空', trigger: 'blur' }],
+        dept: [{ required: true, message: '部门不能为空', trigger: 'blur' }]
+      },
       activeName: 'monthReturnMergeDetails',
       pickerOptions: {
         shortcuts: [{
@@ -741,7 +748,7 @@ export default {
           const key = `${obj.saleOrg}-${obj.saleZone}-${obj.creator}-${obj.monthly}`
           if (map.has(key)) {
             const existingObj = map.get(key)
-            existingObj.goalSum +=obj.goalSum
+            existingObj.goalSum += obj.goalSum
           } else {
             map.set(key, { ...obj })
           }

+ 45 - 17
src/views/business/spd/goal_management/MonthSaleGoal.vue

@@ -258,7 +258,7 @@
         <el-tab-pane label="月销售目标明细" name="monthSaleGoalDetails">
           <el-table v-loading="loading" :data="monthSaleGoalDetailsList" @selection-change="handleSelectionChange">
             <el-table-column type="selection" width="55" align="center" fixed />
-            <el-table-column label="销售组织" align="center" prop="saleOrg" width="180">
+            <el-table-column label="销售组织" align="center" prop="saleOrg" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].saleOrg" title="销售组织" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -267,7 +267,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="销售区域" align="center" prop="saleZone" width="180">
+            <el-table-column label="销售区域" align="center" prop="saleZone" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].saleZone" title="销售区域" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -276,7 +276,7 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="客户" align="center" prop="custom" width="180">
+            <el-table-column label="客户" align="center" prop="custom" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].custom" title="客户" valueKey="name"
                                       referName="CUSTOMER_PARAM"
@@ -285,25 +285,25 @@
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="部门" align="center" prop="dept" width="180">
+            <el-table-column label="部门" align="center" prop="dept" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].dept" title="部门" valueKey="name"
                                       referName="DEPT_PARAM"
                                       :dataMapping="{ deptCode: 'code', dept: 'name'}"
-                                      :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入客户">
+                                      :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入部门">
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="制单人" align="center" prop="creator" width="180">
+            <el-table-column label="制单人" align="center" prop="creator" width="180" :render-header="addRedStar">
               <template slot-scope="scope">
-                <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].creator" title="负责人" valueKey="name"
+                <el-popover-select-v2 v-model="monthSaleGoalDetailsList[scope.$index].creator" title="制单人" valueKey="name"
                                       referName="CONTACTS_PARAM"
                                       :dataMapping="{ creatorCode: 'code', creator: 'name'}"
-                                      :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入负责人">
+                                      :source.sync="monthSaleGoalDetailsList[scope.$index]" placeholder="请输入制单人">
                 </el-popover-select-v2>
               </template>
             </el-table-column>
-            <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220">
+            <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-select v-model="monthSaleGoalDetailsList[scope.$index].oneLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '一级物料分类', scope.$index)"
@@ -312,7 +312,7 @@
                 </el-select>
               </template>
             </el-table-column>
-            <el-table-column label="二级分类" align="center" prop="twoLevelClassify" width="220">
+            <el-table-column label="二级分类" align="center" prop="twoLevelClassify" width="220" :render-header="addRedStar">
               <template slot-scope="scope">
                 <el-select v-model="monthSaleGoalDetailsList[scope.$index].twoLevelClassify" size="mini" clearable
                            @focus="chooseTreeReferForDetails('MATERIALCLASSIFY_PARAM', false, '二级物料分类', scope.$index)"
@@ -480,7 +480,14 @@ export default {
         goalValue: null
       },
       // 表单校验
-      rules: {},
+      rules: {
+        documentDate: [{ required: true, message: '单据日期不能为空', trigger: 'blur' }],
+        annual: [{ required: true, message: '年度不能为空', trigger: 'blur' }],
+        custom: [{ required: true, message: '客户不能为空', trigger: 'blur' }],
+        saleZone: [{ required: true, message: '销售区域不能为空', trigger: 'blur' }],
+        creator: [{ required: true, message: '销售区域不能为空', trigger: 'blur' }],
+        dept: [{ required: true, message: '部门不能为空', trigger: 'blur' }]
+      },
       // 参照条件
       referCondition: { type: '', isPage: true, title: '', index: null },
       classOptions: [],
@@ -559,6 +566,7 @@ export default {
     /** 新增按钮操作 */
     handleAdd() {
       this.reset();
+      this.monthSaleGoalDetailsList = []
       this.open = true;
       this.title = "添加月销售目标填报";
     },
@@ -566,11 +574,11 @@ export default {
       let list = {
         id: null,
         code: null,
-        saleOrg: null,
-        saleZone: null,
-        custom: null,
-        dept: null,
-        creator: null,
+        saleOrg: this.form.saleZone,
+        saleZone: this.form.saleZone,
+        custom: this.form.custom,
+        dept: this.form.dept,
+        creator: this.form.creator,
         oneLevelClassifyCode: null,
         oneLevelClassify: null,
         twoLevelClassifyCode: null,
@@ -580,9 +588,10 @@ export default {
         department: null,
         num: null,
         monthly: null,
-        goalValue: null
+        goalValue: 0
       }
       this.monthSaleGoalDetailsList.push(list)
+      this.computeTotal()
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
@@ -597,6 +606,9 @@ export default {
     },
     /** 提交按钮 */
     submitForm() {
+      if (!this.justiceDetailsList()) {
+        return this.$message.error('子表有必填字段未填')
+      }
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
@@ -726,6 +738,22 @@ export default {
         this.monthSaleGoalDetailsList[this.referCondition.index].twoLevelClassifyCode = selection.code
         this.monthSaleGoalDetailsList[this.referCondition.index].twoLevelClassify = selection.name
       }
+    },
+    // 子表table加必填标志
+    addRedStar(h, { column }) {
+      return [
+        h('span', { style: 'color: #F56C6C' }, '*'),
+        h('span', '' + column.label)
+      ]
+    },
+    justiceDetailsList() {
+      const arr = JSON.parse(JSON.stringify(this.monthSaleGoalDetailsList))
+      for (const element of arr) {
+        if (element.saleOrg === null || element.saleZone === null || element.custom === null || element.dept === null || element.creator === null || element.oneLevelClassify === null || element.twoLevelClassify === null) {
+          return false
+        }
+      }
+      return true
     }
   }
 }

+ 2 - 1
vue.config.js

@@ -45,7 +45,8 @@ module.exports = {
         // target: `http://172.16.13.152:8000/drp-admin`, //豪哥本地
         // target: `http://172.16.13.47:8000/drp-admin`, //这是一个美女的本地
         // target: `http://172.16.13.113:8000/drp-admin`, //DWT本地
-        target: `http://172.16.13.21:8000/drp-admin`, //CKF本地
+        // target: `http://172.16.13.21:8000/drp-admin`, //CKF本地
+        target: `http://172.16.13.43:8000/drp-admin`, //lz's localhost
 
          // target: `http://127.0.0.1:8000/drp-admin`,
         changeOrigin: true,