瀏覽代碼

feat: 完善按钮功能

zhangyuhan 3 月之前
父節點
當前提交
ac4ff7d53b

+ 1 - 1
src/views/create-order/components/newSetOrderInfo.vue

@@ -293,7 +293,7 @@ export default {
     },
     checkInvoiceQuery (codes) {
       return new Promise((resolve) => {
-        this.$jyRequest('/jyOrderManager/order/invoiceQuery').data({ orderCodes: codes }).success((res) => {
+        this.$jyRequest('/jyOrderManager/order/invoiceQuery').data({ orderCode: codes }).success((res) => {
           resolve(res)
         }).error((err) => {
           resolve(err)

+ 2 - 2
src/views/create-order/components/order-detail-submodule/ContractInfo.vue

@@ -139,7 +139,7 @@ export default {
 
 <style lang="scss" scoped>
 .contract-info {
-  background: #F2F2F4;
+  background: #f5f7f9;
   ::v-deep {
     .info-card {
       margin-bottom: 16px;
@@ -150,7 +150,7 @@ export default {
   display: flex;
   justify-content: space-between;
   align-items: center;
-  .edit-btn { 
+  .edit-btn {
     padding: 4px 31px;
     background: $color_main;
     color: $white;

+ 98 - 16
src/views/create-order/components/order-detail-submodule/OrderActions.vue

@@ -15,7 +15,7 @@
         </div>
       </div>
       <!--  管理后台功能   -->
-      <div class="order-action-item" v-if="isAdminPage">
+      <div class="order-action-item" v-if="isAdminPage && checkActionPower['协议归档']">
         <div class="order-action-text" @click="doAction('协议归档')">协议归档</div>
       </div>
       <div class="order-action-item" v-if="isAdminPage && newActionList.length > 0">
@@ -42,6 +42,11 @@
         <div class="order-action-text" @click="doAction('权限开通')">权限开通</div>
       </div>
     </div>
+    <div>
+      <br>
+      <div>-- 按钮权限相关测试 --</div>
+      {{ checkActionPower }}
+    </div>
     <el-dialog
         class="edit-dialog"
         title="编辑订单"
@@ -267,7 +272,8 @@ export default {
 
       checkActionPower () {
         return {
-          '权限开通': true || this.checkActionPowerUse('权限开通')
+          '协议归档': this.checkActionPowerUse('协议归档').canShow,
+          '权限开通': true || this.checkActionPowerUse('权限开通').canShow,
         }
       },
     showDetailModel() {
@@ -496,11 +502,41 @@ export default {
           break 
         }
         case '回款': {
-          this.$refs.batchModel.asdShow = true
+          const errorTip = ['原因:']
+
+          if (this.orderDetail.orderData?.audit_status !== 3) {
+            errorTip.push(errorTip.length + '.订单审核状态不是"已通过"')
+          }
+          if (this.orderDetail.returnRes?.remainingMoney == 0) {
+            errorTip.push(errorTip.length + '.已全额回款"')
+          }
+
+          if (errorTip.length > 1) {
+            this.$alert(errorTip.join('<br>'), '不支持新增回款', {
+              confirmButtonText: '我知道了',
+              dangerouslyUseHTMLString: true
+            })
+          } else {
+            this.$refs.batchModel.asdShow = true
+          }
           break
         }
         case '退款': {
-          this.$refs.backRef.tShow = true
+          const errorTip = ['原因:']
+
+          if (this.orderDetail.returnRes?.returnMoney - this.orderDetail.refundRes?.refundMoney <= 0) {
+            errorTip.push('尚未回款或已回款金额已全额退款"')
+          }
+
+          if (errorTip.length > 1) {
+            this.$alert(errorTip.join('<br>'), '不支持新增退款', {
+              confirmButtonText: '我知道了',
+              dangerouslyUseHTMLString: true
+            })
+          } else {
+            this.$refs.backRef.tShow = true
+          }
+
           break
         }
         case '业绩变更': {
@@ -508,21 +544,65 @@ export default {
           break
         }
         case '红冲': {
-          this.$refs.backRef.correctionShow = true
-          if (this.orDetails.product_type === '大会员') {
-            this.$refs.backRef.bigCorrection = true
+          const errorTip = ['原因:']
+
+          if (this.orderDetail.orderData?.order_status !== 1) {
+            errorTip.push('订单状态非"已完成"')
           }
+
+          if (errorTip.length > 1) {
+            this.$alert(errorTip.join('<br>'), '不支持红冲', {
+              confirmButtonText: '我知道了',
+              dangerouslyUseHTMLString: true
+            })
+          } else {
+            this.$refs.backRef.correctionShow = true
+            if (this.orDetails.product_type === '大会员') {
+              this.$refs.backRef.bigCorrection = true
+            }
+          }
+
           break
         }
         case '盖章': {
-          this.$refs.sealDialogRef.show({
-            res: this.orderDetail.orderData,
-            saleDataRes: this.orderDetail.saleDataRes
-          })
+          const errorTip = ['原因:']
+          if (this.orderDetail.orderData?.order_status === -2) {
+            errorTip.push(errorTip.length + '.订单状态为"已取消"')
+          }
+          if (this.orderDetail.orderData?.audit_status !== 3) {
+            errorTip.push(errorTip.length + '.订单审核状态不是"已通过"')
+          }
+
+          if (errorTip.length > 1) {
+            this.$alert(errorTip.join('<br>'), '不支持盖章', {
+              confirmButtonText: '我知道了',
+              dangerouslyUseHTMLString: true
+            })
+          } else {
+            this.$refs.sealDialogRef.show({
+              res: this.orderDetail.orderData,
+              saleDataRes: this.orderDetail.saleDataRes
+            })
+          }
           break
         }
         case '协议归档': {
-          this.$refs.backRef.pShow = true
+          const errorTip = ['原因:']
+          if (this.orderDetail.orderData?.order_status === -2) {
+            errorTip.push(errorTip.length + '.订单状态为"已取消"')
+          }
+          if (this.orderDetail.orderData?.audit_status !== 3) {
+            errorTip.push(errorTip.length + '.订单审核状态不是"已通过"')
+          }
+
+          if (errorTip.length > 1) {
+            this.$alert(errorTip.join('<br>'), '不支持协议归档', {
+              confirmButtonText: '我知道了',
+              dangerouslyUseHTMLString: true
+            })
+          } else {
+            this.$refs.backRef.pShow = true
+          }
           break
         }
         case '线下开发票': {
@@ -545,7 +625,7 @@ export default {
     },
     checkActionPowerUse (type) {
       const result = {
-        canUse: true
+        canShow: true
       }
       console.log('checkActionPower', type)
       switch (type) {
@@ -576,7 +656,8 @@ export default {
           break
         }
         case '协议归档': {
-          this.$refs.backRef.pShow = true
+          // 1.展示:该笔订单协议归档状态为“未归档”且“协议状态”为“签协议”才展示,否则不展示。
+          result.canShow = this.orderDetail.contractRes?.contract_status === 1 && this.orderDetail.contractRes?.contract_archive_status !== 1
           break
         }
         case '线下开发票': {
@@ -592,10 +673,10 @@ export default {
           break
         }
         case '权限开通': {
-          result.canUse = this.orderDetail?.return_status == '1'
+          result.canShow = this.orderDetail?.return_status == '1'
         }
       }
-      return result.canUse
+      return result
     }
   }
 }
@@ -620,6 +701,7 @@ export default {
     border-radius: 4px;
     cursor: pointer;
     background-color: #fff;
+    &:hover,
     &-active {
       border: 1px solid #2ABED1;
       color: #2ABED1;

+ 62 - 18
src/views/create-order/components/performanceBelongs.vue

@@ -10,11 +10,11 @@
         :options="salesDepList"
         placeholder="请选择销售人员">
       </SelectTree>
-      <div class="sale-person-list-container" v-if="salePerson.length > 1">
+      <div class="sale-person-list-container" v-if="showTable || salePerson.length > 1">
         <el-table
           :data="salePersonTableList"
           :summary-method="getSummaries"
-          show-summary
+          :show-summary="showSummary"
           stripe
           border>
           <el-table-column
@@ -23,6 +23,16 @@
             align="center"
             label="销售人员">
           </el-table-column>
+          <el-table-column
+              v-if="showDep"
+              prop="id"
+              header-align="center"
+              align="center"
+              label="业绩归属部门">
+            <template slot-scope="scope">
+              {{ findUserDepName(scope.row.id) }}
+            </template>
+          </el-table-column>
           <el-table-column
             prop="money"
             header-align="center"
@@ -32,7 +42,7 @@
               <number-input
                 :value="salePersonTableList[scope.$index].money"
                 @input="onSalePersonSplitMoneyChange(scope, $event)"
-                :disabled="scope.$index === getLastEditLineIndex()"
+                :disabled="getSaleMoneyDisabled(scope)"
                 type="number"
                 :decimal="2"
                 placeholder="请输入"
@@ -59,7 +69,7 @@
         </el-table>
       </div>
     </el-form-item>
-    <el-form-item class="performance-belongs-line" label="销售渠道" v-if="onlyOneSale" :required="required.saleWay && onlyOneSale">
+    <el-form-item class="performance-belongs-line" label="销售渠道" v-if="showSelectWay && onlyOneSale" :required="required.saleWay && onlyOneSale">
       <el-cascader
         :value="saleWay"
         @input="updateSyncData('saleWay', $event)"
@@ -79,6 +89,7 @@ import { mapState, mapGetters } from 'vuex'
 import { SalePersonTableRow } from '@/views/create-order/data/interface'
 import { add, sub } from '@/utils/number'
 import { cloneDeep } from 'lodash'
+import { findUserInDeptTree, calcChannelSelectorList } from "@/views/create-order/hooks/utils"
 
 export default {
   name: 'PerformanceBelongs',
@@ -91,6 +102,26 @@ export default {
       type: Boolean,
       default: false
     },
+    skipCheckTotal: {
+      type: Boolean,
+      default: false
+    },
+    showSelectWay: {
+      type: Boolean,
+      default: true
+    },
+    showTable: {
+      type: Boolean,
+      default: false
+    },
+    showSummary: {
+      type: Boolean,
+      default: true
+    },
+    showDep: {
+      type: Boolean,
+      default: false
+    },
     salesMoneyTotal: {
       required: true,
       type: [String, Number],
@@ -202,6 +233,9 @@ export default {
     }
   },
   methods: {
+    findUserDepName (id) {
+      return findUserInDeptTree((v) => v.id === id)?.parentLabel || ''
+    },
     updateSyncData(type, e) {
       this.$emit(`update:${type}`, e)
     },
@@ -260,7 +294,9 @@ export default {
       const selectDetailList = this.getSelectSalePersonDetailList(e)
       const arr = selectDetailList.map(item => {
         const saleWayKey = this.getDefaultSaleWayKey(item) || ''
-        return new SalePersonTableRow(item.label, item.value, '', saleWayKey)
+        // 保留历史数据
+        const oldItem = this.salePersonTableList.find(v => v.name == item.name) || {}
+        return new SalePersonTableRow(item.label, item.value, oldItem?.money || '', oldItem?.saleWay || saleWayKey)
       })
       this.updateSyncData('salePersonTableList', arr)
     },
@@ -351,7 +387,7 @@ export default {
           eNum = add(eNum, Number(money))
         }
       })
-      
+
       // const lastMoney = this.salesMoneyTotalNum - eNum
       // 高精度计算
       const lastMoney = sub(this.salesMoneyTotalNum ,eNum)
@@ -361,6 +397,12 @@ export default {
     getLastEditLineIndex() {
       return this.salePersonTableList.length - 1
     },
+    getSaleMoneyDisabled (scope) {
+      if (this.showSummary) {
+        return scope.$index === this.getLastEditLineIndex()
+      }
+      return false
+    },
     onSalePersonSplitMoneyChange(scope, e) {
       const index = scope.$index
       this.onChangeTableLineData('money', index, e)
@@ -379,20 +421,22 @@ export default {
         })
       }
 
-      let lastMoney = this.calcLastColumnMoney(index, e)
-      // 1.2 限制当前格子的金额
-      if (lastMoney < 0) {
-        this.$message({
-          message: '合计值需小于应收金额',
-          type: 'warning'
+      if (!this.skipCheckTotal) {
+        let lastMoney = this.calcLastColumnMoney(index, e)
+        // 1.2 限制当前格子的金额
+        if (lastMoney < 0) {
+          this.$message({
+            message: '合计值需小于应收金额',
+            type: 'warning'
+          })
+          this.onChangeTableLineData('money', index, '')
+          lastMoney = this.calcLastColumnMoney(index, 0)
+        }
+        // 同一个函数内只执行一行的更新,否则会造成数据丢失
+        this.$nextTick(() => {
+          this.onChangeTableLineData('money', this.getLastEditLineIndex(), lastMoney)
         })
-        this.onChangeTableLineData('money', index, '')
-        lastMoney = this.calcLastColumnMoney(index, 0)
       }
-      // 同一个函数内只执行一行的更新,否则会造成数据丢失
-      this.$nextTick(() => {
-        this.onChangeTableLineData('money', this.getLastEditLineIndex(), lastMoney)
-      })
     },
     onChangeTableLineData(key, index, e) {
       this.updatePageFormArrayObjectValue({

+ 83 - 79
src/views/order/components/new-detailModel.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="detail-model">
+  <div class="detail-model new-d-model">
     <!-- 线下开发票 -->
     <Modal title="线下开发票" v-model="iShow" class-name="order-model piao-model" :mask-closable="false"
       @on-visible-change="visibleChange">
@@ -79,9 +79,22 @@
     <!-- 上传归档协议 -->
     <Modal title="上传归档协议" v-model="pShow" class-name="order-model contract-model" :mask-closable="false"
       @on-visible-change="visibleChange">
-      <b-upload ref="uploadRef2" @fileData="contractFile" :placeholdered="'请上传归档协议'"
-        :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
-        :formated="['doc', 'pdf', 'docx', 'rar', 'zip', 'jpg', 'png', 'jpeg']" :multipled="false"></b-upload>
+      <Form :label-width="110">
+        <FormItem required label="归档时间">
+          <date-sigle ref="sigleRef5" :dateType="'date'" :placeholderd="'请选择归档时间'" @startDate="guiDate"
+                      :overTime="0"></date-sigle>
+        </FormItem>
+        <FormItem required label="归档份数">
+          <Input v-model.number="contract.contract_archive_num" type="tel" maxlength="4" @on-keyup="payHandler"
+                 placeholder="请输入归档份数"></Input>
+        </FormItem>
+        <FormItem  required label="归档协议">
+          <b-upload ref="uploadRef2" @fileData="contractFile" :placeholdered="'请上传归档协议'"
+                    :accepted="'.doc,.pdf,.docx,.rar,.zip,.jpg,.png,.jpeg'"
+                    :formated="['doc', 'pdf', 'docx', 'rar', 'zip', 'jpg', 'png', 'jpeg']" :multipled="false"></b-upload>
+        </FormItem>
+      </Form>
+
       <div slot="footer">
         <Button type="primary" size="large" @click="pingSub" :disabled="isDisable">提交</Button>
         <Button size="large" @click="pingCancel">取消</Button>
@@ -182,7 +195,7 @@
             :maxlength="11" placeholder="请输入手机号"></Input>
         </FormItem>
         <FormItem label="开始日期" style="width: 460px;" required>
-          <date-sigle ref="sigleRef1" :dateType="'date'" :placeholderd="'请选择开始日期'" @startDate="startDate_"
+          <date-sigle ref="sigleRef1" :dateType="'date'" :disabledDateCallback="permissionActivationOptions.disabledDate" :placeholderd="'请选择开始日期'" @startDate="startDate_"
             :overTime="0"></date-sigle>
         </FormItem>
       </Form>
@@ -196,38 +209,19 @@
       @on-visible-change="performanceVisible">
       <Form ref="performance" :model="performanceFrom" :label-width="120">
         <FormItem label="请输入变更后业绩归属情况" class="formTitle" :label-width="230"></FormItem>
-        <PerformanceBelongsModule ref="modulePerformanceBelong" setDefaultUser />
-        <FormItem label="销售人员">
-          <sale-select ref="saleRef" :saleType="'1'" @salePerson="salePerson" transfer></sale-select>
-        </FormItem>
-        <FormItem class="table-order1" v-show="saleTableData.length > 0">
-          <Table border :columns="saleTable" :data="saleTableData">
-            <template slot-scope="{ row }" slot="name">
-              <strong>{{ row.name }}</strong>
-            </template>
-            <template slot-scope="{ row }" slot="saler_dept">
-              <strong>{{ row.saler_dept }}</strong>
-            </template>
-            <template slot-scope="{ row, index }" slot="money">
-              <Input style="padding: 0 10px;" v-model="saleTableData[index].money" type="number" placeholder="请输入"></Input>
-            </template>
-            <template slot-scope="{ row }" slot="channel">
-              <span style="display:none;">{{ row.channel }}</span>
-              <!-- <Input v-model="saleTableData[index].channel" type="number" placeholder="请输入"></Input> -->
-<!--              <Cascader :data="channelListGetters" v-model="row.channel" @on-change="(value,selectedData)=>{ onChangeCascader(value,selectedData,row)}" transfer />-->
-              <!-- <v-cascader ref="casRef" :data-id="row.channel" :initVal="row.channel" placeholderType="销售渠道" type="1" quType="1" transfer></v-cascader> -->
-              <el-cascader
-                  v-model="row.distribution_channel"
-                  :options="saleChannelOptions"
-                  :props="cascaderProps"
-                  @change="onChangeCascader(row, $event)"
-                  size="medium"
-                  placeholder="请选择销售渠道"
-                  clearable>
-              </el-cascader>
-            </template>
-          </Table>
-        </FormItem>
+        <performanceBelongs
+            :salePerson.sync="pageForm.salePerson"
+            :saleWay.sync="pageForm.saleWay"
+            :salePersonTableList.sync="pageForm.salePersonTableList"
+            :salesMoneyTotal="0"
+            :hasContract="true"
+            :setDefaultUser="true"
+            :showDep="true"
+            :showTable="true"
+            :showSummary="false"
+            :showSelectWay="false"
+            :skipCheckTotal="true"
+        />
         <FormItem label="变更原因">
           <RadioGroup v-model="performanceFrom.changeReason">
             <Radio :label="item" v-for="item in reasonList" :key="item">{{item}}</Radio>
@@ -288,17 +282,17 @@ import { copyImage } from '@/utils/copy'
 import vCascader from '@/components/cascader'
 import { getChannelCode, formatPrice, debounce } from '@/utils/globalFun'
 import QRCode from 'qrcode'
-import PerformanceBelongsModule from "@/views/create-order/components/performanceBelongsModule.vue";
+import PerformanceBelongs from "@/views/create-order/components/performanceBelongs.vue";
+import { calcSaleTableList } from "@/views/create-order/hooks/utils"
 export default {
+  name: 'new-d-model',
   props: {
     data: {}
   },
   components: {
-    PerformanceBelongsModule,
+    PerformanceBelongs,
     dateSigle,
     bUpload,
-    saleSelect,
-    vCascader
   },
   methods: {
     dateFormatter, formatPrice,
@@ -376,44 +370,22 @@ export default {
       }).post()
     },
     performanceVisible(val) {
+      this.performanceFrom.changeReason = ''
+      this.pageForm.salePerson = []
+      this.pageForm.salePersonTableList = []
+
       if (val) {
         const { saleDataRes } = JSON.parse(JSON.stringify(this.data))
-        let list =[]
-        if (saleDataRes.saleFinal) {
-          list = saleDataRes.saleFinal.list || []
-          let sarr = list.map(ele => {
-            return ele.id + ''
-          })
-          this.$nextTick(()=>{
-            this.$refs.saleRef.salePerson = sarr
-            setTimeout(() => {
-            if (saleDataRes.saleFinal  && saleDataRes.saleFinal.list.length > 0) {
-            let salelist = JSON.parse(JSON.stringify(saleDataRes.saleFinal.list))
-            salelist.forEach(ele => {
-              ele.channel = getChannelCode(this.channelListGetters, ele.distribution_channel)
-              ele.money = ele.money / 100
-            })
-            this.saleTableData = salelist
-            let ajaxinitSalelist = JSON.parse(JSON.stringify(saleDataRes.saleFinal.list))
-             ajaxinitSalelist.forEach(ele => {
-             ele.money = ele.money / 100
-            //  ele.channel = ele.distribution_channel
-            })
-            this.ajaxinitSalelist = ajaxinitSalelist
-          }
-          }, 500)
-          })
-           this.reasonList = saleDataRes.reason
-        }
-      }else{
-        this.performanceFrom.changeReason = ''
-        this.saleTableData = []
-        this.$refs.saleRef.salePerson = []
+
+        this.reasonList = saleDataRes.reason
+        const result = calcSaleTableList(saleDataRes?.saleFinal?.list || [])
+        this.pageForm.salePerson = result.salePerson.filter(v => v) || []
+        this.pageForm.salePersonTableList = result.salePersonTableList || []
       }
     },
       performanceSave() {
-        let salesMoneylist = this.saleTableData.map(ele => {
-          const channel = ele.channel[1]? ele.channel[1] : ''
+        let salesMoneylist = this.pageForm.salePersonTableList.map(ele => {
+          const channel = ele.saleWay[1]? ele.saleWay[1] : ''
           return { id: Number(ele.id), money: this.fixedNum(ele.money), channel: channel }
         })
         this.performanceDis = true
@@ -505,6 +477,12 @@ export default {
       contractFile(val) {
         this.contract.contractFileUrl = val
       },
+      guiDate(val) {
+        this.contract.contract_archive_time = val
+      },
+      payHandler() {
+        this.contract.contract_archive_num = Number(String(this.contract.contract_archive_num).replace(/[^\d]+/g, ''))
+      },
       startDate(val) {
         this.returned.returnTime = val
       },
@@ -560,10 +538,12 @@ export default {
           return
         }
         this.isDisable = true
-        this.$request('/order/uploadContractFile').data({
-          contractId: $.isEmptyObject(this.contractData) == false ? this.contractData.id : '',
+        this.$jyRequest('/jyOrderManager/order/uploadContractFile').data({
+          contractId: $.isEmptyObject(this.contractData) == false ? this.contractData.id : -1,
           orderCode: this.orderDetail.order_code,
-          contractFileUrl: this.contract.contractFileUrl
+          contractFileUrl: this.contract.contractFileUrl,
+          contract_archive_time: this.contract.contract_archive_time,
+          contract_archive_num: this.contract.contract_archive_num,
         }).showSuccessTip().success(() => {
           this.pShow = false
           this.inited()
@@ -788,6 +768,13 @@ export default {
     },
     data() {
       return {
+        // 业绩归属
+        pageForm: {
+          salePerson: [],
+          saleWay: [],
+          salePersonTableList: [],
+        },
+        //
         paymentCodeShow: false,
         btnloading: false,
         pa_dis: false,
@@ -812,7 +799,9 @@ export default {
           { v: '3', n: '专用发票(纸质发票)' }
         ],
         contract: {
-          contractFileUrl: ''
+          contractFileUrl: '',
+          contract_archive_num: '',
+          contract_archive_time: ''
         },
         funds: {
           sum: '',
@@ -823,6 +812,11 @@ export default {
           startTime: '',
           orderCode: ''
         },
+        permissionActivationOptions: {
+          disabledDate (date) {
+            return date && date.valueOf() < Date.now() - 86400000;
+          }
+        },
         saleTable: [
           {
             title: '销售人员',
@@ -974,7 +968,7 @@ export default {
         return this.data.orderData
       },
       contractData () {
-        return this.data.contractData
+        return this.data.contractRes
       },
       returnRes () {
         return this.data.returnRes
@@ -1099,4 +1093,14 @@ export default {
     text-align: center;
   }
 }
+.new-d-model {
+  .performance-belongs-line {
+    .el-form-item__label {
+      width: 120px;
+    }
+    .el-form-item__content {
+      margin-left: 120px;
+    }
+  }
+}
 </style>