Bläddra i källkod

feat: 折扣率计算逻辑优化

cuiyalong 3 månader sedan
förälder
incheckning
de875d88af

+ 2 - 2
src/store/order.js

@@ -13,7 +13,7 @@ import { checkRequired } from "@/views/create-order/hooks/checkRequired"
 import { getRandomString } from '@/utils/utils'
 import { cloneDeep } from "lodash"
 import { showMessage, showNotify } from '@/views/create-order/hooks/toast'
-import { add, div } from '@/utils/number'
+import { add, calcDiscountRate } from '@/utils/number'
 import { productKeyMap } from '@/views/create-order/data'
 
 class OrderProductCardItem {
@@ -225,7 +225,7 @@ export default {
       if (standard === 0) {
         rate = 0
       } else {
-        rate = `${(div(contract, standard) * 100).toFixed(2)}%`
+        rate = `${(calcDiscountRate(contract, standard))}%`
       }
       return {
         hasContract,

+ 9 - 2
src/utils/number/index.js

@@ -23,6 +23,13 @@ export function div(a, b) {
 }
 
 // 保留x位小时四舍五入
-export function roundToTwoDecimals(num, x) {
-  return new Decimal(num).toFixed(x, Decimal.ROUND_HALF_UP)
+export function roundToTwoDecimals(num, x = 2) {
+  const r = new Decimal(num).toFixed(x, Decimal.ROUND_HALF_UP)
+  return new Decimal(r).toNumber()
+}
+
+// 折扣率计算
+export function calcDiscountRate(n, d, x = 2) {
+  const rateT = div(n, d) * 100
+  return roundToTwoDecimals(rateT, x)
 }

+ 5 - 0
src/utils/utils.js

@@ -27,3 +27,8 @@ export const getRandomString = (len) => {
   }
   return randomString
 }
+
+// 数组取交集
+export function getIntersection(arr1, arr2) {
+  return arr1.filter(value => arr2.includes(value))
+}

+ 3 - 2
src/views/create-order/components/product-info-submodule/ContractAmount.vue

@@ -27,6 +27,7 @@
 <script>
 import NumberInput from '@/views/create-order/ui/NumberInput.vue'
 import { currencyFormat } from '@/utils/str'
+import { calcDiscountRate } from '@/utils/number'
 
 export default {
   name: 'ContractAmount',
@@ -54,8 +55,8 @@ export default {
   },
   computed: {
     discountRate() {
-      if (this.contractMoney >= 0 && this.standardMoney) {
-        return `${(this.contractMoney / this.standardMoney * 100).toFixed(2)}%`
+      if (this.contractMoney && this.standardMoney) {
+        return `${(calcDiscountRate(this.contractMoney, this.standardMoney))}%`
       } else {
         return '-'
       }

+ 8 - 1
src/views/create-order/components/productInfoModule.vue

@@ -59,6 +59,7 @@ import { currencyFormat } from '@/utils/str'
 import RadioGroup from '@/views/create-order/components/product-info-submodule/RadioGroup'
 import { mapState, mapGetters } from 'vuex'
 import { pageFormState } from '@/views/create-order/mixins'
+import { showMessage } from '@/views/create-order/hooks/toast'
 
 export default {
   name: 'ProductInfoModule',
@@ -129,7 +130,13 @@ export default {
       const card = this.$refs.productionInfoCardList
     },
     onChannelCommissionChange(e) {
-      this.setPageFormData('channelCommission', e)
+      const cTotal = this.pageTotalMoney.contract
+      if (e > cTotal) {
+        showMessage('渠道佣金不可大于合同金额总计')
+        this.setPageFormData('channelCommission', '')
+      } else {
+        this.setPageFormData('channelCommission', e)
+      }
     },
   }
 }

+ 7 - 6
src/views/create-order/components/schema-form/params/base.js

@@ -19,13 +19,14 @@ export class Parameters {
     if (!params.product_code) {
       return console.warn(`${NOTICE_TEXT.price}product_code`)
     }
-    if (!params.filter?.buy_cycle) {
-      return console.warn(`${NOTICE_TEXT.price}buy_cycle`)
+    if (params.service_type !== 3) {
+      if (!params.filter?.buy_cycle) {
+        return console.warn(`${NOTICE_TEXT.price}buy_cycle`)
+      }
+      if (!params.filter?.buy_type) {
+        return console.warn(`${NOTICE_TEXT.price}buy_type`)
+      }
     }
-    if (!params.filter?.buy_type) {
-      return console.warn(`${NOTICE_TEXT.price}buy_type`)
-    }
-  
     return params
   }
 

+ 5 - 2
src/views/create-order/components/schema-form/params/bigmember.js

@@ -38,13 +38,16 @@ export class BigMemberParamsGroup extends Parameters {
     const filter = {
       ...commonFilter,
       comboId,
-      serviceIds: productForm.serviceList,
+      serviceIds: productForm.serviceList,  // 当前所有选择的id
       // 大会员个人版也可开通子账号,getCommonFilterParams中个人版没有加上的,此处要加上
       buyAccountCount: productForm.subAccountNumbers?.payCount,
       giftAccountCount: productForm.subAccountNumbers?.freeCount
     }
 
-    // filter.SupServiceIds = productForm.SupServiceIds
+    const relateOrdersServiceList = productForm.selectedRelatedOrder?.serviceList
+    if (Array.isArray(relateOrdersServiceList)) {
+      filter.supServiceIds = filter.serviceIds.filter(item => !relateOrdersServiceList.includes(item)) // 对比以前的,新增的id
+    }
 
     p.filter = filter
 

+ 1 - 1
src/views/create-order/components/schema-form/products/common.js

@@ -207,7 +207,7 @@ export function createUpgradeContentSchema(state) {
   const options = upgradeContentOptions
   const validateArr = options.filter(r => !r.hide)
   const key = schemaKeyMap.upgradeContent
-  const defaultValue = state[key] || []
+  const defaultValue = state[key] || [1]
 
   return createSchemaItem({
     label: '升级内容',

+ 28 - 7
src/views/create-order/components/schema-form/schema-form.vue

@@ -19,6 +19,7 @@ import { mapState, mapMutations } from 'vuex'
 import { schemaKeyMap, productKeyMap, productGroupKeyMap, productTypeMap } from '@/views/create-order/data'
 import { cloneDeep, debounce } from 'lodash'
 import { deepEqual } from '@/utils/object'
+import { getIntersection } from '@/utils/utils'
 
 const dhy001 = 'dyh001'
 
@@ -137,7 +138,7 @@ export default {
     },
     // 数组求交集
     getIntersection(arr1, arr2) {
-      return arr1.filter(value => arr2.includes(value))
+      return getIntersection(arr1, arr2)
     },
     onInput(e) {
       this.emitInput(e)
@@ -479,18 +480,23 @@ export default {
         if (p.selected[0]) {
           const t = p.selected[0]
           this.selectedRelatedOrder = t
+          this.syncSelectedRelateOrder(this.selectedRelatedOrder)
           // 更新serviceList(续费升级需要回传)
           if (Array.isArray(t.serviceList)) {
             Object.assign(refreshObj, { serviceList: [...new Set(t.serviceList)] })
           }
         } else {
           this.selectedRelatedOrder = {}
+          this.syncSelectedRelateOrder(this.selectedRelatedOrder)
         }
         // 自动选择完成后,需要触发一次更新
         this.refreshValue(refreshObj)
         this.triggerRefreshSchema()
       })
     },
+    syncSelectedRelateOrder(s) {
+      this.refreshValue({ selectedRelatedOrder: s })
+    },
     // common: 升级内容
     commonChangeUpgradeContentSchema(value = this.value || {}) {
       const { buySubject } = this.pageForm
@@ -509,9 +515,9 @@ export default {
           uc.props.options = uc.props.options.filter(c => !c.subCount)
         }
 
-        if (uc.props.options.length === 1) {
-          this.refreshValue({ [schemaKeyMap.upgradeContent]: [uc.props.options[0].value] })
-        }
+        // if (uc.props.options.length === 1) {
+        //   this.refreshValue({ [schemaKeyMap.upgradeContent]: [uc.props.options[0].value] })
+        // }
       }
     },
     // 账号数量、主账号/子账号数量
@@ -531,7 +537,7 @@ export default {
       }
 
       // 1.子账号展示:满足以下任意条件即展示:
-      const hasAddSubAccount = true // 是否勾选了增购子账号
+      const hasAddSubAccount = Array.isArray(value.upgradeContent) && value.upgradeContent.includes(2) // 是否勾选了增购子账号
       // (1)产品属性为“会员服务”且购买主体为“企业”且付费类型不是升级;
       const entNotUpgrade = this.utilCheckIsVipService() && buySubject === 2 && payment !== 3
       // (2)产品属性为“会员服务”且购买主体为“企业”且付费类型是升级且升级内容有“增购子账号”;
@@ -544,6 +550,7 @@ export default {
       const show = entNotUpgrade || entUpgradeAddSubAccount || bigNotUpgrade || bigNotUpgradeAddSubAccount
       main.show = show
       sub.show = show
+      sub.label = '子账号数量'
       
       // 2.账号展示规则
       // (1)主账号默认为1个;
@@ -553,7 +560,8 @@ export default {
       // 特殊情况说明如下:付费类型为续费,则反显关联订单付费和赠送账号数量,不支持修改,历史数据0元订单,默认为赠送,非0元订单,都默认为付费。
 
       // 计算主账号1个+子账号+赠送账号的和
-      const mainAccountCount = 1
+      // 升级-增购子账号则不计算主账号
+      const mainAccountCount = payment === 3 ? 0 : 1
       let allTotal = 0
       allTotal += mainAccountCount
       if (subAccountNumbers) {
@@ -570,11 +578,16 @@ export default {
           Object.assign(refreshObj, { subAccountNumbers })
           // 禁用
         }
+        sub.required = false
         this.$set(sub.props, 'disabled', true)
       } else if (payment === 3) {
         // 升级
-
+        main.show = false
+        sub.required = true
+        sub.label = '账号数量'
+        this.$set(sub.props, 'disabled', false)
       } else {
+        sub.required = false
         this.$set(sub.props, 'disabled', false)
       }
       this.refreshValue(refreshObj)
@@ -911,6 +924,14 @@ export default {
         // 销售策略变更,清空有效周期(通用规则)
         this.refreshValue({ validityPeriod: {} })
       }
+      if (changedArr.includes('saleGifts') || changedArr.includes(schemaKeyMap.specification)) {
+        // 付费类型变更,如果有主账号数量,则清空
+        if (this.value.subAccountNumbers) {
+          const subAccountNumbers = { payCount: '', freeCount: '' }
+          this.refreshValue({ subAccountNumbers })
+        }
+      }
+
       console.log('以下字段变更了:', changedArr)
     },
     checkNeedRefreshPrice(changedArr) {