Forráskód Böngészése

feature(合同): 销售签约指标管理功能实现

likai 2 éve
szülő
commit
e5a2780dce

+ 4 - 0
src/api/contract/index.js

@@ -50,4 +50,8 @@ export default {
   commitWithFileUrl(query) {
     return micro_request.postRequest(basePath, 'CtrContract', 'CommitWithFileUrl', query)
   },
+  // 获取分成信息
+  getContractShareList(query) {
+    return micro_request.postRequest(basePath, 'CtrContract', 'GetContractShareList', query)
+  },
 }

+ 13 - 0
src/api/contract/target.js

@@ -0,0 +1,13 @@
+import micro_request from '@/utils/micro_request'
+
+const basePath = process.env.VUE_APP_ParentPath
+export default {
+  // 销售签约指标列表
+  getSaleTargetList(query) {
+    return micro_request.postRequest(basePath, 'SaleTarget', 'List', query)
+  },
+  // 销售签约指标导入
+  importSaleTarget(query) {
+    return micro_request.postRequest(basePath, 'SaleTarget', 'Import', query)
+  },
+}

+ 5 - 1
src/components/table/TableTool.vue

@@ -31,7 +31,7 @@
     <!--      </template>-->
     <!--    </el-popover>-->
     <el-popover popper-class="custom-table-checkbox" trigger="hover">
-      <el-checkbox-group v-model="checkColumns">
+      <el-checkbox-group v-model="checkColumns" class="checkboxes">
         <vab-draggable v-bind="dragOptions" :list="columns">
           <div v-for="item in columns" :key="item.label">
             <vab-icon icon="drag-drop-line" />
@@ -148,4 +148,8 @@
       margin: 5px 0 5px 8px;
     }
   }
+  .checkboxes {
+    max-height: 500px;
+    overflow-y: auto;
+  }
 </style>

+ 182 - 113
src/views/contract/components/ApplyContract.vue

@@ -7,56 +7,91 @@
  * @FilePath: \opms_frontend\src\views\customer\components\allocate.vue
 -->
 <template>
-  <el-dialog title="提交审核" :visible.sync="visible" width="50%" @close="handleClose">
-    <el-form ref="form" label-width="150px" :model="form" :rules="rules">
-      <el-form-item label="合同模板" prop="contractModel">
-        <el-radio-group v-model="form.contractModel">
-          <el-radio label="大数模板" />
-          <el-radio label="客户模板" />
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="条款情况" prop="terms">
-        <el-radio-group v-model="form.terms">
-          <el-radio label="接纳全部条款" />
-          <el-radio label="不接纳全部条款" />
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="付款条件" prop="payTerms">
-        <el-input
-          v-model="form.payTerms"
-          maxlength="500"
-          placeholder="请输入付款条件"
-          resize="none"
-          :rows="5"
-          show-word-limit
-          type="textarea" />
-      </el-form-item>
-      <el-form-item label="文件" prop="file">
-        <el-upload
-          ref="uploadRef"
-          :action="uploadFileUrl"
-          :file-list="fileList"
-          :limit="1"
-          :show-file-list="true"
-          :on-remove="
-            (file, fileList) => {
-              return removeFile(file, fileList, index)
-            }
-          "
-          :on-success="
-            (response, file) => {
-              return setFile(response, file, index)
-            }
-          ">
-          <el-button size="mini" type="primary">点击上传</el-button>
-        </el-upload>
-      </el-form-item>
-    </el-form>
-    <span slot="footer">
-      <el-button :loading="loading" size="mini" type="primary" @click="handleSubmit">确定</el-button>
-      <el-button size="mini" @click="visible = false">取消</el-button>
-    </span>
-  </el-dialog>
+  <div>
+    <el-dialog title="提交审核" :visible.sync="visible" width="50%" @close="handleClose">
+      <el-form ref="form" label-width="150px" :model="form" :rules="rules">
+        <el-form-item label="合同模板" prop="contractModel">
+          <el-radio-group v-model="form.contractModel">
+            <el-radio label="大数模板" />
+            <el-radio label="客户模板" />
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="条款情况" prop="terms">
+          <el-radio-group v-model="form.terms">
+            <el-radio label="接纳全部条款" />
+            <el-radio label="不接纳全部条款" />
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="付款条件" prop="payTerms">
+          <el-input
+            v-model="form.payTerms"
+            maxlength="500"
+            placeholder="请输入付款条件"
+            resize="none"
+            :rows="5"
+            show-word-limit
+            type="textarea" />
+        </el-form-item>
+        <el-form-item label="文件" prop="file">
+          <el-upload
+            ref="uploadRef"
+            :action="uploadFileUrl"
+            :file-list="fileList"
+            :limit="1"
+            :on-remove="
+              (file, fileList) => {
+                return removeFile(file, fileList, index)
+              }
+            "
+            :on-success="
+              (response, file) => {
+                return setFile(response, file, index)
+              }
+            "
+            :show-file-list="true">
+            <el-button size="mini" type="primary">点击上传</el-button>
+          </el-upload>
+        </el-form-item>
+        <el-form-item v-if="shareFlag" label="销售分成">
+          <el-button style="float: right" type="primary" @click="addShare">添加</el-button>
+          <el-table ref="table" :data="shares">
+            <el-table-column label="合同金额" prop="contractAmount" />
+            <el-table-column label="销售" prop="saleId">
+              <template #default="{ row }">
+                <el-input v-model="row.saleName" readonly suffix-icon="el-icon-search" @focus="handleSelectSale(row)" />
+              </template>
+            </el-table-column>
+            <el-table-column label="分成比例" prop="shareRatio">
+              <template #default="{ row }">
+                <el-input-number
+                  v-model="row.shareRatio"
+                  :max="100"
+                  :min="0.01"
+                  :precision="2"
+                  :step="0.1"
+                  @change="changeRatio(row)" />
+              </template>
+            </el-table-column>
+            <el-table-column label="金额" prop="shareAmount" />
+            <el-table-column align="center" fixed="right" label="操作" width="110px">
+              <template slot-scope="scope">
+                <el-button type="primary" @click="deleteShare(scope.$index)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+      </el-form>
+      <span slot="footer">
+        <el-button :loading="loading" size="mini" type="primary" @click="handleSubmit">确定</el-button>
+        <el-button size="mini" @click="visible = false">取消</el-button>
+      </span>
+    </el-dialog>
+    <!-- 选择销售工程师弹窗 -->
+    <select-user
+      ref="selectSales"
+      :query-params="{ roles: ['SalesEngineer', 'ProductLineManager'] }"
+      @save="selectSales" />
+  </div>
 </template>
 
 <script>
@@ -64,8 +99,10 @@
   import { getToken } from '@/utils/token'
   import to from 'await-to-js'
   import contractApi from '@/api/contract'
+  import SelectUser from '@/components/select/SelectUser'
+
   export default {
-    components: {},
+    components: { SelectUser },
     data() {
       return {
         visible: false,
@@ -95,10 +132,32 @@
           terms: [{ required: true, trigger: 'blur', message: '请选择条款情况' }],
           payTerms: [{ required: true, trigger: 'blur', message: '请选择付款条件' }],
         },
+        shareFlag: false,
+        theContract: {},
+        shares: [], // 分成计算
+        theShare: {}, // 选中的分成数据
       }
     },
     methods: {
+      // 打开弹窗
+      openDialog(row) {
+        this.shareFlag = true
+        this.shares.splice(0, this.shares.length)
+        this.theContract = row
+        this.shares.push({
+          contractId: this.theContract.id,
+          contractCode: this.theContract.contractCode,
+          contractAmount: this.theContract.contractAmount,
+          contractSignTime: this.theContract.contractSignTime,
+          saleId: this.theContract.inchargeId,
+          saleName: this.theContract.inchargeName,
+          shareRatio: 100,
+          shareAmount: this.theContract.contractAmount,
+        })
+        this.visible = true
+      },
       handleClose() {
+        this.shareFlag = false
         this.fileList = []
         this.loading = false
         this.form = {
@@ -121,73 +180,83 @@
         this.form.fileUrl = ''
       },
       async handleSubmit() {
+        //  数据校验
         const [valid] = await to(this.$refs.form.validate())
         if (valid == false) return
         if (!this.form.fileUrl) return this.$message.warning('附件不能为空')
-        // const [err, res] = await to(contractApi.ss(this.form))
-        // if (err) return
 
-        this.loading = true
-        contractApi
-          .commitWithFileUrl(this.form)
-          .then((res) => {
-            if (res.code == 200) {
-              this.$message.success('提交成功')
-              this.visible = false
-              this.$emit('refresh')
-            } else {
-              this.$message.success('系统异常')
-              console.error(res)
-            }
-            this.loading = false
-          })
-          .catch((err) => {
-            console.error(err)
-            this.loading = false
+        // 销售分成信息校验
+        if (!this.shares || this.shares.length == 0) {
+          return this.$message.warning('分成信息不能为空')
+        }
+        let ratio = 0
+        for (let share of this.shares) {
+          ratio += parseFloat(share.shareRatio)
+          if (share.saleName == '') {
+            return this.$message.warning('销售不能为空')
+          }
+        }
+        if (ratio > 100) {
+          this.$confirm('合计分成比例大于1,确定提交数据吗?', '提示', {
+            confirmButtonText: '确定',
+            cancelButtonText: '取消',
+            type: 'warning',
+          }).then(async () => {
+            this.loading = true
+            let data = JSON.parse(JSON.stringify(this.form))
+            data.shares = this.shares
+            contractApi
+              .commitWithFileUrl(data)
+              .then((res) => {
+                if (res.code == 200) {
+                  this.$message.success('提交成功')
+                  this.visible = false
+                  this.$emit('refresh')
+                } else {
+                  this.$message.success('系统异常')
+                  console.error(res)
+                }
+                this.loading = false
+              })
+              .catch((err) => {
+                console.error(err)
+                this.loading = false
+              })
           })
-
-        // let formData = new FormData()
-        // formData.append('file', this.form.file)
-        // formData.append('contractId', this.form.id)
-        // formData.append('contractModel', this.form.contractModel)
-        // formData.append('terms', this.form.terms)
-        // formData.append('payTerms', this.form.payTerms)
-        // this.loading = true
-        // axios({
-        //   method: 'post',
-        //   url: process.env.VUE_APP_MicroSrvProxy_API + process.env.VUE_APP_ParentPath,
-        //   // url: 'http://192.168.0.51:9981/dashoo.dev.opms.parent-0.0.1',
-        //   data: formData,
-        //   headers: {
-        //     Authorization: 'Bearer ' + getToken(),
-        //     'X-RPCX-SerializeType': '1',
-        //     'X-RPCX-ServicePath': 'CtrContractHandler',
-        //     'X-RPCX-ServiceMethod': 'CommitWithFile',
-        //     'content-type': 'multipart/form-data',
-        //     tenant: process.env.VUE_APP_TENANT,
-        //   },
-        // })
-        //   .then((res) => {
-        //     this.loading = false
-        //     console.log(res)
-        //     if (res.data.code != 0) {
-        //       this.$message({
-        //         type: 'error',
-        //         message: res.data.msg,
-        //       })
-        //     } else {
-        //       this.visible = false
-        //       this.$emit('refresh')
-        //     }
-        //   })
-        //   .catch((err) => {
-        //     this.loading = false
-        //     console.error(err)
-        //     this.$message({
-        //       type: 'warning',
-        //       message: '系统异常',
-        //     })
-        //   })
+        }
+      },
+      // 修改分成比例
+      changeRatio(row) {
+        row.shareAmount = (row.contractAmount * row.shareRatio) / 100
+      },
+      // 添加分成信息
+      addShare() {
+        this.shares.push({
+          contractId: this.theContract.id,
+          contractCode: this.theContract.contractCode,
+          contractAmount: this.theContract.contractAmount,
+          contractSignTime: this.theContract.contractSignTime,
+          saleId: '',
+          saleName: '',
+          shareRatio: 1,
+          shareAmount: this.theContract.contractAmount / 100,
+        })
+      },
+      // 删除分成信息
+      deleteShare(index) {
+        this.shares.splice(index, 1)
+      },
+      // 选择销售
+      handleSelectSale(row) {
+        this.theShare = row
+        this.$refs.selectSales.open()
+      },
+      // 选中
+      selectSales(val) {
+        if (val && val.length > 0) {
+          this.theShare.saleId = val[0].id
+          this.theShare.saleName = val[0].nickName
+        }
       },
     },
   }

+ 72 - 0
src/views/contract/components/DetailsShare.vue

@@ -0,0 +1,72 @@
+<!--
+ * @Author: liuzl 461480418@qq.com
+ * @Date: 2023-01-09 13:54:40
+ * @LastEditors: liuzhenlin
+ * @LastEditTime: 2023-01-10 14:38:22
+ * @Description: file content
+ * @FilePath: \订单全流程管理系统\src\views\contract\components\DetailsProduct.vue
+-->
+<template>
+  <div>
+    <el-table border :data="shares">
+      <el-table-column
+        v-for="(item, index) in columns"
+        :key="index"
+        align="center"
+        :label="item.label"
+        :min-width="item.width"
+        :prop="item.prop"
+        show-overflow-tooltip>
+        <template #default="{ row }">
+          <span v-if="item.prop === 'shareRatio'">
+            {{ row.shareRatio ? row.shareRatio + '%' : '' }}
+          </span>
+          <span v-else>{{ row[item.prop] }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: 'DetailsShare',
+    components: {},
+    props: {
+      details: {
+        type: Object,
+        default: () => {},
+      },
+      shares: {
+        type: Array,
+        default: () => [],
+      },
+    },
+    data() {
+      return {
+        columns: [
+          {
+            label: '销售',
+            width: 'auto',
+            prop: 'saleName',
+          },
+          {
+            label: '分成比例',
+            width: 'auto',
+            prop: 'shareRatio',
+          },
+          {
+            label: '金额',
+            width: 'auto',
+            prop: 'shareAmount',
+          },
+        ],
+      }
+    },
+    computed: {},
+    mounted() {},
+    methods: {},
+  }
+</script>
+
+<style lang="scss" scoped></style>

+ 16 - 0
src/views/contract/detail.vue

@@ -64,6 +64,9 @@
           <el-tab-pane label="附件" name="enclosure">
             <details-enclosure v-if="activeName == 'enclosure'" :details="details" />
           </el-tab-pane>
+          <el-tab-pane label="分成信息" name="share">
+            <details-share v-if="activeName == 'share'" :details="details" :shares="shares" />
+          </el-tab-pane>
         </el-tabs>
       </div>
       <div class="info-side">
@@ -93,6 +96,7 @@
   import DetailsInvoice from './components/DetailsInvoice'
   import DetailsEnclosure from './components/DetailsEnclosure'
   import DetailsDeliver from './components/DetailsDeliver'
+  import DetailsShare from './components/DetailsShare'
   import Edit from './components/Edit'
   import Transfer from './components/Transfer'
 
@@ -106,6 +110,7 @@
       DetailsInvoice,
       DetailsEnclosure,
       DetailsDeliver,
+      DetailsShare,
       Edit,
       Transfer,
     },
@@ -117,6 +122,7 @@
         abstract: {},
         activeName: 'details',
         dynamicsList: [],
+        shares: [],
       }
     },
     computed: {
@@ -128,6 +134,7 @@
     mounted() {
       this.id = parseInt(this.$route.query.id) || null
       this.init()
+      this.getShares()
       this.getRecord()
     },
     methods: {
@@ -140,6 +147,15 @@
           this.details = data
         }
       },
+      // 获取查询分成信息
+      async getShares() {
+        const [err, res] = await to(contractApi.getContractShareList({ contractId: this.id + '' }))
+        if (err) return
+        if (res.data) {
+          let { list } = res.data
+          this.shares = list
+        }
+      },
       scale(numer1, numer2) {
         if (numer2 == 0) {
           return '-'

+ 4 - 4
src/views/contract/index.vue

@@ -189,7 +189,7 @@
             v-if="scope.row.approStatus == '10'"
             v-permissions="['contract:manage:apply']"
             type="text"
-            @click="handleApply(scope.row.id)">
+            @click="handleApply(scope.row)">
             提交审核
           </el-button>
           <el-button
@@ -435,9 +435,9 @@
         this.listLoading = false
         this.$nextTick(() => this.$refs.table.doLayout())
       },
-      handleApply(id) {
-        this.$refs.applyContract.form.id = id
-        this.$refs.applyContract.visible = true
+      handleApply(row) {
+        this.$refs.applyContract.form.id = row.id
+        this.$refs.applyContract.openDialog(row)
       },
       reset() {
         this.queryForm = {

+ 404 - 0
src/views/contract/target/index.vue

@@ -0,0 +1,404 @@
+<!--
+ * @Author: liuzhenlin 461480418@qq.ocm
+ * @Date: 2023-01-05 11:28:51
+ * @LastEditors: wanglj
+ * @LastEditTime: 2023-03-22 14:53:09
+ * @FilePath: \opms_frontend\src\views\contract\index.vue
+-->
+<template>
+  <div class="contract-container">
+    <vab-query-form>
+      <vab-query-form-top-panel>
+        <el-form :inline="true" label-width="0px" :model="queryForm" @submit.native.prevent>
+          <el-form-item prop="saleName">
+            <el-input v-model="queryForm.saleName" clearable placeholder="销售工程师" @keyup.enter.native="queryData" />
+          </el-form-item>
+          <el-form-item prop="year">
+            <el-date-picker v-model="queryForm.year" placeholder="选择年度" type="year" value-format="yyyy" />
+          </el-form-item>
+          <el-form-item>
+            <el-button icon="el-icon-search" type="primary" @click="queryData">查询</el-button>
+          </el-form-item>
+        </el-form>
+      </vab-query-form-top-panel>
+      <vab-query-form-left-panel :span="12">
+        <el-upload
+          ref="uploadRef"
+          :accept="fileSettings.types"
+          action="#"
+          :before-upload="
+            (file) => {
+              return beforeUpload(file)
+            }
+          "
+          :file-list="fileList"
+          :http-request="uploadRequest"
+          :show-file-list="false"
+          style="margin: 0 10px 10px 0 !important">
+          <el-button v-permissions="['contract/target/import']" icon="el-icon-upload2" type="primary">导入</el-button>
+        </el-upload>
+      </vab-query-form-left-panel>
+      <vab-query-form-right-panel :span="12">
+        <table-tool :columns="columns" :show-columns.sync="showColumns" table-type="saleTarget" />
+      </vab-query-form-right-panel>
+    </vab-query-form>
+    <el-table ref="table" v-loading="listLoading" :data="list" :height="height">
+      <el-table-column align="center" show-overflow-tooltip type="selection" />
+      <el-table-column
+        v-for="(item, index) in showColumns"
+        :key="index"
+        align="center"
+        :label="item.label"
+        :min-width="item.width"
+        :prop="item.prop"
+        show-overflow-tooltip
+        :sortable="item.sortable">
+        <template #default="{ row }">
+          <span v-if="item.prop.indexOf('完成率') >= 0">
+            {{ row[item.prop] + '%' }}
+          </span>
+          <span v-else>{{ row[item.prop] }}</span>
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      background
+      :current-page="queryForm.pageNum"
+      :layout="layout"
+      :page-size="queryForm.pageSize"
+      :total="total"
+      @current-change="handleCurrentChange"
+      @size-change="handleSizeChange" />
+  </div>
+</template>
+
+<script>
+  import targetApi from '@/api/contract/target'
+  import TableTool from '@/components/table/TableTool'
+  import to from 'await-to-js'
+  import axios from 'axios'
+  import asyncUploadFile from '@/utils/uploadajax'
+
+  export default {
+    name: 'SaleTarget',
+    components: {
+      TableTool,
+    },
+    data() {
+      return {
+        height: this.$baseTableHeight(3),
+        listLoading: false,
+        layout: 'total, sizes, prev, pager, next, jumper',
+        list: [],
+        total: 0,
+        queryForm: {
+          pageNum: 1,
+          pageSize: 10,
+          year: '', // 年度
+          saleName: '', // 销售工程师
+        },
+        // 自定义列表
+        showColumns: [],
+        columns: [
+          {
+            label: '销售',
+            width: '160px',
+            prop: 'saleName',
+          },
+          {
+            label: '年度',
+            width: '100px',
+            prop: 'year',
+          },
+          {
+            label: '1月计划',
+            width: '100px',
+            prop: 'plan1',
+          },
+          {
+            label: '1月达成',
+            width: '100px',
+            prop: 'complete1',
+          },
+          {
+            label: '2月计划',
+            width: '100px',
+            prop: 'plan2',
+          },
+          {
+            label: '2月达成',
+            prop: 'complete2',
+            width: '140px',
+          },
+          {
+            label: '3月计划',
+            width: '100px',
+            prop: 'plan3',
+          },
+          {
+            label: '3月达成',
+            prop: 'complete3',
+            width: '140px',
+          },
+          {
+            label: '第一季度计划',
+            prop: 'quarterPlan1',
+            width: '140px',
+          },
+          {
+            label: '第一季度达成',
+            prop: 'quarterComplete1',
+            width: '140px',
+          },
+          {
+            label: '第一季度完成率',
+            prop: 'quarterCompleteRatio1',
+            width: '140px',
+          },
+          {
+            label: '4月计划',
+            width: '100px',
+            prop: 'plan4',
+          },
+          {
+            label: '4月达成',
+            width: '100px',
+            prop: 'complete4',
+          },
+          {
+            label: '5月计划',
+            width: '100px',
+            prop: 'plan5',
+          },
+          {
+            label: '5月达成',
+            prop: 'complete5',
+            width: '140px',
+          },
+          {
+            label: '6月计划',
+            width: '100px',
+            prop: 'plan6',
+          },
+          {
+            label: '6月达成',
+            prop: 'complete6',
+            width: '140px',
+          },
+          {
+            label: '第二季度计划',
+            prop: 'quarterPlan2',
+            width: '140px',
+          },
+          {
+            label: '第二季度达成',
+            prop: 'quarterComplete2',
+            width: '140px',
+          },
+          {
+            label: '第二季度完成率',
+            prop: 'quarterCompleteRatio2',
+            width: '140px',
+          },
+          {
+            label: '7月计划',
+            width: '100px',
+            prop: 'plan7',
+          },
+          {
+            label: '7月达成',
+            width: '100px',
+            prop: 'complete7',
+          },
+          {
+            label: '8月计划',
+            width: '100px',
+            prop: 'plan8',
+          },
+          {
+            label: '8月达成',
+            prop: 'complete8',
+            width: '140px',
+          },
+          {
+            label: '9月计划',
+            width: '100px',
+            prop: 'plan9',
+          },
+          {
+            label: '9月达成',
+            prop: 'complete9',
+            width: '140px',
+          },
+          {
+            label: '第三季度计划',
+            prop: 'quarterPlan3',
+            width: '140px',
+          },
+          {
+            label: '第三季度达成',
+            prop: 'quarterComplete3',
+            width: '140px',
+          },
+          {
+            label: '第三季度完成率',
+            prop: 'quarterCompleteRatio3',
+            width: '140px',
+          },
+          {
+            label: '10月计划',
+            width: '100px',
+            prop: 'plan10',
+          },
+          {
+            label: '10月达成',
+            width: '100px',
+            prop: 'complete10',
+          },
+          {
+            label: '11月计划',
+            width: '100px',
+            prop: 'plan11',
+          },
+          {
+            label: '11月达成',
+            prop: 'complete11',
+            width: '140px',
+          },
+          {
+            label: '12月计划',
+            width: '100px',
+            prop: 'plan12',
+          },
+          {
+            label: '12月达成',
+            prop: 'complete12',
+            width: '140px',
+          },
+          {
+            label: '年度计划',
+            prop: 'yearPlan',
+            width: '140px',
+          },
+          {
+            label: '年度达成',
+            prop: 'yearComplete',
+            width: '140px',
+          },
+          {
+            label: '年度完成率',
+            prop: 'yearCompleteRatio',
+            width: '140px',
+          },
+        ],
+        fileList: [],
+        fileSettings: {
+          // 文件配置信息
+          fileSize: 52428800,
+          fileTypes: '.xlsx',
+          pictureSize: 52428800,
+          types: '.xlsx',
+        },
+      }
+    },
+    watch: {
+      showColumns: function () {
+        this.$nextTick(() => this.$refs.table.doLayout())
+      },
+    },
+    activated() {
+      this.queryData()
+    },
+    mounted() {
+      this.queryData()
+    },
+    methods: {
+      async queryData() {
+        this.listLoading = true
+        const params = { ...this.queryForm }
+        const [err, res] = await to(targetApi.getSaleTargetList(params))
+        if (err) return (this.listLoading = false)
+        this.list = res.data.list || []
+        this.total = res.data.total
+        this.listLoading = false
+        this.$nextTick(() => this.$refs.table.doLayout())
+      },
+      reset() {
+        this.queryForm = {
+          pageNum: 1,
+          pageSize: 10,
+          year: '', // 年度
+          saleName: '', // 销售工程师
+        }
+        this.queryData()
+      },
+      handleSizeChange(val) {
+        this.queryForm.pageSize = val
+        this.queryData()
+      },
+      handleCurrentChange(val) {
+        this.queryForm.pageNum = val
+        this.queryData()
+      },
+      // 客户编辑
+      async handleEdit(row = null) {
+        row ? this.$refs.edit.init(row.id) : this.$refs.edit.init()
+      },
+      beforeUpload(file) {
+        let flag1 = file.size < this.fileSettings.fileSize
+        if (!flag1) {
+          this.$message.warning('文件过大,请重新选择!')
+          return false
+        }
+        let flag2 = this.fileSettings.fileTypes.split(',').includes('.' + file.name.split('.').pop())
+        if (!flag2) {
+          this.$message.warning('文件类型不符合,请重新选择!')
+          return false
+        }
+        return true
+      },
+      // 上传
+      uploadRequest(option) {
+        let _this = this
+        let url = process.env.VUE_APP_UPLOAD_WEED
+        axios
+          .post(url)
+          .then((res) => {
+            if (res.data && res.data.fid && res.data.fid !== '') {
+              option.action = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}`
+              let fileUrl = `${process.env.VUE_APP_PROTOCOL}${res.data.publicUrl}/${res.data.fid}` // 资料存储url
+              asyncUploadFile(option).then(async () => {
+                const params = {
+                  excelUrl: fileUrl,
+                }
+                const [err, res] = await to(targetApi.importSaleTarget(params))
+                if (err) return
+                if (res.code == 200) {
+                  _this.$message({
+                    type: 'success',
+                    message: '操作成功',
+                  })
+                  this.queryData()
+                }
+              })
+            } else {
+              _this.$message({
+                type: 'warning',
+                message: '未上传成功!请刷新界面重新上传!',
+              })
+            }
+          })
+          .catch(function () {
+            _this.$message({
+              type: 'warning',
+              message: '未上传成功!请重新上传!',
+            })
+          })
+      },
+    },
+  }
+</script>
+
+<style lang="scss" scoped>
+  $base: '.contract-container';
+</style>