소스 검색

refactor(order): 重构订单详情页面

- 修改发票状态逻辑,使用新的发票状态数组
- 优化订单数据处理,使用 Promise.all 并行处理产品信息
- 添加服务名称计算功能
- 调整订单总额计算方式
- 移除不必要的控制台日志输出

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 2 달 전
부모
커밋
2d10df5d51

+ 10 - 14
src/views/create-order/components/order-detail-submodule/InvoiceInfo.vue

@@ -3,7 +3,7 @@
     <info-card title="开票概览">
       <div class="invoice-info-content">
         <div class="invoice-info-item">
-          开票状态:{{ getInvoiceStatus(orderDetail?.orderData?.applybill_status) }}
+          开票状态:{{ getInvoiceStatus(orderDetail?.orderData?.invoiced_status) }}
 
         </div>
         <div class="invoice-info-item">
@@ -29,7 +29,7 @@
             </div>
           </template>
           <template v-slot:code_url="{ row }">
-            <span class="column-cell" @click="getInvoiceInfo(row.row.code_url)">查看</span>
+            <span class="column-cell" @click="getInvoiceInfo(row.row)">查看</span>
           </template>
           <template v-slot:invoice_money="{ row }">
             <span>¥{{ formatNumber(row.row.invoice_money) }}</span>
@@ -44,7 +44,7 @@
       ref="invoiceRef"
       :show-content="4"
       :show-dialog="showInvoiceDialog"
-      :orderDetail="orderDetail?.orderData"
+      :orderInfo="orderData"
       title="开票二维码"
       @close="showInvoiceDialog = false"
     >
@@ -96,19 +96,19 @@ export default {
       }],
       invoiceData: {},
       invoiceSta: [
-        {v: -2, n: '已冲红'},
-        {v: 0, n: '未申请'},
-        {v: 1, n: '已申请'},
-        {v: 2, n: '已开具'},
+        {v: 0, n: '未开票'},
+        {v: 2, n: '全额开票'},
         {v: 3, n: '部分开票'}
       ],
       showInvoiceDialog: false,
-      selectInvoice: {}
+      selectInvoice: {},
+      orderData: {}
     }
   },
   mounted() {
     this.invoiceData = this.orderDetail?.invoiceData || {}
     this.invoiceList = this.invoiceData?.invoiceInfo || []
+    this.orderData = this.orderDetail?.orderData || {}
   },
   methods: {
     formatNumber(num, x = 2) {
@@ -127,12 +127,8 @@ export default {
       }
     },
     getInvoiceStatus(val) {
-      if(val === 1 && this.orderDetail?.orderData?.refund_status === 1) {
-        return '已冲红' 
-      } else {
-        const item = this.invoiceSta.find(item => item.v === val) || {};
-        return item.n || '-';
-      }
+      const item = this.invoiceSta.find(item => item.v === val) || {};
+      return item.n || '-';
     },
     getInvoiceInfo(item) {
       this.selectInvoice = item

+ 1 - 8
src/views/create-order/components/order-detail-submodule/OrderActions.vue

@@ -376,8 +376,6 @@ export default {
       const order_channel = this.orderDetailInfo.order_channel === 'xdqd04'
       const is_backstage_order = this.orderDetailInfo.is_backstage_order === 1
       // 订单状态为未完成且订单渠道为xdqd04或者is_backstage_order为1时显示
-      const Bool = !status && (order_channel || is_backstage_order)
-      console.log('showCancelButton', Bool)
       return status && (order_channel || is_backstage_order)
     },
 
@@ -444,7 +442,7 @@ export default {
       const orderStatus = this.invoiceData?.remainingMoney > 0
       if(!orderStatus) reasonList.push('已全额开票')
       // 非线下开发票
-      const invoiceOffline = this.invoiceData?.applybill_status === 2
+      const invoiceOffline = this.orderDetail.orderData?.applybill_status === 2
       if(invoiceOffline) reasonList.push('已线下开发票')
       // 不存在发票状态为“已申请”的发票信息
       const invoiceType = this.invoiceData?.invoiceInfo.map(
@@ -545,10 +543,8 @@ export default {
           this.$emit('loading', true)
           const { error_code: code, error_msg: msg, data} = await ajaxGetContractPdf({ orderCode: this.orderCode })
           if (code === 0) {
-            console.log('downloadProtocol', data)
             const fileUrl = data
             const filename = this.getEContractFilename(fileUrl)
-            console.log('filename', filename)
             this.downloadFile(fileUrl, filename)
           } else {
             this.downloadProtocolVisible = true
@@ -563,9 +559,7 @@ export default {
         }
         case '微信/支付宝付款码': {
           const reasonList = this.isShowPayBtn()
-          console.log('isShowPayBtn', reasonList)
           if  (!reasonList) {
-            console.log(this.$refs.detailModelRef, '$refs.detailModelRef')
             this.$refs.detailModelRef.paymentCodeShow = true;
           } else {
             this.wxAliDialogVisible = true
@@ -711,7 +705,6 @@ export default {
       const result = {
         canShow: true
       }
-      console.log('checkActionPower', type)
       switch (type) {
         case '回款': {
           break

+ 1 - 1
src/views/create-order/components/order-detail-submodule/OrderDescInfo.vue

@@ -54,7 +54,7 @@ export default {
     flex-wrap: wrap;
     .order-desc-card-info-item {
       margin-right: 32px;
-      width: 255px;
+      min-width: 255px;
       font-size: 14px;
       color: #333;
       line-height: 28px;

+ 80 - 43
src/views/create-order/components/order-detail-submodule/OrderDetailCard.vue

@@ -131,6 +131,7 @@
       </div>
     </InfoCard>
     <newDetailModel ref="newDetailModel" :data="orderDetail"></newDetailModel>
+    <ServiceList v-show="false" ref="serviceListRef"></ServiceList>
   </div>
 </template>
 
@@ -141,13 +142,15 @@ import { paymentTypeOptions } from '../../data/options.js';
 import { div, calcDiscountRate, roundToTwoDecimals } from '@/utils/number/';
 import TableCard from '../../ui/TableCard.vue';
 import newDetailModel from '@/views/order/components/new-detailModel.vue';
+import ServiceList from '../product-info-submodule/ServiceList.vue';
 export default {
   name: 'OrderDetailCard',
   components: {
     InfoCard,
     ProductCard,
     TableCard,
-    newDetailModel
+    newDetailModel,
+    ServiceList
   },
   props: {
     orderDetail: {
@@ -241,9 +244,9 @@ export default {
   },
   watch: {
     orderDetail: {
-      handler(newVal) {
+      async handler(newVal) {
         this.orderDetailInfo = newVal || {};
-        this.init();
+        await this.init();
       },
       deep: true,
       immediate: true
@@ -259,43 +262,52 @@ export default {
     }
   },
   methods: {
-    init() {
-      this.orderData = this.orderDetailInfo?.orderData || {}
-      let productData = this.orderDetailInfo?.productData || []
-      if(productData.length > 0) {
-        productData = productData.map(product => {
-          try {
-            const parsedFilter = this.parseProductFilter(product);
-            const rate = this.calculateDiscountRate(product);
-            const validityPeriod = this.calculateValidityPeriod(
-              parsedFilter.buy_cycle,
-              parsedFilter.buy_type,
-              parsedFilter.give_cycle,
-              parsedFilter.give_type,
-              product
-            );
-            const subAccountCount = this.buildSubAccountCount(product, parsedFilter);
-            const mainAccountCount = this.buildMainAccountCount(product);
-            const linkedOrder = this.processLinkedOrder(product);
-            const finalPrice = this.formatNumber(product.final_price);
-            const originalPrice = this.formatNumber(product.original_price);
-            this.parsedFilter = parsedFilter;
-            return {
-              ...product,
-              filter: parsedFilter,
-              rate,
-              validity_period: validityPeriod,
-              subAccountCount,
-              mainAccountCount,
-              linkedOrder,
-              final_price: finalPrice,
-              original_price: originalPrice
-            };
-          } catch (error) {
-            console.error('产品信息初始化失败:', error);
-            return product;
-          }
-        });
+    async init() {
+      this.orderData = this.orderDetailInfo?.orderData || {};
+      let productData = this.orderDetailInfo?.productData || [];
+
+      if (productData.length > 0) {
+        // 使用 Promise.all 来并行处理每个 product 的异步操作
+        productData = await Promise.all(
+          productData.map(async (product) => {
+            try {
+              const parsedFilter = this.parseProductFilter(product);
+              const serviceIds = parsedFilter.serviceIds || [];
+
+              // 等待异步方法完成
+              const bigServiceNames = await this.buildBigServiceNames(serviceIds);
+              const rate = this.calculateDiscountRate(product);
+              const validityPeriod = this.calculateValidityPeriod(
+                parsedFilter.buy_cycle,
+                parsedFilter.buy_type,
+                parsedFilter.give_cycle,
+                parsedFilter.give_type,
+                product
+              );
+              const subAccountCount = this.buildSubAccountCount(product, parsedFilter);
+              const mainAccountCount = this.buildMainAccountCount(product);
+              const linkedOrder = this.processLinkedOrder(product);
+              const finalPrice = this.formatNumber(product.final_price);
+              const originalPrice = this.formatNumber(product.original_price);
+
+              return {
+                ...product,
+                filter: parsedFilter,
+                rate,
+                validity_period: validityPeriod,
+                subAccountCount,
+                mainAccountCount,
+                linkedOrder,
+                bigServiceNames,
+                final_price: finalPrice,
+                original_price: originalPrice
+              };
+            } catch (error) {
+              console.error('产品信息初始化失败:', error);
+              return product;
+            }
+          })
+        );
       }
 
       this.setTotalAmounts(productData);
@@ -322,6 +334,34 @@ export default {
       }
       return RETURN_BOOL[product] || false;
     },
+    buildBigServiceNames(serviceIds) {
+      return new Promise((resolve) => {
+        if (!serviceIds || serviceIds.length === 0) {
+          resolve('');
+          return;
+        }
+
+        // 避免修改原始数组,创建新的整型数组
+        const numericServiceIds = serviceIds.map(id => parseInt(id));
+
+        this.$nextTick(() => {
+          try {
+            const serviceListRef = this.$refs.serviceListRef;
+            if (!serviceListRef || typeof serviceListRef.calcAlreadyBuyServiceNamesArr !== 'function') {
+              resolve('');
+              return;
+            }
+
+            const res = serviceListRef.calcAlreadyBuyServiceNamesArr(numericServiceIds);
+            const serviceData = Array.isArray(res) ? res.join('、') : '';
+            resolve(serviceData);
+          } catch (error) {
+            console.error('Error calculating service names:', error);
+            resolve('');
+          }
+        });
+      });
+    },
     parseProductFilter(product) {
       let parsedFilter = {};
       if (typeof product.filter === 'string') {
@@ -347,13 +387,11 @@ export default {
 
     // 构造子账号数量字符串。
     buildSubAccountCount(product, filter) {
-      console.log(product.product_type, 'product')
 
       if (product.product_type === 'VIP订阅' || product.product_type === '大会员') {
         const buyCount = Number(filter?.buyAccountCount) || 0;
         const giftCount = Number(filter?.giftAccountCount) || 0;
         const countTotal = buyCount + giftCount;
-        console.log(buyCount,giftCount, 'buyCount')
         return `付费${buyCount}个,赠送${giftCount}个,合计:<span class="color_main">${countTotal}</span>个`;
       }
       return '';
@@ -380,7 +418,6 @@ export default {
     setTotalAmounts(productData) {
       const totalFinalPrice = productData.reduce((acc, cur) => acc + Number(cur.final_price), 0).toFixed(2);
       const totalOriginalPrice = productData.reduce((acc, cur) => acc + Number(cur.original_price), 0).toFixed(2);
-      console.log(totalOriginalPrice, 'totalOriginalPrice')
       const rateTotal = div(totalFinalPrice, totalOriginalPrice) ? (div(totalFinalPrice, totalOriginalPrice) * 100).toFixed(2) + '%' : '无法计算';
 
       this.orderData.final_price_total = totalFinalPrice;

+ 0 - 1
src/views/create-order/components/order-detail-submodule/SelectOrderDetailCard.vue

@@ -467,7 +467,6 @@ export default {
     setTotalAmounts(productData) {
       const totalFinalPrice = productData.reduce((acc, cur) => acc + Number(cur.final_price), 0).toFixed(2);
       const totalOriginalPrice = productData.reduce((acc, cur) => acc + Number(cur.original_price), 0).toFixed(2);
-      console.log(totalOriginalPrice, 'totalOriginalPrice')
       const rateTotal = div(totalFinalPrice, totalOriginalPrice) ? (div(totalFinalPrice, totalOriginalPrice) * 100).toFixed(2) + '%' : '无法计算';
 
       this.orderData.final_price_total = '¥' + totalFinalPrice;