Sfoglia il codice sorgente

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

002637 1 anno fa
parent
commit
5be22f23ec

+ 8 - 51
src/api/business/spd/goal_management/annualSaleMergeDetails.js

@@ -3,7 +3,7 @@ import request from '@/utils/request'
 // 查询年销售目标合并明细列表
 export function listAnnualSaleMergeDetails(query) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails/list',
+    url: '/goal_management/annualSaleGoalMerge/list',
     method: 'get',
     params: query
   })
@@ -12,7 +12,7 @@ export function listAnnualSaleMergeDetails(query) {
 // 查询年销售目标合并明细详细
 export function getAnnualSaleMergeDetails(id) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails/' + id,
+    url: '/goal_management/annualSaleGoalMerge/' + id,
     method: 'get'
   })
 }
@@ -20,7 +20,7 @@ export function getAnnualSaleMergeDetails(id) {
 // 新增年销售目标合并明细
 export function addAnnualSaleMergeDetails(data) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails/addAnnualSaleMergeDetails',
+    url: '/goal_management/annualSaleGoalMerge/addAnnualSaleMergeDetails',
     method: 'post',
     data: data
   })
@@ -29,7 +29,7 @@ export function addAnnualSaleMergeDetails(data) {
 // 修改年销售目标合并明细
 export function updateAnnualSaleMergeDetails(data) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails',
+    url: '/goal_management/annualSaleGoalMerge',
     method: 'put',
     data: data
   })
@@ -38,58 +38,15 @@ export function updateAnnualSaleMergeDetails(data) {
 // 删除年销售目标合并明细
 export function delAnnualSaleMergeDetails(id) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails/' + id,
+    url: '/goal_management/annualSaleGoalMerge/' + id,
     method: 'delete'
   })
 }
 
-// 根据目标分类合并,在销售目标明细查找
-export function mergeAnnualSaleGoalDetails(query) {
+// 年销售目标合并明细
+export function mergeAnnualSaleMergeDetails(query) {
   return request({
-    url: '/goal_management/annualSaleMergeDetails/mergeAnnualSaleGoalDetails',
-    method: 'get',
-    params: query
-  })
-}
-
-export function setGoalMergeCodeIsNotNull() {
-  return request({
-    url: 'goal_management/annualSaleMergeDetails/setGoalMergeCodeIsNotNull',
-    method: 'post'
-  })
-}
-
-// 新增后获得数据
-export function getDetailsAfterAdding(query) {
-  return request({
-    url: '/goal_management/annualSaleMergeDetails/getDetailsAfterAdding',
-    method: 'get',
-    params: query
-  })
-}
-
-// 复制数据
-export function copyDetails(data) {
-  return request({
-    url: '/goal_management/annualSaleMergeDetails/copyDetails',
-    method: 'post',
-    data: data
-  })
-}
-
-// 根据code得到数据
-export function getMergeDetailsByCode(query, code) {
-  return request({
-    url: '/goal_management/annualSaleMergeDetails/getMergeDetailsByCode/' + code,
-    method: 'get',
-    params: query
-  })
-}
-
-// 在编辑页面合并
-export function annualGoalMergeFromEdit(query, code) {
-  return request({
-    url: '/goal_management/annualSaleMergeDetails/annualGoalMergeFromEdit/' + code,
+    url: '/goal_management/annualSaleGoalMerge/merge',
     method: 'get',
     params: query
   })

+ 1 - 3
src/views/business/spd/goal_management/AnnualSaleGoal.vue

@@ -556,9 +556,7 @@ export default {
       referCondition: {type: '', isPage: true, title: '', index: null},
       classOptions: [],
       // 子表数组
-      annualSaleGoalDetailsList: [],
-      // 按钮使用权
-      buttonUseful: false
+      annualSaleGoalDetailsList: []
     };
   },
   created() {

+ 543 - 116
src/views/business/spd/goal_management/AnnualSaleGoalMerge.vue

@@ -51,7 +51,7 @@
           icon="el-icon-plus"
           size="mini"
           @click="handleAdd"
-          v-hasPermi="['goal_management:annualSaleGoalDetails:add']"
+          v-hasPermi="['goal_management:annualSaleGoalMerge:add']"
         >新增
         </el-button>
       </el-col>
@@ -63,7 +63,7 @@
           size="mini"
           :disabled="multiple"
           @click="handleDelete"
-          v-hasPermi="['goal_management:annualSaleGoalDetails:remove']"
+          v-hasPermi="['goal_management:annualSaleGoalMerge:remove']"
         >删除
         </el-button>
       </el-col>
@@ -74,14 +74,14 @@
           icon="el-icon-download"
           size="mini"
           @click="handleExport"
-          v-hasPermi="['goal_management:annualSaleGoalDetails:export']"
+          v-hasPermi="['goal_management:annualSaleGoalMerge:export']"
         >导出
         </el-button>
       </el-col>
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
 
-    <el-table v-loading="loading" :data="annualSaleGoalDetailsList" @selection-change="handleSelectionChange">
+    <el-table v-loading="loading" :data="annualSaleGoalMergeList" @selection-change="handleSelectionChange">
       <el-table-column type="selection" width="55" align="center"/>
       <el-table-column label="编码" align="center" prop="code" width="180"/>
       <el-table-column label="目标名称" align="center" prop="goalName" width="180"/>
@@ -106,7 +106,7 @@
             type="text"
             icon="el-icon-edit"
             @click="handleUpdate(scope.row)"
-            v-hasPermi="['goal_management:annualSaleGoalDetails:edit']"
+            v-hasPermi="['goal_management:annualSaleGoalMerge:edit']"
           >修改
           </el-button>
           <el-button
@@ -114,7 +114,7 @@
             type="text"
             icon="el-icon-delete"
             @click="handleDelete(scope.row)"
-            v-hasPermi="['goal_management:annualSaleGoalDetails:remove']"
+            v-hasPermi="['goal_management:annualSaleGoalMerge:remove']"
           >删除
           </el-button>
         </template>
@@ -131,102 +131,290 @@
 
     <!-- 添加或修改年度销售目标明细对话框 -->
     <el-drawer :title="title" :visible.sync="open" direction="rtl" :before-close="handleClose" size="100%">
-      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
-        <el-form-item label="编码" prop="code">
-          <el-input v-model="form.code" placeholder="请输入编码"/>
-        </el-form-item>
-        <el-form-item label="销售组织" prop="saleOrg">
-          <el-input v-model="form.saleOrg" placeholder="请输入销售组织"/>
-        </el-form-item>
-        <el-form-item label="销售区域" prop="saleZone">
-          <el-input v-model="form.saleZone" placeholder="请输入销售区域"/>
-        </el-form-item>
-        <el-form-item label="客户" prop="custom">
-          <el-input v-model="form.custom" placeholder="请输入客户"/>
-        </el-form-item>
-        <el-form-item label="负责人" prop="creator">
-          <el-input v-model="form.creator" placeholder="请输入负责人"/>
-        </el-form-item>
-        <el-form-item label="一级分类编码" prop="oneLevelClassifyCode">
-          <el-input v-model="form.oneLevelClassifyCode" placeholder="请输入一级分类编码"/>
-        </el-form-item>
-        <el-form-item label="一级分类" prop="oneLevelClassify">
-          <el-input v-model="form.oneLevelClassify" placeholder="请输入一级分类"/>
-        </el-form-item>
-        <el-form-item label="二级分类编码" prop="twoLevelClassifyCode">
-          <el-input v-model="form.twoLevelClassifyCode" placeholder="请输入二级分类编码"/>
-        </el-form-item>
-        <el-form-item label="二级分类编码" prop="twoLevelClassify">
-          <el-input v-model="form.twoLevelClassify" placeholder="请输入二级分类编码"/>
-        </el-form-item>
-        <el-form-item label="物料编码" prop="materialCode">
-          <el-input v-model="form.materialCode" placeholder="请输入物料编码"/>
-        </el-form-item>
-        <el-form-item label="物料" prop="material">
-          <el-input v-model="form.material" placeholder="请输入物料"/>
-        </el-form-item>
-        <el-form-item label="一月目标" prop="januaryGoal">
-          <el-input v-model="form.januaryGoal" placeholder="请输入一月目标"/>
-        </el-form-item>
-        <el-form-item label="二月目标" prop="februaryGoal">
-          <el-input v-model="form.februaryGoal" placeholder="请输入二月目标"/>
-        </el-form-item>
-        <el-form-item label="三月目标" prop="marchGoal">
-          <el-input v-model="form.marchGoal" placeholder="请输入三月目标"/>
-        </el-form-item>
-        <el-form-item label="四月目标" prop="aprilGoal">
-          <el-input v-model="form.aprilGoal" placeholder="请输入四月目标"/>
-        </el-form-item>
-        <el-form-item label="五月目标" prop="mayGoal">
-          <el-input v-model="form.mayGoal" placeholder="请输入五月目标"/>
-        </el-form-item>
-        <el-form-item label="六月目标" prop="juneGoal">
-          <el-input v-model="form.juneGoal" placeholder="请输入六月目标"/>
-        </el-form-item>
-        <el-form-item label="七月目标" prop="julyGoal">
-          <el-input v-model="form.julyGoal" placeholder="请输入七月目标"/>
-        </el-form-item>
-        <el-form-item label="八月目标" prop="augustGoal">
-          <el-input v-model="form.augustGoal" placeholder="请输入八月目标"/>
-        </el-form-item>
-        <el-form-item label="九月目标" prop="septemberGoal">
-          <el-input v-model="form.septemberGoal" placeholder="请输入九月目标"/>
-        </el-form-item>
-        <el-form-item label="十月目标" prop="octoberGoal">
-          <el-input v-model="form.octoberGoal" placeholder="请输入十月目标"/>
-        </el-form-item>
-        <el-form-item label="十一月目标" prop="novemberGoal">
-          <el-input v-model="form.novemberGoal" placeholder="请输入十一月目标"/>
-        </el-form-item>
-        <el-form-item label="十二月目标" prop="decemberGoal">
-          <el-input v-model="form.decemberGoal" placeholder="请输入十二月目标"/>
-        </el-form-item>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="编码" prop="code">
+              <el-input v-model="form.code" placeholder="编码后端自动生成" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="目标名称" prop="goalName">
+              <el-input v-model="form.goalName" placeholder="目标名称后端自动生成" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="单据日期" prop="documentDate">
+              <el-date-picker v-model="form.documentDate" type="date" placeholder="选择单据日期" value-format="yyyy-MM-dd">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="年度" prop="annual">
+              <el-date-picker v-model="form.annual" type="year" placeholder="选择年度" value-format="yyyy">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="制单人" prop="creator">
+              <el-popover-select-v2 v-model="form.creator" title="制单人" valueKey="name"
+                                    referName="CONTACTS_PARAM"
+                                    :dataMapping="{ creatorCode: 'code', creator: 'name'}"
+                                    :source.sync="form" placeholder="请输入制单人">
+              </el-popover-select-v2>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="部门" prop="dept">
+              <el-popover-select-v2 v-model="form.dept" title="部门" valueKey="name"
+                                    referName="DEPT_PARAM"
+                                    :dataMapping="{ deptCode: 'code', dept: 'name'}"
+                                    :source.sync="form" placeholder="请输入部门">
+              </el-popover-select-v2>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="目标分类" prop="goalCategory">
+              <el-select v-model="form.goalCategory" placeholder="请选择" @change="changeGoalCategoryForm">
+                <el-option
+                  v-for="item in goalCategoryList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="目标值汇总" prop="goalTotal">
+              <el-input v-model="form.goalTotal" placeholder="目标值汇总自动计算" disabled />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="6">
+            <el-form-item label="备注" prop="notes">
+              <el-input v-model="form.notes" placeholder="请输入备注" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item v-if="form.goalCategory === '销售区域'" label="销售区域" prop="saleZone">
+              <el-popover-select-v2 v-model="form.saleZone" title="销售区域" valueKey="name"
+                                    referName="CUSTOMER_PARAM"
+                                    :dataMapping="{ saleZoneCode: 'code', saleZone: 'name'}"
+                                    :source.sync="form" placeholder="请输入销售区域">
+              </el-popover-select-v2>
+            </el-form-item>
+            <el-form-item v-if="form.goalCategory === '一级分类'" label="一级分类" prop="oneLevelClassify">
+              <el-select v-model="form.oneLevelClassify" clearable
+                         @focus="chooseTreeReferForMain('MATERIALCLASSIFY_PARAM', false, '一级物料分类')"
+                         style="width: 200px">
+                <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-select v-model="form.twoLevelClassify" clearable
+                         @focus="chooseTreeReferForMain('MATERIALCLASSIFY_PARAM', false, '二级物料分类')"
+                         style="width: 200px">
+                <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="单据状态" prop="documentStatus">
+              <el-input v-model="form.documentStatus" placeholder="新增页默认未提交" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="6">
+            <el-form-item label="操作">
+              <el-button type="primary" @click="submitForm">确 定</el-button>
+              <el-button @click="cancel">取 消</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
       </el-form>
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAddDetails">增 行</el-button>
+        </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="handleClick">
+        <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-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"
+                                      :dataMapping="{saleOrg: 'name'}"
+                                      :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入销售组织">
+                </el-popover-select-v2>
+              </template>
+            </el-table-column>
+            <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"
+                                      :dataMapping="{saleOrg: 'name'}"
+                                      :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入销售区域">
+                </el-popover-select-v2>
+              </template>
+            </el-table-column>
+            <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"
+                                      :dataMapping="{custom: 'name'}"
+                                      :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入客户">
+                </el-popover-select-v2>
+              </template>
+            </el-table-column>
+            <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"
+                                      :dataMapping="{creator: 'name'}"
+                                      :source.sync="annualSaleGoalMergeDetailsList[scope.$index]" placeholder="请输入负责人">
+                </el-popover-select-v2>
+              </template>
+            </el-table-column>
+            <el-table-column label="一级分类" align="center" prop="oneLevelClassify" width="220">
+              <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">
+                  <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="二级分类" align="center" prop="twoLevelClassify" width="220">
+              <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">
+                  <el-option v-for="item in classOptions" :key="item.id" :label="item.name" :value="item.id" />
+                </el-select>
+              </template>
+            </el-table-column>
+            <el-table-column label="合计" align="center" prop="goalSum" width="180">
+              <template slot-scope="scope">
+                <el-input v-model="annualSaleGoalMergeDetailsList[scope.$index].totalGoal" disabled></el-input>
+              </template>
+            </el-table-column>
+            <el-table-column label="一月" align="center" prop="januaryGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].januaryGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="二月" align="center" prop="februaryGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].februaryGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="三月" align="center" prop="marchGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].marchGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="四月" align="center" prop="aprilGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].aprilGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="五月" align="center" prop="mayGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].mayGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="六月" align="center" prop="juneGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].juneGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="七月" align="center" prop="julyGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].julyGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="八月" align="center" prop="augustGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].augustGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="九月" align="center" prop="septemberGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].septemberGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="十月" align="center" prop="octoberGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].octoberGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="十一月" align="center" prop="novemberGoal" width="220">
+              <template slot-scope="scope">
+                <el-input-number @change="computeTotalDetails(scope.$index, annualSaleGoalMergeDetailsList[scope.$index])" v-model="annualSaleGoalMergeDetailsList[scope.$index].novemberGoal" :precision="2" :step="0.1" :min="0"></el-input-number>
+              </template>
+            </el-table-column>
+            <el-table-column label="十二月" align="center" prop="decemberGoal" width="220">
+              <template slot-scope="scope">
+                <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">
+              <template slot-scope="scope">
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleDeleteDetails(scope.$index, scope.row)"
+                >删除</el-button>
+                <el-button
+                  size="mini"
+                  type="text"
+                  icon="el-icon-delete"
+                  @click="handleCopyDetails(scope.row)"
+                >复制</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-tab-pane>
+        <el-tab-pane label="区域目标汇总(年)" name="zoneGoalSum(year)">配置管理</el-tab-pane>
+        <el-tab-pane label="客户目标汇总(年)" name="customerGoalSum(year)">角色管理</el-tab-pane>
+      </el-tabs>
     </el-drawer>
 
     <TreeRefers ref="treeQuery" @doSubmit="selectionsToInputForQuery" :single="true"/>
+    <TreeRefers ref="treeMain" @doSubmit="selectionsToInputForMain" :single="true" />
+    <TreeRefers ref="treeDetails" @doSubmit="selectionsToInputForDetails" :single="true" />
   </div>
 </template>
 
 <script>
 import {
-  listAnnualSaleGoalDetails,
-  getAnnualSaleGoalDetails,
-  delAnnualSaleGoalDetails,
-  addAnnualSaleGoalDetails,
-  updateAnnualSaleGoalDetails
-} from "@/api/business/spd/goal_management/annualSaleGoalDetails";
+  listAnnualSaleGoalMerge,
+  getAnnualSaleGoalMerge,
+  delAnnualSaleGoalMerge,
+  addAnnualSaleGoalMerge,
+  updateAnnualSaleGoalMerge
+} from "@/api/business/spd/goal_management/annualSaleGoalMerge";
+import {
+  delAnnualSaleMergeDetails,
+  mergeAnnualSaleMergeDetails
+} from "@/api/business/spd/goal_management/annualSaleMergeDetails"
 
 // 树形参照
 import TreeRefers from '@/components/Refers/treeRefer.vue'
 import ElPopoverSelectV2 from "@/components/popover-select-v2"
+import log from "../../../monitor/job/log";
 
 export default {
-  name: "AnnualSaleGoalDetails",
+  name: "AnnualSaleGoalMerge",
   components: {
     TreeRefers, ElPopoverSelectV2
   },
@@ -245,7 +433,10 @@ export default {
       // 总条数
       total: 0,
       // 年度销售目标明细表格数据
-      annualSaleGoalDetailsList: [],
+      annualSaleGoalMergeList: [],
+      annualSaleGoalMergeDetailsList: [],
+      areaDetailList: [],
+      customerDetailList: [],
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -295,13 +486,49 @@ export default {
         oneLevelClassifyCode: null,
         oneLevelClassify: null,
         twoLevelClassifyCode: null,
-        twoLevelClassify: null
+        twoLevelClassify: null,
+        annualGoalMergeDetailsList: null
+      },
+      formDetails: {
+        id: null,
+        mergeCode: null,
+        saleOrg: null,
+        saleZone: null,
+        custom: null,
+        creator: null,
+        oneLevelClassifyCode: null,
+        oneLevelClassify: null,
+        twoLevelClassifyCode: null,
+        twoLevelClassify: null,
+        totalGoal: null,
+        januaryGoal: null,
+        februaryGoal: null,
+        marchGoal: null,
+        aprilGoal: null,
+        mayGoal: null,
+        juneGoal: null,
+        julyGoal: null,
+        augustGoal: null,
+        septemberGoal: null,
+        octoberGoal: null,
+        novemberGoal: null,
+        decemberGoal: null
       },
       // 表单校验
       rules: {},
       // 树形参照
       referCondition: {type: '', isPage: true, title: '', index: null},
-      classOptions: []
+      classOptions: [],
+      // 目标分类
+      goalCategoryList: [
+        {
+          label: '销售区域', value: '销售区域'
+        }, {
+          label: '一级分类', value: '一级分类'
+        }, {
+          label: '二级分类', value: '二级分类'
+        }],
+      activeName: 'annualSaleGoalMergeDetails'
     };
   },
   created() {
@@ -311,8 +538,8 @@ export default {
     /** 查询年度销售目标明细列表 */
     getList() {
       this.loading = true;
-      listAnnualSaleGoalDetails(this.queryParams).then(response => {
-        this.annualSaleGoalDetailsList = response.rows;
+      listAnnualSaleGoalMerge(this.queryParams).then(response => {
+        this.annualSaleGoalMergeList = response.rows;
         this.total = response.total;
         this.loading = false;
       });
@@ -327,35 +554,31 @@ export default {
       this.form = {
         id: null,
         code: null,
-        saleOrg: null,
-        saleZone: null,
-        custom: null,
+        goalName: null,
+        documentDate: null,
+        annual: null,
+        creatorCode: null,
         creator: null,
+        deptCode: null,
+        dept: null,
+        goalCategory: null,
+        goalTotal: null,
+        notes: null,
+        documentStatus: null,
+        delFlag: null,
+        saleZoneCode: null,
+        saleZone: null,
         oneLevelClassifyCode: null,
         oneLevelClassify: null,
         twoLevelClassifyCode: null,
         twoLevelClassify: null,
-        materialCode: null,
-        material: null,
-        januaryGoal: null,
-        februaryGoal: null,
-        marchGoal: null,
-        aprilGoal: null,
-        mayGoal: null,
-        juneGoal: null,
-        julyGoal: null,
-        augustGoal: null,
-        septemberGoal: null,
-        octoberGoal: null,
-        novemberGoal: null,
-        decemberGoal: null
+        detailsList: null
       };
       this.resetForm("form");
     },
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
-      console.log(this.queryParams);
       this.getList();
     },
     /** 重置按钮操作 */
@@ -375,11 +598,42 @@ export default {
       this.open = true;
       this.title = "添加年度销售目标明细";
     },
+    handleAddDetails() {
+      if (this.activeName !== 'annualSaleGoalMergeDetails') {
+        return this.$message.error('当前标签不是‘年度销售目标合并明细’')
+      }
+      let list = {
+        id: null,
+        mergeCode: null,
+        saleOrg: null,
+        saleZone: null,
+        custom: null,
+        creator: null,
+        oneLevelClassifyCode: null,
+        oneLevelClassify: null,
+        twoLevelClassifyCode: null,
+        twoLevelClassify: null,
+        goalSum: null,
+        januaryGoal: null,
+        februaryGoal: null,
+        marchGoal: null,
+        aprilGoal: null,
+        mayGoal: null,
+        juneGoal: null,
+        julyGoal: null,
+        augustGoal: null,
+        septemberGoal: null,
+        octoberGoal: null,
+        novemberGoal: null,
+        decemberGoal: null
+      }
+      this.annualSaleGoalMergeDetailsList.push(list)
+    },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.reset();
       const id = row.id || this.ids
-      getAnnualSaleGoalDetails(id).then(response => {
+      getAnnualSaleGoalMerge(id).then(response => {
         this.form = response.data;
         this.open = true;
         this.title = "修改年度销售目标明细";
@@ -390,13 +644,16 @@ export default {
       this.$refs["form"].validate(valid => {
         if (valid) {
           if (this.form.id != null) {
-            updateAnnualSaleGoalDetails(this.form).then(response => {
+            updateAnnualSaleGoalMerge(this.form).then(response => {
               this.$modal.msgSuccess("修改成功");
               this.open = false;
               this.getList();
             });
           } else {
-            addAnnualSaleGoalDetails(this.form).then(response => {
+            this.form.annualGoalMergeDetailsList = this.annualSaleGoalMergeDetailsList
+            this.form.documentStatus = 0
+            console.log(this.form);
+            addAnnualSaleGoalMerge(this.form).then(response => {
               this.$modal.msgSuccess("新增成功");
               this.open = false;
               this.getList();
@@ -409,18 +666,22 @@ export default {
     handleDelete(row) {
       const ids = row.id || this.ids;
       this.$modal.confirm('是否确认删除年度销售目标明细编号为"' + ids + '"的数据项?').then(function () {
-        return delAnnualSaleGoalDetails(ids);
+        return delAnnualSaleGoalMerge(ids);
       }).then(() => {
         this.getList();
         this.$modal.msgSuccess("删除成功");
       }).catch(() => {
       });
     },
+    handleDeleteDetails(index, row) {
+      this.annualSaleGoalMergeDetailsList.splice(index, 1)
+      this.computeTotal()
+    },
     /** 导出按钮操作 */
     handleExport() {
-      this.download('goal_management/annualSaleGoalDetails/export', {
+      this.download('goal_management/annualSaleGoalMerge/export', {
         ...this.queryParams
-      }, `annualSaleGoalDetails_${new Date().getTime()}.xlsx`)
+      }, `annualSaleGoalMerge_${new Date().getTime()}.xlsx`)
     },
     // 树形参照
     chooseTreeReferForQuery(type, isPage, title) {
@@ -445,6 +706,83 @@ export default {
         this.queryParams.twoLevelClassify = selection.name
       }
     },
+    chooseTreeReferForMain(type, isPage, title) {
+      this.referCondition.type = type
+      this.referCondition.isPage = isPage
+      this.referCondition.title = title
+      this.$refs.treeMain.init(this.referCondition)
+    },
+    selectionsToInputForMain(selection) {
+      this.classOptions.push(selection)
+      if (this.referCondition.title === '一级物料分类') {
+        if (selection.code.length !== 1) {
+          return this.$message.info('请在一级分类下选择')
+        }
+        this.form.oneLevelClassifyCode = selection.code
+        this.form.oneLevelClassify = selection.name
+      } else if (this.referCondition.title === '二级物料分类') {
+        if (selection.code.length !== 4) {
+          return this.$message.info('请在二级分类下选择')
+        }
+        this.form.twoLevelClassifyCode = selection.code
+        this.form.twoLevelClassify = selection.name
+      }
+    },
+    chooseTreeReferForDetails(type, isPage, title, index) {
+      this.referCondition.type = type
+      this.referCondition.isPage = isPage
+      this.referCondition.title = title
+      this.referCondition.index = index
+      this.$refs.treeDetails.init(this.referCondition)
+    },
+    selectionsToInputForDetails(selection) {
+      this.classOptions.push(selection)
+      if (this.referCondition.title === '一级物料分类') {
+        if (selection.code.length !== 1) {
+          return this.$message.info('请在一级分类中选择')
+        }
+        this.annualSaleGoalMergeDetailsList[this.referCondition.index].oneLevelClassifyCode = selection.code
+        this.annualSaleGoalMergeDetailsList[this.referCondition.index].oneLevelClassify = selection.name
+        if (selection.code !== this.formDetails.oneLevelClassifyCode) {
+          this.annualSaleGoalMergeDetailsList[this.referCondition.index].twoLevelClassifyCode = null
+          this.annualSaleGoalMergeDetailsList[this.referCondition.index].twoLevelClassify = null
+        }
+      } else if (this.referCondition.title === '二级物料分类') {
+        if (selection.code.length !== 4) {
+          return this.$message.info('请在二级分类中选择')
+        } else if (selection.code[0] !== this.annualSaleGoalMergeDetailsList[this.referCondition.index].oneLevelClassifyCode) {
+          return this.$message.error('所选择的二级物料分类不属于一级分类')
+        }
+        this.annualSaleGoalMergeDetailsList[this.referCondition.index].twoLevelClassifyCode = selection.code
+        this.annualSaleGoalMergeDetailsList[this.referCondition.index].twoLevelClassify = selection.name
+      }
+    },
+    changeGoalCategoryForm() {
+      let condition = this.form.goalCategory
+      if (condition === '销售区域') {
+        this.form.oneLevelClassifyCode = null
+        this.form.oneLevelClassify = null
+        this.form.twoLevelClassifyCode = null
+        this.form.twoLevelClassify = null
+      } else if (condition === '一级分类') {
+        this.form.saleZoneCode = null
+        this.form.saleZone = null
+        this.form.twoLevelClassifyCode = null
+        this.form.twoLevelClassify = null
+      } else if (condition === '二级分类') {
+        this.form.saleZoneCode = null
+        this.form.saleZone = null
+        this.form.oneLevelClassifyCode = null
+        this.form.oneLevelClassify = null
+      } else {
+        this.form.saleZoneCode = null
+        this.form.saleZone = null
+        this.form.oneLevelClassifyCode = null
+        this.form.oneLevelClassify = null
+        this.form.twoLevelClassifyCode = null
+        this.form.twoLevelClassify = null
+      }
+    },
     // 关闭抽屉
     handleClose(done) {
       this.$confirm('确认关闭?')
@@ -454,6 +792,95 @@ export default {
         })
         .catch(_ => {});
     },
+    // 标签转换
+    handleClick(tab, event) {
+      console.log(tab, event);
+    },
+    // 复制明细
+    handleCopyDetails(row) {
+      let list = {
+        id: row.id,
+        mergeCode: row.mergeCode,
+        saleOrg: row.saleOrg,
+        saleZone: row.saleZone,
+        custom: row.custom,
+        creator: row.creator,
+        oneLevelClassifyCode: row.oneLevelClassifyCode,
+        oneLevelClassify: row.oneLevelClassify,
+        twoLevelClassifyCode: row.twoLevelClassifyCode,
+        twoLevelClassify: row.twoLevelClassify,
+        totalGoal: row.totalGoal,
+        januaryGoal: row.januaryGoal,
+        februaryGoal: row.februaryGoal,
+        marchGoal: row.marchGoal,
+        aprilGoal: row.aprilGoal,
+        mayGoal: row.mayGoal,
+        juneGoal: row.juneGoal,
+        julyGoal: row.julyGoal,
+        augustGoal: row.augustGoal,
+        septemberGoal: row.septemberGoal,
+        octoberGoal: row.octoberGoal,
+        novemberGoal: row.novemberGoal,
+        decemberGoal: row.decemberGoal
+      }
+      this.annualSaleGoalMergeDetailsList.push(list)
+      this.computeTotal()
+    },
+    // 计算子表合计
+    computeTotalDetails(index, row) {
+      let array = [row.januaryGoal, row.februaryGoal, row.marchGoal, row.aprilGoal, row.mayGoal, row.juneGoal, row.julyGoal, row.augustGoal, row.septemberGoal, row.octoberGoal, row.novemberGoal, row.decemberGoal]
+      let sum = 0
+      for (const element of array) {
+        sum = (sum * 1000000 + element * 1000000) / 1000000
+      }
+      this.annualSaleGoalMergeDetailsList[index].totalGoal = sum
+      this.computeTotal()
+    },
+    // 计算主表合计
+    computeTotal() {
+      let list = this.annualSaleGoalMergeDetailsList
+      let sum = 0
+      for (const listElement of list) {
+        sum = (sum * 1000000 + listElement.totalGoal * 1000000) / 1000000
+      }
+      this.form.goalTotal = sum
+    },
+    // 合并数据
+    clickMerge() {
+      let classify = this.form.goalCategory
+      let classifyValue;
+      if (classify === null || classify === '') {
+        return this.$message.error('请输入目标分类')
+      } else if (classify === '销售区域') {
+        classifyValue = this.form.saleZone
+        if (classifyValue === null) {
+          return this.$message.error('请输入销售区域')
+        }
+      } else if (classify === '一级分类') {
+        classifyValue = this.form.oneLevelClassify
+        if (classifyValue === null) {
+          return this.$message.error('请输入一级分类')
+        }
+      } else if (classify === '二级分类') {
+        classifyValue = this.form.twoLevelClassify
+        if (classifyValue === null) {
+          return this.$message.error('请输入二级分类')
+        }
+      }
+      let query = { classify: classify, classifyValue: classifyValue }
+      mergeAnnualSaleMergeDetails(query).then(response => {
+        console.log(response);
+        this.annualSaleGoalMergeDetailsList = response.data.consolidatedDetail
+        if (classify !== '销售区域') {
+          this.areaDetailList = []
+          this.customerDetailList = []
+        } else {
+          this.areaDetailList = response.data.areaDetailList
+          this.customerDetailList = response.data.customerDetailList
+        }
+        this.computeTotal()
+      })
+    }
   }
 };
 </script>

+ 2 - 2
src/views/business/spd/goal_management/MonthGoalMerge.vue

@@ -56,7 +56,7 @@
         </el-popover-select-v2>
       </el-form-item>
       <el-form-item label="目标类型" prop="goalCategory">
-        <el-select v-model="queryParams.goalCategory" placeholder="请输入目标类型" @change="changeGoalCategory" @keyup.enter.native="handleQuery">
+        <el-select v-model="queryParams.goalCategory" placeholder="请输入目标类型" @change="changeGoalCategoryQuery" @keyup.enter.native="handleQuery">
           <el-option
             v-for="item in goalCategoryList"
             :key="item.value"
@@ -777,7 +777,7 @@ export default {
       }
     },
     // 改变查询表单的目标分类
-    changeGoalCategory() {
+    changeGoalCategoryQuery() {
       let condition = this.queryParams.goalCategory
       if (condition === null) {
         this.queryParams.custom = null