Просмотр исходного кода

Merge remote-tracking branch 'origin/master'

lk 1 неделя назад
Родитель
Сommit
d694d13677
24 измененных файлов с 183 добавлено и 27 удалено
  1. 8 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  2. 20 13
      fs-common/src/main/java/com/fs/common/core/redis/service/StockDeductService.java
  3. 1 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyRedPacketBalanceLogsController.java
  4. 2 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyRechargeMapper.java
  5. 3 0
      fs-service/src/main/java/com/fs/company/vo/CompanyRechargeVO.java
  6. 7 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  7. 2 1
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  8. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  9. 1 1
      fs-service/src/main/java/com/fs/qw/domain/QwTag.java
  10. 1 1
      fs-service/src/main/java/com/fs/qw/domain/QwTagGroup.java
  11. 3 0
      fs-service/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java
  12. 1 1
      fs-service/src/main/java/com/fs/qw/vo/QwTagGroupAddParam.java
  13. 1 1
      fs-service/src/main/java/com/fs/qw/vo/QwTagGroupListVO.java
  14. 1 1
      fs-service/src/main/java/com/fs/qw/vo/QwTagVO.java
  15. 1 1
      fs-service/src/main/java/com/fs/qwApi/domain/inner/InTag.java
  16. 1 1
      fs-service/src/main/java/com/fs/qwApi/domain/inner/TagData.java
  17. 1 1
      fs-service/src/main/java/com/fs/qwApi/domain/inner/TagGroup.java
  18. 1 1
      fs-service/src/main/java/com/fs/qwApi/param/QwAddTagParam.java
  19. 1 1
      fs-service/src/main/java/com/fs/qwApi/param/QwEditTagParam.java
  20. 1 0
      fs-service/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java
  21. 1 1
      fs-service/src/main/resources/application-druid-ylrz.yml
  22. 6 1
      fs-service/src/main/resources/mapper/company/CompanyRechargeMapper.xml
  23. 113 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  24. 1 1
      fs-user-app/src/test/java/com/fs/test/StockDeductTest.java

+ 8 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -22,6 +22,7 @@ import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.company.param.CompanyStoreOrderMoneyLogsListParam;
 import com.fs.company.service.ICompanyMoneyLogsService;
 import com.fs.company.vo.CompanyStoreOrderMoneyLogsVO;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.erp.domain.ErpDeliverys;
 import com.fs.erp.domain.ErpOrderQuery;
 import com.fs.erp.dto.ErpOrderQueryRequert;
@@ -101,6 +102,9 @@ public class FsStoreOrderScrmController extends BaseController {
     @Autowired
     IFsStorePaymentScrmService paymentService;
 
+    @Autowired
+    private CloudHostProper cloudHostProper;
+
     @Autowired
     private ICompanyMoneyLogsService moneyLogsService;
     @Autowired
@@ -902,6 +906,10 @@ public class FsStoreOrderScrmController extends BaseController {
      * **/
     @GetMapping("/orderDimensionStatisticsList")
     public TableDataInfo orderDimensionStatisticsList(OrderStatisticsParam param){
+        // 郑多燕需求
+        if("广州郑多燕".equals(cloudHostProper.getCompanyName())){
+            return getDataTable(fsStoreOrderService.selectZDYOrderSaleStatisticsList(param));
+        }
         return getDataTable(fsStoreOrderService.selectOrderDimensionStatisticsList(param));
     }
 

+ 20 - 13
fs-common/src/main/java/com/fs/common/core/redis/service/StockDeductService.java

@@ -1,6 +1,7 @@
 package com.fs.common.core.redis.service;
 
 import com.fs.common.constant.RedisConstant;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.data.redis.core.script.DefaultRedisScript;
 import org.springframework.stereotype.Service;
@@ -16,6 +17,7 @@ import java.util.stream.IntStream;
 /**
  * 高并发库存扣减服务(Java 8 + Redis分布式锁)
  */
+@Slf4j
 @Service
 public class StockDeductService {
 
@@ -54,7 +56,7 @@ public class StockDeductService {
     public void initStock(Long productId, Integer initStock) {
         String stockKey = RedisConstant.STOCK_KEY_PREFIX + productId;
         redisTemplate.opsForValue().set(stockKey, initStock, 24 * 60 * 60, TimeUnit.SECONDS);
-        System.out.println("商品" + productId + "库存初始化完成,初始库存:" + initStock);
+        log.info("商品" + productId + "库存初始化完成,初始库存:" + initStock);
     }
 
     /**
@@ -64,7 +66,7 @@ public class StockDeductService {
      * @param deductNum 扣减数量(默认1)
      * @return 扣减结果:true=成功,false=失败
      */
-    public CompletableFuture<Boolean> deductStockAsync(Long productId, Integer deductNum) {
+    public CompletableFuture<Boolean> deductStockAsync(Long productId, Integer deductNum, Long userId) {
         // Java 8 CompletableFuture 异步处理,提升高并发吞吐量
         return CompletableFuture.supplyAsync(() -> {
             // 1. 参数校验(Java 8 Optional 空值处理)
@@ -72,13 +74,10 @@ public class StockDeductService {
             String stockKey = RedisConstant.STOCK_KEY_PREFIX + productId;
             String lockKey = RedisConstant.LOCK_KEY_PREFIX + productId;
 
-            // 2. 生成锁持有者唯一标识(UUID + 线程ID,避免误释放)
-            String lockOwner = UUID.randomUUID().toString() + "-" + Thread.currentThread().getId();
-
             // 3. 尝试获取分布式锁(非阻塞重试,Java 8 Stream API 实现重试)
 // 3. 尝试获取分布式锁(优化:加入随机延迟,避免惊群效应)
             boolean isLockAcquired = IntStream.range(0, RedisConstant.LOCK_MAX_RETRY).anyMatch(retryCount -> {
-                Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, lockOwner, RedisConstant.LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
+                Boolean result = redisTemplate.opsForValue().setIfAbsent(lockKey, userId, RedisConstant.LOCK_EXPIRE_SECONDS, TimeUnit.SECONDS);
                 if (Boolean.TRUE.equals(result)) {
                     return true;
                 }
@@ -102,7 +101,7 @@ public class StockDeductService {
                 // 5. 执行库存扣减Lua脚本(原子操作,防超卖)
                 // 新增日志:打印当前库存值和扣减数量
                 Integer currentStockStr = (Integer) redisTemplate.opsForValue().get(stockKey);
-                System.out.println("拿到锁成功 → 库存Key:" + stockKey + ",当前库存值:" + currentStockStr + ",扣减数量:" + num);
+                log.info("拿到锁成功 → 库存Key:{},当前库存值:{},扣减数量:{}", stockKey, currentStockStr, num);
 
                 // 执行库存扣减Lua脚本
                 Long remainingStock = redisTemplate.execute(
@@ -112,20 +111,28 @@ public class StockDeductService {
                 );
 
                 // 新增日志:打印Lua返回结果
-                System.out.println("Lua脚本返回值:" + remainingStock);
+                log.info("Lua脚本返回值:{}", remainingStock);
 
                 // 6. 判断扣减结果
-                if (remainingStock != null && remainingStock >= 0) {
-                    System.out.println("商品" + productId + "库存扣减成功,剩余库存:" + remainingStock);
+                if (remainingStock >= 0) {
+                    log.info("商品{}库存扣减成功,剩余库存:{}", productId, remainingStock);
                     return true;
                 } else {
-                    System.err.println("商品" + productId + "库存不足,扣减失败");
+                    String errorMsg = "";
+                    switch (remainingStock.intValue()) {
+                        case -1: errorMsg = "库存不足"; break;
+                        case -2: errorMsg = "库存Key不存在"; break;
+                        case -3: errorMsg = "库存值非数字"; break;
+                        case -4: errorMsg = "扣减数量无效"; break;
+                        default: errorMsg = "未知错误,错误码:" + remainingStock;
+                    }
+                    log.info("商品{}扣减失败:{}", productId, errorMsg);
                     return false;
                 }
             } finally {
                 // 7. 释放分布式锁(Lua脚本保证原子性,仅释放自己持有的锁)
-                redisTemplate.execute(LOCK_RELEASE_SCRIPT, Collections.singletonList(lockKey), lockOwner);
-                System.out.println("商品" + productId + "锁释放成功,持有者:" + lockOwner);
+                redisTemplate.execute(LOCK_RELEASE_SCRIPT, Collections.singletonList(lockKey), userId);
+                log.info("商品{}锁释放成功,持有者:{}", productId, userId);
             }
         });
     }

+ 1 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyRedPacketBalanceLogsController.java

@@ -108,6 +108,7 @@ public class CompanyRedPacketBalanceLogsController extends BaseController {
         redRecharge.setRemark(param.getRemark());
         redRecharge.setPayType(3);
         redRecharge.setBusinessType(1);// 红包充值
+        redRecharge.setImgs(param.getImgs());// 红包充值
         rechargeService.insertCompanyRecharge(redRecharge);
         return R.ok("提交成功,等待审核");
 

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyRechargeMapper.java

@@ -98,8 +98,10 @@ public interface CompanyRechargeMapper
             "order by r.recharge_id desc " +
             "</script>"})
     List<CompanyRechargeVO> selectCompanyRechargeVOList(@Param("maps")CompanyRecharge companyRecharge);
+
     @Select("select * from company_recharge where recharge_no=#{no}")
     CompanyRecharge selectCompanyRechargeByNo(String no);
+
     @Select("select sum(money) from company_recharge where status=1")
     BigDecimal selectCompanyRechargeMoney();
 

+ 3 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyRechargeVO.java

@@ -85,6 +85,9 @@ public class CompanyRechargeVO implements Serializable {
     @Excel(name = "备注")
     private String remark;
 
+    @Excel(name = "凭证")
+    private String imgs;
+
     /** 业务类型 0-普通 1-红包充值 */
     private Integer businessType;
 

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -1088,6 +1088,13 @@ public interface FsStoreOrderScrmMapper
      * **/
     List<OrderStatisticsVo> selectOrderSaleStatisticsList(@Param("param") OrderStatisticsParam param);
 
+    /**
+     * 郑多燕订单销售维度分页查询接口
+     * @param param 查询条件
+     * @return List<OrderStatisticsVo>
+     * **/
+    List<OrderStatisticsVo> selectZDYOrderSaleStatisticsList(@Param("param") OrderStatisticsParam param);
+
     List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map);
 
     List<FsStoreOrderScrm> computePayMoney(@Param("customerIds")List<Long> customerIds);

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java

@@ -12,7 +12,6 @@ import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyUser;
 import com.fs.course.dto.FsOrderDeliveryNoteDTO;
 import com.fs.erp.domain.ErpOrder;
-import com.fs.his.domain.FsStorePayment;
 import com.fs.his.dto.FsStoreOrderAmountScrmStatsQueryDto;
 import com.fs.his.param.FsStoreOrderSalesParam;
 import com.fs.his.vo.FsStoreOrderAmountScrmStatsVo;
@@ -251,6 +250,8 @@ public interface IFsStoreOrderScrmService
      * **/
     List<OrderStatisticsVo> selectOrderDimensionStatisticsList(OrderStatisticsParam param);
 
+    List<OrderStatisticsVo> selectZDYOrderSaleStatisticsList(OrderStatisticsParam param);
+
     List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map,Long deptId);
 
     R updateSalesOrderMoneyByProduct(FsStoreOrderMoneyByProductParam param);

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

@@ -3621,6 +3621,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 //        }
     }
 
+    @Override
+    public List<OrderStatisticsVo> selectZDYOrderSaleStatisticsList(OrderStatisticsParam param) {
+        return fsStoreOrderMapper.selectZDYOrderSaleStatisticsList(param);
+    }
+
     @Override
     public List<FsStoreOrderCountsVO> selectFsStoreOrderCountsByDept(Map<String, Object> map, Long deptId) {
         List<FsStoreOrderCountsVO> vos = fsStoreOrderMapper.selectFsStoreOrderCountsByDept(map);

+ 1 - 1
fs-service/src/main/java/com/fs/qw/domain/QwTag.java

@@ -36,7 +36,7 @@ public class QwTag extends BaseEntity
 
     /** 排序 */
     @Excel(name = "排序")
-    private Integer order;
+    private Long order;
 
     /** 企业id */
     @Excel(name = "企业id")

+ 1 - 1
fs-service/src/main/java/com/fs/qw/domain/QwTagGroup.java

@@ -29,7 +29,7 @@ public class QwTagGroup extends BaseEntity
 
     /** 排序 */
     @Excel(name = "排序")
-    private Integer order;
+    private Long order;
 
     /** 企业id */
     @Excel(name = "企业id")

+ 3 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwWatchLogMapper.java

@@ -108,6 +108,9 @@ public interface QwWatchLogMapper extends BaseMapper<QwWatchLog>{
             "<if test ='companyUserId !=null and companyUserId!=\"\"'>\n" +
             "   and qu.company_user_id =#{companyUserId} \n" +
             "</if>" +
+            "<if test ='corpId !=null and corpId!=\"\"'>\n" +
+            "   and qu.corp_id =#{corpId} \n" +
+            "</if>" +
             "<if test ='ids !=null and ids!=\"\"'>\n" +
             "   and qec.qw_user_id in (${ids})\n" +
             "</if>" +

+ 1 - 1
fs-service/src/main/java/com/fs/qw/vo/QwTagGroupAddParam.java

@@ -22,7 +22,7 @@ public class QwTagGroupAddParam {
 
     /** 排序 */
     @Excel(name = "排序")
-    private Integer order;
+    private Long order;
 
     /** 企业id */
     @Excel(name = "企业id")

+ 1 - 1
fs-service/src/main/java/com/fs/qw/vo/QwTagGroupListVO.java

@@ -21,7 +21,7 @@ public class QwTagGroupListVO {
 
     /** 排序 */
     @Excel(name = "排序")
-    private Integer order;
+    private Long order;
 
     /** 企业id */
     @Excel(name = "企业id")

+ 1 - 1
fs-service/src/main/java/com/fs/qw/vo/QwTagVO.java

@@ -21,7 +21,7 @@ public class QwTagVO {
 
     /** 排序 */
     @Excel(name = "排序")
-    private Integer order;
+    private Long order;
 
     /**
      * 标签来源 0/null:其他应用 1:当前应用

+ 1 - 1
fs-service/src/main/java/com/fs/qwApi/domain/inner/InTag.java

@@ -7,6 +7,6 @@ public class InTag {
     private String id;
     private String name;
     private long create_time;
-    private int order;
+    private Long order;
     private boolean deleted;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/qwApi/domain/inner/TagData.java

@@ -5,5 +5,5 @@ import lombok.Data;
 @Data
 public class TagData {
     private String name;
-    private int order;
+    private Long order;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/qwApi/domain/inner/TagGroup.java

@@ -9,7 +9,7 @@ public class TagGroup {
     private String group_id;
     private String group_name;
     private long create_time;
-    private int order;
+    private Long order;
     private boolean deleted;
     private List<InTag> tag;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/qwApi/param/QwAddTagParam.java

@@ -10,6 +10,6 @@ public class QwAddTagParam {
     private int strategy_id;
     private String group_id;
     private String group_name;
-    private int order;
+    private Long order;
     private List<TagData> tag;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/qwApi/param/QwEditTagParam.java

@@ -6,5 +6,5 @@ import lombok.Data;
 public class QwEditTagParam {
     private String id;
     private String name;
-    private int order;
+    private Long order;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/qwApi/service/impl/QwApiServiceImpl.java

@@ -1622,6 +1622,7 @@ public class QwApiServiceImpl implements QwApiService {
     @Override
     public QwTagResult getTag(QwTagParam param,String corpId) {
         String json = sendPost(QwApiConfig.getTagUrl, param,corpId);
+        log.error("json={}",json);
         QwTagResult qwResult = JSON.parseObject(json, QwTagResult.class);
         return qwResult;
     }

+ 1 - 1
fs-service/src/main/resources/application-druid-ylrz.yml

@@ -161,7 +161,7 @@ token:
 im:
     type: NONE
 #是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: false
+isNewWxMerchant: true
 qw:
     enableAutoTag: 1
 tag:

+ 6 - 1
fs-service/src/main/resources/mapper/company/CompanyRechargeMapper.xml

@@ -21,10 +21,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="auditTime"    column="audit_time"    />
         <result property="remark"    column="remark"    />
         <result property="businessType"    column="business_type"    />
+        <result property="imgs"    column="imgs"    />
     </resultMap>
 
     <sql id="selectCompanyRechargeVo">
-        select recharge_id, company_id, recharge_no, money, create_time, pay_time, status, pay_type, trade_no, balance, create_user_id, is_audit, audit_user_id, audit_time,remark, business_type from company_recharge
+        select recharge_id, company_id, recharge_no, money, create_time, pay_time, status, pay_type, trade_no, balance, create_user_id, is_audit, audit_user_id, audit_time,remark, business_type,imgs from company_recharge
     </sql>
 
     <select id="selectCompanyRechargeList" parameterType="CompanyRecharge" resultMap="CompanyRechargeResult">
@@ -42,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isAudit != null "> and is_audit = #{isAudit}</if>
             <if test="auditUserId != null "> and audit_user_id = #{auditUserId}</if>
             <if test="auditTime != null "> and audit_time = #{auditTime}</if>
+            <if test="imgs != null "> and imgs = #{imgs}</if>
         </where>
     </select>
 
@@ -68,6 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="auditTime != null">audit_time,</if>
             <if test="remark != null">remark,</if>
             <if test="businessType != null">business_type,</if>
+            <if test="imgs != null">imgs,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyId != null">#{companyId},</if>
@@ -85,6 +88,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="auditTime != null">#{auditTime},</if>
             <if test="remark != null">#{remark},</if>
             <if test="businessType != null">#{businessType},</if>
+            <if test="imgs != null">#{imgs},</if>
          </trim>
     </insert>
 
@@ -105,6 +109,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="auditUserId != null">audit_user_id = #{auditUserId},</if>
             <if test="auditTime != null">audit_time = #{auditTime},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="imgs != null">imgs = #{imgs},</if>
         </trim>
         where recharge_id = #{rechargeId}
     </update>

+ 113 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -785,6 +785,119 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         ) a ORDER BY
         a.company_id DESC,a.totalNum DESC
     </select>
+
+
+    <select id="selectZDYOrderSaleStatisticsList" resultType="com.fs.hisStore.vo.OrderStatisticsVo">
+        SELECT * FROM (  SELECT
+        cu.user_id,
+        cu.user_name,
+        cu.nick_name,
+        c.company_name,
+        c.company_id,
+        SUM(fso.`status` > 0) AS totalNum,
+        SUM(
+        CASE
+        WHEN fso.`status` > 0 THEN
+        fso.pay_delivery + fso.pay_money
+        ELSE
+        0
+        END
+        ) totalPrice,
+        SUM(fso.`status` > 0) AS dealNum,
+        SUM(
+        CASE
+        WHEN fso.`status` > 0 THEN
+        fso.pay_money
+        ELSE
+        0
+        END
+        ) AS dealPrice,
+        SUM(
+        CASE
+        WHEN fso.`status` > 0
+        THEN
+        fso.pay_delivery
+        ELSE
+        0
+        END
+        ) AS invoicePrice,
+        IFNULL(
+        SUM(
+        fso.`status` = 3
+        ),
+        0
+        ) AS signForNum,
+        SUM(
+        CASE
+        WHEN fso.`status` = 3
+        THEN
+        fso.pay_delivery + fso.pay_money
+        ELSE
+        0
+        END
+        ) AS signFPrice,
+        SUM(
+        fso.`status` = -2
+        ) AS chargebackNum,
+        SUM(
+        CASE
+        WHEN fso.`status` = -2
+        THEN
+        fso.pay_money
+        ELSE
+        0
+        END
+        ) AS chargebackPrice
+        FROM
+        company_user cu
+        INNER JOIN company c ON cu.company_id = c.company_id
+        LEFT JOIN fs_store_order_scrm fso ON cu.user_id = fso.company_user_id
+        INNER JOIN fs_store_order_item_scrm fsoi ON fso.id = fsoi.order_id
+        INNER JOIN fs_store_product_scrm fsp ON fsoi.product_id = fsp.product_id
+        INNER JOIN fs_store_product_category_scrm fspc ON fspc.cate_id = fsp.cate_id
+        WHERE
+        fso.is_del = '0'
+        AND fso.`status` != 0
+        <if test="param.companyId != null and param.companyId != ''">
+            AND  c.company_id = #{param.companyId}
+        </if>
+
+        <if test="param.userName != null and param.userName != ''">
+            AND cu.user_name Like CONCAT('%',#{param.userName},'%')
+        </if>
+
+        <if test="param.companyUser != null and param.companyUser != ''">
+            AND cu.nick_name Like CONCAT('%',#{param.companyUser},'%')
+        </if>
+
+        <if test="param.productId != null and param.productId != ''">
+            AND fsp.product_id = #{param.productId}
+        </if>
+
+        <if test="param.productName != null and param.productName != ''">
+            AND fsp.product_name Like CONCAT('%',#{param.productName},'%')
+        </if>
+
+        <if test="param.cateName != null and param.cateName != ''">
+            AND fspc.cate_name Like CONCAT('%',#{param.cateName},'%')
+        </if>
+
+        <if test="param.cateId != null and param.cateId != ''">
+            AND fspc.cate_id = #{param.cateId}
+        </if>
+
+        <if test="param.startDate != null">
+            AND DATE_FORMAT(fso.pay_time,'%Y-%m') >= DATE_FORMAT(#{param.startDate},'%Y-%m')
+        </if>
+
+        <if test="param.endDate != null">
+            AND DATE_FORMAT(fso.pay_time,'%Y-%m') &lt;= DATE_FORMAT(#{param.endDate},'%Y-%m')
+        </if>
+        GROUP BY
+        cu.user_id
+        ) a ORDER BY
+        a.company_id DESC,a.totalNum DESC
+    </select>
     <select id="selectFsStoreOrderCountsByDept" resultType="com.fs.hisStore.vo.FsStoreOrderCountsVO">
         SELECT
         o.dept_id,

+ 1 - 1
fs-user-app/src/test/java/com/fs/test/StockDeductTest.java

@@ -48,7 +48,7 @@ public class StockDeductTest {
 
         // 提交50万请求
         for (int i = 0; i < TOTAL_REQUESTS; i++) {
-            futureList.add(stockDeductService.deductStockAsync(PRODUCT_ID, 1));
+            futureList.add(stockDeductService.deductStockAsync(PRODUCT_ID, 1, (long) i));
         }
 
         // 等待所有任务完成(Java 8 CompletableFuture 批量处理)