Kaynağa Gözat

Merge remote-tracking branch 'origin/master'

xgb 3 gün önce
ebeveyn
işleme
1c88bf6387
21 değiştirilmiş dosya ile 799 ekleme ve 75 silme
  1. 2 4
      fs-admin/src/main/java/com/fs/company/controller/CompanyStatisticsController.java
  2. 6 0
      fs-admin/src/main/java/com/fs/his/controller/FsIntegralOrderController.java
  3. 9 2
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  4. 1 1
      fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java
  5. 2 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  6. 7 1
      fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListVO.java
  7. 5 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderItemScrmMapper.java
  8. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderItemScrmService.java
  9. 16 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  10. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderItemScrmServiceImpl.java
  11. 12 8
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  12. 102 22
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductPurchaseLimitScrmServiceImpl.java
  13. 5 16
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  14. 19 19
      fs-service/src/main/java/com/fs/live/vo/MergedOrderVO.java
  15. 104 0
      fs-service/src/main/resources/application-config-dev-xcsw.yml
  16. 104 0
      fs-service/src/main/resources/application-config-druid-xcsw.yml
  17. 165 0
      fs-service/src/main/resources/application-dev-xcsw.yml
  18. 165 0
      fs-service/src/main/resources/application-druid-xcsw.yml
  19. 2 2
      fs-service/src/main/resources/mapper/hisStore/MergedOrderMapper.xml
  20. 21 0
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveController.java
  21. 45 0
      fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

+ 2 - 4
fs-admin/src/main/java/com/fs/company/controller/CompanyStatisticsController.java

@@ -784,10 +784,8 @@ public class CompanyStatisticsController extends BaseController
     @PostMapping("/syncYesterday")
     public AjaxResult syncYesterday() {
         try {
-            Date startDate = DateUtils.parseDate("2026-01-07");
-            Date endDate = DateUtils.parseDate("2026-01-07");
-            finishCourseStatisticsSyncService.syncDailyStatistics(startDate, endDate);
-            return AjaxResult.success("同步指定范围数据成功");
+            finishCourseStatisticsSyncService.syncMultiDimensionStatistics();
+            return AjaxResult.success("同步昨天数据成功");
         } catch (Exception e) {
             return AjaxResult.error("同步失败:" + e.getMessage());
         }

+ 6 - 0
fs-admin/src/main/java/com/fs/his/controller/FsIntegralOrderController.java

@@ -174,6 +174,9 @@ public class FsIntegralOrderController extends BaseController
                             if (goods != null && goods.getString("goodsName") != null) {
                                 vo.setGoodsName(goods.getString("goodsName"));
                             }
+                            if (goods != null && goods.getString("barCode") != null) {
+                                vo.setBarCode(goods.getString("barCode"));
+                            }
                         }
                     } else if (vo.getItemJson().startsWith("{")) {
                         // 对象格式
@@ -181,6 +184,9 @@ public class FsIntegralOrderController extends BaseController
                         if (goods != null && goods.getString("goodsName") != null) {
                             vo.setGoodsName(goods.getString("goodsName"));
                         }
+                        if (goods != null && goods.getString("barCode") != null) {
+                            vo.setGoodsName(goods.getString("barCode"));
+                        }
                     }
                 } catch (Exception e) {
                     // 解析失败时保持goodsName为空,避免导出出错

+ 9 - 2
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -56,6 +56,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport;
 import org.springframework.web.bind.annotation.*;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 import java.util.HashMap;
@@ -197,7 +198,7 @@ public class FsStorePaymentScrmController extends BaseController
     }
 
     @PreAuthorize("@ss.hasPermi('store:storePayment:refund')")
-    @PostMapping("refundStorePayment")
+    @PostMapping("/refundStorePayment")
     @Transactional
     public R refundStorePayment(@RequestBody FsStorePaymentScrm fsStorePayment)
     {
@@ -238,7 +239,13 @@ public class FsStorePaymentScrmController extends BaseController
                 }
                 V2TradePaymentScanpayRefundRequest request = new V2TradePaymentScanpayRefundRequest();
                 request.setHuifuId(huifuId);
-                request.setOrdAmt(payment.getPayMoney().toString());
+
+                if (("易行健".equals(cloudHostProper.getCompanyName()))){
+                    request.setOrdAmt(fsStorePayment.getRefundMoney().setScale(2, RoundingMode.DOWN).toString());
+                }else {
+                    request.setOrdAmt(payment.getPayMoney().toString());
+                }
+
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-"+payment.getPayCode());
                 request.setAppId(payment.getAppId());

+ 1 - 1
fs-admin/src/main/java/com/fs/qw/qwTask/qwTask.java

@@ -377,7 +377,7 @@ public class qwTask {
     /**
      * 特殊处理(木易完课统计数据)
      */
-    private  void  syncMultiDimensionStatistics(){
+    public  void  syncMultiDimensionStatistics(){
         finishCourseStatisticsSyncService.syncMultiDimensionStatistics();
     }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -699,6 +699,7 @@ public class CompanyServiceImpl implements ICompanyService
                 log.setBalance(company.getMoney());
                 log.setCreateTime(new Date());
                 log.setBusinessId(order.getId().toString());
+                log.setType(0);
                 moneyLogsMapper.insertCompanyMoneyLogs(log);
                 FsStoreOrderScrm fsStoreOrder = new FsStoreOrderScrm();
                 fsStoreOrder.setId(order.getId());
@@ -735,6 +736,7 @@ public class CompanyServiceImpl implements ICompanyService
                 log.setBalance(company.getMoney());
                 log.setCreateTime(new Date());
                 log.setBusinessId(order.getOrderId().toString());
+                log.setType(1);
                 moneyLogsMapper.insertCompanyMoneyLogs(log);
                 LiveOrder liveOrder = new LiveOrder();
                 liveOrder.setOrderId(order.getOrderId());

+ 7 - 1
fs-service/src/main/java/com/fs/his/vo/FsIntegralOrderListVO.java

@@ -36,6 +36,12 @@ public class FsIntegralOrderListVO {
     /** 商品信息 */
     @Excel(name = "商品信息")
     private String itemJson;
+    @Excel(name = "商品名称")
+    private String goodsName;
+
+    /** 商品条码 */
+    @Excel(name = "商品编码")
+    private String barCode;
 
     /** 支付积分 */
     @Excel(name = "支付积分")
@@ -84,5 +90,5 @@ public class FsIntegralOrderListVO {
     private String erpPhone;
 
     private String loginAccount;
-    private String goodsName;
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderItemScrmMapper.java

@@ -305,4 +305,9 @@ public interface FsStoreOrderItemScrmMapper
     List<FsStoreOrderItemVO> selectFsStoreOrderItemListByOrderIds(@Param("orderIds")List<Long> orderIds);
 
     String selectFsStoreOrderItemByOrderId(@Param("orderId") Long orderId);
+
+
+    @Select("select product_id from fs_store_order_item_scrm where order_code = #{orderCode}")
+    Long selectProductIdByOrderCode(@Param("orderCode") String orderCode);
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderItemScrmService.java

@@ -77,4 +77,6 @@ public interface IFsStoreOrderItemScrmService
     List<FsStoreOrderItemListDVO> selectFsStoreOrderItemListDVOByOrderId(Long orderId);
 
     String selectFsStoreOrderItemByOrderId(Long orderId);
+
+    Long selectProductIdByOrderCode(String orderCode);
 }

+ 16 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -964,10 +964,26 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
         if(order.getTuiUserId()!=null&&order.getTuiUserId()>0){
             userService.subTuiMoney(order);
         }
+        // 删除限购记录
+        this.deletePurchaseLimitRecordsForStoreOrder(order);
         return R.ok();
     }
 
+    @Autowired
+    private IFsStoreProductPurchaseLimitScrmService purchaseLimitService;
 
+    /**
+     * 删除限购记录(用于直播订单)
+     * @param fsStoreOrderScrm 订单
+     */
+    private void deletePurchaseLimitRecordsForStoreOrder(FsStoreOrderScrm fsStoreOrderScrm) {
+        Long productId = fsStoreOrderItemMapper.selectProductIdByOrderCode(fsStoreOrderScrm.getOrderCode());
+
+        // 减少限购数量
+        Long userId = fsStoreOrderScrm.getUserId();
+        Integer num = Math.toIntExact(fsStoreOrderScrm.getTotalNum());
+        purchaseLimitService.decreasePurchaseLimit(productId, userId, num);
+    }
     @Autowired
     private FsJstAftersalePushScrmMapper fsJstAftersalePushMapper;
 

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderItemScrmServiceImpl.java

@@ -136,4 +136,9 @@ public class FsStoreOrderItemScrmServiceImpl implements IFsStoreOrderItemScrmSer
     public String selectFsStoreOrderItemByOrderId(Long orderId) {
         return fsStoreOrderItemMapper.selectFsStoreOrderItemByOrderId(orderId);
     }
+
+    @Override
+    public Long selectProductIdByOrderCode(String orderCode) {
+        return fsStoreOrderItemMapper.selectProductIdByOrderCode(orderCode);
+    }
 }

+ 12 - 8
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -1096,12 +1096,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 }
                 fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
                 listOrderItem.add(item);
-                
-                // 记录限购数量(订单创建成功后记录)
-                FsStoreProductScrm product = productService.selectFsStoreProductById(vo.getProductId());
-                if (product != null && product.getPurchaseLimit() != null && product.getPurchaseLimit() > 0) {
-                    purchaseLimitService.increasePurchaseLimit(vo.getProductId(), userId, vo.getCartNum());
-                }
+
             }
             if (listOrderItem.size() > 0) {
                 String itemJson = JSONUtil.toJsonStr(listOrderItem);
@@ -1297,8 +1292,6 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             this.refundCoupon(order);
             //退回库存
             this.refundStock(order);
-            // 删除限购记录
-            this.deletePurchaseLimitRecords(order);
             fsStoreOrderMapper.cancelOrder(orderId);
             //添加记录
             orderStatusService.create(order.getId(), OrderLogEnum.CANCEL_ORDER.getValue(),
@@ -2052,7 +2045,18 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (storeOrder.getCompanyId() != null) {
             addOrderAudit(order);
         }
+        try {
+            // 记录限购数量(订单创建成功后记录)
+            List<FsStoreOrderItemVO> fsStoreOrderItemVOS = storeOrderItemService.selectFsStoreOrderItemListByOrderId(order.getId());
+            if (fsStoreOrderItemVOS != null && !fsStoreOrderItemVOS.isEmpty()) {
+                for (FsStoreOrderItemVO fsStoreOrderItemVO : fsStoreOrderItemVOS) {
+                    purchaseLimitService.increasePurchaseLimit(fsStoreOrderItemVO.getProductId(), order.getUserId(), Math.toIntExact(fsStoreOrderItemVO.getNum()));
+                }
+            }
 
+        } catch (Exception e) {
+            log.error("创建限购商品失败:{}",e.getMessage());
+        }
 
     return "SUCCESS";
 

+ 102 - 22
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductPurchaseLimitScrmServiceImpl.java

@@ -1,10 +1,22 @@
 package com.fs.hisStore.service.impl;
 
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import com.fs.common.constant.LiveKeysConstant;
+import com.fs.common.core.redis.RedisCache;
 import com.fs.common.utils.DateUtils;
+import com.fs.hisStore.domain.FsStoreProductAttrScrm;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
 import com.fs.hisStore.domain.FsStoreProductPurchaseLimitScrm;
+import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.mapper.FsStoreProductAttrScrmMapper;
+import com.fs.hisStore.mapper.FsStoreProductAttrValueScrmMapper;
 import com.fs.hisStore.mapper.FsStoreProductPurchaseLimitScrmMapper;
+import com.fs.hisStore.mapper.FsStoreProductScrmMapper;
 import com.fs.hisStore.service.IFsStoreProductPurchaseLimitScrmService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -21,6 +33,16 @@ public class FsStoreProductPurchaseLimitScrmServiceImpl implements IFsStoreProdu
     @Autowired
     private FsStoreProductPurchaseLimitScrmMapper fsStoreProductPurchaseLimitMapper;
 
+    @Autowired
+    private RedisCache redisCache;
+    @Autowired
+    private FsStoreProductScrmMapper fsStoreProductScrmMapper;
+    @Autowired
+    private FsStoreProductAttrScrmMapper fsStoreProductAttrScrmMapper;
+    @Autowired
+    private FsStoreProductAttrValueScrmMapper fsStoreProductAttrValueScrmMapper;
+
+
     /**
      * 查询商品限购
      *
@@ -119,19 +141,48 @@ public class FsStoreProductPurchaseLimitScrmServiceImpl implements IFsStoreProdu
     @Override
     public int increasePurchaseLimit(Long productId, Long userId, Integer num)
     {
-        FsStoreProductPurchaseLimitScrm limit = selectByProductIdAndUserId(productId, userId);
-        if (limit == null) {
-            // 创建新记录
-            limit = new FsStoreProductPurchaseLimitScrm();
-            limit.setProductId(productId);
-            limit.setUserId(userId);
-            limit.setNum(num);
-            return insertFsStoreProductPurchaseLimit(limit);
+        String cacheKey = String.format(LiveKeysConstant.PRODUCT_DETAIL_CACHE, productId);
+        Map<String, Object> cachedData = redisCache.getCacheObject(cacheKey);
+
+        FsStoreProductScrm product;
+        List<FsStoreProductAttrScrm> productAttr;
+        List<FsStoreProductAttrValueScrm> productValues;
+
+        if (cachedData != null) {
+            // 从缓存中获取数据
+            product = (FsStoreProductScrm) cachedData.get("product");
         } else {
-            // 更新现有记录
-            limit.setNum(limit.getNum() + num);
-            return updateFsStoreProductPurchaseLimit(limit);
+            // 缓存中没有,从数据库查询
+            product = fsStoreProductScrmMapper.selectFsStoreProductById(productId);
+            if(product==null){
+                return -1;
+            }
+            productAttr = fsStoreProductAttrScrmMapper.selectFsStoreProductAttrByProductId(productId);
+            productValues = fsStoreProductAttrValueScrmMapper.selectFsStoreProductAttrValueByProductId(productId);
+
+            // 将数据存入缓存
+            Map<String, Object> cacheData = new HashMap<>();
+            cacheData.put("product", product);
+            cacheData.put("productAttr", productAttr);
+            cacheData.put("productValues", productValues);
+            redisCache.setCacheObject(cacheKey, cacheData, LiveKeysConstant.PRODUCT_DETAIL_CACHE_EXPIRE, TimeUnit.SECONDS);
         }
+        if (product != null && product.getPurchaseLimit() != null && product.getPurchaseLimit() > 0) {
+            FsStoreProductPurchaseLimitScrm limit = selectByProductIdAndUserId(productId, userId);
+            if (limit == null) {
+                // 创建新记录
+                limit = new FsStoreProductPurchaseLimitScrm();
+                limit.setProductId(productId);
+                limit.setUserId(userId);
+                limit.setNum(num);
+                return insertFsStoreProductPurchaseLimit(limit);
+            } else {
+                // 更新现有记录
+                limit.setNum(limit.getNum() + num);
+                return updateFsStoreProductPurchaseLimit(limit);
+            }
+        }
+        return -1;
     }
 
     /**
@@ -145,19 +196,48 @@ public class FsStoreProductPurchaseLimitScrmServiceImpl implements IFsStoreProdu
     @Override
     public int decreasePurchaseLimit(Long productId, Long userId, Integer num)
     {
-        FsStoreProductPurchaseLimitScrm limit = selectByProductIdAndUserId(productId, userId);
-        if (limit != null) {
-            int newNum = limit.getNum() - num;
-            if (newNum <= 0) {
-                // 如果数量为0或负数,删除记录
-                return deleteFsStoreProductPurchaseLimitById(limit.getId());
-            } else {
-                // 更新数量
-                limit.setNum(newNum);
-                return updateFsStoreProductPurchaseLimit(limit);
+        String cacheKey = String.format(LiveKeysConstant.PRODUCT_DETAIL_CACHE, productId);
+        Map<String, Object> cachedData = redisCache.getCacheObject(cacheKey);
+
+        FsStoreProductScrm product;
+        List<FsStoreProductAttrScrm> productAttr;
+        List<FsStoreProductAttrValueScrm> productValues;
+
+        if (cachedData != null) {
+            // 从缓存中获取数据
+            product = (FsStoreProductScrm) cachedData.get("product");
+        } else {
+            // 缓存中没有,从数据库查询
+            product = fsStoreProductScrmMapper.selectFsStoreProductById(productId);
+            if(product==null){
+                return -1;
+            }
+            productAttr = fsStoreProductAttrScrmMapper.selectFsStoreProductAttrByProductId(productId);
+            productValues = fsStoreProductAttrValueScrmMapper.selectFsStoreProductAttrValueByProductId(productId);
+
+            // 将数据存入缓存
+            Map<String, Object> cacheData = new HashMap<>();
+            cacheData.put("product", product);
+            cacheData.put("productAttr", productAttr);
+            cacheData.put("productValues", productValues);
+            redisCache.setCacheObject(cacheKey, cacheData, LiveKeysConstant.PRODUCT_DETAIL_CACHE_EXPIRE, TimeUnit.SECONDS);
+        }
+        if (product != null && product.getPurchaseLimit() != null && product.getPurchaseLimit() > 0) {
+            FsStoreProductPurchaseLimitScrm limit = selectByProductIdAndUserId(productId, userId);
+            if (limit != null) {
+                int newNum = limit.getNum() - num;
+                if (newNum <= 0) {
+                    // 如果数量为0或负数,删除记录
+                    return deleteFsStoreProductPurchaseLimitById(limit.getId());
+                } else {
+                    // 更新数量
+                    limit.setNum(newNum);
+                    return updateFsStoreProductPurchaseLimit(limit);
+                }
             }
+            return 0;
         }
-        return 0;
+        return -1;
     }
 }
 

+ 5 - 16
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -786,6 +786,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
             baseMapper.updateLiveOrder(order);
             try {
                 this.updateLiveWatchLog(order);
+                // 记录限购数量(订单创建成功后记录)
+                purchaseLimitService.increasePurchaseLimit(order.getProductId(), Long.valueOf(order.getUserId()), Integer.valueOf(order.getTotalNum()));
                 this.createOmsOrderCall(order);
             } catch (Exception e) {
                 log.error("推送erp失败:{}",e.getMessage());
@@ -1431,6 +1433,8 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 userService.subTuiMoney(storeOrder);
             }
         }
+        // 删除限购记录
+        deletePurchaseLimitRecordsForLiveOrder(order);
 
         return R.ok();
     }
@@ -3807,11 +3811,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 liveOrderItem.setNum(Long.valueOf(liveOrder.getTotalNum()));
                 liveOrderItem.setJsonInfo(JSON.toJSONString(dto));
                 liveOrderItemMapper.insertLiveOrderItem(liveOrderItem);
-                
-                // 记录限购数量(订单创建成功后记录)
-                if (fsStoreProduct.getPurchaseLimit() != null && fsStoreProduct.getPurchaseLimit() > 0) {
-                    purchaseLimitService.increasePurchaseLimit(liveOrder.getProductId(), userId, purchaseNum);
-                }
+
                 
                 redisCache.deleteObject("orderKey:" + liveOrder.getOrderKey());
                 //添加支付到期时间
@@ -4039,17 +4039,6 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
      * @param liveOrder 订单
      */
     private void deletePurchaseLimitRecordsForLiveOrder(LiveOrder liveOrder) {
-        // 查询商品信息
-        FsStoreProductScrm product = fsStoreProductService.selectFsStoreProductById(liveOrder.getProductId());
-        if (product == null) {
-            return;
-        }
-        
-        // 如果商品没有设置限购,跳过
-        if (product.getPurchaseLimit() == null || product.getPurchaseLimit() <= 0) {
-            return;
-        }
-        
         // 减少限购数量
         Long userId = Long.parseLong(liveOrder.getUserId());
         Integer num = Integer.parseInt(liveOrder.getTotalNum());

+ 19 - 19
fs-service/src/main/java/com/fs/live/vo/MergedOrderVO.java

@@ -20,40 +20,39 @@ import java.util.List;
 public class MergedOrderVO implements Serializable
 {
     private static final long serialVersionUID = 1L;
-
+    @Excel(name = "订单ID")
     /** 订单ID */
     private Long id;
-
+    @Excel(name = "订单ID(直播订单使用)")
     /** 订单ID(直播订单使用) */
     private Long orderId;
-
+    @Excel(name = "直播ID")
     /** 直播ID(直播订单使用) */
     private Long liveId;
-
+    @Excel(name = "售后ID")
     /** 售后ID(直播订单使用) */
     private Long afterSalesId;
-
+    @Excel(name = "订单号")
     /** 订单号 */
     private String orderCode;
-
+    @Excel(name = "实际支付金额")
     /** 实际支付金额 */
     private BigDecimal payPrice;
-
     /** 会员等级 */
     private Integer userLevel;
-
+    @Excel(name = "实付金额")
     /** 实付金额 */
     private BigDecimal payMoney;
-
+    @Excel(name = "优惠金额")
     /** 优惠金额(直播订单使用) */
     private Integer discountMoney;
-
+    @Excel(name = "运费")
     /** 运费 */
     private BigDecimal payDelivery;
 
     /** 运费 */
     private BigDecimal payPostage;
-
+    @Excel(name = "成本价")
     /** 成本价 */
     private BigDecimal cost;
 
@@ -61,7 +60,7 @@ public class MergedOrderVO implements Serializable
     /** 订单状态 */
     @Excel(name = "订单状态",dictType="sys_live_order_status")
     private Integer status;
-
+    @Excel(name = "订单状态")
     /** 订单总价 */
     private BigDecimal totalPrice;
 
@@ -73,13 +72,13 @@ public class MergedOrderVO implements Serializable
 
     /** 商品JSON */
     private String itemJson;
-
+    @Excel(name = "物流单号")
     /** 物流单号 */
     private String deliveryId;
-
+    @Excel(name = "物流公司编码")
     /** 物流公司编码 */
     private String deliveryCode;
-
+    @Excel(name = "物流公司名称")
     /** 物流公司名称 */
     private String deliveryName;
 
@@ -97,7 +96,7 @@ public class MergedOrderVO implements Serializable
     /** 支付时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date payTime;
-
+    @Excel(name = "发货时间")
     /** 发货时间 */
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date deliverySendTime;
@@ -111,13 +110,13 @@ public class MergedOrderVO implements Serializable
     private Integer orderType;
 //    汇付商户订单号
     private String hfshh;
-
+    @Excel(name = "订单类型名称")
     /** 订单类型名称 */
     private String orderTypeName;
-
+    @Excel(name = "公司名称")
     /** 公司名称 */
     private String companyName;
-
+    @Excel(name = "销售名称")
     /** 销售名称(company_user表的user_name) */
     private String salesName;
 
@@ -167,6 +166,7 @@ public class MergedOrderVO implements Serializable
     private String productSpec;
 
     /** 商品编码 */
+    @Excel(name = "商品编码")
     private String barCode;
 
     /** 商品分类 */

+ 104 - 0
fs-service/src/main/resources/application-config-dev-xcsw.yml

@@ -0,0 +1,104 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx94951f52d3ac5e25   #北京存在文化
+        secret: bfe27b20c6e3c4232a1d4ef36228e84b #北京存在文化
+        token: Ncbnd7lJvkripxxna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwa46ffb9ff6ac35b8 #企业ID北京存在文化
+    appConfigs:
+      - agentId: 1000070       #北京存在文化
+        secret: pu2EFz6gY2Fo2K-aRUxLPaAkKIaMJJRp8ES9JdpHkp4 #北京存在文化
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+#      - appId: wxce847c8ebe5e62aa # 第一个公众号的appid  //公众号名称:济南联智健康
+#        secret: 37f7c5e3b7ff07794343957f7ced8de4 # 公众号的appsecret--济南联智健康
+      - appId: wxd6905bed94e45ef0 # 第一个公众号的appid  //公众号名称:济南联智健康
+        secret: c1a042a55bac24033535da50ce8ab6a2 # 公众号的appsecret--济南联智健康
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://10.206.0.12:7771
+  h5CommonApi: http://10.206.0.12:7771
+  jwt:
+    # 加密秘钥
+    secret: 3e6d9c0b4a7f1e2d5c4e0d3c6b9a2f5e
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: shdn-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: shdn
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 星辰生物
+  projectCode: XCSW
+  spaceName: shdn-20251226
+  volcengineUrl: https://shdnjbvolcengine.ylrztop.com
+headerImg:
+  imgUrl:
+
+ipad:
+  ipadUrl: http://ipad.ljhehualu.com
+  aiApi: http://49.232.181.28:3000/api
+  voiceApi: http://129.28.187.88:8667
+  commonApi: http://129.28.187.88:7771
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+
+

+ 104 - 0
fs-service/src/main/resources/application-config-druid-xcsw.yml

@@ -0,0 +1,104 @@
+baidu:
+  token: 12313231232
+  back-domain: https://www.xxxx.com
+#配置
+logging:
+  level:
+    org.springframework.web: INFO
+    com.github.binarywang.demo.wx.cp: DEBUG
+    me.chanjar.weixin: DEBUG
+wx:
+  miniapp:
+    configs:
+      - appid: wx94951f52d3ac5e25   #北京存在文化
+        secret: bfe27b20c6e3c4232a1d4ef36228e84b #北京存在文化
+        token: Ncbnd7lJvkripxxna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
+  cp:
+    corpId: wwa46ffb9ff6ac35b8 #企业ID北京存在文化
+    appConfigs:
+      - agentId: 1000070       #北京存在文化
+        secret: pu2EFz6gY2Fo2K-aRUxLPaAkKIaMJJRp8ES9JdpHkp4 #北京存在文化
+        token: PPKOdAlCoMO
+        aesKey: PKvaxtpSv8NGpfTDm7VUHIK8Wok2ESyYX24qpXJAdMP
+  pay:
+    appId:  #微信公众号或者小程序等的appid
+    mchId:  #微信支付商户号
+    mchKey:  #微信支付商户密钥
+    subAppId:  #服务商模式下的子商户公众账号ID
+    subMchId:  #服务商模式下的子商户号
+    keyPath: c:\\cert\\apiclient_cert.p12 # p12证书的位置,可以指定绝对路径,也可以指定类路径(以classpath:开头)
+    notifyUrl: https://userapp.his.runtzh.com/app/wxpay/wxPayNotify
+  mp:
+    useRedis: false
+    redisConfig:
+      host: 127.0.0.1
+      port: 6379
+      timeout: 2000
+    configs:
+#      - appId: wxce847c8ebe5e62aa # 第一个公众号的appid  //公众号名称:济南联智健康
+#        secret: 37f7c5e3b7ff07794343957f7ced8de4 # 公众号的appsecret--济南联智健康
+      - appId: wxd6905bed94e45ef0 # 第一个公众号的appid  //公众号名称:济南联智健康
+        secret: c1a042a55bac24033535da50ce8ab6a2 # 公众号的appsecret--济南联智健康
+        token: PPKOdAlCoMO # 接口配置里的Token值
+        aesKey: Eswa6VjwtVMCcw03qZy6fWllgrv5aytIA1SZPEU0kU2 # 接口配置里的EncodingAESKey值
+aifabu:  #爱链接
+  appKey: 7b471be905ab17e00f3b858c6710dd117601d008
+watch:
+  watchUrl: watch.ylrzcloud.com/prod-api
+  #  account: tcloud
+  #  password: mdf-m2h_6yw2$hq
+  account1: ccif #866655060138751
+  password1: cp-t5or_6xw7$mt
+  account2: tcloud #rt500台
+  password2: mdf-m2h_6yw2$hq
+  account3: whr
+  password3: v9xsKuqn_$d2y
+
+fs :
+  commonApi: http://10.206.0.12:7771
+  h5CommonApi: http://10.206.0.12:7771
+  jwt:
+    # 加密秘钥
+    secret: 3e6d9c0b4a7f1e2d5c4e0d3c6b9a2f5e
+    # token有效时长,7天,单位秒
+    expire: 31536000
+    header: AppToken
+nuonuo:
+  key: 10924508
+  secret: A2EB20764D304D16
+
+# 存储捅配置
+tencent_cloud_config:
+  secret_id: AKIDiMq9lDf2EOM9lIfqqfKo7FNgM5meD0sT
+  secret_key: u5SuS80342xzx8FRBukza9lVNHKNMSaB
+  bucket: xcsw-1323137866
+  app_id: 1323137866
+  region: ap-chongqing
+  proxy: xcsw
+tmp_secret_config:
+  secret_id: AKIDCj7NSNAovtqeJpBau8GZ4CGB71thXIxX
+  secret_key: lTB5zwqqz7CNhzDOWivFWedgfTBgxgBT
+  bucket: fs-1319721001
+  app_id: 1319721001
+  region: ap-chongqing
+  proxy: fs
+cloud_host:
+  company_name: 星辰生物
+  projectCode: XCSW
+  spaceName: xcsw-2114522511
+  volcengineUrl: https://xcswvolcengine.ylrztop.com
+headerImg:
+  imgUrl:
+
+ipad:
+  ipadUrl: http://ipad.ljhehualu.com
+  aiApi: http://49.232.181.28:3000/api
+  voiceApi: http://129.28.187.88:8667
+  commonApi: http://129.28.187.88:7771
+wx_miniapp_temp:
+  pay_order_temp_id:
+  inquiry_temp_id:
+
+

+ 165 - 0
fs-service/src/main/resources/application-dev-xcsw.yml

@@ -0,0 +1,165 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-xcsw,common
+    # redis 配置
+    redis:
+        host: 127.0.0.1
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password:
+        # 连接超时时间
+        timeout: 30s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+#        clickhouse:
+#            type: com.alibaba.druid.pool.DruidDataSource
+#            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+#            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+#            username: rt_2024
+#            password: Yzx_19860213
+#            initialSize: 10
+#            maxActive: 100
+#            minIdle: 10
+#            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                  url: jdbc:mysql://1.95.187.223:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                  username: root
+                  password: Ylrztek250218!3@.
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://1.95.187.223:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-33namm2jeq.rocketmq.nj.qcloud.tencenttdmq.com:8080
+    producer:
+        group: my-producer-group
+        access-key: ak33namm2jeq90148878a325 # 替换为实际的 accessKey
+        secret-key: sk0256ccecd9f96742 # 替换为实际的 secretKey
+    consumer:
+        group: common-group
+        access-key: ak33namm2jeq90148878a325 # 替换为实际的 accessKey
+        secret-key: sk0256ccecd9f96742 # 替换为实际的 secretKey
+openIM:
+    secret: openIM123
+    userID: imAdmin
+    url: https://web.im.fbylive.com/api
+#是否使用新im
+im:
+    type: NONE
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: false
+qw:
+    enableAutoTag: 1
+tag:
+    thread:
+        num: 10
+    rate:
+        limit: 50
+

+ 165 - 0
fs-service/src/main/resources/application-druid-xcsw.yml

@@ -0,0 +1,165 @@
+# 数据源配置
+spring:
+    profiles:
+        include: config-druid-xcsw,common
+    # redis 配置
+    redis:
+        host: 192.168.0.216
+        port: 6379
+        # 数据库索引
+        database: 0
+        # 密码
+        password: Ylrztek250218!3@.
+        # 连接超时时间
+        timeout: 30s
+        lettuce:
+            pool:
+                # 连接池中的最小空闲连接
+                min-idle: 0
+                # 连接池中的最大空闲连接
+                max-idle: 8
+                # 连接池的最大数据库连接数
+                max-active: 100
+                # #连接池最大阻塞等待时间(使用负值表示没有限制)
+                max-wait: -1ms
+    datasource:
+#        clickhouse:
+#            type: com.alibaba.druid.pool.DruidDataSource
+#            driverClassName: com.clickhouse.jdbc.ClickHouseDriver
+#            url: jdbc:clickhouse://1.14.104.71:8123/sop_test?compress=0&use_server_time_zone=true&use_client_time_zone=false&timezone=Asia/Shanghai
+#            username: rt_2024
+#            password: Yzx_19860213
+#            initialSize: 10
+#            maxActive: 100
+#            minIdle: 10
+#            maxWait: 6000
+        mysql:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                  url: jdbc:mysql://192.168.0.43:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                  username: root
+                  password: Ylrztek250218!3@.
+                # 从库数据源
+                slave:
+                    # 从数据源开关/默认关闭
+                    enabled: false
+                    url:
+                    username:
+                    password:
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+        sop:
+            type: com.alibaba.druid.pool.DruidDataSource
+            driverClassName: com.mysql.cj.jdbc.Driver
+            druid:
+                # 主库数据源
+                master:
+                    url: jdbc:mysql://192.168.0.43:3306/fs_his_sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                    username: root
+                    password: Ylrztek250218!3@.
+                # 初始连接数
+                initialSize: 5
+                # 最小连接池数量
+                minIdle: 10
+                # 最大连接池数量
+                maxActive: 20
+                # 配置获取连接等待超时的时间
+                maxWait: 60000
+                # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+                timeBetweenEvictionRunsMillis: 60000
+                # 配置一个连接在池中最小生存的时间,单位是毫秒
+                minEvictableIdleTimeMillis: 300000
+                # 配置一个连接在池中最大生存的时间,单位是毫秒
+                maxEvictableIdleTimeMillis: 900000
+                # 配置检测连接是否有效
+                validationQuery: SELECT 1 FROM DUAL
+                testWhileIdle: true
+                testOnBorrow: false
+                testOnReturn: false
+                webStatFilter:
+                    enabled: true
+                statViewServlet:
+                    enabled: true
+                    # 设置白名单,不填则允许所有访问
+                    allow:
+                    url-pattern: /druid/*
+                    # 控制台管理用户名和密码
+                    login-username: fs
+                    login-password: 123456
+                filter:
+                    stat:
+                        enabled: true
+                        # 慢SQL记录
+                        log-slow-sql: true
+                        slow-sql-millis: 1000
+                        merge-sql: true
+                    wall:
+                        config:
+                            multi-statement-allow: true
+rocketmq:
+    name-server: rmq-33namm2jeq.rocketmq.nj.qcloud.tencenttdmq.com:8080
+    producer:
+        group: my-producer-group
+        access-key: ak33namm2jeq90148878a325 # 替换为实际的 accessKey
+        secret-key: sk0256ccecd9f96742 # 替换为实际的 secretKey
+    consumer:
+        group: common-group
+        access-key: ak33namm2jeq90148878a325 # 替换为实际的 accessKey
+        secret-key: sk0256ccecd9f96742 # 替换为实际的 secretKey
+openIM:
+    secret: openIM123
+    userID: imAdmin
+    url: https://web.im.fbylive.com/api
+#是否使用新im
+im:
+    type: NONE
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: false
+qw:
+    enableAutoTag: 1
+tag:
+    thread:
+        num: 10
+    rate:
+        limit: 50
+

+ 2 - 2
fs-service/src/main/resources/mapper/hisStore/MergedOrderMapper.xml

@@ -46,7 +46,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         fss.store_id as storeId,
         fss.store_name as storeName,
         fspcs.cate_name as cateName,
-        GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(o.item_json, '$.barCode')) SEPARATOR ',') AS barCode,
+        GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(item_latest.json_info, '$.barCode')) SEPARATOR ',') AS barCode,
 
       c.company_name,
       cu.user_name AS sales_name,
@@ -191,7 +191,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     fss.store_id as storeId,
     fss.store_name as storeName,
     fspcs.cate_name as cateName,
-    GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(o.item_json, '$.barCode')) SEPARATOR ',') AS barCode,
+    GROUP_CONCAT(JSON_UNQUOTE(JSON_EXTRACT(item_latest.json_info, '$.barCode')) SEPARATOR ',') AS barCode,
 
       c.company_name,
       cu.user_name AS sales_name,

+ 21 - 0
fs-user-app/src/main/java/com/fs/app/controller/live/LiveController.java

@@ -15,10 +15,19 @@ import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.bean.BeanUtils;
 import com.fs.common.utils.http.HttpUtils;
+import com.fs.company.domain.Company;
+import com.fs.company.domain.CompanyMoneyLogs;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyMapper;
+import com.fs.company.mapper.CompanyMoneyLogsMapper;
 import com.fs.company.service.ICompanyService;
+import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.service.ICompanyUserService;
+import com.fs.hisStore.domain.FsStoreOrderScrm;
+import com.fs.hisStore.service.IFsStoreOrderScrmService;
+import com.fs.live.domain.LiveOrder;
+import java.math.BigDecimal;
+import java.util.Date;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.ErpOrderQueryRequert;
@@ -90,6 +99,16 @@ public class LiveController extends AppBaseController {
     private com.fs.live.mapper.LiveUserFirstEntryMapper liveUserFirstEntryMapper;
     @Autowired
     private com.fs.live.mapper.LiveOrderMapper liveOrderMapper;
+    @Autowired
+    private ICompanyService companyService;
+    @Autowired
+    private ICompanyMoneyLogsService companyMoneyLogsService;
+    @Autowired
+    private CompanyMoneyLogsMapper companyMoneyLogsMapper;
+    @Autowired
+    private CompanyMapper companyMapper;
+    @Autowired
+    private IFsStoreOrderScrmService fsStoreOrderScrmService;
 
 	/**
 	 * 查询未结束直播间(销售专用)
@@ -393,4 +412,6 @@ public class LiveController extends AppBaseController {
 	}
 
 
+
+
 }

+ 45 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -239,6 +239,50 @@ public class ProductScrmController extends AppBaseController {
                 .put("purchasedNum", purchasedNum); // 已购买数量
     }
 
+    @Login
+    @ApiOperation("检查商品限购")
+    @GetMapping("/checkPurchaseLimit")
+    public R checkPurchaseLimit(@RequestParam(value="productId") Long productId){
+        try {
+            // 查询商品信息
+            FsStoreProductScrm product = productService.selectFsStoreProductById(productId);
+            if(product == null){
+                return R.error("商品不存在");
+            }
+            
+            // 检查是否限购
+            if(product.getPurchaseLimit() == null || product.getPurchaseLimit() <= 0){
+                // 商品不限购,直接返回成功
+                return R.ok();
+            }
+            
+            // 商品有限购,查询用户已购买数量
+            String userId = getUserId();
+            if(userId == null){
+                return R.error("用户未登录");
+            }
+            
+            FsStoreProductPurchaseLimitScrm purchaseLimit = purchaseLimitService.selectByProductIdAndUserId(
+                    productId, Long.parseLong(userId));
+            int purchasedNum = 0;
+            if (purchaseLimit != null) {
+                purchasedNum = purchaseLimit.getNum();
+            }
+            
+            // 计算剩余可购买数量
+            int remainingPurchaseLimit = product.getPurchaseLimit() - purchasedNum;
+            if (remainingPurchaseLimit <= 0) {
+                // 剩余可购买数量不足
+                return R.error("该商品限购" + product.getPurchaseLimit() + "件,目前剩余可购买数量不足");
+            }
+            
+            // 剩余可购买数量充足
+            return R.ok();
+        } catch (Exception e){
+            return R.error("检查限购失败:" + e.getMessage());
+        }
+    }
+
     @Login
     @ApiOperation("添加购物车")
     @PostMapping("/addCart")
@@ -266,6 +310,7 @@ public class ProductScrmController extends AppBaseController {
     }
 
 
+
     @Login
     @ApiOperation("获取商品购物车数量")
     @GetMapping("/getCartCount")