Ver código fonte

feat: 优化创建订单页面逻辑

cuiyalong 3 meses atrás
pai
commit
41e0947b9a

+ 32 - 1
src/store/order.js

@@ -18,6 +18,7 @@ import { showMessage, showNotify } from '@/views/create-order/hooks/toast'
 import { add, sub, calcDiscountRate } from '@/utils/number'
 import { productKeyMap } from '@/views/create-order/data'
 import { defaultPageFormValue, OrderProductCardItem } from '@/views/create-order/data/interface'
+import { findUserInDeptTree } from "@/views/create-order/hooks/utils"
 
 const defaultOrderInfo = {
   disabled: false, // 禁用
@@ -53,6 +54,9 @@ export default {
     orderInfo: cloneDeep(defaultOrderInfo),
   },
   getters: {
+    currentUserInfo(state) {
+      return findUserInDeptTree(u => u.id === state.conf.currentUserEntId)
+    },
     requestLoading(state) {
       const loading = state.loading
       let s = false
@@ -149,10 +153,18 @@ export default {
         }
       })
 
+      // 标准售价只要有一个<0(无法计算标注售价,就置为-1)
+      const standardMoneyArr = getters.userProductInfoList.map(u => Number(u.contractAmount?.standardMoney) < 0)
+      if (standardMoneyArr.includes(true)) {
+        standard = -1
+      }
+
       if (standard === 0) {
         rate = 0
-      } else {
+      } else if (standard > 0) {
         rate = `${(calcDiscountRate(contract, standard))}%`
+      } else {
+        rate = -1
       }
       return {
         hasContract,
@@ -434,10 +446,29 @@ export default {
     async restorePageInfo({ commit, dispatch }, order) {
       const { pageFormValue, productArr } = sortOrderInfo(order)
       await dispatch('resetPageInfo')
+      // 延迟更新列表
+      const delayRestoreList = [
+        'paymentAccountName',
+        'paybackTableData',
+        'paybackTimes',
+        'salePerson',
+        'salePersonTableList',
+        'saleWay',
+      ]
+      
       if (pageFormValue) {
         for (const key in pageFormValue) {
+          if (delayRestoreList.includes(key)) {
+            continue
+          }
           commit('setPageForm', { key, data: pageFormValue[key] })
         }
+
+        setTimeout(() => {
+          delayRestoreList.forEach(key => {
+            commit('setPageForm', { key, data: pageFormValue[key] })
+          })
+        }, 10)
       }
       if (Array.isArray(productArr) && productArr.length > 0) {
         commit('setOrderProductInfoList', productArr)

+ 17 - 1
src/views/create-order/components/ProductInfoCard.vue

@@ -4,7 +4,7 @@
       <el-row :gutter="2">
         <el-col :span="24">
           <ProductTypeSelector
-            :productTypeOptions="productTypeOptions"
+            :productTypeOptions="productTypeOptions2"
             :showErrorTip="showErrorTip"
             :value="productTypeResult"
             :loading="loading"
@@ -37,6 +37,7 @@
 import ProductTypeSelector from './product-info-submodule/ProductTypeSelector.vue'
 import ProductSchemaForm from './schema-form/schema-form.vue'
 import { mapState } from 'vuex'
+import { cloneDeep } from 'lodash'
 
 export default {
   name: 'ProductInfoCard',
@@ -75,6 +76,21 @@ export default {
       productInfoList: state => state.order.orderInfo.productInfoList,
       pageForm: state => state.order.pageForm,
     }),
+    productTypeOptions2() {
+      if (this.index <= 0) {
+        // 过滤:产品1(索引是0的产品)隐藏那些只能赠送的选项
+        const productList = cloneDeep(this.productTypeOptions)
+        productList.forEach(p1 => {
+          if (Array.isArray(p1.children) && p1.children.length > 0) {
+            // 排除仅赠送的
+            p1.children = p1.children.filter(p2 => p2.tactics !== 2)
+          }
+        })
+        return productList.filter(t => t.children.length > 0)
+      } else {
+        return this.productTypeOptions
+      }
+    },
     productInfoListItem() {
       return this.productInfoList[this.index]?.productCardInfo || {}
     },

+ 1 - 3
src/views/create-order/components/otherInfoModule.vue

@@ -110,9 +110,7 @@ export default {
   },
   watch: {
     companyName(n) {
-      if (n === this.pageForm.paymentAccountName) {
-        this.setPageFormData('paymentAccountName', n)
-      }
+      this.setPageFormData('paymentAccountName', n)
     },
   },
   methods: {

+ 3 - 1
src/views/create-order/components/paymentPlanModule.vue

@@ -162,7 +162,9 @@ export default {
   },
   watch: {
     contractTime() {
-      this.onPaymentDeadlineChangeCallback()
+      if (this.pageForm.paymentDeadline) {
+        this.onPaymentDeadlineChangeCallback()
+      }
     },
     buySubject() {
       this.reset()

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

@@ -140,7 +140,7 @@ export default {
   .no-amount-money {
     font-size: 14px;
     line-height: 22px;
-    color: #F56500;
+    color: $red_light;
   }
 }
 </style>

+ 1 - 1
src/views/create-order/components/product-info-submodule/ElOnlineContractForm.vue

@@ -252,7 +252,7 @@ export default {
           }
           // 默认填写订单人的名字
           if (!this.e_contract_userB_contacts_name) {
-            const defaultName = this.$store.getters.getAdminUser.username
+            const defaultName = this.$store.getters['order/currentUserInfo'].name
             this.inputChangeVal(defaultName, 'e_contract_userB_contacts_name')
           }
           if (this.buySubject == '2') {

+ 15 - 2
src/views/create-order/components/productInfoModule.vue

@@ -13,11 +13,21 @@
           </div>
           <div class="desc-detail-info-item form-item-container">
             <div class="desc-label form-item-label">标准售价合计:</div>
-            <div class="desc-value form-item-value">{{ formatMoney(pageTotalMoney.standard) }}</div>
+            <div class="desc-value form-item-value">
+              <span v-if="pageTotalMoney.standard < 0" class="color-light-orange">无法计算</span>
+              <template v-else>
+                {{ formatMoney(pageTotalMoney.standard) }}
+              </template>
+            </div>
           </div>
           <div class="desc-detail-info-item form-item-container">
             <div class="desc-label form-item-label">折扣率:</div>
-            <div class="desc-value form-item-value">{{ pageTotalMoney.rate }}</div>
+            <div class="desc-value form-item-value">
+              <span v-if="pageTotalMoney.rate < 0" class="color-light-orange">无法计算</span>
+              <template v-else>
+                {{ pageTotalMoney.rate }}
+              </template>
+            </div>
           </div>
         </div>
         <el-row :gutter="2">
@@ -164,6 +174,9 @@ export default {
     color: $gray_10;
   }
 }
+.color-light-orange {
+  color: $red_light;
+}
 .desc-detail-info-list,
 .desc-detail-info-item {
   display: flex;

+ 12 - 5
src/views/create-order/components/schema-form/params/base.js

@@ -20,11 +20,18 @@ export class Parameters {
       return console.warn(`${NOTICE_TEXT.price}product_code`)
     }
     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.tactics === 2) {
+        // 赠送
+        if (!params.filter?.give_cycle) {
+          return console.warn(`${NOTICE_TEXT.price}give_cycle`)
+        }
+      } else {
+        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`)
+        }
       }
     }
     return params

+ 0 - 5
src/views/create-order/components/schema-form/required/common.js

@@ -69,11 +69,6 @@ export function checkContractAmountRequired(pageForm, productForm) {
     msg: ''
   }
 
-  if (productForm.saleGifts === 2) {
-    // 赠送
-    return res
-  }
-
   if (productForm.contractAmount) {
     const m = productForm.contractAmount.contractMoney
     if (emptyValue(m)) {

+ 1 - 1
src/views/create-order/components/schema-form/resort/bigmember.js

@@ -21,7 +21,7 @@ export function sortBigMemberProductFrom(product) {
   if (product.filter) {
     const filter = getFilter(product)
     // 周期
-    const period = sortValidityPeriod(filter)
+    const period = sortValidityPeriod(filter, product)
     Object.assign(map, period)
 
     // 子账号数量

+ 2 - 2
src/views/create-order/components/schema-form/resort/common.js

@@ -80,7 +80,7 @@ export function sortSubAccountNumbers(filter = {}) {
   }
 }
 
-export function sortValidityPeriod(filter = {}) {
+export function sortValidityPeriod(filter = {}, product = {}) {
   // 时间类有效周期
   return {
     validityPeriod: {
@@ -88,7 +88,7 @@ export function sortValidityPeriod(filter = {}) {
       payUnit: filter.buy_type,
       freeCount: filter.give_cycle,
       freeUnit: filter.give_type,
-      paybackOpenServer: false,
+      paybackOpenServer: product.returned_open === 1,
     }
   }
 }

+ 2 - 1
src/views/create-order/components/schema-form/resort/index.js

@@ -12,6 +12,7 @@ import { sortSvipProductFrom } from './svip'
 import { sortDataCountPackProductFrom } from './data-count-pack'
 import { sortMarketingProductFrom } from './marketing'
 import { sortOneSpecProductFrom } from './one-spec'
+import { hasValue } from '@/utils/utils'
 
 
 function findItemInOptions(options, cb) {
@@ -51,7 +52,7 @@ export function sortOrderInfo(order = {}) {
   
   // 协议信息
   if (contractRes) {
-    pageFormValue.agreeStatus = contractRes.contract_status || defaultPageFormValue.agreeStatus
+    pageFormValue.agreeStatus = hasValue(contractRes.contract_status) ? contractRes.contract_status : defaultPageFormValue.agreeStatus
     pageFormValue.signCode = contractRes.contract_code || defaultPageFormValue.signCode // 协议编号
     if (contractRes.contract_time) {
       pageFormValue.signTime = dayjs(contractRes.contract_time).valueOf() // 协议签订时间

+ 1 - 1
src/views/create-order/components/schema-form/resort/one-spec.js

@@ -5,7 +5,7 @@ export function sortOneSpecProductFrom(product = {}) {
   if (product.filter) {
     const filter = getFilter(product)
     // 周期
-    const period = sortValidityPeriod(filter)
+    const period = sortValidityPeriod(filter, product)
     Object.assign(map, period)
   }
 

+ 1 - 1
src/views/create-order/components/schema-form/resort/svip.js

@@ -5,7 +5,7 @@ export function sortSvipProductFrom(product = {}) {
   if (product.filter) {
     const filter = getFilter(product)
     // 周期
-    const period = sortValidityPeriod(filter)
+    const period = sortValidityPeriod(filter, product)
     Object.assign(map, period)
   }
 

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

@@ -230,7 +230,7 @@ export default {
         await this.getUserPowerCheck(true)
         setTimeout(() => {
           this.tryToRestoreForm()
-        }, 200)
+        }, 300)
       } catch (error) {
         console.log(error)
       } finally {
@@ -632,6 +632,7 @@ export default {
       if (!m) {
         return console.error('没找到schema: ', 'validityPeriod')
       }
+      const canAutoOpen = this.utilCheckCanAutoOpen()
 
       // 2.产品属性为“会员服务”:
       if (this.utilCheckIsVipService()) {
@@ -650,7 +651,7 @@ export default {
           if (payment === 1 || payment === 4) {
             // 购买、试用
             // do something...
-            this.$set(m.props, 'showPaybackOpenServerDay', true)
+            this.$set(m.props, 'showPaybackOpenServerDay', canAutoOpen)
             this.$set(m.props, 'showButtonTip', false)
           } else if (payment === 2) {
             // 续费
@@ -670,7 +671,7 @@ export default {
           if (payment === 1 || payment === 4) {
             // 购买、试用
             // do something...
-            this.$set(m.props, 'showPaybackOpenServerDay', true)
+            this.$set(m.props, 'showPaybackOpenServerDay', canAutoOpen)
             this.$set(m.props, 'showButtonTip', false)
           } else if (payment === 2) {
             // 续费
@@ -687,7 +688,6 @@ export default {
         // 【产品属性为资源包】且【该产品类型支持系统自动开通权限】
         // 仅展示自动开通
         // m.show = false // 有自动开通权限【展示】
-        const canAutoOpen = this.utilCheckCanAutoOpen()
         this.$set(m.props, 'showPayInput', false)
         this.$set(m.props, 'showFreeInput', false)
         this.$set(m.props, 'showPaybackOpenServerDay', canAutoOpen)

+ 2 - 2
src/views/create-order/hooks/utils.js

@@ -59,7 +59,7 @@ export function calcSaleTableList(saleFinalList) {
       const saleInfo = saleFinalList[0]
       if (saleInfo) {
         // const userInfo = findUserInDeptTree(saleInfo.name)
-        const userInfo = findUserInDeptTree((u) => u.name === saleInfo.name)
+        const userInfo = findUserInDeptTree(u => u.name === saleInfo.name)
         if (userInfo && userInfo.id) {
           pageFormValue.salePerson = [userInfo.id]
         }
@@ -72,7 +72,7 @@ export function calcSaleTableList(saleFinalList) {
       const salePerson = []
       pageFormValue.salePersonTableList = saleFinalList.map(sale => {
         // const userInfo = findUserInDeptTree(sale.name)
-        const userInfo = findUserInDeptTree((u) => u.name === sale.name)
+        const userInfo = findUserInDeptTree(u => u.name === sale.name)
         const saleWay = calcChannelSelectorList(sale.distribution_channel)
         salePerson.push(userInfo?.id)
         return new SalePersonTableRow(sale.name, userInfo?.id, div(sale.money, 100), saleWay)

+ 1 - 1
src/views/create-order/ui/ProductCard.vue

@@ -71,7 +71,7 @@ export default {
   }
   .product-header-subtitle {
     padding: 0 20px;
-    color: #F56500;
+    color: $red_light;
     font-size: 14px;
     line-height: 22px;
   }