Ver código fonte

feat(create-order): 优化订单详情页面展示逻辑

- 修改企业关联接口 URL
- 修复升级内容字段名错误
- 优化服务列表展示逻辑
- 完善审核状态展示
- 修复回款计划展示问题
- 新增发票上传功能
- 增加通用关键字高亮替换方法
- 更新开发环境代理配置

Signed-off-by: tangshizhe <48740614+tangshizhe@users.noreply.github.com>
tangshizhe 1 mês atrás
pai
commit
1f650495c5

+ 10 - 1
src/api/modules/index.js

@@ -156,8 +156,17 @@ export function ajaxEditOrderContract(data) {
 
 export function ajaxGetCompanyAssociation(data) {
   return request({
-    url: '/jypay/user/company/association',
+    url: '/bigmember/search/ent/association',
     method: 'post',
     data: qs.stringify(data)
   })
+}
+
+// 上传发票、编辑发票
+export function ajaxUploadInvoice(data) {
+  return request({
+    url: '/jyOrderManager/order/invoiceUpload',
+    method: 'post',
+    data,
+  })
 }

+ 33 - 4
src/views/create-order/components/order-detail-submodule/OrderDetailCardProductList.vue

@@ -50,7 +50,7 @@
                 <div v-else-if="item.key === 'validity_period'">
                   <span v-html="getValidityPeriodHtml(product, item)"></span>
                 </div>
-                <div v-else-if="item.key === 'supServicelds'">
+                <div v-else-if="item.key === 'supServiceIds'">
                   {{ item.label }}:{{ getFilteredValue(product[item.key], item.filter) || '-' }}
                 </div>
                 <div v-else-if="item.key === 'service_starttime'">
@@ -125,7 +125,7 @@ export default {
       productInfoItems: [
         { label: '活动产品', key: 'activityName', span: 1, condition: (product) => product.activityName },
         { label: '付费类型', key: 'service_type', filter: 'orderServiceType', span: 3},
-        { label: '升级内容', key: 'supServicelds', span: 3, condition: (product) => product.supServicelds },
+        { label: '升级内容', key: 'supServiceIds', span: 3, condition: (product) => product.supServiceIds },
         { label: '产品规格', key: 'productName', span: 3},
         { label: '服务列表', key: 'bigServiceNames', span: 1, condition: (product) => product.productName && product.productName.includes('自定义') &&  product.product_code === 'dyh001'},
         { label: '数据条数', key: 'data_count', span: 1, condition: (product) => product.data_count && product.data_count !== '-'},
@@ -234,9 +234,10 @@ export default {
             try {
               const parsedFilter = this.parseProductFilter(product);
               const serviceIds = parsedFilter.serviceIds || [];
-              const supServiceIds = parsedFilter.supServiceIds || [];
+              const supServiceIdsOrigin = parsedFilter.supServiceIds || [];
               // 等待异步方法完成
-              const bigServiceNames = product.product_type === '大会员' ? await this.buildBigServiceNames(serviceIds, supServiceIds) : '';
+              const supServiceIds = await this.buildSupServiceIds(parsedFilter.supServiceIds || []);
+              const bigServiceNames = product.product_type === '大会员' ? await this.buildBigServiceNames(serviceIds, supServiceIdsOrigin) : '';
               const rate = this.calculateDiscountRate(product);
               const validityPeriod = this.calculateValidityPeriod(
                 parsedFilter,
@@ -300,6 +301,7 @@ export default {
                 subAccountCount,
                 mainAccountCount,
                 linkedOrder,
+                supServiceIds,
                 bigServiceNames,
                 final_price: finalPrice,
                 sale_final_price: finalPrice,
@@ -340,6 +342,33 @@ export default {
     divided(a, b) {
       return div(a, b)
     },
+    buildSupServiceIds(supServiceIds) {
+      return new Promise((resolve) => {
+        if (!supServiceIds || supServiceIds.length === 0) {
+          resolve('');
+          return;
+        }
+        
+        // 避免修改原始数组,创建新的整型数组
+        const numericServiceIds = supServiceIds.map(id => parseInt(id));
+        this.$nextTick(() => {
+          try {
+            
+            const serviceListRef = this.$refs.serviceListRef;
+            if (!serviceListRef || typeof serviceListRef.calcAlreadyBuyServiceNamesArr !== 'function') {
+              resolve('');
+              return;
+            }
+            const baseServiceIdsArr = serviceListRef.calcAlreadyBuyServiceNamesArr(numericServiceIds);
+            const serviceData = Array.isArray(baseServiceIdsArr) ? baseServiceIdsArr.join('、') : '';
+            resolve(serviceData);
+          } catch (error) {
+            console.error('Error calculating service names:', error);
+            resolve('');
+          }
+        });
+      });
+    },
     buildBigServiceNames(serviceIds, supServiceIds) {
       return new Promise((resolve) => {
         if (!serviceIds || serviceIds.length === 0) {

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

@@ -40,7 +40,7 @@
             <span @click="vouched(row.row.voucher)" class="column-cell">点击查看</span>
           </template>
           <template v-slot:action="{ row }">
-            <span @click="payShenHe" class="column-cell">{{ row.row.action }}</span>
+            <span @click="payShenHe" class="column-cell">审核</span>
           </template>
         </TableCard>
       </div>
@@ -196,7 +196,13 @@ export default {
           label: '审核状态',
           prop: 'state',
           render (row) {
-            return defaultRender(row.state) 
+            if(row.state == 1) {
+              return '审核通过'
+            } else if(row.state == 2) {
+              return '审核未通过'
+            } else if(row.state == 3) {
+              return '待审核'
+            }
           }
         },
         {

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

@@ -4,7 +4,7 @@
       :tableData="paymentPlanList"
       :columns="[
         {label: '序号', prop: 'code', width: '280'},
-        {label: '预计回款时间', prop: 'time'},
+        {label: '预计回款时间', prop: 'time', render: (row) => row.time || '-'},
         {label: '预计回款金额', prop: 'money'}
       ]"
       :width="'1108px'"
@@ -66,6 +66,12 @@ export default {
 
       try {
         plantList = JSON.parse(plantList);
+        // 查找“合计”项
+        const totalItem = plantList.find(item => item.code === '合计');
+
+        if (totalItem && Number(totalItem.money) === 0) {
+          plantList = []
+        }
       } catch (error) {
         console.error('Failed to parse plantList JSON:', error);
         plantList = [];

+ 67 - 0
src/views/create-order/hooks/utils.js

@@ -39,6 +39,73 @@ export function findUserInDeptTree(cb) {
   return nameObj
 }
 
+/**
+ * 通用关键字高亮替换
+ * @param {String} value 要高亮的字符串
+ * @param {String|Array} oldChar 要被替换的字符串(或数组)
+ * @param {String|Array} newChar 要替换成的字符串(或数组)
+ *
+ * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` 高亮
+ * 则此时 value -> `剑鱼标讯工具函数`
+ *        oldChar -> `工具`
+ *        newChar -> `<span class="highlight-text">工具</span>`
+ *
+ * 批量高亮-----
+ * 比如:要将 - `剑鱼标讯工具函数` 字符串中的 `工具` `剑鱼` 高亮
+ * 则此时 value -> `剑鱼标讯工具函数`批量高亮
+ *        oldChar -> ['工具', '剑鱼']
+ *        newChar -> ['<span class="highlight-text">', '</span>']
+ *
+ *   注意:此时newChar为一个长度为2的数组,数组中为高亮标签的起始标签和结束标签
+ *
+ */
+
+export function replaceKeyword(
+  value,
+  oldChar,
+  newChar = ['<span class="highlight-text">', '</span>']
+) {
+  if (!oldChar || !newChar) return value
+  // oldChar的字符串数组
+  let oldCharArr = []
+
+  if (Array.isArray(oldChar)) {
+    oldCharArr = oldChar.concat()
+  } else {
+    oldCharArr.push(oldChar)
+  }
+
+  // 数组去重
+  oldCharArr = Array.from(new Set(oldCharArr))
+  for (let i = 0; i < oldCharArr.length; i++) {
+    if (!oldCharArr[i]) {
+      continue
+    } else {
+      oldCharArr[i] = oldCharArr[i]
+        .replace(/([$()*+.[\]?/\\^{}|])/g, '\\$1')
+        .replace(/\s+/g, '')
+    }
+  }
+
+  // 数组去空
+  const lastArr = oldCharArr
+    .filter((item) => !!item)
+    .sort((a, b) => b.length - a.length)
+  const regExp = new RegExp(`(${lastArr.join('|')})`, 'gmi')
+
+  if (lastArr.length === 0) {
+    return value
+  }
+
+  if (Array.isArray(newChar)) {
+    // 批量高亮
+    return value.replace(regExp, newChar.join('$1'))
+  } else {
+    // 普通单个高亮
+    return value.replace(regExp, newChar)
+  }
+}
+
 // 营销渠道:根据营销渠道最深层级的id。整理出其选择器的选中列表
 export function calcChannelSelectorList(code) {
   const list = store.state.order.conf?.channel || []

+ 9 - 0
vue.config.js

@@ -64,6 +64,15 @@ module.exports = {
           '^/dev-api': '/api/admin/'
         }
       },
+      '^/bigmember': {
+        target: 'https://jybx2-webtest.jydev.jianyu360.com',
+        changeOrigin: true,
+        ws: false,
+        logLevel: 'debug',
+        pathRewrite: {
+          '^/bigmember': '/bigmember'
+        }
+      },
       '^/filemanage': {
         target: 'https://web2-qmx_admin.jydev.jianyu360.com',
         changeOrigin: true,