Bladeren bron

代码提交

yjwang 1 week geleden
bovenliggende
commit
49df192964

+ 9 - 0
src/api/store/userIntegralLogs.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request'
+
+// 按订单 ID 查询积分明细列表
+export function getIntegralLogsByOrderId(orderId) {
+  return request({
+    url: '/store/userIntegralLogs/getByOrderId/' + orderId,
+    method: 'get'
+  })
+}

+ 81 - 0
src/views/components/store/storeAfterSalesDetails.vue

@@ -243,6 +243,34 @@
           </template>
         </el-table-column>
       </el-table>
+      <div style="margin-top: 20px">
+        <span class="font-small">积分明细</span>
+      </div>
+      <el-table
+        border
+        :data="integralLogs"
+        size="small"
+        style="width: 100%;margin-top: 20px"
+        empty-text="该订单暂无积分变动记录">
+        <el-table-column label="类型" align="center" min-width="160">
+          <template slot-scope="scope">
+            <el-tag size="mini" :type="scope.row.integral >= 0 ? 'success' : 'danger'">
+              {{ formatLogType(scope.row.logType) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="积分变动" align="center" width="120">
+          <template slot-scope="scope">
+            <span :style="{ color: scope.row.integral >= 0 ? '#67C23A' : '#F56C6C', fontWeight: 'bold' }">
+              {{ scope.row.integral >= 0 ? '+' + scope.row.integral : scope.row.integral }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="变动后余额" align="center" prop="balance" width="120" />
+        <el-table-column label="业务订单ID" align="center" prop="businessId" width="140" />
+        <el-table-column label="时间" align="center" prop="createTime" width="160" />
+        <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
+      </el-table>
 </div>
 <el-dialog :title="edit.title" :visible.sync="edit.open" width="500px" append-to-body>
   <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="100px">
@@ -307,6 +335,7 @@
 import {tuiMoney,noAuditing,depotAuditing, auditing, codeId, logList,getRelatedProducts, itemList,listSales, getSales, delSales, addSales, updateSales, exportSales, getExpress, cancelSales, audit1 } from "@/api/store/storeAfterSales";
 import { getStoreOrder } from "@/api/store/storeOrder";
 import { getOrderPromotionDetail } from "@/api/store/storePromotion";
+import { getIntegralLogsByOrderId } from "@/api/store/userIntegralLogs";
 import storeOrderDetails from '../store/storeOrderDetails.vue';
   export default {
     name: "orderDet",
@@ -351,6 +380,10 @@ import storeOrderDetails from '../store/storeOrderDetails.vue';
         prod:null,
         order: null,
         orderPromotion: null,
+        // 积分明细列表
+        integralLogs: [],
+        // 积分日志类型字典(字典 + 本地兜底,与 FsUserIntegralLogTypeEnum 对齐)
+        integralLogTypeOptions: [],
         form: {
           sreason: '',
         }
@@ -369,6 +402,10 @@ import storeOrderDetails from '../store/storeOrderDetails.vue';
     this.getDicts("sys_after_sales_status").then(response => {
         this.afterSalesStatusOptions = response.data;
       });
+    // 加载积分日志类型字典(合并本地兜底,确保所有已知 logType 都有中文名称)
+    this.getDicts("sys_integral_log_type").then((response) => {
+      this.integralLogTypeOptions = this.mergeLogTypeOptions(response.data || []);
+    });
     },
     methods: {
       formatPromotionDiscount(amount) {
@@ -498,11 +535,13 @@ import storeOrderDetails from '../store/storeOrderDetails.vue';
         this.item=null;
         this.order=null;
         this.orderPromotion=null;
+        this.integralLogs=[];
           getSales(orderId).then(response => {
               this.item = response.data;
               this.getitemList();
               this.getlogList();
               this.loadOrderFeeInfo(this.item.orderId);
+              this.loadIntegralLogs(this.item.orderId);
           });
       },
       loadOrderFeeInfo(orderId) {
@@ -520,6 +559,48 @@ import storeOrderDetails from '../store/storeOrderDetails.vue';
           this.orderPromotion = null;
         });
       },
+      // 加载积分明细
+      loadIntegralLogs(orderId) {
+        console.log("-------------》加载明细积分--->"+orderId);
+        if (!orderId) {
+          this.integralLogs = [];
+          return;
+        }
+        getIntegralLogsByOrderId(orderId).then(response => {
+          console.log("-------------》请求接口---------》")
+          this.integralLogs = response.data || [];
+        }).catch(() => {
+          this.integralLogs = [];
+        });
+      },
+      /** 合并字典与本地兜底类型,确保所有已知 logType 都有对应名称 */
+      mergeLogTypeOptions(dictOptions) {
+        const localMap = {
+          1: '签到获得积分', 2: '消费获得积分', 3: '分享获得积分', 4: '退款扣除积分',
+          5: '购买积分商品', 6: '平台取消售后', 7: '积分过期', 8: '螳螂同步积分',
+          9: '购买课程小节扣除', 10: '观看课程获取积分', 11: '新用户完善就诊人获得积分',
+          12: '新用户填写收货地址获取积分', 13: '浏览商品获得积分', 14: '浏览视频获得积分',
+          15: '首次下单疗法获得积分', 16: '点播看课获得积分', 17: '点播答题获得积分',
+          18: '邀请新用户获取积分', 19: '填写邀请码获取积分', 20: '首次完成手机号绑定注册',
+          21: '首次完成专家咨询', 22: '首次完成积分商城下单', 23: '管理员添加',
+          24: '付费课程订阅', 25: '下单使用积分抵扣', 26: '取消订单退回积分', 27: '退款订单退回积分'
+        };
+        const result = [...dictOptions];
+        const existValues = new Set(dictOptions.map(o => Number(o.dictValue)));
+        Object.keys(localMap).forEach(key => {
+          const val = Number(key);
+          if (!existValues.has(val)) {
+            result.push({ dictValue: String(val), dictLabel: localMap[val] });
+          }
+        });
+        return result;
+      },
+      /** 将 logType 数值转换为中文名称 */
+      formatLogType(logType) {
+        if (logType == null) return '-';
+        const item = this.integralLogTypeOptions.find(o => Number(o.dictValue) === Number(logType));
+        return item ? item.dictLabel : ('类型' + logType);
+      },
       editDelivery(){
         this.edit.open = true;
         this.editForm.deliveryName = this.item.deliveryName;

+ 75 - 0
src/views/components/store/storeOrderDetails.vue

@@ -418,6 +418,35 @@
             </template>
           </el-table-column>
         </el-table>
+
+        <div style="margin-top: 20px">
+          <span class="font-small">积分明细</span>
+        </div>
+        <el-table
+          border
+          :data="integralLogs"
+          size="small"
+          style="width: 100%;margin-top: 20px"
+          empty-text="该订单暂无积分变动记录">
+          <el-table-column label="类型" align="center" min-width="160">
+            <template slot-scope="scope">
+              <el-tag size="mini" :type="scope.row.integral >= 0 ? 'success' : 'danger'">
+                {{ formatLogType(scope.row.logType) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="积分变动" align="center" width="120">
+            <template slot-scope="scope">
+              <span :style="{ color: scope.row.integral >= 0 ? '#67C23A' : '#F56C6C', fontWeight: 'bold' }">
+                {{ scope.row.integral >= 0 ? '+' + scope.row.integral : scope.row.integral }}
+              </span>
+            </template>
+          </el-table-column>
+          <el-table-column label="变动后余额" align="center" prop="balance" width="120" />
+          <el-table-column label="业务订单ID" align="center" prop="businessId" width="140" />
+          <el-table-column label="时间" align="center" prop="createTime" width="160" />
+          <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip />
+        </el-table>
       </el-card>
     </div>
 
@@ -608,6 +637,7 @@ import {afterSales,auditPayRemain,addTuiMoney,syncExpress,updateExpress,getEroOr
    addStoreOrder, updateStoreOrder, exportStoreOrder,updateDeliveryId, createErpOrder,
    updateErp,getStoreOrderAddress,getStoreOrderPhone,updateCommentInfo,getCommentInfo } from "@/api/store/storeOrder";
 import { getOrderPromotionDetail } from "@/api/store/storePromotion";
+import { getIntegralLogsByOrderId } from "@/api/store/userIntegralLogs";
 export default {
   name: "order",
   data() {
@@ -681,6 +711,10 @@ export default {
       erpOrder:null,
       auditLogs: [],
       orderPromotion: null,
+      // 积分明细列表
+      integralLogs: [],
+      // 积分日志类型字典(字典 + 本地兜底,与 FsUserIntegralLogTypeEnum 对齐)
+      integralLogTypeOptions: [],
     };
   },
   created() {
@@ -703,6 +737,10 @@ export default {
     this.getDicts("store_order_create_type").then((response) => {
       this.createTypeOptions = response.data;
     });
+    // 加载积分日志类型字典(合并本地兜底,确保所有已知 logType 都有中文名称)
+    this.getDicts("sys_integral_log_type").then((response) => {
+      this.integralLogTypeOptions = this.mergeLogTypeOptions(response.data || []);
+    });
   },
   methods: {
     formatPromotionDiscount(amount) {
@@ -984,6 +1022,7 @@ export default {
         this.tuiMoneyLogs=response.tuiMoneyLogs;
         this.auditLogs = response.auditLogs;
         this.loadOrderPromotion(orderId);
+        this.loadIntegralLogs(orderId);
       });
     },
     loadOrderPromotion(orderId) {
@@ -993,6 +1032,42 @@ export default {
         this.orderPromotion = null;
       });
     },
+    // 加载积分明细
+    loadIntegralLogs(orderId) {
+      getIntegralLogsByOrderId(orderId).then(response => {
+        this.integralLogs = response.data || [];
+      }).catch(() => {
+        this.integralLogs = [];
+      });
+    },
+    /** 合并字典与本地兜底类型,确保所有已知 logType 都有对应名称 */
+    mergeLogTypeOptions(dictOptions) {
+      const localMap = {
+        1: '签到获得积分', 2: '消费获得积分', 3: '分享获得积分', 4: '退款扣除积分',
+        5: '购买积分商品', 6: '平台取消售后', 7: '积分过期', 8: '螳螂同步积分',
+        9: '购买课程小节扣除', 10: '观看课程获取积分', 11: '新用户完善就诊人获得积分',
+        12: '新用户填写收货地址获取积分', 13: '浏览商品获得积分', 14: '浏览视频获得积分',
+        15: '首次下单疗法获得积分', 16: '点播看课获得积分', 17: '点播答题获得积分',
+        18: '邀请新用户获取积分', 19: '填写邀请码获取积分', 20: '首次完成手机号绑定注册',
+        21: '首次完成专家咨询', 22: '首次完成积分商城下单', 23: '管理员添加',
+        24: '付费课程订阅', 25: '下单使用积分抵扣', 26: '取消订单退回积分', 27: '退款订单退回积分'
+      };
+      const result = [...dictOptions];
+      const existValues = new Set(dictOptions.map(o => Number(o.dictValue)));
+      Object.keys(localMap).forEach(key => {
+        const val = Number(key);
+        if (!existValues.has(val)) {
+          result.push({ dictValue: String(val), dictLabel: localMap[val] });
+        }
+      });
+      return result;
+    },
+    /** 将 logType 数值转换为中文名称 */
+    formatLogType(logType) {
+      if (logType == null) return '-';
+      const item = this.integralLogTypeOptions.find(o => Number(o.dictValue) === Number(logType));
+      return item ? item.dictLabel : ('类型' + logType);
+    },
 
     applyFefund(){