1
0

4 Commits e2ce12baf3 ... bc93de35e0

Autor SHA1 Mensaje Fecha
  yubin bc93de35e0 分库分表改造 hace 3 semanas
  yubin 81a5f65d50 商品每日销量汇总表 hace 4 semanas
  yubin 1e4c41844a 分库分表 hace 1 mes
  yubin d92d6cf7ef 统计报表 hace 1 mes
Se han modificado 55 ficheros con 3836 adiciones y 220 borrados
  1. 606 0
      mall-api/src/main/java/com/txz/mall/dto/DailySalesSummaryOfProductsDTO.java
  2. 27 0
      mall-interface/src/main/java/com/txz/mall/service/DailySalesSummaryOfProductsServiceClient.java
  3. 20 0
      mall-service/pom.xml
  4. 3 0
      mall-service/src/main/java/com/txz/mall/business/OrderServiceBusiness.java
  5. 1 1
      mall-service/src/main/java/com/txz/mall/business/PinkServiceBusiness.java
  6. 120 15
      mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java
  7. 34 7
      mall-service/src/main/java/com/txz/mall/business/impl/PinkServiceBusinessImpl.java
  8. 611 0
      mall-service/src/main/java/com/txz/mall/configurer/DatabaseShardingAlgorithm.java
  9. 331 0
      mall-service/src/main/java/com/txz/mall/configurer/ShardingJdbcConfig.java
  10. 168 0
      mall-service/src/main/java/com/txz/mall/configurer/StoreOrderInfoDatabaseShardingAlgorithm.java
  11. 51 0
      mall-service/src/main/java/com/txz/mall/configurer/StoreOrderInfoTableShardingAlgorithm.java
  12. 168 0
      mall-service/src/main/java/com/txz/mall/configurer/StoreOrderStatusDatabaseShardingAlgorithm.java
  13. 51 0
      mall-service/src/main/java/com/txz/mall/configurer/StoreOrderStatusTableShardingAlgorithm.java
  14. 168 0
      mall-service/src/main/java/com/txz/mall/configurer/StorePinkSummaryDatabaseShardingAlgorithm.java
  15. 51 0
      mall-service/src/main/java/com/txz/mall/configurer/StorePinkSummaryTableShardingAlgorithm.java
  16. 113 0
      mall-service/src/main/java/com/txz/mall/configurer/TableShardingAlgorithm.java
  17. 27 0
      mall-service/src/main/java/com/txz/mall/configurer/UidModuloDatabaseShardingAlgorithm.java
  18. 23 0
      mall-service/src/main/java/com/txz/mall/configurer/UidModuloTableShardingAlgorithm.java
  19. 31 0
      mall-service/src/main/java/com/txz/mall/configurer/UserIdTableShardingAlgorithm.java
  20. 148 0
      mall-service/src/main/java/com/txz/mall/configurer/UserSignDatabaseShardingAlgorithm.java
  21. 44 0
      mall-service/src/main/java/com/txz/mall/configurer/UserSignTableShardingAlgorithm.java
  22. 6 6
      mall-service/src/main/java/com/txz/mall/controller/OrderController.java
  23. 6 6
      mall-service/src/main/java/com/txz/mall/controller/PinkController.java
  24. 1 1
      mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppCombinationController.java
  25. 6 6
      mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppOrderController.java
  26. 4 4
      mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppPinkController.java
  27. 27 0
      mall-service/src/main/java/com/txz/mall/dao/DailySalesSummaryOfProductsMapper.java
  28. 20 0
      mall-service/src/main/java/com/txz/mall/dao/impl/DailySalesSummaryOfProductsMapperImpl.java
  29. 194 0
      mall-service/src/main/java/com/txz/mall/model/DailySalesSummaryOfProducts.java
  30. 5 0
      mall-service/src/main/java/com/txz/mall/model/StoreOrderStatus.java
  31. 5 0
      mall-service/src/main/java/com/txz/mall/model/StorePink.java
  32. 11 1
      mall-service/src/main/java/com/txz/mall/model/StorePinkSummary.java
  33. 22 0
      mall-service/src/main/java/com/txz/mall/service/DailySalesSummaryOfProductsService.java
  34. 7 4
      mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java
  35. 2 2
      mall-service/src/main/java/com/txz/mall/service/StoreOrderStatusService.java
  36. 2 2
      mall-service/src/main/java/com/txz/mall/service/StorePinkService.java
  37. 2 2
      mall-service/src/main/java/com/txz/mall/service/StorePinkSummaryService.java
  38. 64 0
      mall-service/src/main/java/com/txz/mall/service/impl/DailySalesSummaryOfProductsServiceImpl.java
  39. 234 92
      mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java
  40. 4 3
      mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderStatusServiceImpl.java
  41. 97 35
      mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java
  42. 58 14
      mall-service/src/main/java/com/txz/mall/service/impl/StorePinkSummaryServiceImpl.java
  43. 8 4
      mall-service/src/main/java/com/txz/mall/service/impl/UserSignServiceImpl.java
  44. 22 5
      mall-service/src/main/java/com/txz/mall/task/GeneralJob.java
  45. 2 3
      mall-service/src/main/java/com/txz/mall/util/OrderUtils.java
  46. 131 0
      mall-service/src/main/java/com/txz/mall/web/mng/DailySalesSummaryOfProductsController.java
  47. 4 0
      mall-service/src/main/java/dto/GoPinkDTO.java
  48. 8 1
      mall-service/src/main/java/dto/StoreOrderAppDTO.java
  49. 2 0
      mall-service/src/main/java/vo/StorePinkDetailVO.java
  50. 20 2
      mall-service/src/main/resources/bootstrap.properties
  51. 6 1
      mall-service/src/main/resources/i18n/messages_en_US.properties
  52. 4 1
      mall-service/src/main/resources/i18n/messages_zh_CN.properties
  53. 1 1
      mall-service/src/main/resources/logback.xml
  54. 54 0
      mall-service/src/main/resources/mapper/DailySalesSummaryOfProductsMapper.xml
  55. 1 1
      mall-service/src/test/java/CodeGenerator.java

+ 606 - 0
mall-api/src/main/java/com/txz/mall/dto/DailySalesSummaryOfProductsDTO.java

@@ -0,0 +1,606 @@
+/*
+*
+* DailySalesSummaryOfProductsDTO.java
+* Copyright(C) 2017-2020 fendo公司
+* @date 2025-10-21
+*/
+package com.txz.mall.dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class DailySalesSummaryOfProductsDTO implements Serializable {
+    /**
+     * 拼团ID
+     */
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    private Long uid;
+
+    /**
+     * 拼团汇总表id
+     */
+    private Long spsId;
+
+    /**
+     * 订单号
+     */
+    private String orderId;
+
+    /**
+     * 订单id  数据库
+     */
+    private Long orderIdKey;
+
+    /**
+     * 购买商品个数
+     */
+    private Integer totalNum;
+
+    /**
+     * 购买总金额
+     */
+    private BigDecimal totalPrice;
+
+    /**
+     * 拼团商品id
+     */
+    private Long cid;
+
+    /**
+     * 商品id
+     */
+    private Long pid;
+
+    /**
+     * 拼图总人数
+     */
+    private Integer people;
+
+    /**
+     * 拼团商品单价
+     */
+    private BigDecimal price;
+
+    /**
+     * 开始时间
+     */
+    private Date addTime;
+
+    /**
+     * 结束时间
+     */
+    private Date stopTime;
+
+    /**
+     * 天选 默认0  1为天选
+     */
+    private Integer lId;
+
+    /**
+     * 团长id 0为团长
+     */
+    private Integer kId;
+
+    /**
+     * 是否发送模板消息  0未发送  1已发送
+     */
+    private Byte isTpl;
+
+    /**
+     * 是否退款  0未退款 1已退款
+     */
+    private Byte isRefund;
+
+    /**
+     * 状态  1进行中  2已支付 3未完成
+     */
+    private Byte status;
+
+    /**
+     * 订单状态
+     */
+    private Byte orderStatus;
+
+    /**
+     * 是否拼团锁定 1锁定0未锁定
+     */
+    private Boolean isVirtual;
+
+    /**
+     * 用户昵称
+     */
+    private String nickname;
+
+    /**
+     * 用户头像
+     */
+    private String avatar;
+
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 创建人id
+     */
+    private Long createUserId;
+
+    /**
+     * 更新人id
+     */
+    private Long updateUserId;
+
+    /**
+     * 是否删除
+     */
+    private Byte isDelete;
+
+    /**
+     * 拼团汇总表编码
+     */
+    private String spsCode;
+
+    /**
+     * m_daily_sales_summary_of_products
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 拼团ID
+     * @return id 拼团ID
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 拼团ID
+     * @param id 拼团ID
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 用户id
+     * @return uid 用户id
+     */
+    public Long getUid() {
+        return uid;
+    }
+
+    /**
+     * 用户id
+     * @param uid 用户id
+     */
+    public void setUid(Long uid) {
+        this.uid = uid;
+    }
+
+    /**
+     * 拼团汇总表id
+     * @return sps_id 拼团汇总表id
+     */
+    public Long getSpsId() {
+        return spsId;
+    }
+
+    /**
+     * 拼团汇总表id
+     * @param spsId 拼团汇总表id
+     */
+    public void setSpsId(Long spsId) {
+        this.spsId = spsId;
+    }
+
+    /**
+     * 订单号
+     * @return order_id 订单号
+     */
+    public String getOrderId() {
+        return orderId;
+    }
+
+    /**
+     * 订单号
+     * @param orderId 订单号
+     */
+    public void setOrderId(String orderId) {
+        this.orderId = orderId;
+    }
+
+    /**
+     * 订单id  数据库
+     * @return order_id_key 订单id  数据库
+     */
+    public Long getOrderIdKey() {
+        return orderIdKey;
+    }
+
+    /**
+     * 订单id  数据库
+     * @param orderIdKey 订单id  数据库
+     */
+    public void setOrderIdKey(Long orderIdKey) {
+        this.orderIdKey = orderIdKey;
+    }
+
+    /**
+     * 购买商品个数
+     * @return total_num 购买商品个数
+     */
+    public Integer getTotalNum() {
+        return totalNum;
+    }
+
+    /**
+     * 购买商品个数
+     * @param totalNum 购买商品个数
+     */
+    public void setTotalNum(Integer totalNum) {
+        this.totalNum = totalNum;
+    }
+
+    /**
+     * 购买总金额
+     * @return total_price 购买总金额
+     */
+    public BigDecimal getTotalPrice() {
+        return totalPrice;
+    }
+
+    /**
+     * 购买总金额
+     * @param totalPrice 购买总金额
+     */
+    public void setTotalPrice(BigDecimal totalPrice) {
+        this.totalPrice = totalPrice;
+    }
+
+    /**
+     * 拼团商品id
+     * @return cid 拼团商品id
+     */
+    public Long getCid() {
+        return cid;
+    }
+
+    /**
+     * 拼团商品id
+     * @param cid 拼团商品id
+     */
+    public void setCid(Long cid) {
+        this.cid = cid;
+    }
+
+    /**
+     * 商品id
+     * @return pid 商品id
+     */
+    public Long getPid() {
+        return pid;
+    }
+
+    /**
+     * 商品id
+     * @param pid 商品id
+     */
+    public void setPid(Long pid) {
+        this.pid = pid;
+    }
+
+    /**
+     * 拼图总人数
+     * @return people 拼图总人数
+     */
+    public Integer getPeople() {
+        return people;
+    }
+
+    /**
+     * 拼图总人数
+     * @param people 拼图总人数
+     */
+    public void setPeople(Integer people) {
+        this.people = people;
+    }
+
+    /**
+     * 拼团商品单价
+     * @return price 拼团商品单价
+     */
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    /**
+     * 拼团商品单价
+     * @param price 拼团商品单价
+     */
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    /**
+     * 开始时间
+     * @return add_time 开始时间
+     */
+    public Date getAddTime() {
+        return addTime;
+    }
+
+    /**
+     * 开始时间
+     * @param addTime 开始时间
+     */
+    public void setAddTime(Date addTime) {
+        this.addTime = addTime;
+    }
+
+    /**
+     * 结束时间
+     * @return stop_time 结束时间
+     */
+    public Date getStopTime() {
+        return stopTime;
+    }
+
+    /**
+     * 结束时间
+     * @param stopTime 结束时间
+     */
+    public void setStopTime(Date stopTime) {
+        this.stopTime = stopTime;
+    }
+
+    /**
+     * 天选 默认0  1为天选
+     * @return l_id 天选 默认0  1为天选
+     */
+    public Integer getlId() {
+        return lId;
+    }
+
+    /**
+     * 天选 默认0  1为天选
+     * @param lId 天选 默认0  1为天选
+     */
+    public void setlId(Integer lId) {
+        this.lId = lId;
+    }
+
+    /**
+     * 团长id 0为团长
+     * @return k_id 团长id 0为团长
+     */
+    public Integer getkId() {
+        return kId;
+    }
+
+    /**
+     * 团长id 0为团长
+     * @param kId 团长id 0为团长
+     */
+    public void setkId(Integer kId) {
+        this.kId = kId;
+    }
+
+    /**
+     * 是否发送模板消息  0未发送  1已发送
+     * @return is_tpl 是否发送模板消息  0未发送  1已发送
+     */
+    public Byte getIsTpl() {
+        return isTpl;
+    }
+
+    /**
+     * 是否发送模板消息  0未发送  1已发送
+     * @param isTpl 是否发送模板消息  0未发送  1已发送
+     */
+    public void setIsTpl(Byte isTpl) {
+        this.isTpl = isTpl;
+    }
+
+    /**
+     * 是否退款  0未退款 1已退款
+     * @return is_refund 是否退款  0未退款 1已退款
+     */
+    public Byte getIsRefund() {
+        return isRefund;
+    }
+
+    /**
+     * 是否退款  0未退款 1已退款
+     * @param isRefund 是否退款  0未退款 1已退款
+     */
+    public void setIsRefund(Byte isRefund) {
+        this.isRefund = isRefund;
+    }
+
+    /**
+     * 状态  1进行中  2已支付 3未完成
+     * @return status 状态  1进行中  2已支付 3未完成
+     */
+    public Byte getStatus() {
+        return status;
+    }
+
+    /**
+     * 状态  1进行中  2已支付 3未完成
+     * @param status 状态  1进行中  2已支付 3未完成
+     */
+    public void setStatus(Byte status) {
+        this.status = status;
+    }
+
+    /**
+     * 订单状态
+     * @return order_status 订单状态
+     */
+    public Byte getOrderStatus() {
+        return orderStatus;
+    }
+
+    /**
+     * 订单状态
+     * @param orderStatus 订单状态
+     */
+    public void setOrderStatus(Byte orderStatus) {
+        this.orderStatus = orderStatus;
+    }
+
+    /**
+     * 是否拼团锁定 1锁定0未锁定
+     * @return is_virtual 是否拼团锁定 1锁定0未锁定
+     */
+    public Boolean getIsVirtual() {
+        return isVirtual;
+    }
+
+    /**
+     * 是否拼团锁定 1锁定0未锁定
+     * @param isVirtual 是否拼团锁定 1锁定0未锁定
+     */
+    public void setIsVirtual(Boolean isVirtual) {
+        this.isVirtual = isVirtual;
+    }
+
+    /**
+     * 用户昵称
+     * @return nickname 用户昵称
+     */
+    public String getNickname() {
+        return nickname;
+    }
+
+    /**
+     * 用户昵称
+     * @param nickname 用户昵称
+     */
+    public void setNickname(String nickname) {
+        this.nickname = nickname;
+    }
+
+    /**
+     * 用户头像
+     * @return avatar 用户头像
+     */
+    public String getAvatar() {
+        return avatar;
+    }
+
+    /**
+     * 用户头像
+     * @param avatar 用户头像
+     */
+    public void setAvatar(String avatar) {
+        this.avatar = avatar;
+    }
+
+    /**
+     * 创建时间
+     * @return create_time 创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * 创建时间
+     * @param createTime 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 更新时间
+     * @return update_time 更新时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * 更新时间
+     * @param updateTime 更新时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 创建人id
+     * @return create_user_id 创建人id
+     */
+    public Long getCreateUserId() {
+        return createUserId;
+    }
+
+    /**
+     * 创建人id
+     * @param createUserId 创建人id
+     */
+    public void setCreateUserId(Long createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    /**
+     * 更新人id
+     * @return update_user_id 更新人id
+     */
+    public Long getUpdateUserId() {
+        return updateUserId;
+    }
+
+    /**
+     * 更新人id
+     * @param updateUserId 更新人id
+     */
+    public void setUpdateUserId(Long updateUserId) {
+        this.updateUserId = updateUserId;
+    }
+
+    /**
+     * 是否删除
+     * @return is_delete 是否删除
+     */
+    public Byte getIsDelete() {
+        return isDelete;
+    }
+
+    /**
+     * 是否删除
+     * @param isDelete 是否删除
+     */
+    public void setIsDelete(Byte isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    /**
+     * 拼团汇总表编码
+     * @return sps_code 拼团汇总表编码
+     */
+    public String getSpsCode() {
+        return spsCode;
+    }
+
+    /**
+     * 拼团汇总表编码
+     * @param spsCode 拼团汇总表编码
+     */
+    public void setSpsCode(String spsCode) {
+        this.spsCode = spsCode;
+    }
+}

+ 27 - 0
mall-interface/src/main/java/com/txz/mall/service/DailySalesSummaryOfProductsServiceClient.java

@@ -0,0 +1,27 @@
+package com.txz.mall.service;
+
+
+import com.txz.mall.dto.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+
+@FeignClient("mall")
+public interface DailySalesSummaryOfProductsServiceClient {
+
+	@RequestMapping( value = {"/daily/sales/summary/of/products/add"}, method = {RequestMethod.POST} )
+    public Result add(@RequestBody DailySalesSummaryOfProductsDPO dailySalesSummaryOfProducts,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/daily/sales/summary/of/products/delete"}, method = {RequestMethod.POST} )
+	public Result delete(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/daily/sales/summary/of/products/update"}, method = {RequestMethod.POST} )
+	public Result update(@RequestBody DailySalesSummaryOfProductsDPO dailySalesSummaryOfProducts,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/daily/sales/summary/of/products/detail"}, method = {RequestMethod.POST} )
+	public Result<DailySalesSummaryOfProductsDPO> detail(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/daily/sales/summary/of/products/list"}, method = {RequestMethod.POST} )
+	public Result<List<DailySalesSummaryOfProductsDPO>> list(@RequestBody DailySalesSummaryOfProductsDPO dailySalesSummaryOfProducts, @RequestParam("page") Integer page, @RequestParam("size") Integer size,@RequestParam("userId") Long userId);
+}

+ 20 - 0
mall-service/pom.xml

@@ -184,6 +184,26 @@
             <artifactId>engagelab-sdk-java</artifactId>
             <version>0.0.15</version>
         </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.apache.shardingsphere</groupId>-->
+<!--            <artifactId>sharding-jdbc-spring-boot-starter</artifactId>-->
+<!--            <version>4.1.1</version>-->
+<!--            <exclusions>-->
+<!--                &lt;!&ndash; 排除自动配置类,防止 Spring 自动加载默认配置 &ndash;&gt;-->
+<!--                <exclusion>-->
+<!--                    <groupId>org.apache.shardingsphere</groupId>-->
+<!--                    <artifactId>shardingsphere-spring-boot-starter</artifactId>-->
+<!--                </exclusion>-->
+<!--            </exclusions>-->
+<!--        </dependency>-->
+        <dependency>
+            <groupId>org.apache.shardingsphere</groupId>
+            <artifactId>sharding-jdbc-core</artifactId>
+            <version>4.1.1</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>

+ 3 - 0
mall-service/src/main/java/com/txz/mall/business/OrderServiceBusiness.java

@@ -23,4 +23,7 @@ public interface OrderServiceBusiness {
      * 排行榜
      */
     List<StoreCombinationRankVO> getRank();
+
+
+    List<StoreCombinationRankVO> getRankNew();
 }

+ 1 - 1
mall-service/src/main/java/com/txz/mall/business/PinkServiceBusiness.java

@@ -16,7 +16,7 @@ public interface PinkServiceBusiness {
      * @param pinkId 团长pinkId
      * @return
      */
-    List<StorePinkDetailVO> getAdminList(Long pinkId,String terminal);
+    List<StorePinkDetailVO> getAdminList(String orderNo,String terminal);
 
     /**
      * 拼团失败----到点自动退回余额

+ 120 - 15
mall-service/src/main/java/com/txz/mall/business/impl/OrderServiceBusinessImpl.java

@@ -1,6 +1,6 @@
 package com.txz.mall.business.impl;
 
-import cn.hutool.core.date.DateUtil;
+
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.txz.cif.dto.EarningsDTO;
@@ -8,6 +8,7 @@ import com.txz.cif.dto.OrderParam;
 import com.txz.mall.business.OrderServiceBusiness;
 import com.txz.mall.core.RedisUtil;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.dao.DailySalesSummaryOfProductsMapper;
 import com.txz.mall.dao.StoreOrderMapper;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dubbo.client.CifRedEnvelopeDubboServiceClient;
@@ -29,6 +30,8 @@ import tk.mybatis.mapper.entity.SqlsCriteria;
 import vo.StoreCombinationRankVO;
 import vo.StoreOrderVO;
 
+import javax.annotation.Resource;
+import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -56,28 +59,30 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
     @Override
     public StoreOrderVO orderDetail(Long id, String orderNo) {
         StoreOrderVO vo = new StoreOrderVO();
-        StoreOrder storeOrder = null;
-        if (!ObjectUtils.isEmpty(id)) {
-            storeOrder = storeOrderService.findById(id);
-        } else if (!ObjectUtils.isEmpty(orderNo)) {
-            storeOrder = storeOrderService.findBy("orderId", orderNo);
-        }
+
+//        if (!ObjectUtils.isEmpty(id)) {
+//            storeOrder = storeOrderService.findById(id);
+//        } else if (!ObjectUtils.isEmpty(orderNo)) {
+        StoreOrder storeOrder = storeOrderService.findBy("orderId", orderNo);
+       // }
 
         if (ObjectUtils.isEmpty(storeOrder)) {
-            throw new ServiceException(I18nUtil.get("order.does.not.exist.id") + id);
+            throw new ServiceException(I18nUtil.get("order.does.not.exist.id") + orderNo);
         }
-        id = storeOrder.getId();
+       // id = storeOrder.getId();
         Condition infoCondition = new Condition(StoreOrderInfo.class);
         Example.Criteria infoCriteria = infoCondition.createCriteria();
         infoCriteria.andEqualTo("isDelete", 0);
-        infoCriteria.andEqualTo("orderId", storeOrder.getId());
+       // infoCriteria.andEqualTo("orderId", storeOrder.getId());
+
+        infoCriteria.andEqualTo("orderNo", orderNo);
         List<StoreOrderInfo> infoList = storeOrderInfoService.findByCondition(infoCondition);
-        List<StoreOrderStatus> logList = storeOrderStatusService.getLogList(storeOrder.getId());
+        List<StoreOrderStatus> logList = storeOrderStatusService.getLogList(orderNo);
 
         Condition storePinkCondition = new Condition(StorePink.class);
         Example.Criteria storePinkCriteria = storePinkCondition.createCriteria();
         storePinkCriteria.andEqualTo("isDelete", 0);
-        storePinkCriteria.andEqualTo("orderIdKey", id);
+        storePinkCriteria.andEqualTo("orderId", orderNo);
 
         List<StorePink> byCondition = storePinkService.findByCondition(storePinkCondition);
         if (!org.springframework.util.CollectionUtils.isEmpty(byCondition)) {
@@ -85,8 +90,10 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
             vo.setStorePink(storePink);
         }
         //        UserDTO user = userDubboServiceClient.getUser(storeOrder.getUid());
-        UserAddress userAddress = userAddressService.findById(storeOrder.getAddressId());
-
+        UserAddress userAddress = null;
+        if(!ObjectUtils.isEmpty(storeOrder.getAddressId())){
+            userAddress = userAddressService.findById(storeOrder.getAddressId());
+        }
 
         List<OrderParam> orderCodeList = new ArrayList<>();
         OrderParam orderParam = new OrderParam();
@@ -166,6 +173,7 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
     //        redisUtil.set(key, list);
     //        return list;
     //    }
+    @Resource
     private StorePinkMapper storePinkMapper;
 
     @Override
@@ -210,7 +218,7 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
        if(!CollectionUtils.isEmpty(isvalidProductIdList)) {
            log.info("getRank.isvalidProductIdList"+JSONObject.toJSONString(isvalidProductIdList));
            Date date = new Date();
-           Date date1 = DateUtils.addDays(date, -7);
+           Date date1 = DateUtils.addDays(date, -6);
            // List<Map<String, Object>> rank = storeOrderMapper.getRank(date1);
            List<Map<String, Object>> rank = storePinkMapper.getRank(date1,isvalidProductIdList);
 
@@ -261,4 +269,101 @@ public class OrderServiceBusinessImpl implements OrderServiceBusiness {
     }
 
 
+
+    @Resource
+    private DailySalesSummaryOfProductsMapper dailySalesSummaryOfProductsMapper;
+
+    /**
+     * 重构后的top7   先建立daily_sales_summary_table_of_products   每日凌晨通过定时任务汇总一次当天的各个商品的销量,,然后top7就汇总过去7天的数据即可
+     * @return
+     */
+    @Override
+    public List<StoreCombinationRankVO> getRankNew() {
+        List<StoreCombinationRankVO> list = new ArrayList<>();
+//        String key = "order:rank:";
+//        boolean exists = redisUtil.hasKey("order:rank");
+//        if (exists) {
+//            String orderVoString = redisUtil.get(key).toString();
+//            list = JSONObject.parseArray(orderVoString, StoreCombinationRankVO.class);
+//            return list;
+//        }
+
+        Set<Long> isvalidProductIdList = new HashSet<>();
+        //提取有效的参与活动的商品id
+        Condition storeCombinationCondition = new Condition(StoreCombination.class);
+        Example.Criteria StoreCombinationCriteria = storeCombinationCondition.createCriteria();
+        StoreCombinationCriteria.andEqualTo("isDelete", 0);
+        StoreCombinationCriteria.andEqualTo("isShow", 1);
+        List<StoreCombination> combinationList = storeCombinationService.findByCondition(storeCombinationCondition);
+
+        if(!CollectionUtils.isEmpty(combinationList)){
+            log.info("getRank.storeCombinationService.findByCondition"+JSONObject.toJSONString(combinationList));
+            List<Long> productIdList1 = combinationList.stream().map(StoreCombination::getProductId).collect(Collectors.toList());
+            isvalidProductIdList.addAll(productIdList1);
+        }
+
+
+//        Condition storeProductondition = new Condition(StoreProduct.class);
+//        Example.Criteria storeProductCriteria = storeProductondition.createCriteria();
+//        storeProductCriteria.andEqualTo("isDelete", 0);
+//        storeProductCriteria.andEqualTo("isShow", 1);
+//        List<StoreProduct> storeProductList = storeProductService.findByCondition(storeProductondition);
+//        if(!CollectionUtils.isEmpty(storeProductList)){
+//            List<Long> productIdList2 = storeProductList.stream().map(StoreProduct::getId).collect(Collectors.toList());
+//            isvalidProductIdList.addAll(productIdList2);
+//        }
+
+
+        if(!CollectionUtils.isEmpty(isvalidProductIdList)) {
+            log.info("getRank.isvalidProductIdList"+JSONObject.toJSONString(isvalidProductIdList));
+            Date date = new Date();
+            Date date1 = DateUtils.addDays(date, -6);
+            // List<Map<String, Object>> rank = storeOrderMapper.getRank(date1);
+            List<Map<String, Object>> rank = dailySalesSummaryOfProductsMapper.getRankNew(date1,isvalidProductIdList);
+
+
+            if (!CollectionUtils.isEmpty(rank)) {
+                log.info("rank"+JSONObject.toJSONString(rank));
+                Map<Long, Map<String, Object>> saleMap = rank.stream().collect(Collectors.toMap(a -> Long.valueOf(a.get("pid") + ""), a -> a, (b, c) -> c));
+                List<Long> pidList = rank.stream().map(a -> Long.valueOf(a.get("pid") + "")).collect(Collectors.toList());
+
+//               Condition storeCombinationCondition = new Condition(StoreCombination.class);
+//               Example.Criteria storeCombinationCriteria = storeCombinationCondition.createCriteria();
+//               storeCombinationCriteria.andIn("productId", pidList);
+//               List<StoreCombination> combinationList = storeCombinationService.findByCondition(storeCombinationCondition);
+                Map<Long, StoreCombination> storeCombinationMap = new HashMap<>();
+                if (!CollectionUtils.isEmpty(combinationList)) {
+                    log.info("getRank.combinationList"+JSONObject.toJSONString(combinationList));
+                    storeCombinationMap = combinationList.stream().collect(Collectors.toMap(StoreCombination::getProductId, a -> a, (b, c) -> c));
+                }
+                for (Map<String, Object> stringObjectMap : rank) {
+
+
+                    Object pid = stringObjectMap.get("pid");
+                    Object num = stringObjectMap.get("num");
+                    log.info("getRank.pid"+JSONObject.toJSONString(pid));
+                    StoreCombination storeCombination = storeCombinationMap.get(Long.parseLong(pid + ""));
+                    log.info("getRank.storeCombination"+JSONObject.toJSONString(storeCombination));
+                    StoreCombinationRankVO rankVO = new StoreCombinationRankVO();
+                    rankVO.setProductId(storeCombination.getProductId());
+                    rankVO.setProductName(storeCombination.getProductName());
+                    rankVO.setSales(Integer.valueOf(num + ""));
+                    rankVO.setFicti(Integer.valueOf(num + ""));
+                    rankVO.setImage(storeCombination.getImage());
+                    rankVO.setPrice(storeCombination.getPrice());
+                    list.add(rankVO);
+                }
+
+                if (!CollectionUtils.isEmpty(list)) {
+                    log.info("getRank.list"+JSONObject.toJSONString(list));
+                    list = list.stream().sorted(Comparator.comparing(StoreCombinationRankVO::getSales).reversed()).collect(Collectors.toList());
+                }
+
+            }
+
+        }
+
+        // redisUtil.set(key, list);
+        return list;
+    }
 }

+ 34 - 7
mall-service/src/main/java/com/txz/mall/business/impl/PinkServiceBusinessImpl.java

@@ -2,6 +2,7 @@ package com.txz.mall.business.impl;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.txz.cif.dto.EarningsDTO;
 import com.txz.cif.dto.OrderParam;
 import com.txz.cif.dto.UserDTO;
@@ -13,9 +14,11 @@ import com.txz.mall.enums.PinkOrderStatusEnum;
 import com.txz.mall.enums.StorePinkStatusEnum;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
+import com.txz.mall.model.StorePinkSummary;
 import com.txz.mall.service.StoreCombinationService;
 import com.txz.mall.service.StoreOrderService;
 import com.txz.mall.service.StorePinkService;
+import com.txz.mall.service.StorePinkSummaryService;
 import com.txz.mall.util.I18nUtil;
 import lombok.AllArgsConstructor;
 import org.springframework.beans.BeanUtils;
@@ -23,6 +26,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.ObjectUtils;
+import org.springframework.util.StringUtils;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 import vo.OrderRefundApplyVO;
@@ -46,25 +50,45 @@ public class PinkServiceBusinessImpl implements PinkServiceBusiness {
     private final StoreCombinationService storeCombinationService;
     private final CifUserDubboServiceClient cifUserDubboServiceClient;
     private final CifRedEnvelopeDubboServiceClient cifRedEnvelopeDubboServiceClient;
+    private final StorePinkSummaryService storePinkSummaryService;
     @Override
-    public List<StorePinkDetailVO> getAdminList(Long pinkId,String terminal) {
+    public List<StorePinkDetailVO> getAdminList(String orderNo,String terminal) {
 
-        if (ObjectUtils.isEmpty(pinkId)) {
-            throw new ServiceException(I18nUtil.get("group.buying.id.is.empty"));
+        if (ObjectUtils.isEmpty(orderNo)) {
+            throw new ServiceException(I18nUtil.get("group.buying.id.is.empty")+orderNo);
         }
-        StorePink storePink = storePinkService.findById(pinkId);
-
+      //  StorePink storePink = storePinkService.findById(pinkId);
+        //**分库整改
+        StorePink storePink = storePinkService.findBy("orderId", orderNo);
 
         if (ObjectUtils.isEmpty(storePink)) {
-            throw new ServiceException(I18nUtil.get("group.buying.data.does.not.exist.id")+pinkId);
+            throw new ServiceException(I18nUtil.get("group.buying.data.does.not.exist.id")+orderNo);
+        }
+        //**分库整改
+        String spsCode = storePink.getSpsCode();
+
+        StorePinkSummary storePinkSummary = storePinkSummaryService.findBy("code", spsCode);
+        if(ObjectUtils.isEmpty(storePinkSummary)){
+            throw new ServiceException(I18nUtil.get("the.group.buying.summary.data.does.not.exist")+spsCode);
+        }
+        String orderNoSet = storePinkSummary.getOrderNoSet();
+        if(StringUtils.isEmpty(orderNoSet)){
+            throw new ServiceException(I18nUtil.get("the.order.code.set.data.is.empty")+spsCode);
         }
+
+        List<String> orderNoSetList = JSONObject.parseArray(orderNoSet, String.class);
+        if(CollectionUtils.isEmpty(orderNoSetList)){
+            throw new ServiceException(I18nUtil.get("the.order.code.set.data.is.empty")+spsCode);
+        }
+
+
         List<StorePinkDetailVO> resultList = new ArrayList<>();
       //  if (StorePinkStatusEnum.RESULTS_ANNOUNCED.getKey().equals(storePink.getStatus())) {
 
             Condition condition = new Condition(StorePink.class);
             Example.Criteria criteria = condition.createCriteria();
             criteria.andEqualTo("isDelete", 0);
-            criteria.andEqualTo("spsId", storePink.getSpsId());
+       //     criteria.andEqualTo("spsId", storePink.getSpsId());
             ArrayList<Integer> integers = CollUtil.newArrayList(
                     PinkOrderStatusEnum.GROUP_ORDER_CLOSED.getKey(),
                     PinkOrderStatusEnum.GROUP_ORDER_COMPLETED.getKey(),
@@ -72,6 +96,8 @@ public class PinkServiceBusinessImpl implements PinkServiceBusiness {
                     PinkOrderStatusEnum.GROUP_ORDER_TO_RECEIVE.getKey(),
                     PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey()
             );
+            //**分库整改
+            criteria.andIn("orderId", orderNoSetList);
             criteria.andIn("orderStatus", integers);
 //        criteria.andEqualTo("kId", pinkId);
             List<StorePink> pinkList = storePinkService.findByCondition(condition);
@@ -149,6 +175,7 @@ public class PinkServiceBusinessImpl implements PinkServiceBusiness {
                         storePinkDetailVO.setLId(pink.getLId());
                         storePinkDetailVO.setKId(pink.getKId());
                         storePinkDetailVO.setSpsId(pink.getSpsId());
+                        storePinkDetailVO.setSpsCode(pink.getSpsCode());
                     }
                     resultList.add(storePinkDetailVO);
                 }

+ 611 - 0
mall-service/src/main/java/com/txz/mall/configurer/DatabaseShardingAlgorithm.java

@@ -0,0 +1,611 @@
+package com.txz.mall.configurer;
+
+import com.google.common.collect.Range;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+import org.springframework.util.ObjectUtils;
+
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class DatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+
+//    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//    private static final SimpleDateFormat SDFORDERNO = new SimpleDateFormat("yyyyMMdd");
+//    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+//    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+//
+//    @Override
+//    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        // 判断操作类型
+//        boolean isInsert = isInsertOperation(shardingValue);
+//
+//        // 提取分片键
+//        Date createTime = getCreateTime(shardingValue);
+//        Long userId = getUserId(shardingValue);
+//
+//
+//
+//        // 插入操作必须包含create_time和user_id
+//        if (isInsert && (createTime == null || userId == null)) {
+//          //  throw new IllegalArgumentException("插入数据必须包含create_time和user_id");
+//        }
+//
+//        // 1-6月数据处理(维持原逻辑)
+//        if (createTime != null && isFirstHalfYear(createTime)) {
+//            return routeFirstHalf(availableTargets, userId);
+//        }
+//
+//        // 7-12月数据处理
+//        if (createTime != null && isSecondHalfYear(createTime)) {
+//            return routeSecondHalf(availableTargets, userId);
+//        }
+//
+//        // 查询时无create_time:扫描所有符合条件的库
+//        return filterAllDatabases(availableTargets, userId);
+//    }
+//
+//    // 1-6月路由逻辑(维持原逻辑:mall_0/mall_1)
+//    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//           // String lastFour = getLastFourDigits(userId);
+//            long dbIndex = userId % 2; // 0→mall_0,1→mall_1
+//            String targetDb = "ds" + dbIndex;
+//            if (availableTargets.contains(targetDb)) {
+//                return Collections.singleton(targetDb);
+//            }
+//        }
+//        // 查询时无user_id:扫描1-6月的库
+//        return Arrays.asList("ds0", "ds1");
+//    }
+//
+//    // 7-12月路由逻辑(mall_1/mall_2)
+//    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//            //String lastFour = getLastFourDigits(userId);
+//            long dbIndex = 2 + (userId % 2); // 1→mall_1,2→mall_2
+//            String targetDb = "ds" + dbIndex;
+//            if (availableTargets.contains(targetDb)) {
+//                return Collections.singleton(targetDb);
+//            }
+//        }
+//        // 查询时无user_id:扫描7-12月的库
+//        return Arrays.asList("ds2", "ds3");
+//    }
+//
+//    // 判断是否为插入操作
+//    private boolean isInsertOperation(ComplexKeysShardingValue<?> shardingValue) {
+//        //return shardingValue.getSqlType() != null && shardingValue.getSqlType().name().startsWith("INSERT");
+//
+//        //shardingValue
+//        return true;
+//    }
+//
+//    // 提取并解析create_time
+//    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("create_time") && !values.get("create_time").isEmpty()) {
+//            Object value = values.get("create_time").iterator().next();
+//            if (value instanceof Date) return (Date) value;
+//            try {
+//                return SDF.parse(value.toString());
+//            } catch (ParseException e) {
+//                throw new RuntimeException("create_time格式错误,应为yyyy-MM-dd HH:mm:ss");
+//            }
+//        }
+//
+//
+//        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+//            String  orderId = (String) values.get("order_id").iterator().next();
+//            // 提取日期位并转换为Date类型
+//            String dateStr = "20"+orderId.substring(2, 8);
+//            try {
+//                return SDFORDERNO.parse(dateStr);
+//            } catch (ParseException e) {
+//                throw new RuntimeException("从订单号中提取日期错误"+dateStr);
+//            }
+//
+//        }
+//
+//
+//        return null;
+//    }
+//
+//    // 提取user_id
+//    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+//
+//        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+//            String  orderId = (String) values.get("order_id").iterator().next();
+//            // 提取后4位并转换为long类型
+//            String lastFourStr = orderId.substring(orderId.length() - 4);
+//            return Long.parseLong(lastFourStr);
+//        }
+//
+//
+//        return null;
+//    }
+//
+//    // 判断是否为1-6月
+//    private boolean isFirstHalfYear(Date date) {
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(date);
+//        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+//    }
+//
+//    // 判断是否为7-12月
+//    private boolean isSecondHalfYear(Date date) {
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(date);
+//        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+//    }
+//
+//    // 获取user_id后四位
+//    private String getLastFourDigits(String value) {
+//        if (value == null || value.isEmpty()) return "0";
+//        return value.substring(Math.max(0, value.length() - 4));
+//    }
+//
+//    // 无create_time时的全量库过滤
+//    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//            // 有user_id但无时间时,需扫描所有可能的库(mall_0/mall_1/mall_2)
+//            return Arrays.asList("ds0", "ds1", "ds2","ds3");
+//        }
+//        // 无任何条件时扫描所有库
+//        return availableTargets;
+//    }
+
+//哥几个鸡
+//    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//    private static final SimpleDateFormat SDF_ORDER_NO = new SimpleDateFormat("yyyyMMdd");
+//    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+//    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+//
+//    @Override
+//    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        // 获取所有order_id对应的分库条件(时间+用户ID)
+//        Map<String, List<Long>> orderIdDbMap = getOrderIdDbMap(shardingValue);
+//        if (orderIdDbMap.isEmpty()) {
+//            // 无order_id时按原逻辑处理(如uid)
+//            return handleNonOrderIdSharding(availableTargets, shardingValue);
+//        }
+//
+//        // 收集所有匹配的数据库
+//        Set<String> targetDbs = new HashSet<>();
+//        for (List<Long> params : orderIdDbMap.values()) {
+//            Date createTime = new Date(params.get(0)); // 时间毫秒值
+//            Long userId = params.get(1);
+//            targetDbs.addAll(routeByTimeAndUserId(availableTargets, createTime, userId));
+//        }
+//
+//        return targetDbs.isEmpty() ? availableTargets : targetDbs;
+//    }
+//
+//    /**
+//     * 解析所有order_id,提取每个对应的时间(毫秒)和用户ID(后4位)
+//     */
+//    private Map<String, List<Long>> getOrderIdDbMap(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        Map<String, List<Long>> result = new HashMap<>();
+//
+//        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+//            for (Comparable<?> val : values.get("order_id")) {
+//                String orderId = (String) val;
+//                try {
+//                    // 1. 从order_id提取时间(格式:BH2510193430008 → 251019 → 2025-10-19)
+//                    String dateStr = "20" + orderId.substring(2, 8); // 取第2-8位(251019)
+//                    Date createTime = SDF_ORDER_NO.parse(dateStr);
+//                    // 2. 从order_id提取用户ID(后4位)
+//                    String lastFour = orderId.substring(orderId.length() - 4);
+//                    Long userId = Long.parseLong(lastFour);
+//                    // 存储:orderId → [时间毫秒值, 用户ID]
+//                    result.put(orderId, Arrays.asList(createTime.getTime(), userId));
+//                } catch (ParseException | StringIndexOutOfBoundsException e) {
+//                    throw new RuntimeException("解析order_id分库条件失败: " + orderId, e);
+//                }
+//            }
+//        }
+//        return result;
+//    }
+//
+//    /**
+//     * 处理无order_id的情况(如按uid和create_time分库)
+//     */
+//    private Collection<String> handleNonOrderIdSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Date createTime = getCreateTime(shardingValue);
+//        Long userId = getUserId(shardingValue);
+//
+//        if (createTime != null && isFirstHalfYear(createTime)) {
+//            return routeFirstHalf(availableTargets, userId);
+//        }
+//        if (createTime != null && isSecondHalfYear(createTime)) {
+//            return routeSecondHalf(availableTargets, userId);
+//        }
+//        return filterAllDatabases(availableTargets, userId);
+//    }
+//
+//    /**
+//     * 根据时间和用户ID路由到具体数据库
+//     */
+//    private Collection<String> routeByTimeAndUserId(Collection<String> availableTargets, Date createTime, Long userId) {
+//        if (isFirstHalfYear(createTime)) {
+//            return routeFirstHalf(availableTargets, userId);
+//        } else if (isSecondHalfYear(createTime)) {
+//            return routeSecondHalf(availableTargets, userId);
+//        }
+//        return availableTargets;
+//    }
+//
+//    // 1-6月路由(ds0/ds1)
+//    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//            long dbIndex = userId % 2;
+//            String targetDb = "ds" + dbIndex;
+//            if (availableTargets.contains(targetDb)) {
+//                return Collections.singleton(targetDb);
+//            }
+//        }
+//        return Arrays.asList("ds0", "ds1");
+//    }
+//
+//    // 7-12月路由(ds2/ds3)
+//    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//            long dbIndex = 2 + (userId % 2); // 2或3
+//            String targetDb = "ds" + dbIndex;
+//            if (availableTargets.contains(targetDb)) {
+//                return Collections.singleton(targetDb);
+//            }
+//        }
+//        return Arrays.asList("ds2", "ds3");
+//    }
+//
+//    // 提取create_time(非order_id场景)
+//    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("create_time") && !values.get("create_time").isEmpty()) {
+//            Object value = values.get("create_time").iterator().next();
+//            if (value instanceof Date) return (Date) value;
+//            try {
+//                return SDF.parse(value.toString());
+//            } catch (ParseException e) {
+//                throw new RuntimeException("create_time格式错误: " + value);
+//            }
+//        }
+//        return null;
+//    }
+//
+//    // 提取uid(非order_id场景)
+//    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+//        return null;
+//    }
+//
+//    // 判断1-6月
+//    private boolean isFirstHalfYear(Date date) {
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(date);
+//        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+//    }
+//
+//    // 判断7-12月
+//    private boolean isSecondHalfYear(Date date) {
+//        Calendar calendar = Calendar.getInstance();
+//        calendar.setTime(date);
+//        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+//    }
+//
+//    // 无时间条件时的全库过滤
+//    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+//        if (userId != null) {
+//            return Arrays.asList("ds0", "ds1", "ds2", "ds3");
+//        }
+//        return availableTargets;
+//    }
+
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final SimpleDateFormat SDF_ORDER_NO = new SimpleDateFormat("yyyyMMdd");
+    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 优先处理order_id IN条件
+        Map<String, List<Long>> orderIdDbMap = getOrderIdDbMap(shardingValue);
+        if (!orderIdDbMap.isEmpty()) {
+            Set<String> targetDbs = new HashSet<>();
+            for (List<Long> params : orderIdDbMap.values()) {
+                Date createTime = new Date(params.get(0));
+                Long userId = params.get(1);
+                targetDbs.addAll(routeByTimeAndUserId(availableTargets, createTime, userId));
+            }
+            return targetDbs.isEmpty() ? availableTargets : targetDbs;
+        }
+
+        // 处理无order_id的情况(如uid+create_time范围)
+        return handleNonOrderIdSharding(availableTargets, shardingValue);
+    }
+
+    /**
+     * 解析所有order_id,提取时间和用户ID
+     */
+    private Map<String, List<Long>> getOrderIdDbMap(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        Map<String, List<Long>> result = new HashMap<>();
+
+        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+            for (Comparable<?> val : values.get("order_id")) {
+                String orderId = (String) val;
+                try {
+                    String dateStr = "20" + orderId.substring(2, 8);
+                    Date createTime = SDF_ORDER_NO.parse(dateStr);
+                    String lastFour = orderId.substring(orderId.length() - 4);
+                    Long userId = Long.parseLong(lastFour);
+                    result.put(orderId, Arrays.asList(createTime.getTime(), userId));
+                } catch (ParseException | StringIndexOutOfBoundsException e) {
+                    throw new RuntimeException("解析order_id分库条件失败: " + orderId, e);
+                }
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 处理无order_id的情况(支持create_time范围查询)
+     */
+    private Collection<String> handleNonOrderIdSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 提取create_time的范围(start和end)
+        DateRange createTimeRange = getCreateTimeRange(shardingValue);
+        Long userId = getUserId(shardingValue);
+
+        // 有时间范围时,按范围路由
+        if (createTimeRange != null) {
+            Set<String> targetDbs = new HashSet<>();
+            // 判断是否与1-6月重叠
+            if (isRangeOverlapFirstHalf(createTimeRange)) {
+                targetDbs.addAll(routeFirstHalf(availableTargets, userId));
+            }
+            // 判断是否与7-12月重叠
+            if (isRangeOverlapSecondHalf(createTimeRange)) {
+                targetDbs.addAll(routeSecondHalf(availableTargets, userId));
+            }
+            return targetDbs.isEmpty() ? availableTargets : targetDbs;
+        }
+
+        // 无时间范围时,全库扫描
+        return filterAllDatabases(availableTargets, userId);
+    }
+
+    /**
+     * 提取create_time的范围值(支持>=和<=)
+     */
+    private DateRange getCreateTimeRange(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 1. 从范围条件集合中获取create_time的范围值
+        Map<String, com.google.common.collect.Range<Comparable<?>>> rangeValuesMap = shardingValue.getColumnNameAndRangeValuesMap();
+        com.google.common.collect.Range<Comparable<?>> createTimeRanges = rangeValuesMap.get("create_time");
+
+        Date start = null;
+        Date end = null;
+        // 若没有create_time的范围条件,返回null
+//        if (createTimeRanges == null || createTimeRanges.isEmpty()) {
+//            return null;
+//        }
+        if(!ObjectUtils.isEmpty(createTimeRanges)){
+            if (createTimeRanges.hasLowerBound()) {
+                Comparable<?> lowerVal = createTimeRanges.lowerEndpoint();
+                start = parseDate(lowerVal);
+            }
+            // 提取上界(<=)
+            if (createTimeRanges.hasUpperBound()) {
+                Comparable<?> upperVal = createTimeRanges.upperEndpoint();
+                end = parseDate(upperVal);
+            }
+        }
+
+
+        // 3. 兼容等值条件(如果存在create_time = ?,从精确值中提取)
+        if (start == null && end == null) {
+            Map<String, Collection<Comparable<?>>> preciseValuesMap = shardingValue.getColumnNameAndShardingValuesMap();
+            Collection<Comparable<?>> createTimePrecise = preciseValuesMap.get("create_time");
+            if (createTimePrecise != null && !createTimePrecise.isEmpty()) {
+                Comparable<?> preciseVal = createTimePrecise.iterator().next();
+                Date date = parseDate(preciseVal);
+                start = date;
+                end = date;
+            }
+        }
+
+        return (start != null || end != null) ? new DateRange(start, end) : null;
+    }
+
+    /**
+     * 判断时间范围是否与1-6月重叠
+     */
+    private boolean isRangeOverlapFirstHalf(DateRange range) {
+        Calendar firstHalfStart = Calendar.getInstance();
+        firstHalfStart.set(Calendar.MONTH, 0); // 1月
+        firstHalfStart.set(Calendar.DAY_OF_MONTH, 1);
+        firstHalfStart.set(Calendar.HOUR_OF_DAY, 0);
+        firstHalfStart.set(Calendar.MINUTE, 0);
+        firstHalfStart.set(Calendar.SECOND, 0);
+
+        Calendar firstHalfEnd = Calendar.getInstance();
+        firstHalfEnd.set(Calendar.MONTH, 5); // 6月
+        firstHalfEnd.set(Calendar.DAY_OF_MONTH, 30);
+        firstHalfEnd.set(Calendar.HOUR_OF_DAY, 23);
+        firstHalfEnd.set(Calendar.MINUTE, 59);
+        firstHalfEnd.set(Calendar.SECOND, 59);
+
+        return isOverlap(range, new DateRange(firstHalfStart.getTime(), firstHalfEnd.getTime()));
+    }
+
+    /**
+     * 判断时间范围是否与7-12月重叠
+     */
+    private boolean isRangeOverlapSecondHalf(DateRange range) {
+        Calendar secondHalfStart = Calendar.getInstance();
+        secondHalfStart.set(Calendar.MONTH, 6); // 7月
+        secondHalfStart.set(Calendar.DAY_OF_MONTH, 1);
+        secondHalfStart.set(Calendar.HOUR_OF_DAY, 0);
+        secondHalfStart.set(Calendar.MINUTE, 0);
+        secondHalfStart.set(Calendar.SECOND, 0);
+
+        Calendar secondHalfEnd = Calendar.getInstance();
+        secondHalfEnd.set(Calendar.MONTH, 11); // 12月
+        secondHalfEnd.set(Calendar.DAY_OF_MONTH, 31);
+        secondHalfEnd.set(Calendar.HOUR_OF_DAY, 23);
+        secondHalfEnd.set(Calendar.MINUTE, 59);
+        secondHalfEnd.set(Calendar.SECOND, 59);
+
+        return isOverlap(range, new DateRange(secondHalfStart.getTime(), secondHalfEnd.getTime()));
+    }
+
+    /**
+     * 判断两个时间范围是否重叠
+     */
+    private boolean isOverlap(DateRange range1, DateRange range2) {
+        // 范围1在范围2之前(不重叠)
+        if (range1.getEnd() != null && range2.getStart() != null
+                && range1.getEnd().before(range2.getStart())) {
+            return false;
+        }
+        // 范围1在范围2之后(不重叠)
+        if (range1.getStart() != null && range2.getEnd() != null
+                && range1.getStart().after(range2.getEnd())) {
+            return false;
+        }
+        // 其他情况均重叠
+        return true;
+    }
+
+    /**
+     * 根据时间和用户ID路由数据库
+     */
+    private Collection<String> routeByTimeAndUserId(Collection<String> availableTargets, Date createTime, Long userId) {
+        if (isFirstHalfYear(createTime)) {
+            return routeFirstHalf(availableTargets, userId);
+        } else if (isSecondHalfYear(createTime)) {
+            return routeSecondHalf(availableTargets, userId);
+        }
+        return availableTargets;
+    }
+
+    /**
+     * 1-6月路由(ds0/ds1)
+     */
+    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            long dbIndex = userId % 2;
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        return Arrays.asList("ds0", "ds1");
+    }
+
+    /**
+     * 7-12月路由(ds2/ds3)
+     */
+    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            long dbIndex = 2 + (userId % 2); // 2或3
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        return Arrays.asList("ds2", "ds3");
+    }
+
+    /**
+     * 提取uid(非order_id场景)
+     */
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+            Long uid = (Long) values.get("uid").iterator().next();
+            return uid % 10000;
+        }
+        return null;
+    }
+
+    /**
+     * 判断是否为1-6月
+     */
+    private boolean isFirstHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    /**
+     * 判断是否为7-12月
+     */
+    private boolean isSecondHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    /**
+     * 无时间条件时的全库过滤
+     */
+    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            return Arrays.asList("ds0", "ds1", "ds2", "ds3");
+        }
+        return availableTargets;
+    }
+
+    /**
+     * 解析时间对象为Date
+     */
+    private Date parseDate(Object value) {
+        if (value instanceof Date) {
+            return (Date) value;
+        }
+        try {
+            return SDF.parse(value.toString());
+        } catch (ParseException e) {
+            throw new RuntimeException("时间格式错误: " + value, e);
+        }
+    }
+
+    /**
+     * 内部类:表示时间范围(start <= create_time <= end)
+     */
+    private static class DateRange {
+        private final Date start;
+        private final Date end;
+
+        public DateRange(Date start, Date end) {
+            this.start = start;
+            this.end = end;
+        }
+
+        public Date getStart() {
+            return start;
+        }
+
+        public Date getEnd() {
+            return end;
+        }
+    }
+
+
+
+}

+ 331 - 0
mall-service/src/main/java/com/txz/mall/configurer/ShardingJdbcConfig.java

@@ -0,0 +1,331 @@
+package com.txz.mall.configurer;
+
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.shardingsphere.api.config.sharding.KeyGeneratorConfiguration;
+import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
+import org.apache.shardingsphere.api.config.sharding.strategy.ComplexShardingStrategyConfiguration;
+import org.apache.shardingsphere.api.config.sharding.strategy.StandardShardingStrategyConfiguration;
+import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.*;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.transaction.PlatformTransactionManager;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.*;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class ShardingJdbcConfig {
+
+    /**
+     * 配置数据源
+     */
+//    @Bean("shardingDataSource")
+//    @Primary
+//    public DataSource dataSource() throws SQLException {
+//        // 配置分片规则
+//        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
+//
+//        // 配置m_store_order表的分片规则
+//        TableRuleConfiguration orderTableRuleConfig = new TableRuleConfiguration("m_store_order",
+//                "mall_${0..1}.m_store_order_${0..1}");
+//
+//        // 设置分库策略
+//        orderTableRuleConfig.setDatabaseShardingStrategyConfig(
+//                new StandardShardingStrategyConfiguration("uid", new UidModuloDatabaseShardingAlgorithm()));
+//
+//        // 设置分表策略
+//        orderTableRuleConfig.setTableShardingStrategyConfig(
+//                new StandardShardingStrategyConfiguration("uid", new UidModuloTableShardingAlgorithm()));
+//
+//        shardingRuleConfig.getTableRuleConfigs().add(orderTableRuleConfig);
+//
+//        // 获取数据源映射
+//        Map<String, DataSource> dataSources = createDataSources();
+//
+//        // 创建并返回分片数据源
+//        return ShardingDataSourceFactory.createDataSource(dataSources, shardingRuleConfig, getProperties());
+//    }
+//
+//    /**
+//     * 创建数据源映射
+//     */
+//    private Map<String, DataSource> createDataSources() {
+//        Map<String, DataSource> dataSources = new HashMap<>(2);
+//
+//        // 配置第一个数据库
+//        dataSources.put("mall_0", createHikariDataSource(
+//                "jdbc:mysql://124.222.152.234:3306/mall_0?useUnicode=true&characterEncoding=utf-8&useSSL=false",
+//                "root",
+//                "hy123456"
+//        ));
+//
+//        // 配置第二个数据库
+//        dataSources.put("mall_1", createHikariDataSource(
+//                "jdbc:mysql://124.222.152.234:3306/mall_1?useUnicode=true&characterEncoding=utf-8&useSSL=false",
+//                "root",
+//                "hy123456"
+//        ));
+//
+//        return dataSources;
+//    }
+//
+//    /**
+//     * 创建Hikari数据源
+//     */
+//    private DataSource createHikariDataSource(String jdbcUrl, String username, String password) {
+//        HikariConfig config = new HikariConfig();
+//        config.setJdbcUrl(jdbcUrl);
+//        config.setUsername(username);
+//        config.setPassword(password);
+//        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
+//        // 可以根据需要配置其他Hikari参数
+//        config.setMaximumPoolSize(10);
+//        config.setMinimumIdle(5);
+//        return new HikariDataSource(config);
+//    }
+//
+//    /**
+//     * 设置Sharding-JDBC的其他属性
+//     */
+//    private Properties getProperties() {
+//        Properties properties = new Properties();
+//        // 打印SQL,方便调试
+//        properties.setProperty("sql.show", "true");
+//        // 执行线程池大小
+//        properties.setProperty("executor.size", "10");
+//        return properties;
+//    }
+
+
+
+    /**
+     * 配置数据源
+     */
+    @Bean
+    public DataSource dataSource() throws SQLException {
+
+        // 1. 配置多个数据源
+        Map<String, DataSource> dataSources = new HashMap<>();
+        dataSources.put("ds0", createDataSource("jdbc:mysql://124.222.152.234:3306/mall_0?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false", "root", "hy123456","ds0"));
+        dataSources.put("ds1", createDataSource("jdbc:mysql://124.222.152.234:3306/mall_1?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false", "root", "hy123456","ds1"));
+        dataSources.put("ds2", createDataSource("jdbc:mysql://124.222.152.234:3306/mall_2?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false", "root", "hy123456","ds2"));
+        dataSources.put("ds3", createDataSource("jdbc:mysql://124.222.152.234:3306/mall_3?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false", "root", "hy123456","ds3"));
+        // 添加默认数据库(非分库分表的表使用)
+        dataSources.put("default_ds", createDataSource("jdbc:mysql://124.222.152.234:3306/mall?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false", "root", "hy123456","ds4"));
+
+
+
+
+        // 4. 配置分表策略(用户ID取模)
+//        orderTableRule.setTableShardingStrategyConfig(
+//                new StandardShardingStrategyConfiguration("uid,order_id", )
+//        );
+
+        // 5. 配置分片规则
+        ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
+        Collection<TableRuleConfiguration> tableRuleConfigs = shardingRuleConfig.getTableRuleConfigs();
+
+        TableRuleConfiguration storeOrderTableRule = storeOrderTableRuleConfiguration();
+        tableRuleConfigs.add(storeOrderTableRule);
+
+
+        TableRuleConfiguration storePinkTableRuleConfiguration = storePinkTableRuleConfiguration();
+        tableRuleConfigs.add(storePinkTableRuleConfiguration);
+
+
+        TableRuleConfiguration storeOrderInfoTableRuleConfiguration = storeOrderInfoTableRuleConfiguration();
+        tableRuleConfigs.add(storeOrderInfoTableRuleConfiguration);
+
+
+        TableRuleConfiguration storeOrderStatusTableRuleConfiguration = storeOrderStatusTableRuleConfiguration();
+        tableRuleConfigs.add(storeOrderStatusTableRuleConfiguration);
+
+        //     这个表分起来有点麻烦,不如不分  查询sql 用的是 cid(活动商品id) 或者 create_time(定时关单)   可以采用定时清理无效数据的方式处理。一般这个数据只在活动持续时间内有效
+//        TableRuleConfiguration storePinkSummaryTableRuleConfiguration = storePinkSummaryTableRuleConfiguration();
+//        tableRuleConfigs.add(storePinkSummaryTableRuleConfiguration);
+
+
+        TableRuleConfiguration userSignTableRuleConfiguration = userSignTableRuleConfiguration();
+        tableRuleConfigs.add(userSignTableRuleConfiguration);
+
+        // 设置默认数据源(非分片表使用)
+        shardingRuleConfig.setDefaultDataSourceName("default_ds");
+
+        Properties props = new Properties();
+        props.setProperty("sql.show", "true");
+        // 允许缺少分片键的查询执行全表扫描(默认false,会报错)
+        props.setProperty("shardingsphere.sharding.allow.full.table.scan", "true");
+
+        // 6. 创建并返回分片数据源
+        return ShardingDataSourceFactory.createDataSource(dataSources, shardingRuleConfig, props);
+    }
+
+
+    @Bean
+    public PlatformTransactionManager transactionManager(DataSource dataSource) {
+        return new DataSourceTransactionManager(dataSource);
+    }
+
+
+    /**
+     * 创建数据源工具方法
+     */
+    private DataSource createDataSource(String url, String username, String password,String dataSourceName) {
+
+        com.zaxxer.hikari.HikariConfig config = new com.zaxxer.hikari.HikariConfig();
+        config.setJdbcUrl(url);
+        config.setUsername(username);
+        config.setPassword(password);
+        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
+        config.setPoolName("dataSourceName");
+        HikariDataSource hikariDataSource = new HikariDataSource(config);
+        try {
+            hikariDataSource.getConnection().close();
+            System.out.println("数据源 " + dataSourceName + " 初始化成功");
+        } catch (SQLException e) {
+            throw new RuntimeException(e);
+        }
+
+        return hikariDataSource;
+    }
+
+    private TableRuleConfiguration storeOrderTableRuleConfiguration(){
+        // 2. 配置订单表分库分表规则
+        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_store_order", "ds${0..3}.m_store_order_${0..4}");
+        // 3. 配置分库策略(时间+用户ID)
+
+        orderTableRule.setDatabaseShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "create_time,uid,order_id",  // 多分片键
+                        new DatabaseShardingAlgorithm()      // 复合分片算法
+                )
+        );
+        orderTableRule.setTableShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "uid,order_id",  // 多分片键
+                        new TableShardingAlgorithm()      // 复合分片算法
+                )
+        );
+
+        return orderTableRule;
+    }
+
+    private TableRuleConfiguration storePinkTableRuleConfiguration(){
+        // 2. 配置订单表分库分表规则
+        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_store_pink", "ds${0..3}.m_store_pink_${0..4}");
+        // 3. 配置分库策略(时间+用户ID)
+
+        orderTableRule.setDatabaseShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "create_time,uid,order_id",  // 多分片键
+                        new DatabaseShardingAlgorithm()      // 复合分片算法
+                )
+        );
+        orderTableRule.setTableShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "uid,order_id",  // 多分片键
+                        new TableShardingAlgorithm()      // 复合分片算法
+                )
+        );
+
+        return orderTableRule;
+    }
+
+
+
+    private TableRuleConfiguration storeOrderInfoTableRuleConfiguration(){
+        // 2. 配置订单表分库分表规则
+        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_store_order_info", "ds${0..3}.m_store_order_info_${0..4}");
+        // 3. 配置分库策略(时间+用户ID)
+
+        orderTableRule.setDatabaseShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "order_no",  // 多分片键
+                        new StoreOrderInfoDatabaseShardingAlgorithm()      // 复合分片算法
+                )
+        );
+        orderTableRule.setTableShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "order_no",  // 多分片键
+                        new StoreOrderInfoTableShardingAlgorithm()      // 复合分片算法
+                )
+        );
+
+        return orderTableRule;
+    }
+
+
+    private TableRuleConfiguration storeOrderStatusTableRuleConfiguration(){
+        // 2. 配置订单表分库分表规则
+        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_store_order_status", "ds${0..3}.m_store_order_status_${0..4}");
+        // 3. 配置分库策略(时间+用户ID)
+
+        orderTableRule.setDatabaseShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "order_id",  // 多分片键
+                        new StoreOrderStatusDatabaseShardingAlgorithm()      // 复合分片算法
+                )
+        );
+        orderTableRule.setTableShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "order_id",  // 多分片键
+                        new StoreOrderStatusTableShardingAlgorithm()      // 复合分片算法
+                )
+        );
+
+        return orderTableRule;
+    }
+
+
+
+//    private TableRuleConfiguration storePinkSummaryTableRuleConfiguration(){
+//        // 2. 配置订单表分库分表规则
+//        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_store_pink_summary", "ds${0..3}.m_store_pink_summary_${0..4}");
+//        // 3. 配置分库策略(时间+用户ID)
+//
+//        orderTableRule.setDatabaseShardingStrategyConfig(
+//                new ComplexShardingStrategyConfiguration(
+//                        "cid",  // 多分片键
+//                        new StorePinkSummaryDatabaseShardingAlgorithm()      // 复合分片算法
+//                )
+//        );
+//        orderTableRule.setTableShardingStrategyConfig(
+//                new ComplexShardingStrategyConfiguration(
+//                        "cid",  // 多分片键
+//                        new StorePinkSummaryTableShardingAlgorithm()      // 复合分片算法
+//                )
+//        );
+//
+//        return orderTableRule;
+//    }
+
+    private TableRuleConfiguration userSignTableRuleConfiguration(){
+        // 2. 配置订单表分库分表规则
+        TableRuleConfiguration orderTableRule = new TableRuleConfiguration("m_user_sign", "ds${0..3}.m_user_sign_${0..4}");
+        // 3. 配置分库策略(时间+用户ID)
+
+        orderTableRule.setDatabaseShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "uid,create_day",  // 多分片键
+                        new UserSignDatabaseShardingAlgorithm()      // 复合分片算法
+                )
+        );
+        orderTableRule.setTableShardingStrategyConfig(
+                new ComplexShardingStrategyConfiguration(
+                        "uid,create_day",  // 多分片键
+                        new UserSignTableShardingAlgorithm()      // 复合分片算法
+                )
+        );
+
+        return orderTableRule;
+    }
+
+
+}

+ 168 - 0
mall-service/src/main/java/com/txz/mall/configurer/StoreOrderInfoDatabaseShardingAlgorithm.java

@@ -0,0 +1,168 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class StoreOrderInfoDatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final SimpleDateFormat SDFORDERNO = new SimpleDateFormat("yyyyMMdd");
+    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 判断操作类型
+        boolean isInsert = isInsertOperation(shardingValue);
+
+        // 提取分片键
+        Date createTime = getCreateTime(shardingValue);
+        Long userId = getUserId(shardingValue);
+
+
+
+        // 插入操作必须包含create_time和user_id
+        if (isInsert && (createTime == null || userId == null)) {
+          //  throw new IllegalArgumentException("插入数据必须包含create_time和user_id");
+        }
+
+        // 1-6月数据处理(维持原逻辑)
+        if (createTime != null && isFirstHalfYear(createTime)) {
+            return routeFirstHalf(availableTargets, userId);
+        }
+
+        // 7-12月数据处理
+        if (createTime != null && isSecondHalfYear(createTime)) {
+            return routeSecondHalf(availableTargets, userId);
+        }
+
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllDatabases(availableTargets, userId);
+    }
+
+    // 1-6月路由逻辑(维持原逻辑:mall_0/mall_1)
+    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+           // String lastFour = getLastFourDigits(userId);
+            long dbIndex = userId % 2; // 0→mall_0,1→mall_1
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描1-6月的库
+        return Arrays.asList("ds0", "ds1");
+    }
+
+    // 7-12月路由逻辑(mall_1/mall_2)
+    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            //String lastFour = getLastFourDigits(userId);
+            long dbIndex = 2 + (userId % 2); // 1→mall_1,2→mall_2
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描7-12月的库
+        return Arrays.asList("ds2", "ds3");
+    }
+
+    // 判断是否为插入操作
+    private boolean isInsertOperation(ComplexKeysShardingValue<?> shardingValue) {
+        //return shardingValue.getSqlType() != null && shardingValue.getSqlType().name().startsWith("INSERT");
+
+        //shardingValue
+        return true;
+    }
+
+    // 提取并解析create_time
+    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("create_time") && !values.get("create_time").isEmpty()) {
+//            Object value = values.get("create_time").iterator().next();
+//            if (value instanceof Date) return (Date) value;
+//            try {
+//                return SDF.parse(value.toString());
+//            } catch (ParseException e) {
+//                throw new RuntimeException("create_time格式错误,应为yyyy-MM-dd HH:mm:ss");
+//            }
+//        }
+
+
+        if (values.containsKey("order_no") && !values.get("order_no").isEmpty()) {
+            String  orderId = (String) values.get("order_no").iterator().next();
+            // 提取日期位并转换为Date类型
+            String dateStr = "20"+orderId.substring(2, 8);
+            try {
+                return SDFORDERNO.parse(dateStr);
+            } catch (ParseException e) {
+                throw new RuntimeException("StoreOrderInfoDatabaseShardingAlgorithm从订单号中提取日期错误"+dateStr);
+            }
+
+        }
+
+
+        return null;
+    }
+
+    // 提取user_id
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("order_no") && !values.get("order_no").isEmpty()) {
+            String  orderId = (String) values.get("order_no").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+
+        return null;
+    }
+
+    // 判断是否为1-6月
+    private boolean isFirstHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 判断是否为7-12月
+    private boolean isSecondHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 获取user_id后四位
+    private String getLastFourDigits(String value) {
+        if (value == null || value.isEmpty()) return "0";
+        return value.substring(Math.max(0, value.length() - 4));
+    }
+
+    // 无create_time时的全量库过滤
+    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            // 有user_id但无时间时,需扫描所有可能的库(mall_0/mall_1/mall_2)
+            return Arrays.asList("ds0", "ds1", "ds2","ds3");
+        }
+        // 无任何条件时扫描所有库
+        return availableTargets;
+    }
+
+
+
+
+
+
+}

+ 51 - 0
mall-service/src/main/java/com/txz/mall/configurer/StoreOrderInfoTableShardingAlgorithm.java

@@ -0,0 +1,51 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class StoreOrderInfoTableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Long userId = getUserId(shardingValue);
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllTable(availableTargets, userId);
+    }
+
+
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("order_no") && !values.get("order_no").isEmpty()) {
+            String  orderId = (String) values.get("order_no").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+        return null;
+    }
+
+    private Collection<String> filterAllTable(Collection<String> availableTargets, Long userId) {
+        //这个模树要拎出去形成配置项
+        long mod = userId % 5;
+        for (String tableName : availableTargets) {
+            if (tableName.endsWith(String.valueOf(mod))) {
+                List<String> list = Arrays.asList(tableName);
+                return list;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分片值: " + userId);
+
+    }
+
+}

+ 168 - 0
mall-service/src/main/java/com/txz/mall/configurer/StoreOrderStatusDatabaseShardingAlgorithm.java

@@ -0,0 +1,168 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class StoreOrderStatusDatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final SimpleDateFormat SDFORDERNO = new SimpleDateFormat("yyyyMMdd");
+    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 判断操作类型
+        boolean isInsert = isInsertOperation(shardingValue);
+
+        // 提取分片键
+        Date createTime = getCreateTime(shardingValue);
+        Long userId = getUserId(shardingValue);
+
+
+
+        // 插入操作必须包含create_time和user_id
+        if (isInsert && (createTime == null || userId == null)) {
+          //  throw new IllegalArgumentException("插入数据必须包含create_time和user_id");
+        }
+
+        // 1-6月数据处理(维持原逻辑)
+        if (createTime != null && isFirstHalfYear(createTime)) {
+            return routeFirstHalf(availableTargets, userId);
+        }
+
+        // 7-12月数据处理
+        if (createTime != null && isSecondHalfYear(createTime)) {
+            return routeSecondHalf(availableTargets, userId);
+        }
+
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllDatabases(availableTargets, userId);
+    }
+
+    // 1-6月路由逻辑(维持原逻辑:mall_0/mall_1)
+    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+           // String lastFour = getLastFourDigits(userId);
+            long dbIndex = userId % 2; // 0→mall_0,1→mall_1
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描1-6月的库
+        return Arrays.asList("ds0", "ds1");
+    }
+
+    // 7-12月路由逻辑(mall_1/mall_2)
+    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            //String lastFour = getLastFourDigits(userId);
+            long dbIndex = 2 + (userId % 2); // 1→mall_1,2→mall_2
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描7-12月的库
+        return Arrays.asList("ds2", "ds3");
+    }
+
+    // 判断是否为插入操作
+    private boolean isInsertOperation(ComplexKeysShardingValue<?> shardingValue) {
+        //return shardingValue.getSqlType() != null && shardingValue.getSqlType().name().startsWith("INSERT");
+
+        //shardingValue
+        return true;
+    }
+
+    // 提取并解析create_time
+    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("create_time") && !values.get("create_time").isEmpty()) {
+//            Object value = values.get("create_time").iterator().next();
+//            if (value instanceof Date) return (Date) value;
+//            try {
+//                return SDF.parse(value.toString());
+//            } catch (ParseException e) {
+//                throw new RuntimeException("create_time格式错误,应为yyyy-MM-dd HH:mm:ss");
+//            }
+//        }
+
+
+        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+            String  orderId = (String) values.get("order_id").iterator().next();
+            // 提取日期位并转换为Date类型
+            String dateStr = "20"+orderId.substring(2, 8);
+            try {
+                return SDFORDERNO.parse(dateStr);
+            } catch (ParseException e) {
+                throw new RuntimeException("StoreOrderStatusDatabaseShardingAlgorithm从订单号中提取日期错误"+dateStr);
+            }
+
+        }
+
+
+        return null;
+    }
+
+    // 提取user_id
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+            String  orderId = (String) values.get("order_id").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+
+        return null;
+    }
+
+    // 判断是否为1-6月
+    private boolean isFirstHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 判断是否为7-12月
+    private boolean isSecondHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 获取user_id后四位
+    private String getLastFourDigits(String value) {
+        if (value == null || value.isEmpty()) return "0";
+        return value.substring(Math.max(0, value.length() - 4));
+    }
+
+    // 无create_time时的全量库过滤
+    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            // 有user_id但无时间时,需扫描所有可能的库(mall_0/mall_1/mall_2)
+            return Arrays.asList("ds0", "ds1", "ds2","ds3");
+        }
+        // 无任何条件时扫描所有库
+        return availableTargets;
+    }
+
+
+
+
+
+
+}

+ 51 - 0
mall-service/src/main/java/com/txz/mall/configurer/StoreOrderStatusTableShardingAlgorithm.java

@@ -0,0 +1,51 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class StoreOrderStatusTableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Long userId = getUserId(shardingValue);
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllTable(availableTargets, userId);
+    }
+
+
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+            String  orderId = (String) values.get("order_id").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+        return null;
+    }
+
+    private Collection<String> filterAllTable(Collection<String> availableTargets, Long userId) {
+        //这个模树要拎出去形成配置项
+        long mod = userId % 5;
+        for (String tableName : availableTargets) {
+            if (tableName.endsWith(String.valueOf(mod))) {
+                List<String> list = Arrays.asList(tableName);
+                return list;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分片值: " + userId);
+
+    }
+
+}

+ 168 - 0
mall-service/src/main/java/com/txz/mall/configurer/StorePinkSummaryDatabaseShardingAlgorithm.java

@@ -0,0 +1,168 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class StorePinkSummaryDatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private static final SimpleDateFormat SDFORDERNO = new SimpleDateFormat("yyyyMMdd");
+    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 判断操作类型
+        boolean isInsert = isInsertOperation(shardingValue);
+
+        // 提取分片键
+        Date createTime = getCreateTime(shardingValue);
+        Long userId = getUserId(shardingValue);
+
+
+
+        // 插入操作必须包含create_time和user_id
+        if (isInsert && (createTime == null || userId == null)) {
+          //  throw new IllegalArgumentException("插入数据必须包含create_time和user_id");
+        }
+
+        // 1-6月数据处理(维持原逻辑)
+        if (createTime != null && isFirstHalfYear(createTime)) {
+            return routeFirstHalf(availableTargets, userId);
+        }
+
+        // 7-12月数据处理
+        if (createTime != null && isSecondHalfYear(createTime)) {
+            return routeSecondHalf(availableTargets, userId);
+        }
+
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllDatabases(availableTargets, userId);
+    }
+
+    // 1-6月路由逻辑(维持原逻辑:mall_0/mall_1)
+    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+           // String lastFour = getLastFourDigits(userId);
+            long dbIndex = userId % 2; // 0→mall_0,1→mall_1
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描1-6月的库
+        return Arrays.asList("ds0", "ds1");
+    }
+
+    // 7-12月路由逻辑(mall_1/mall_2)
+    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            //String lastFour = getLastFourDigits(userId);
+            long dbIndex = 2 + (userId % 2); // 1→mall_1,2→mall_2
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描7-12月的库
+        return Arrays.asList("ds2", "ds3");
+    }
+
+    // 判断是否为插入操作
+    private boolean isInsertOperation(ComplexKeysShardingValue<?> shardingValue) {
+        //return shardingValue.getSqlType() != null && shardingValue.getSqlType().name().startsWith("INSERT");
+
+        //shardingValue
+        return true;
+    }
+
+    // 提取并解析create_time
+    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("create_time") && !values.get("create_time").isEmpty()) {
+//            Object value = values.get("create_time").iterator().next();
+//            if (value instanceof Date) return (Date) value;
+//            try {
+//                return SDF.parse(value.toString());
+//            } catch (ParseException e) {
+//                throw new RuntimeException("create_time格式错误,应为yyyy-MM-dd HH:mm:ss");
+//            }
+//        }
+
+
+        if (values.containsKey("code") && !values.get("code").isEmpty()) {
+            String  orderId = (String) values.get("code").iterator().next();
+            // 提取日期位并转换为Date类型
+            String dateStr = "20"+orderId.substring(2, 8);
+            try {
+                return SDFORDERNO.parse(dateStr);
+            } catch (ParseException e) {
+                throw new RuntimeException("StoreOrderStatusDatabaseShardingAlgorithm从订单号中提取日期错误"+dateStr);
+            }
+
+        }
+
+
+        return null;
+    }
+
+    // 提取user_id
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("code") && !values.get("code").isEmpty()) {
+            String  orderId = (String) values.get("code").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+
+        return null;
+    }
+
+    // 判断是否为1-6月
+    private boolean isFirstHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 判断是否为7-12月
+    private boolean isSecondHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 获取user_id后四位
+    private String getLastFourDigits(String value) {
+        if (value == null || value.isEmpty()) return "0";
+        return value.substring(Math.max(0, value.length() - 4));
+    }
+
+    // 无create_time时的全量库过滤
+    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            // 有user_id但无时间时,需扫描所有可能的库(mall_0/mall_1/mall_2)
+            return Arrays.asList("ds0", "ds1", "ds2","ds3");
+        }
+        // 无任何条件时扫描所有库
+        return availableTargets;
+    }
+
+
+
+
+
+
+}

+ 51 - 0
mall-service/src/main/java/com/txz/mall/configurer/StorePinkSummaryTableShardingAlgorithm.java

@@ -0,0 +1,51 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class StorePinkSummaryTableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Long userId = getUserId(shardingValue);
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllTable(availableTargets, userId);
+    }
+
+
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+
+        if (values.containsKey("code") && !values.get("code").isEmpty()) {
+            String  orderId = (String) values.get("code").iterator().next();
+            // 提取后4位并转换为long类型
+            String lastFourStr = orderId.substring(orderId.length() - 4);
+            return Long.parseLong(lastFourStr);
+        }
+
+        return null;
+    }
+
+    private Collection<String> filterAllTable(Collection<String> availableTargets, Long userId) {
+        //这个模树要拎出去形成配置项
+        long mod = userId % 5;
+        for (String tableName : availableTargets) {
+            if (tableName.endsWith(String.valueOf(mod))) {
+                List<String> list = Arrays.asList(tableName);
+                return list;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分片值: " + userId);
+
+    }
+
+}

+ 113 - 0
mall-service/src/main/java/com/txz/mall/configurer/TableShardingAlgorithm.java

@@ -0,0 +1,113 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class TableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+//    @Override
+//    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Long userId = getUserId(shardingValue);
+//        // 查询时无create_time:扫描所有符合条件的库
+//        return filterAllTable(availableTargets, userId);
+//    }
+//
+//
+//    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+//        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+//        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+//            Long uid = (Long) values.get("uid").iterator().next();
+//            return uid % 10000;
+//        }
+//
+//        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+//            String  orderId = (String) values.get("order_id").iterator().next();
+//            // 提取后4位并转换为long类型
+//            String lastFourStr = orderId.substring(orderId.length() - 4);
+//            return Long.parseLong(lastFourStr);
+//        }
+//
+//        return null;
+//    }
+//
+//    private Collection<String> filterAllTable(Collection<String> availableTargets, Long userId) {
+//        //这个模树要拎出去形成配置项
+//        long mod = userId % 5;
+//        for (String tableName : availableTargets) {
+//            if (tableName.endsWith(String.valueOf(mod))) {
+//                List<String> list = Arrays.asList(tableName);
+//                return list;
+//            }
+//        }
+//        throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分片值: " + userId);
+//
+//    }
+
+    // 步骤1:修改getUserId,返回所有order_id对应的分表键(后4位)
+    private Collection<Long> getShardingKeys(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        Collection<Long> shardingKeys = new ArrayList<>();
+
+        // 优先处理uid(如果有)
+        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+            for (Comparable<?> val : values.get("uid")) {
+                Long uid = (Long) val;
+                shardingKeys.add(uid % 10000);
+            }
+            return shardingKeys;
+        }
+
+        // 核心:处理order_id的IN条件,遍历所有order_id
+        if (values.containsKey("order_id") && !values.get("order_id").isEmpty()) {
+            for (Comparable<?> val : values.get("order_id")) {
+                String orderId = (String) val;
+                // 提取每个order_id的后4位,作为分表键
+                String lastFourStr = orderId.substring(orderId.length() - 4);
+                shardingKeys.add(Long.parseLong(lastFourStr));
+            }
+            return shardingKeys;
+        }
+
+        return shardingKeys;
+    }
+
+    // 步骤2:修改doSharding,返回所有匹配的表
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+       // String logicTableName = shardingValue.getLogicTableName();
+
+        // 1. 获取所有分表键(每个order_id对应一个)
+        Collection<Long> shardingKeys = getShardingKeys(shardingValue);
+        if (shardingKeys.isEmpty()) {
+            throw new IllegalArgumentException("分表键不能为空(需uid或order_id)");
+        }
+
+        // 2. 每个分表键对应一个表,收集所有匹配的表
+        Collection<String> resultTables = new ArrayList<>();
+        for (Long key : shardingKeys) {
+            // 计算分区(和你原逻辑一致:key % 5)
+            long tableSuffix = key % 5;
+            // 匹配可用表(如m_store_pink_3)
+            for (String targetTable : availableTargets) {
+                if (targetTable.endsWith(String.valueOf(tableSuffix))) {
+                    resultTables.add(targetTable);
+                    break; // 找到对应表就跳出,避免重复
+                }
+            }
+        }
+
+        // 3. 若没有匹配的表,抛出异常
+        if (resultTables.isEmpty()) {
+            throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分表键: " + shardingKeys);
+        }
+
+        return resultTables;
+    }
+
+
+
+}

+ 27 - 0
mall-service/src/main/java/com/txz/mall/configurer/UidModuloDatabaseShardingAlgorithm.java

@@ -0,0 +1,27 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+
+import java.util.Collection;
+
+public class UidModuloDatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
+
+    @Override
+    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
+        // 获取uid值
+        Long uid = shardingValue.getValue();
+        // 取uid后四位
+        long lastFourDigits = uid % 10000;
+        // 对2取模,确定库索引
+        long dbIndex = lastFourDigits % 2;
+
+        // 匹配对应的数据库
+        for (String targetName : availableTargetNames) {
+            if (targetName.endsWith(String.valueOf(dbIndex))) {
+                return targetName;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的数据库: " + availableTargetNames + ", uid: " + uid);
+    }
+}

+ 23 - 0
mall-service/src/main/java/com/txz/mall/configurer/UidModuloTableShardingAlgorithm.java

@@ -0,0 +1,23 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+
+import java.util.Collection;
+
+public class UidModuloTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
+
+    @Override
+    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
+        // 获取uid值
+        Long uid = shardingValue.getValue();
+        // 取uid后四位
+        long lastFourDigits = uid % 10000;
+        // 对2取模,确定表索引
+        long tableIndex = lastFourDigits % 2;
+
+        // 匹配对应的表
+        String logicTableName = shardingValue.getLogicTableName();
+        return logicTableName + "_" + tableIndex;
+    }
+}

+ 31 - 0
mall-service/src/main/java/com/txz/mall/configurer/UserIdTableShardingAlgorithm.java

@@ -0,0 +1,31 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;
+
+import java.util.Collection;
+
+public class UserIdTableShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
+
+    @Override
+    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
+
+        long lastFourDigits = getLastFourDigits(shardingValue.getValue());
+        // 用户ID取模5,分配到0-4表
+        long mod = lastFourDigits % 5;
+        for (String tableName : availableTargetNames) {
+            if (tableName.endsWith(String.valueOf(mod))) {
+                return tableName;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的表: " + availableTargetNames + ", 分片值: " + shardingValue);
+    }
+
+
+    // 获取user_id后四位
+    private long getLastFourDigits(Long value) {
+        if (value == null ) return 0L;
+        return value % 10000 ;
+    }
+
+}

+ 148 - 0
mall-service/src/main/java/com/txz/mall/configurer/UserSignDatabaseShardingAlgorithm.java

@@ -0,0 +1,148 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class UserSignDatabaseShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+
+    private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd");
+
+    private static final Set<Integer> FIRST_HALF_MONTHS = new HashSet<>(Arrays.asList(1, 2, 3, 4, 5, 6));
+    private static final Set<Integer> SECOND_HALF_MONTHS = new HashSet<>(Arrays.asList(7, 8, 9, 10, 11, 12));
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        // 判断操作类型
+     //   boolean isInsert = isInsertOperation(shardingValue);
+
+        // 提取分片键
+        Date createTime = getCreateTime(shardingValue);
+        Long userId = getUserId(shardingValue);
+
+
+
+        // 插入操作必须包含create_time和user_id
+     //   if (isInsert && (createTime == null || userId == null)) {
+          //  throw new IllegalArgumentException("插入数据必须包含create_time和user_id");
+     //   }
+
+        // 1-6月数据处理(维持原逻辑)
+        if (createTime != null && isFirstHalfYear(createTime)) {
+            return routeFirstHalf(availableTargets, userId);
+        }
+
+        // 7-12月数据处理
+        if (createTime != null && isSecondHalfYear(createTime)) {
+            return routeSecondHalf(availableTargets, userId);
+        }
+
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllDatabases(availableTargets, userId);
+    }
+
+    // 1-6月路由逻辑(维持原逻辑:mall_0/mall_1)
+    private Collection<String> routeFirstHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+           // String lastFour = getLastFourDigits(userId);
+            long dbIndex = userId % 2; // 0→mall_0,1→mall_1
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描1-6月的库
+        return Arrays.asList("ds0", "ds1");
+    }
+
+    // 7-12月路由逻辑(mall_1/mall_2)
+    private Collection<String> routeSecondHalf(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            //String lastFour = getLastFourDigits(userId);
+            long dbIndex = 2 + (userId % 2); // 1→mall_1,2→mall_2
+            String targetDb = "ds" + dbIndex;
+            if (availableTargets.contains(targetDb)) {
+                return Collections.singleton(targetDb);
+            }
+        }
+        // 查询时无user_id:扫描7-12月的库
+        return Arrays.asList("ds2", "ds3");
+    }
+
+    // 判断是否为插入操作
+    private boolean isInsertOperation(ComplexKeysShardingValue<?> shardingValue) {
+        //return shardingValue.getSqlType() != null && shardingValue.getSqlType().name().startsWith("INSERT");
+
+        //shardingValue
+        return true;
+    }
+
+    // 提取并解析create_time
+    private Date getCreateTime(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        if (values.containsKey("create_day") && !values.get("create_day").isEmpty()) {
+            Object value = values.get("create_day").iterator().next();
+            if (value instanceof Date) return (Date) value;
+            try {
+                return SDF.parse(value.toString());
+            } catch (ParseException e) {
+                throw new RuntimeException("UserSignDatabaseShardingAlgorithm create_day格式错误,应为yyyy-MM-dd");
+            }
+        }
+
+
+        return null;
+    }
+
+    // 提取user_id
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+            Long uid = (Long) values.get("uid").iterator().next();
+            return uid % 10000;
+        }
+
+
+        return null;
+    }
+
+    // 判断是否为1-6月
+    private boolean isFirstHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return FIRST_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 判断是否为7-12月
+    private boolean isSecondHalfYear(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return SECOND_HALF_MONTHS.contains(calendar.get(Calendar.MONTH) + 1);
+    }
+
+    // 获取user_id后四位
+    private String getLastFourDigits(String value) {
+        if (value == null || value.isEmpty()) return "0";
+        return value.substring(Math.max(0, value.length() - 4));
+    }
+
+    // 无create_time时的全量库过滤
+    private Collection<String> filterAllDatabases(Collection<String> availableTargets, Long userId) {
+        if (userId != null) {
+            // 有user_id但无时间时,需扫描所有可能的库(mall_0/mall_1/mall_2)
+            return Arrays.asList("ds0", "ds1", "ds2","ds3");
+        }
+        // 无任何条件时扫描所有库
+        return availableTargets;
+    }
+
+
+
+
+
+
+}

+ 44 - 0
mall-service/src/main/java/com/txz/mall/configurer/UserSignTableShardingAlgorithm.java

@@ -0,0 +1,44 @@
+package com.txz.mall.configurer;
+
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingAlgorithm;
+import org.apache.shardingsphere.api.sharding.complex.ComplexKeysShardingValue;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class UserSignTableShardingAlgorithm implements ComplexKeysShardingAlgorithm<Comparable<?>> {
+
+    @Override
+    public Collection<String> doSharding(Collection<String> availableTargets, ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Long userId = getUserId(shardingValue);
+        // 查询时无create_time:扫描所有符合条件的库
+        return filterAllTable(availableTargets, userId);
+    }
+
+
+    private Long getUserId(ComplexKeysShardingValue<Comparable<?>> shardingValue) {
+        Map<String, Collection<Comparable<?>>> values = shardingValue.getColumnNameAndShardingValuesMap();
+        if (values.containsKey("uid") && !values.get("uid").isEmpty()) {
+            Long uid = (Long) values.get("uid").iterator().next();
+            return uid % 10000;
+        }
+
+        return null;
+    }
+
+    private Collection<String> filterAllTable(Collection<String> availableTargets, Long userId) {
+        //这个模树要拎出去形成配置项
+        long mod = userId % 5;
+        for (String tableName : availableTargets) {
+            if (tableName.endsWith(String.valueOf(mod))) {
+                List<String> list = Arrays.asList(tableName);
+                return list;
+            }
+        }
+        throw new IllegalArgumentException("未找到匹配的表: " + availableTargets + ", 分片值: " + userId);
+
+    }
+
+}

+ 6 - 6
mall-service/src/main/java/com/txz/mall/controller/OrderController.java

@@ -102,8 +102,8 @@ public class OrderController {
     public Result<StoreOrderVO> detail(@RequestParam(value = "id", required = false) Long id
             ,@RequestParam(value = "orderNo", required = false) String orderNo) {
 
-        if (ObjectUtils.isEmpty(id) && ObjectUtils.isEmpty(orderNo) ) {
-            return Result.fail(ResultCode.ID_IS_NULL);
+        if (ObjectUtils.isEmpty(orderNo) ) {
+            return Result.fail(ResultCode.CODE_IS_NULL);
         }
         StoreOrderVO vo = orderServiceBusiness.orderDetail(id,orderNo);
         return Result.success(vo);
@@ -167,8 +167,8 @@ public class OrderController {
 
     @ApiOperation("关闭订单")
     @PostMapping("/close")
-    public Result close(@RequestParam("id") Long id) {
-        storeOrderService.close(id);
+    public Result close(@RequestParam("orderNo") String orderNo) {
+        storeOrderService.close(orderNo);
         return Result.success();
     }
 
@@ -185,8 +185,8 @@ public class OrderController {
 
     @ApiOperation("取消订单")
     @PostMapping("/cancel")
-    public Result cancel(@RequestParam("id") Long id) {
-        storeOrderService.cancel(id);
+    public Result cancel(@RequestParam("orderNo") String orderNo) {
+        storeOrderService.cancel(orderNo);
         return Result.success();
     }
 

+ 6 - 6
mall-service/src/main/java/com/txz/mall/controller/PinkController.java

@@ -166,8 +166,8 @@ public class PinkController {
      */
     @ApiOperation(value = "拼团订单列表")
     @GetMapping(value = "/orderPink")
-    public Result<List<StorePinkDetailVO>> getPinkList(@RequestParam("id") Long id) {
-        return Result.success(pinkServiceBusiness.getAdminList(id,"pc"));
+    public Result<List<StorePinkDetailVO>> getPinkList(@RequestParam("orderNo") String orderNo) {
+        return Result.success(pinkServiceBusiness.getAdminList(orderNo,"pc"));
     }
 
     /**
@@ -175,9 +175,9 @@ public class PinkController {
      */
     @ApiOperation(value = "拼团成功")
     @PostMapping(value = "/pinkSuccess")
-    public Result pinkSuccess(@RequestParam("id") Long id) {
+    public Result pinkSuccess(@RequestParam("orderNo") String orderNo) {
         StoreOrder storeOrder = new StoreOrder();
-        storePinkService.pinkSuccess(id,storeOrder);
+        storePinkService.pinkSuccess(orderNo,storeOrder);
         return Result.success();
     }
 
@@ -196,8 +196,8 @@ public class PinkController {
      */
     @ApiOperation(value = "天选")
     @PostMapping(value = "/theSelection")
-    public Result theSelection(@RequestParam("id") Long orderId) {
-        storePinkService.theSelection(orderId,new Date());
+    public Result theSelection(@RequestParam("spsCode") String spsCode) {
+        storePinkService.theSelection(spsCode,new Date());
         return Result.success();
     }
     @Resource

+ 1 - 1
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppCombinationController.java

@@ -316,7 +316,7 @@ public class AppCombinationController {
       //  PageHelper.startPage(page, size);
         PageInfo pageInfo = null;
         try {
-            List<StoreCombinationRankVO> list = orderServiceBusiness.getRank();
+            List<StoreCombinationRankVO> list = orderServiceBusiness.getRankNew();
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 6 - 6
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppOrderController.java

@@ -137,8 +137,8 @@ public class AppOrderController {
     public Result<StoreOrderVO> detail(@RequestParam(value = "id", required = false) Long id
             , @RequestParam(value = "orderNo", required = false) String orderNo) {
         
-        if (ObjectUtils.isEmpty(id) && ObjectUtils.isEmpty(orderNo)) {
-            return Result.fail(ResultCode.ID_IS_NULL);
+        if (ObjectUtils.isEmpty(orderNo)) {
+            return Result.fail(ResultCode.CODE_IS_NULL);
         }
         StoreOrderVO vo = orderServiceBusiness.orderDetail(id, orderNo);
         return Result.success(vo);
@@ -196,15 +196,15 @@ public class AppOrderController {
     
     @ApiOperation("关闭订单")
     @PostMapping("/close")
-    public Result close(@RequestParam("id") Long id) {
-        storeOrderService.close(id);
+    public Result close(@RequestParam("orderNo") String orderNo) {
+        storeOrderService.close(orderNo);
         return Result.success();
     }
     
     @ApiOperation("取消订单")
     @PostMapping("/cancel")
-    public Result cancel(@RequestParam("id") Long id) {
-        storeOrderService.cancel(id);
+    public Result cancel(@RequestParam("orderNo") String orderNo) {
+        storeOrderService.cancel(orderNo);
         return Result.success();
     }
     

+ 4 - 4
mall-service/src/main/java/com/txz/mall/controller/appcontroller/AppPinkController.java

@@ -152,8 +152,8 @@ public class AppPinkController {
      */
     @ApiOperation(value = "拼团订单列表")
     @GetMapping(value = "/orderPink")
-    public Result<List<StorePinkDetailVO>> getPinkList(@RequestParam("id") Long id) {
-        return Result.success(pinkServiceBusiness.getAdminList(id,"app"));
+    public Result<List<StorePinkDetailVO>> getPinkList(@RequestParam("orderNo") String orderNo) {
+        return Result.success(pinkServiceBusiness.getAdminList(orderNo,"app"));
     }
 
     /**
@@ -161,9 +161,9 @@ public class AppPinkController {
      */
     @ApiOperation(value = "拼团成功")
     @PostMapping(value = "/pinkSuccess")
-    public Result pinkSuccess(@RequestParam("id") Long id) {
+    public Result pinkSuccess(@RequestParam("orderNo") String orderNo) {
         StoreOrder storeOrder = new StoreOrder();
-        storePinkService.pinkSuccess(id,storeOrder);
+        storePinkService.pinkSuccess(orderNo,storeOrder);
         return Result.success();
     }
 

+ 27 - 0
mall-service/src/main/java/com/txz/mall/dao/DailySalesSummaryOfProductsMapper.java

@@ -0,0 +1,27 @@
+package com.txz.mall.dao;
+
+import com.txz.mall.core.Mapper;
+import com.txz.mall.dao.impl.DailySalesSummaryOfProductsMapperImpl;
+import com.txz.mall.dao.impl.StorePinkMapperImpl;
+import com.txz.mall.model.DailySalesSummaryOfProducts;
+import dto.ProductCarouselDTO;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.SelectProvider;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public interface DailySalesSummaryOfProductsMapper extends Mapper<DailySalesSummaryOfProducts> {
+
+
+    List<Map<String,Object>> getRankNew(@Param("date") Date date, @Param("productSet") Set<Long> productSet);
+
+
+    @SelectProvider(type = DailySalesSummaryOfProductsMapperImpl.class, method = "pinkByProductId")
+    List<ProductCarouselDTO> pinkByProductId(Long productId);
+
+
+
+}

+ 20 - 0
mall-service/src/main/java/com/txz/mall/dao/impl/DailySalesSummaryOfProductsMapperImpl.java

@@ -0,0 +1,20 @@
+package com.txz.mall.dao.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+
+/**
+ * @author: MTD®️
+ * @date: 2025/8/27
+ */
+
+public class DailySalesSummaryOfProductsMapperImpl {
+    
+    public String pinkByProductId(Long productId) {
+        if (ObjectUtil.isNotEmpty(productId)) {
+            return "SELECT uid, k_id FROM m_daily_sales_summary_of_products WHERE pid = #{productId} GROUP BY uid ORDER BY create_time DESC LIMIT 10";
+        } else {
+            return "SELECT uid, k_id FROM m_daily_sales_summary_of_products GROUP BY uid ORDER BY create_time DESC LIMIT 10";
+        }
+        
+    }
+}

+ 194 - 0
mall-service/src/main/java/com/txz/mall/model/DailySalesSummaryOfProducts.java

@@ -0,0 +1,194 @@
+package com.txz.mall.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import javax.persistence.*;
+
+/**
+ * 表名:m_daily_sales_summary_of_products
+ * 表注释:商品每日销量汇总表
+*/
+@Data
+@Table(name = "m_daily_sales_summary_of_products")
+public class DailySalesSummaryOfProducts {
+    /**
+     * 拼团ID
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 用户id
+     */
+    @ApiModelProperty(value = "用户id")
+    private Long uid;
+
+
+    /**
+     * 拼团汇总表id
+     */
+    @ApiModelProperty(value = "拼团汇总表id")
+    @Column(name = "sps_id")
+    private Long spsId;
+
+    /**
+     * 订单id 生成
+     */
+    @ApiModelProperty(value = "订单id 生成")
+    @Column(name = "order_id")
+    private String orderId;
+
+    /**
+     * 订单id  数据库
+     */
+    @ApiModelProperty(value = "订单id  数据库")
+    @Column(name = "order_id_key")
+    private Long orderIdKey;
+
+    /**
+     * 购买商品个数
+     */
+    @ApiModelProperty(value = "购买商品个数")
+    @Column(name = "total_num")
+    private Integer totalNum;
+
+    /**
+     * 购买总金额
+     */
+    @ApiModelProperty(value = "购买总金额")
+    @Column(name = "total_price")
+    private BigDecimal totalPrice;
+
+    /**
+     * 拼团商品id
+     */
+    @ApiModelProperty(value = "拼团商品id")
+    private Long cid;
+
+    /**
+     * 商品id
+     */
+    @ApiModelProperty(value = "商品id")
+    private Long pid;
+
+    /**
+     * 拼图总人数
+     */
+    @ApiModelProperty(value = "拼图总人数")
+    private Integer people;
+
+    /**
+     * 拼团商品单价
+     */
+    @ApiModelProperty(value = "拼团商品单价")
+    private BigDecimal price;
+
+    /**
+     * 开始时间
+     */
+    @ApiModelProperty(value = "开始时间")
+    @Column(name = "add_time")
+    private Date addTime;
+
+    /**
+     * 结束时间
+     */
+    @ApiModelProperty(value = "结束时间")
+    @Column(name = "stop_time")
+    private Date stopTime;
+
+    /**
+     * 团长id 0为团长
+     */
+    @ApiModelProperty(value = "团长id 0为团长 1不是")
+    @Column(name = "k_id")
+    private Integer kId;
+
+    @ApiModelProperty(value = "幸运儿 默认0  1为幸运儿   (//团长不能是天选)")
+    @Column(name = "l_id")
+    private Integer lId;
+
+//    /**
+//     * 是否发送模板消息0未发送1已发送
+//     */
+//    @ApiModelProperty(value = "是否发送模板消息 0未发送 1已发送")
+//    @Column(name = "is_tpl")
+//    private Integer isTpl;
+
+    /**
+     * 是否退款 0未退款 1已退款
+     */
+    @ApiModelProperty(value = "是否退款 0未退款 1已退款")
+    @Column(name = "is_refund")
+    private Integer isRefund;
+
+    /**
+     * 状态1进行中2已完成3未完成
+     */
+    @ApiModelProperty(value = "状态 1进行中 2已完成 3未完成")
+    @Column(name = "status")
+    private Integer status;
+
+//    /**
+//     * 是否虚拟拼团
+//     */
+//    @ApiModelProperty(value = "是否虚拟拼团")
+//    @Column(name = "is_virtual")
+//    private Integer isVirtual;
+
+    /**
+     * 用户昵称
+     */
+    @ApiModelProperty(value = "用户昵称")
+    private String nickname;
+
+    /**
+     * 用户头像
+     */
+    @ApiModelProperty(value = "用户头像")
+    private String avatar;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    /**
+     * 创建人id
+     */
+    @Column(name = "create_user_id")
+    private Long createUserId;
+
+    /**
+     * 更新人id
+     */
+    @Column(name = "update_user_id")
+    private Long updateUserId;
+
+    /**
+     * 是否删除
+     */
+    @Column(name = "is_delete")
+    private Integer isDelete;
+
+
+    @ApiModelProperty(value = "订单状态")
+    @Column(name = "order_status")
+    private Integer orderStatus;
+
+
+    @ApiModelProperty(value = "拼团汇总编码")
+    @Column(name = "sps_code")
+    private String spsCode;
+}

+ 5 - 0
mall-service/src/main/java/com/txz/mall/model/StoreOrderStatus.java

@@ -36,5 +36,10 @@ public class StoreOrderStatus {
     @Column(name = "create_time")
     private Date createTime;
 
+    /**
+     * 订单编码
+     */
+    @Column(name = "order_id")
+    private String orderId;
 
 }

+ 5 - 0
mall-service/src/main/java/com/txz/mall/model/StorePink.java

@@ -183,4 +183,9 @@ public class StorePink {
     @Column(name = "order_status")
     private Integer orderStatus;
 
+
+    @ApiModelProperty(value = "拼团汇总编码")
+    @Column(name = "sps_code")
+    private String spsCode;
+
 }

+ 11 - 1
mall-service/src/main/java/com/txz/mall/model/StorePinkSummary.java

@@ -137,7 +137,11 @@ public class StorePinkSummary {
     @Column(name = "version")
     private Integer version;
 
-
+    /**
+     * 订单编码集合
+     */
+    @Column(name = "order_no_set")
+    private String orderNoSet;
 
     public Integer getVersion() {
         return version;
@@ -506,5 +510,11 @@ public class StorePinkSummary {
         this.code = code;
     }
 
+    public String getOrderNoSet() {
+        return orderNoSet;
+    }
 
+    public void setOrderNoSet(String orderNoSet) {
+        this.orderNoSet = orderNoSet;
+    }
 }

+ 22 - 0
mall-service/src/main/java/com/txz/mall/service/DailySalesSummaryOfProductsService.java

@@ -0,0 +1,22 @@
+package com.txz.mall.service;
+import com.txz.mall.model.DailySalesSummaryOfProducts;
+import com.txz.mall.core.Service;
+import com.txz.mall.model.StorePink;
+import org.springframework.beans.BeanUtils;
+
+
+/**
+ * Created by CodeGenerator on 2025/10/21.
+ */
+public interface DailySalesSummaryOfProductsService extends Service<DailySalesSummaryOfProducts> {
+
+
+   void saveDailySalesSummaryOfProducts(StorePink storePink);
+
+
+   void updateDailySalesSummaryOfProducts(String orderNo,StorePink storePink);
+
+
+   void dailyDataCleaning();
+
+}

+ 7 - 4
mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java

@@ -125,7 +125,7 @@ public interface StoreOrderService extends Service<StoreOrder> {
      *
      * @param id 订单编号
      */
-    void close(Long id);
+    void close(String orderNo);
 
 
     /**
@@ -137,9 +137,9 @@ public interface StoreOrderService extends Service<StoreOrder> {
     /**
      * 订单取消
      *
-     * @param id 订单编号
+     * @param orderNo 订单编号
      */
-    void cancel(Long id);
+    void cancel(String orderNo);
 
 
     void orderTimeoutAutomaticCancel();
@@ -157,7 +157,7 @@ public interface StoreOrderService extends Service<StoreOrder> {
     /**
      * 订单状态机
      */
-    void updateOrderStatus(Long id, Integer status);
+    void updateOrderStatus(String orderNo, Integer status);
 
 
 
@@ -174,4 +174,7 @@ public interface StoreOrderService extends Service<StoreOrder> {
 
     List<StoreCombinationRankVO> getRank();
 
+
+
+
 }

+ 2 - 2
mall-service/src/main/java/com/txz/mall/service/StoreOrderStatusService.java

@@ -19,7 +19,7 @@ public interface StoreOrderStatusService extends Service<StoreOrderStatus> {
      * @param message 备注
      * @return Boolean
      */
-    void createLog(Long orderId, String type, String message);
+    void createLog(Long orderId,String orderCode, String type, String message);
 
     /**
      * 获取订单日志
@@ -27,5 +27,5 @@ public interface StoreOrderStatusService extends Service<StoreOrderStatus> {
      * @param orderId 订单id
      * @return List<StoreOrderStatus>
      */
-    List<StoreOrderStatus> getLogList(Long orderId);
+    List<StoreOrderStatus> getLogList(String orderId);
 }

+ 2 - 2
mall-service/src/main/java/com/txz/mall/service/StorePinkService.java

@@ -27,7 +27,7 @@ public interface StorePinkService extends Service<StorePink> {
     /**
      * 拼团成功
      */
-    void pinkSuccess(Long id, StoreOrder storeOrder);
+    void pinkSuccess(String orderNo, StoreOrder storeOrder);
 
     /**
      * 天选之子
@@ -36,7 +36,7 @@ public interface StorePinkService extends Service<StorePink> {
      */
   //  void theSelection(String orderId);
 
-    void theSelection(Long spsId, Date date);
+    void theSelection(String spsCode, Date date);
     /**
      * 已存在拼团列表
      */

+ 2 - 2
mall-service/src/main/java/com/txz/mall/service/StorePinkSummaryService.java

@@ -10,8 +10,8 @@ public interface StorePinkSummaryService extends Service<StorePinkSummary> {
 
 
 
-    Boolean maintainQuantityStatusOfTheStorePinkSummary(Long id);
-
+    Boolean maintainQuantityStatusOfTheStorePinkSummary(String  spsCode);
 
+    Boolean maintainOrderNoSetOfTheStorePinkSummary(String spsCode,String orderNo);
 
 }

+ 64 - 0
mall-service/src/main/java/com/txz/mall/service/impl/DailySalesSummaryOfProductsServiceImpl.java

@@ -0,0 +1,64 @@
+package com.txz.mall.service.impl;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import com.txz.mall.dao.DailySalesSummaryOfProductsMapper;
+import com.txz.mall.model.DailySalesSummaryOfProducts;
+import com.txz.mall.model.StorePink;
+import com.txz.mall.service.DailySalesSummaryOfProductsService;
+import com.txz.mall.core.AbstractService;
+import org.apache.commons.lang.time.DateUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
+
+import javax.annotation.Resource;
+import java.util.Date;
+
+
+/**
+ * Created by CodeGenerator on 2025/10/21.
+ */
+@Service
+@Transactional
+public class DailySalesSummaryOfProductsServiceImpl extends AbstractService<DailySalesSummaryOfProducts> implements DailySalesSummaryOfProductsService {
+    @Resource
+    private DailySalesSummaryOfProductsMapper mDailySalesSummaryOfProductsMapper;
+
+
+    @Override
+    public void saveDailySalesSummaryOfProducts(StorePink storePink) {
+        //每日统计表数据维护
+        DailySalesSummaryOfProducts dailySalesSummaryOfProducts = new DailySalesSummaryOfProducts();
+        BeanUtils.copyProperties(storePink,dailySalesSummaryOfProducts);
+        int insert = mDailySalesSummaryOfProductsMapper.insert(dailySalesSummaryOfProducts);
+
+    }
+
+    @Override
+    public void updateDailySalesSummaryOfProducts(String orderNo, StorePink storePink) {
+
+        DailySalesSummaryOfProducts dailySalesSummaryOfProducts = new DailySalesSummaryOfProducts();
+        BeanUtils.copyProperties(storePink,dailySalesSummaryOfProducts);
+        Condition updateCondition = new Condition(DailySalesSummaryOfProducts.class);
+        updateCondition.createCriteria().andEqualTo("orderId",orderNo);
+        int i = mDailySalesSummaryOfProductsMapper.updateByConditionSelective(dailySalesSummaryOfProducts,updateCondition);
+    }
+
+
+    /**
+     * 保留近3个月的数据
+     */
+    @Override
+    public void dailyDataCleaning() {
+
+        Date date = new Date();
+        DateTime dateTime = DateUtil.offsetDay(date, -30);
+        Condition deleteConditon = new Condition(DailySalesSummaryOfProducts.class);
+        deleteConditon.createCriteria().andLessThanOrEqualTo("createTime",dateTime);
+        int i = mDailySalesSummaryOfProductsMapper.deleteByCondition(deleteConditon);
+
+
+    }
+}

+ 234 - 92
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -3,6 +3,8 @@ package com.txz.mall.service.impl;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.lang.Snowflake;
+import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.poi.excel.ExcelUtil;
@@ -39,6 +41,8 @@ import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.time.DateUtils;
 import org.apache.commons.lang3.StringEscapeUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.annotations.SelectKey;
+import org.apache.ibatis.session.ExecutorType;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
@@ -62,6 +66,7 @@ import java.util.*;
 import java.util.stream.Collectors;
 
 import static com.txz.mall.util.OrderUtils.getDateTime;
+import static org.springframework.data.jpa.domain.AbstractPersistable_.id;
 
 
 /**
@@ -86,6 +91,8 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     private final StoreOrderStatusService storeOrderStatusService;
     private RedisUtil redisUtil;
     private final CifAccountDubboServiceClient accountDubboServiceClient;
+    @Resource
+    private StoreOrderMapper storeOrderMapper;
 
     @Override
     public StoreOrderCountItemVO getOrderStatusNum() {
@@ -174,15 +181,20 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     //        storeOrder.setPinkId(storePink.getId());
     //        update(storeOrder);
     //    }
+
+    @Resource
+    private DailySalesSummaryOfProductsService dailySalesSummaryOfProductsService;
     @Override
     public void goOpen(String orderId) {
         StoreOrder storeOrder = findBy("orderId", orderId);
         if (storeOrder == null) {
             String s = I18nUtil.get("order.does.not.exist");
-            throw new ServiceException(s);
+            throw new ServiceException(s+orderId);
         }
         UserDTO user = userDubboServiceClient.getUser(storeOrder.getUid());
         StorePink storePink = new StorePink();
+        long storePinkId = IdUtil.getSnowflake(1, 3).nextId();
+        storePink.setId(storePinkId);
         if (!ObjectUtils.isEmpty(user)) {
             storePink.setAvatar(user.getHeadPic());
             storePink.setNickname(user.getName());
@@ -198,11 +210,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storePink.setPid(storeCombination.getProductId());
         storePink.setPeople(storeCombination.getPeople());
         storePink.setPrice(storeCombination.getPrice());
-        Date date = new Date();
+        Date date = storeOrder.getCreateTime();
         Integer effectiveTime = storeCombination.getEffectiveTime();
         storePink.setAddTime(date);
         storePink.setStopTime(DateUtils.addMinutes(date, effectiveTime));
         storePink.setKId(0);
+        storePink.setLId(0);
         storePink.setUid(storeOrder.getUid());
         storePink.setIsRefund(0);
         storePink.setStatus(1);
@@ -210,11 +223,16 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
         // 插入拼团汇总表
         StorePinkSummary storePinkSummary = new StorePinkSummary();
+        long storePinkSummaryId = IdUtil.getSnowflake(1, 2).nextId();
+        storePinkSummary.setId(storePinkSummaryId);
         storePinkSummary.setTotalPrice(storeOrder.getTotalPrice());
         storePinkSummary.setCid(storeCombination.getId());
         storePinkSummary.setPid(storeCombination.getProductId());
 
-        String tgCode = OrderUtils.getTGCode();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd");
+        String formatted = sdf.format(date);
+        String tgCode = OrderUtils.getTGCode(formatted);
+
         storePinkSummary.setCode(tgCode);
         storePinkSummary.setPeople(storeCombination.getPeople());
         storePinkSummary.setAddTime(date);
@@ -225,18 +243,36 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storePinkSummary.setIsVirtual(Boolean.TRUE);  // 初始化时直接锁定,防止团长还没支付这个团就暴露出来了。等团长支付时会重新计算是否锁定
         storePinkSummary.setPeopleCount(1);
         storePinkSummary.setStatus(1);
-
-
+        List<String> orderNoSet = new ArrayList<>();
+        orderNoSet.add(orderId);
+        String orderNoSetStr = JSONObject.toJSONString(orderNoSet);
+        storePinkSummary.setOrderNoSet(orderNoSetStr);
         EasyToUseUtil.appCreateAssignment(date, storePinkSummary);
         storePinkSummaryService.save(storePinkSummary);
 
         // 插入拼团详情表
         storePink.setSpsId(storePinkSummary.getId());
+        storePink.setSpsCode(storePinkSummary.getCode());
+        EasyToUseUtil.appCreateAssignment(date, storePink);
         storePinkService.save(storePink);
 
+        //插入每日统计表
+        dailySalesSummaryOfProductsService.saveDailySalesSummaryOfProducts(storePink);
+
         // 如果是开团,需要更新订单数据
         storeOrder.setPinkId(storePink.getId());
-        update(storeOrder);
+
+        Example exampleStoreOrder = new Example(StoreOrder.class);
+        exampleStoreOrder.createCriteria().andEqualTo("orderId", orderId);
+        storeOrder.setOrderId(null);
+        storeOrder.setCreateTime(null);
+        storeOrder.setUid(null);
+
+        storeOrderMapper.updateByConditionSelective(storeOrder,exampleStoreOrder);
+        //先清空分片建再设置回去传递到后面,因为分片建不允许更新
+        storeOrder.setOrderId(orderId);
+      //分库分表后下面的修改方式已经不合适了换上上面的方式
+     //   update(storeOrder);
     }
 
     //    @Override
@@ -345,6 +381,8 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         StorePink storePink = new StorePink();
         BeanUtils.copyProperties(teamPink, storePink);
         storePink.setId(null);
+        long l = IdUtil.getSnowflake(1, 3).nextId();
+        storePink.setId(l);
         storePink.setSpsId(dto.getSpsId());
         storePink.setOrderId(dto.getOrderId());
         storePink.setOrderIdKey(dto.getOrderIdKey());
@@ -353,6 +391,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storePink.setOrderStatus(PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey());
         storePink.setIsRefund(0);
         storePink.setKId(1);
+        storePink.setSpsCode(dto.getSpsCode());
         UserDTO user = userDubboServiceClient.getUser(dto.getUserId());
         if (!ObjectUtils.isEmpty(user)) {
             storePink.setUid(dto.getUserId());
@@ -362,15 +401,21 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
         storePink.setCreateTime(date);
         storePinkService.save(storePink);
-
-        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsId());
+        //插入每日统计表s
+        dailySalesSummaryOfProductsService.saveDailySalesSummaryOfProducts(storePink);
+        //**分库整改
+        Boolean b1 = storePinkSummaryService.maintainOrderNoSetOfTheStorePinkSummary(teamPink.getSpsCode(), dto.getOrderId());
+        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsCode());
 
         StoreOrder storeOrder = new StoreOrder();
-        storeOrder.setId(dto.getOrderIdKey());
-
+       // storeOrder.setId(dto.getOrderIdKey());
         // 需要更新订单数据
         storeOrder.setPinkId(storePink.getId());
-        update(storeOrder);
+        Condition storeOrderCondition = new Condition(StoreOrder.class);
+        storeOrderCondition.createCriteria().andEqualTo("orderId",dto.getOrderId());
+        storeOrderMapper.updateByConditionSelective(storeOrder,storeOrderCondition);
+        //**分库整改
+       // update(storeOrder);
         //        if(!b){
         //            throw new ServiceException("拼团超员请选择新的拼团");
         //        }
@@ -410,15 +455,32 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             throw new ServiceException(I18nUtil.get("there.is.no.group.to.join.temporarily"));
         }
 
+        List<String> orderNoSetListStr = pinkSummaryList.stream().map(StorePinkSummary::getOrderNoSet).filter(orderNoSet ->!ObjectUtils.isEmpty(orderNoSet)).collect(Collectors.toList());
+
+        List<String> allOrderNo = new ArrayList<>();
+        if(!ObjectUtils.isEmpty(orderNoSetListStr)){
+            for (String s : orderNoSetListStr) {
+                List<String> orderNoSet = JSONObject.parseArray(s, String.class);
+                allOrderNo.addAll(orderNoSet);
+            }
+        }
+        log.info("allOrderNo:" + JSONObject.toJSONString(allOrderNo));
+        if(ObjectUtils.isEmpty(allOrderNo)){
+            throw new ServiceException(I18nUtil.get("cid.store.pink.summary.order.no.set.not.exist")+dto.getCid());
+        }
+
         List<Long> storePinkSummaryId = pinkSummaryList.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
         log.info("storePinkSummaryId:" + storePinkSummaryId.toString());
         Condition pinkCondition = new Condition(StorePink.class);
         Example.Criteria pinkCriteria = pinkCondition.createCriteria();
         pinkCriteria.andEqualTo("isDelete", 0);
-        pinkCriteria.andEqualTo("cid", dto.getCid());
+        //这个条件应该是没啥用的,因为下面已经有spsId了
+       // pinkCriteria.andEqualTo("cid", dto.getCid());
         List<Integer> orderStatusList = CollUtil.newArrayList(PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey(), PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
+        pinkCriteria.andIn("orderId", allOrderNo);
         pinkCriteria.andIn("orderStatus", orderStatusList);
-        pinkCriteria.andIn("spsId", storePinkSummaryId);
+        //**分库整改
+       // pinkCriteria.andIn("spsId", storePinkSummaryId);
         List<StorePink> pinkList = storePinkService.findByCondition(pinkCondition);
         log.info("pinkList:" + pinkList.toString());
 
@@ -459,6 +521,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 log.info("count:" + count);
                 if (count > 0) {
                     dto.setSpsId(pink.getSpsId()); // 拼团汇总表id
+                    dto.setSpsCode(pink.getSpsCode()); //拼团汇总表code
                     joinGroup(pink, dto, count, pinkList.size());
                 } else {
                     throw new ServiceException(I18nUtil.get("the.number.of.group.buying.participants.exceeds.the.limit.please.initiate.group.buying.again.pinkid") + pink.getId());
@@ -575,7 +638,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             Example example = new Example(StoreOrder.class);
             example.createCriteria().andEqualTo("orderId", storeOrder.getOrderId());
             storeOrderMapper.updateByConditionSelective(storeOrderForUpdate, example);
-            storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_DELIVERY_ORDER, "订单发货");
+            storeOrderStatusService.createLog(storeOrder.getId(),storeOrder.getOrderId(), Constants.ORDER_STATUS_DELIVERY_ORDER, "订单发货");
 
             // 维护拼团订单状态
             StorePink storePinkForUpdate = new StorePink();
@@ -583,7 +646,8 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             Example exampleStorePink = new Example(StorePink.class);
             exampleStorePink.createCriteria().andEqualTo("orderId", storeOrder.getOrderId());
             storePinkMapper.updateByConditionSelective(storePinkForUpdate, exampleStorePink);
-
+            //维护每日统计表
+            dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(storeOrder.getOrderId(),storePinkForUpdate);
             noticeService.addOrderNotice(NoticeEnum.ORDER_SHIPPED_SUCCESS, storeOrder.getOrderId(), storeOrder.getUid());
         }
 
@@ -1315,13 +1379,19 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         Condition condition = new Condition(StoreOrder.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
-        condition.setOrderByClause("create_time DESC");
         criteria.andEqualTo("uid", dto.getUserId());
+       // criteria.andBetween("createTime",)
+        criteria.andGreaterThanOrEqualTo("createTime",dto.getStartDate());
+        criteria.andLessThanOrEqualTo("createTime",dto.getEndDate());
+
+        condition.setOrderByClause("create_time DESC");
 
         Condition pinkCondition = new Condition(StorePink.class);
         Example.Criteria pinkCriteria = pinkCondition.createCriteria();
         pinkCriteria.andEqualTo("isDelete", 0);
         pinkCriteria.andEqualTo("uid", dto.getUserId());
+        pinkCriteria.andGreaterThanOrEqualTo("createTime",dto.getStartDate());
+        pinkCriteria.andLessThanOrEqualTo("createTime",dto.getEndDate());
 
         List<StorePink> pinkList = new ArrayList<>();
 
@@ -1344,7 +1414,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 pinkCriteria.andIn("orderStatus", Arrays.asList(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey()));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
-                    criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
+                    criteria.andIn("orderId", pinkList.stream().map(StorePink::getOrderId).collect(Collectors.toList()));
                     list = findByCondition(condition);
                 }
                 break;
@@ -1354,7 +1424,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 //   pinkCriteria.andIn("orderStatus", Arrays.asList(3));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
-                    criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
+                    criteria.andIn("orderId", pinkList.stream().map(StorePink::getOrderId).collect(Collectors.toList()));
                     list = findByCondition(condition);
                 }
                 break;
@@ -1363,7 +1433,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 pinkCriteria.andIn("orderStatus", Arrays.asList(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey(), PinkOrderStatusEnum.GROUP_ORDER_TO_RECEIVE.getKey(), PinkOrderStatusEnum.GROUP_ORDER_COMPLETED.getKey()));
                 pinkList = storePinkService.findByCondition(pinkCondition);
                 if (CollUtil.isNotEmpty(pinkList)) {
-                    criteria.andIn("id", pinkList.stream().map(StorePink::getOrderIdKey).collect(Collectors.toList()));
+                    criteria.andIn("orderId", pinkList.stream().map(StorePink::getOrderId).collect(Collectors.toList()));
                     list = findByCondition(condition);
                 }
                 break;
@@ -1379,12 +1449,12 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             Condition infoCondition = new Condition(StoreOrderInfo.class);
             Example.Criteria infoCriteria = infoCondition.createCriteria();
             infoCriteria.andEqualTo("isDelete", 0);
-            infoCriteria.andIn("orderId", list.stream().map(StoreOrder::getId).collect(Collectors.toList()));
+            infoCriteria.andIn("orderNo", list.stream().map(StoreOrder::getOrderId).collect(Collectors.toList()));
             infoArrayList = storeOrderInfoService.findByCondition(infoCondition);
 
             Condition statusCondition = new Condition(StoreOrderStatus.class);
             Example.Criteria statusCriteria = statusCondition.createCriteria();
-            statusCriteria.andIn("oid", list.stream().map(StoreOrder::getId).collect(Collectors.toList()));
+            statusCriteria.andIn("orderId", list.stream().map(StoreOrder::getOrderId).collect(Collectors.toList()));
             statusList = storeOrderStatusService.findByCondition(statusCondition);
 
             Condition addressCondition = new Condition(UserAddress.class);
@@ -1500,7 +1570,21 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     @Resource
     private CreateSequenceService createSequenceService;
 
+    private String getLastFourDigitsOfTheUserId(Long userId){
+        String result = "0000";
+        if(!ObjectUtils.isEmpty(userId)){
+            String userIdStr = userId.toString();
+            if(userIdStr.length()<4){
+                String aa = "0000"+userIdStr;
+                result = aa.substring(aa.length() - 4);
+
+            }
+        }
+        return result;
+    }
+
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public MyRecord createOrder(CreateOrderRequest request) {
         UserDTO user = userDubboServiceClient.getUser(request.getUserId());
         // 通过缓存获取预下单对象
@@ -1555,11 +1639,13 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         CreateSequence createSequence = new CreateSequence();
         createSequenceService.save(createSequence);
 
+        Long userId = request.getUserId();
+        String lastFourDigitsOfTheUserId = getLastFourDigitsOfTheUserId(userId);
 
         Long id = createSequence.getId();
 
         // 生成订单号
-         String orderNo = OrderUtils.getOrderCode()+ id;
+         String orderNo = OrderUtils.getOrderCode()+ id +lastFourDigitsOfTheUserId;
 
         // 购买赠送的积分
         List<StoreOrderInfo> storeOrderInfos = new ArrayList<>();
@@ -1661,8 +1747,11 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 //**   productAttrValueService.operationStock(skuRecord.getInt("attrValueId"), skuRecord.getInt("num"), "sub", Constants.PRODUCT_TYPE_NORMAL);
             }
         }
-
+        Long snowflakeId = IdUtil.getSnowflake(1,1).nextId();
+        storeOrder.setId(snowflakeId);
         save(storeOrder);
+        //SELECT LAST_INSERT_ID() 被路由到默认库去了,只能通过下面到方式解决
+       // storeOrder = findBy("orderId", storeOrder.getOrderId());
         for (StoreOrderInfo storeOrderInfo : storeOrderInfos) {
             storeOrderInfo.setOrderId(storeOrder.getId());
             storeOrderInfo.setIsDelete(0);
@@ -1692,7 +1781,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
 
         //        // 生成订单日志
-        storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_CREATE_ORDER, "订单生成");
+        storeOrderStatusService.createLog(storeOrder.getId(),storeOrder.getOrderId(), Constants.ORDER_STATUS_CREATE_ORDER, "订单生成");
         //
         //        // 清除购物车数据
         //        if (CollUtil.isNotEmpty(orderInfoVo.getCartIdList())) {
@@ -1714,6 +1803,10 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         return record;
     }
 
+
+
+
+
     @Override
     @Transactional(propagation = Propagation.REQUIRED)
     public com.txz.mall.core.Result goPay(GoPinkDTO dto) {
@@ -1767,9 +1860,9 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             if (!result1.getCode().equals("200")) {
                 throw new ServiceException(I18nUtil.get("payment.failed") + result1.getMessage());
             }
-            updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+            updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
             log.info("pinkSuccess storeOrder1" + storeOrder);
-            storePinkService.pinkSuccess(storeOrder.getPinkId(), storeOrder);
+            storePinkService.pinkSuccess(storeOrder.getOrderId(), storeOrder);
             log.info("pinkSuccess storeOrder2" + storeOrder);
             // goOpen(dto.getOrderId());
         }
@@ -1787,9 +1880,9 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
             if (!result1.getCode().equals("200")) {
                 throw new ServiceException(I18nUtil.get("payment.failed") + result1.getMessage());
             }
-            updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+            updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
             log.info("storePinkService.pinkSuccess1 :" + storeOrder);
-            storePinkService.pinkSuccess(storeOrder.getPinkId(), storeOrder);
+            storePinkService.pinkSuccess(storeOrder.getOrderId(), storeOrder);
             log.info("storePinkService.pinkSuccess2 :" + storeOrder);
             // goPink(dto);
         }
@@ -1855,7 +1948,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         if (!equals) {
             throw new ServiceException(I18nUtil.get("refund.failed.please.initiate.again"));
         }
-        updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+        updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
         // 订单状态回退
         // 拼团状态回退
 
@@ -1865,7 +1958,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         storePinkForUpdate.setOrderStatus(pinkOrderStatusEnum.getKey());
         storePinkService.update(storePinkForUpdate);
         // 拼团汇总数量维护以及锁单标识维护
-        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsId());
+        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsCode());
         // 拼团商品数量以及m_store_combination
         storeCombinationService.operationStock(storePink.getCid(), storePink.getTotalNum(), "add");
         // 拼团商品规格扣库存
@@ -1880,7 +1973,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
     //    关闭指系统层面的自动结束  如活动时间超时或者拼团超时由定时任务触发  不暴露给客户端
     @Override
-    public void close(Long id) {
+    public void close(String orderNo) {
 
 
         // PinkOrderStatusEnum pinkOrderStatusEnum = OrderStateMachine.handleEvent(storeOrder, OrderEventsEnum.GROUP_PURCHASE_FAIL, null);
@@ -1890,9 +1983,9 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
         try {
 
-            StoreOrder storeOrder = findById(id);
+            StoreOrder storeOrder = findBy("orderId",orderNo);
             if (ObjectUtils.isEmpty(storeOrder)) {
-                throw new ServiceException("订单不存在id:" + id);
+                throw new ServiceException(I18nUtil.get("order.is.empty.orderid") + orderNo);
             }
 
             if (PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey().equals(storeOrder.getStatus())) {
@@ -1904,20 +1997,26 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                     throw new ServiceException(I18nUtil.get("current.status.does.not.support.cancellation"));
                 }
                 // 订单状态回退
-                updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+                updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
 
                 // 拼团状态回退
-                StorePink storePink = storePinkService.findById(storeOrder.getPinkId());
+                StorePink storePink = storePinkService.findBy("orderId",orderNo);
                 if (ObjectUtils.isEmpty(storePink)) {
-                    throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.canceling.the.order.id") + storeOrder.getPinkId());
+                    throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.canceling.the.order.id") + orderNo);
                 }
                 StorePink storePinkForUpdate = new StorePink();
-                storePinkForUpdate.setId(storeOrder.getPinkId());
+               // storePinkForUpdate.setId(storeOrder.getPinkId());
                 storePinkForUpdate.setStatus(StorePinkStatusEnum.LOTTERY_FAILED.getKey());
                 storePinkForUpdate.setOrderStatus(pinkOrderStatusEnum.getKey());
-                storePinkService.update(storePinkForUpdate);
+                Condition condition = new Condition(StorePink.class);
+                condition.createCriteria().andEqualTo("orderId",orderNo);
+                storePinkMapper.updateByConditionSelective(storePinkForUpdate,condition);
+                //维护每日统计表
+                dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(orderNo,storePinkForUpdate);
+                //**分库整改
+                //storePinkService.update(storePinkForUpdate);
                 // 拼团汇总数量维护以及锁单标识维护
-                Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsId());
+                Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsCode());
                 // 拼团商品数量以及m_store_combination
                 storeCombinationService.operationStock(storePink.getCid(), storePink.getTotalNum(), "add");
                 // 拼团商品规格扣库存
@@ -1935,10 +2034,10 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
                 // 订单状态回退
                 // 拼团状态回退
-                StorePink storePink = storePinkService.findById(storeOrder.getPinkId());
+                StorePink storePink = storePinkService.findBy("orderId",orderNo);
 
                 if (ObjectUtils.isEmpty(storePink)) {
-                    throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.initiating.active.refund.id") + storeOrder.getPinkId());
+                    throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.initiating.active.refund.id") + orderNo);
                 }
 
                 Date date = new Date();
@@ -1956,15 +2055,20 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                     throw new ServiceException(I18nUtil.get("refund.failed.please.initiate.again.orderid") + storeOrder.getOrderId());
                 }
 
-                updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+                updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
 
                 StorePink storePinkForUpdate = new StorePink();
-                storePinkForUpdate.setId(storeOrder.getPinkId());
+                //storePinkForUpdate.setId(storeOrder.getPinkId());
                 storePinkForUpdate.setStatus(StorePinkStatusEnum.LOTTERY_FAILED.getKey());   // 定时任务触发的拼团失败导致的订单退款需要设置这个状态为拼团失败状态
                 storePinkForUpdate.setOrderStatus(pinkOrderStatusEnum.getKey());
-                storePinkService.update(storePinkForUpdate);
+                Condition condition = new Condition(StorePink.class);
+                condition.createCriteria().andEqualTo("orderId",orderNo);
+                storePinkMapper.updateByConditionSelective(storePinkForUpdate,condition);
+                //维护每日统计表
+                dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(orderNo,storePinkForUpdate);
+                //storePinkService.update(storePinkForUpdate);
                 // 拼团汇总数量维护以及锁单标识维护
-                Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsId());
+                Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsCode());
                 // 拼团商品数量以及m_store_combination
                 storeCombinationService.operationStock(storePink.getCid(), storePink.getTotalNum(), "add");
                 // 拼团商品规格扣库存
@@ -1974,10 +2078,10 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                 noticeService.addOrderNotice(NoticeEnum.ORDER_GROUP_BUY_FAIL, storeOrder.getOrderId(), storeOrder.getUid());
 
             } else {
-                throw new ServiceException(I18nUtil.get("current.status.does.not.support.refund.cancellationid") + id);
+                throw new ServiceException(I18nUtil.get("current.status.does.not.support.refund.cancellationid") + orderNo);
             }
         } catch (Exception e) {
-            log.error(I18nUtil.get("scheduled.task.failed.to.close.the.order.order.id") + id, e);
+            log.error(I18nUtil.get("scheduled.task.failed.to.close.the.order.order.id") + orderNo, e);
         }
 
         // 如果是已支付状态状态推到拼团失败退款状态
@@ -1997,7 +2101,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
     public void scheduledTaskStorePinkSummaryClose() {
 
         Date date = new Date();
-        PageHelper.startPage(1, 10);
+        PageHelper.startPage(1, 50);
         Condition pinkSummaryCondition = new Condition(StorePinkSummary.class);
         Example.Criteria pinkSummaryCriteria = pinkSummaryCondition.createCriteria();
         pinkSummaryCriteria.andEqualTo("isDelete", 0);
@@ -2009,34 +2113,45 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
 
         if (!CollectionUtils.isEmpty(byCondition)) {
-            List<Long> storePinkSummaryidList = byCondition.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
-
-            Condition condition = new Condition(StorePink.class);
-            Example.Criteria criteria = condition.createCriteria();
-            criteria.andIn("spsId", storePinkSummaryidList);
+           // List<Long> storePinkSummaryidList = byCondition.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
+            List<String> getOrderNoSetList = byCondition.stream().map(StorePinkSummary::getOrderNoSet).filter(a -> !ObjectUtils.isEmpty(a)).collect(Collectors.toList());
+            if(!CollectionUtils.isEmpty(getOrderNoSetList)) {
+                for (String s : getOrderNoSetList) {
+                    List<String> strings = JSONObject.parseArray(s, String.class);
+                    if(!CollectionUtils.isEmpty(strings)) {
+                        Condition condition = new Condition(StorePink.class);
+                        Example.Criteria criteria = condition.createCriteria();
+                        criteria.andIn("orderId", strings);
+
+                        criteria.andEqualTo("isDelete", 0);
+                        // 找出拼团待支付 和 拼团已支付的数据进行 关闭
+                        List<Integer> statusList = CollUtil.newArrayList(
+                                PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey()
+                                , PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey()
+                        );
+                        criteria.andIn("orderStatus", statusList);
+
+                        List<StorePink> storePinkListForUpdate = storePinkService.findByCondition(condition);
+                        if (!CollectionUtils.isEmpty(storePinkListForUpdate)) {
+                            storePinkListForUpdate.forEach(a ->
+                                    close(a.getOrderId())
+                            );
+                        }
+                    }
+                }
 
-            criteria.andEqualTo("isDelete", 0);
-            // 找出拼团待支付 和 拼团已支付的数据进行 关闭
-            List<Integer> statusList = CollUtil.newArrayList(
-                    PinkOrderStatusEnum.GROUP_ORDER_TO_PAY.getKey()
-                    , PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey()
-            );
-            criteria.andIn("orderStatus", statusList);
-
-            List<StorePink> storePinkListForUpdate = storePinkService.findByCondition(condition);
-            if (!CollectionUtils.isEmpty(storePinkListForUpdate)) {
-                storePinkListForUpdate.forEach(a ->
-                        close(a.getOrderIdKey())
-                );
             }
         }
 
 
     }
 
+    @Resource
+    private StorePinkMapper storePinkMapper;
+
     @Override
-    public void cancel(Long id) {
-        StoreOrder storeOrder = findById(id);
+    public void cancel(String orderNo) {
+        StoreOrder storeOrder = findBy("orderId",orderNo);
         if (ObjectUtils.isEmpty(storeOrder)) {
             throw new ServiceException(I18nUtil.get("order.does.not.exist.when.canceling.the.order.id") + id);
         }
@@ -2047,22 +2162,30 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         }
 
         // 订单状态回退
-        updateOrderStatus(storeOrder.getId(), pinkOrderStatusEnum.getKey());
+        updateOrderStatus(storeOrder.getOrderId(), pinkOrderStatusEnum.getKey());
 
 
         // 拼团状态回退
-        StorePink storePink = storePinkService.findById(storeOrder.getPinkId());
+        StorePink storePink = storePinkService.findBy("orderId",storeOrder.getOrderId());
         if (ObjectUtils.isEmpty(storePink)) {
-            throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.canceling.the.order.id") + storeOrder.getPinkId());
+            throw new ServiceException(I18nUtil.get("group.buying.information.does.not.exist.when.canceling.the.order.id") + storeOrder.getOrderId());
         }
         StorePink storePinkForUpdate = new StorePink();
-        storePinkForUpdate.setId(storeOrder.getPinkId());
+      //  storePinkForUpdate.setId(storeOrder.getPinkId());
         storePinkForUpdate.setOrderStatus(pinkOrderStatusEnum.getKey());
-        storePinkService.update(storePinkForUpdate);
+
+        Condition storePinkCondition = new Condition(StorePink.class);
+        storePinkCondition.createCriteria().andEqualTo("orderId",storeOrder.getOrderId());
+        storePinkMapper.updateByConditionSelective(storePinkForUpdate,storePinkCondition);
+
+        //维护每日统计
+        dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(storeOrder.getOrderId(),storePinkForUpdate);
+
+       // storePinkService.update(storePinkForUpdate);
 
         // 拼团汇总数量维护以及锁单标识维护
 
-        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsId());
+        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(storePink.getSpsCode());
 
         // 拼团商品数量以及m_store_combination
 
@@ -2107,7 +2230,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         if (!org.springframework.util.CollectionUtils.isEmpty(byCondition)) {
             try {
                 for (StoreOrder storeOrder : byCondition) {
-                    cancel(storeOrder.getId());
+                    cancel(storeOrder.getOrderId());
                 }
             } catch (Exception e) {
                 log.error(I18nUtil.get("failed.to.process.ordertimeoutautomaticcancel"), e);
@@ -2232,19 +2355,31 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         }
     }
 
-    @Resource
-    private StorePinkMapper storePinkMapper;
+
 
 
     @Override
-    public void updateOrderStatus(Long id, Integer status) {
-        StoreOrder storeOrder = findById(id);
-        storeOrder.setStatus(status);
+    public void updateOrderStatus(String orderNo, Integer status) {
+        //**分库整改
+        if(ObjectUtils.isEmpty(orderNo)){
+            throw new ServiceException(I18nUtil.get("order.code.is.empty")+orderNo);
+        }
+        StoreOrder storeOrderOri = findBy("orderId", orderNo);
+        if(ObjectUtils.isEmpty(storeOrderOri)){
+           throw new ServiceException(I18nUtil.get("order.does.not.exist")+orderNo);
+        }
+        StoreOrder storeOrderForUpdate = new StoreOrder();
+        storeOrderForUpdate.setStatus(status);
         if (PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey().equals(status)) {
             Date date = new Date();
-            storeOrder.setPayTime(date);
+            storeOrderForUpdate.setPayTime(date);
         }
-        update(storeOrder);
+        Condition storeOrderCondition = new Condition(StoreOrder.class);
+        storeOrderCondition.createCriteria().andEqualTo("orderId",orderNo);
+
+        int i = storeOrderMapper.updateByConditionSelective(storeOrderForUpdate, storeOrderCondition);
+
+
 
         //        StorePink storePink = new StorePink();
         //        Example example = new Example(StorePink.class);
@@ -2327,8 +2462,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         return recordList;
     }
 
-    @Resource
-    private StoreOrderMapper storeOrderMapper;
+
 
 
     @Override
@@ -2349,11 +2483,11 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
         Condition conditionStorePink = new Condition(StorePink.class);
         Example.Criteria criteriaStorePink = conditionStorePink.createCriteria();
-        criteriaStorePink.andEqualTo("orderIdKey", storeOrderOri.getId());
+        criteriaStorePink.andEqualTo("orderId", storeOrderOri.getOrderId());
         criteriaStorePink.andEqualTo("isDelete", 0);
         List<StorePink> storePinks = storePinkMapper.selectByCondition(conditionStorePink);
         if (CollectionUtils.isEmpty(storePinks)) {
-            throw new ServiceException(I18nUtil.get("group.buying.data.does.not.exist") + storeOrder.getId());
+            throw new ServiceException(I18nUtil.get("group.buying.data.does.not.exist") + storeOrderOri.getOrderId());
         }
         StorePink storePink = storePinks.get(0);
         Integer winner = 1;
@@ -2362,14 +2496,19 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
         if (equals1 && equals) {
             PinkOrderStatusEnum pinkOrderStatusEnum = OrderStateMachine.handleEvent(storeOrderOri, OrderEventsEnum.GROUP_PURCHASE_WIN, null);
             if (ObjectUtils.isEmpty(pinkOrderStatusEnum)) {
-                throw new ServiceException(I18nUtil.get("current.order.status.does.not.allow.progression.to.pending.shipment.orderid") + storeOrder.getId());
+                throw new ServiceException(I18nUtil.get("current.order.status.does.not.allow.progression.to.pending.shipment.orderid") + storeOrder.getOrderId());
             }
             storeOrder.setStatus(pinkOrderStatusEnum.getKey());
             StorePink storePinkForUpdate = new StorePink();
-            storePinkForUpdate.setId(storePink.getId());
+           // storePinkForUpdate.setId(storePink.getId());
             storePinkForUpdate.setOrderStatus(pinkOrderStatusEnum.getKey());
-
-            storePinkMapper.updateByPrimaryKeySelective(storePinkForUpdate);
+            Condition storePinkUpdateCondition = new Condition(StorePink.class);
+            storePinkUpdateCondition.createCriteria().andEqualTo("orderId",storePink.getOrderId());
+            //**分库整改
+            storePinkMapper.updateByConditionSelective(storePinkForUpdate,storePinkUpdateCondition);
+            //维护每日统计
+            dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(storePink.getOrderId(),storePinkForUpdate);
+           // storePinkMapper.updateByPrimaryKeySelective(storePinkForUpdate);
         }
 
 
@@ -2410,7 +2549,7 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                     storeOrderMapper.updateByConditionSelective(storeOrderForUpdate, example);
 
 
-                    storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_RECEIVE_ORDER, I18nUtil.get("automatic.order.receipt.confirmation"));
+                    storeOrderStatusService.createLog(storeOrder.getId(),storeOrder.getOrderId(), Constants.ORDER_STATUS_RECEIVE_ORDER, I18nUtil.get("automatic.order.receipt.confirmation"));
 
                     //维护拼团订单状态
                     StorePink storePinkForUpdate = new StorePink();
@@ -2418,7 +2557,8 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
                     Example exampleStorePink = new Example(StorePink.class);
                     exampleStorePink.createCriteria().andEqualTo("orderId", storeOrder.getOrderId());
                     storePinkMapper.updateByConditionSelective(storePinkForUpdate, exampleStorePink);
-
+                    //维护每日统计表
+                    dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(storeOrder.getOrderId(),storePinkForUpdate);
                 }
             }
 
@@ -2490,4 +2630,6 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
         return null;
     }
+
+
 }

+ 4 - 3
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderStatusServiceImpl.java

@@ -24,20 +24,21 @@ public class StoreOrderStatusServiceImpl extends AbstractService<StoreOrderStatu
     private StoreOrderStatusMapper storeOrderStatusMapper;
 
     @Override
-    public void createLog(Long orderId, String type, String message) {
+    public void createLog(Long orderId, String orderCode,String type, String message) {
         StoreOrderStatus storeOrderStatus = new StoreOrderStatus();
         storeOrderStatus.setOid(orderId);
         storeOrderStatus.setChangeType(type);
         storeOrderStatus.setChangeMessage(message);
         storeOrderStatus.setCreateTime(new Date());
+        storeOrderStatus.setOrderId(orderCode);
         save(storeOrderStatus);
     }
 
     @Override
-    public List<StoreOrderStatus> getLogList(Long orderId) {
+    public List<StoreOrderStatus> getLogList(String orderId) {
         Condition statusCondition = new Condition(StoreOrderStatus.class);
         Example.Criteria statusCriteria = statusCondition.createCriteria();
-        statusCriteria.andEqualTo("oid", orderId);
+        statusCriteria.andEqualTo("orderId", orderId);
         return findByCondition(statusCondition);
     }
 }

+ 97 - 35
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.github.pagehelper.PageHelper;
@@ -14,6 +15,7 @@ import com.txz.cif.param.OrderParam;
 import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.ServiceException;
+import com.txz.mall.dao.DailySalesSummaryOfProductsMapper;
 import com.txz.mall.dao.StoreCombinationMapper;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dao.StoreProductMapper;
@@ -83,28 +85,38 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
 
     @Resource
     private StorePinkSummaryService storePinkSummaryService;
+    @Resource
+    private DailySalesSummaryOfProductsService dailySalesSummaryOfProductsService;
 
     @Override
     @Transactional
-    public void pinkSuccess(Long id, StoreOrder storeOrder) {
+    public void pinkSuccess(String orderNo, StoreOrder storeOrder) {
 
 
         // 现在这个方法每次支付的时候都会执行一次
         Date date = new Date();
-        if (ObjectUtil.isNull(id)) {
+        if (ObjectUtil.isNull(orderNo)) {
             return;
         }
-        StorePink teamPink = findById(id);
-        List<StorePink> memberList = getListByCidAndKid(teamPink.getCid(), id);
+        StorePink teamPink = findBy("orderId",orderNo);
+        //下面这行好像没什么用
+      //  List<StorePink> memberList = getListByCidAndKid(teamPink.getCid(), id);
         StorePink storePink2 = new StorePink();
         storePink2.setId(teamPink.getId());
        // storePink2.setStatus(2);
        // storePink2.setStopTime(date);
         storePink2.setOrderStatus(PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
         log.info("storePink2:"+storePink2);
-        update(storePink2);
 
-        storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_LOG_PAY_SUCCESS, "支付成功");
+        Condition updateStorePinkCondition = new Condition(StorePink.class);
+        updateStorePinkCondition.createCriteria().andEqualTo("orderId",orderNo);
+        storePinkMapper.updateByConditionSelective(storePink2,updateStorePinkCondition);
+        dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(orderNo,storePink2);
+
+       //**分库整改
+       // update(storePink2);
+
+        storeOrderStatusService.createLog(storeOrder.getId(), storeOrder.getOrderId(),Constants.ORDER_LOG_PAY_SUCCESS, "支付成功");
         noticeService.addOrderNotice(NoticeEnum.ORDER_GROUP_BUY_PAYMENT_SUCCESS,storeOrder.getOrderId(),storeOrder.getUid());
 
         //累计虚拟销量,虚拟销量和下单数挂钩,和是否退款或者成团或者是否中奖都无关  只累加不扣减
@@ -128,7 +140,7 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         exampleStoreCombination.createCriteria().andEqualTo("productId", pid).andEqualTo("isDelete",0);
         storeCombinationMapper.updateByConditionSelective(storeCombinationUpdate,exampleStoreCombination);
 
-        memberList.add(teamPink);
+      //  memberList.add(teamPink);
 //        memberList.forEach(i -> {
 //            i.setStatus(2);
 //            i.setStopTime(date);
@@ -137,13 +149,13 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
 
         //理论上在支付环节调用的时候不会出现拼团人数校验异常,所以这块调用这个方法的目的在于维护成团状态。 如果支付环节抛出了
         //拼团校验异常则证明在 add时就有问题,没有挡住异常的拼团数据
-        log.info("storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary SpsId"+teamPink.getSpsId());
-        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsId());
+        log.info("storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary SpsId"+teamPink.getSpsCode());
+        Boolean b = storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary(teamPink.getSpsCode());
         log.info("storePinkSummaryService.maintainQuantityStatusOfTheStorePinkSummary b"+b);
         if(b){
 
         // 算出天选  同时推进订单状态到 代发货状态/订单关闭状态/未中奖成员退款
-        theSelection(teamPink.getSpsId(),date);
+        theSelection(teamPink.getSpsCode(),date);
 
         }
     }
@@ -196,15 +208,33 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
     private StoreOrderStatusService storeOrderStatusService;
 
     @Override
-    public void theSelection(Long spsId,Date date) {
-        log.info("theSelection"+spsId);
+    public void theSelection(String spsCode,Date date) {
+        log.info("theSelection:"+spsCode);
         // 假设只有1个用户是天选
         long luckNum = 1;
 
+        StorePinkSummary storePinkSummary = storePinkSummaryService.findBy("code", spsCode);
+        //**分库整改
+        // StorePinkSummary storePinkSummary = storePinkSummaryService.findById(spsId);
+        if(ObjectUtils.isEmpty(storePinkSummary)){
+            throw new ServiceException(I18nUtil.get("no.group.buying.summary.records")+spsCode);
+        }
+
+        List<String> orderNoSetList = new ArrayList<>();
+        String orderNoSet = storePinkSummary.getOrderNoSet();
+        if(!ObjectUtils.isEmpty(orderNoSet)){
+             orderNoSetList = JSONObject.parseArray(orderNoSet, String.class);
+        }
+        if(ObjectUtils.isEmpty(orderNoSetList)){
+            throw new ServiceException(I18nUtil.get("store.pink.summary.order.no.set.not.exist")+spsCode);
+        }
+
         Condition condition = new Condition(StorePink.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
-        criteria.andEqualTo("spsId", spsId);
+        criteria.andIn("orderId",orderNoSetList);
+        //**分库整改
+       // criteria.andEqualTo("spsId", spsId);
         // 排除团长
 //        criteria.andEqualTo("kId", 1);
         // 支付成功的
@@ -212,18 +242,15 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         List<StorePink> list = findByCondition(condition);
         if (CollUtil.isEmpty(list)) {
             String s = I18nUtil.get("no.group.buying.orders");
-            throw new ServiceException(s+spsId);
+            throw new ServiceException(s+spsCode);
         }
         long count = list.stream().filter(i -> i.getLId().equals(1)).count();
         if (count >= luckNum) {
-            throw new ServiceException(I18nUtil.get("already.have.a.chosen.one")+spsId);
+            throw new ServiceException(I18nUtil.get("already.have.a.chosen.one")+spsCode);
         }
 
 
-        StorePinkSummary storePinkSummary = storePinkSummaryService.findById(spsId);
-        if(ObjectUtils.isEmpty(storePinkSummary)){
-            throw new ServiceException(I18nUtil.get("no.group.buying.summary.records")+spsId);
-        }
+
 
 
         Map<Long, StorePink> idStorePinkMap = list.stream().collect(Collectors.toMap(StorePink::getId, a -> a, (b, c) -> c));
@@ -241,7 +268,9 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         randomIds.forEach(i -> {
             StorePink luckPink = new StorePink();
             StorePink storePink = idStorePinkMap.get(i);
-            StoreOrder storeOrder = storeOrderService.findById(storePink.getOrderIdKey());
+            StoreOrder storeOrder = storeOrderService.findBy("orderId", storePink.getOrderId());
+            //**分库整改
+           // StoreOrder storeOrder = storeOrderService.findById(storePink.getOrderIdKey());
             luckPink.setId(i);
             luckPink.setLId(1);
 
@@ -250,18 +279,25 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
 
             PinkOrderStatusEnum pinkOrderStatusEnum = OrderStateMachine.handleEvent(storeOrder, OrderEventsEnum.GROUP_PURCHASE_WIN, null);
             if(ObjectUtils.isEmpty(pinkOrderStatusEnum)){
-                throw new ServiceException(I18nUtil.get("current.order.status.does.not.allow.progression.to.pending.shipment.orderid")+storePink.getOrderIdKey());
+                throw new ServiceException(I18nUtil.get("current.order.status.does.not.allow.progression.to.pending.shipment.orderid")+storePink.getOrderId());
             }
             if(!ObjectUtils.isEmpty(storeOrder.getAddressId())) {
                 luckPink.setOrderStatus(PinkOrderStatusEnum.GROUP_ORDER_TO_SHIP.getKey());
-                storeOrderService.updateOrderStatus(storePink.getOrderIdKey(), pinkOrderStatusEnum.getKey());
+                storeOrderService.updateOrderStatus(storePink.getOrderId(), pinkOrderStatusEnum.getKey());
             }else{
                 noticeService.addOrderNotice(NoticeEnum.ORDER_PROVIDE_SHIPPING_ADDRESS,storeOrder.getOrderId(),storeOrder.getUid());
             }
-            update(luckPink);
+            //分库整改
+            Condition storePinkUpdateCondition = new Condition(StorePink.class);
+            storePinkUpdateCondition.createCriteria().andEqualTo("orderId",storePink.getOrderId());
+            int i1 = storePinkMapper.updateByConditionSelective(luckPink, storePinkUpdateCondition);
+            //维护每日统计表
+            dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(storePink.getOrderId(),luckPink);
+
+            // update(luckPink);
             //推进订单状态到待发货状态
 
-            storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_PINK_SUCCESS_ORDER, "拼团成功");
+            storeOrderStatusService.createLog(storeOrder.getId(), storeOrder.getOrderId(),Constants.ORDER_STATUS_PINK_SUCCESS_ORDER, "拼团成功");
             noticeService.addOrderNotice(NoticeEnum.ORDER_GROUP_BUY_SUCCESS_WIN,storeOrder.getOrderId(),storeOrder.getUid());
             //中奖者
             param.setWinnerOrderNo(storeOrder.getOrderId());
@@ -282,10 +318,12 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         //将所有参团成员的status设置为 已开奖
         list.forEach(a->{
             log.info("forEach a:"+JSONObject.toJSONString(a));
-            StoreOrder storeOrder = storeOrderService.findById(a.getOrderIdKey());
+            StoreOrder storeOrder = storeOrderService.findBy("orderId",a.getOrderId());
+            //**分库整改
+           // StoreOrder storeOrder = storeOrderService.findById(a.getOrderIdKey());
             PinkOrderStatusEnum pinkOrderStatusEnum = OrderStateMachine.handleEvent(storeOrder, OrderEventsEnum.GROUP_PURCHASE_NOT_WIN, null);
             if(ObjectUtils.isEmpty(pinkOrderStatusEnum)){
-                throw new ServiceException(I18nUtil.get("the.current.order.status.does.not.allow.advancement.to.the.closed.status.of.unwinning.orders.orderid")+a.getOrderIdKey());
+                throw new ServiceException(I18nUtil.get("the.current.order.status.does.not.allow.advancement.to.the.closed.status.of.unwinning.orders.orderid")+a.getOrderId());
             }
             // storePink2.setStopTime(date);
             StorePink unLuckPink = new StorePink();
@@ -293,13 +331,21 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
             unLuckPink.setStatus(StorePinkStatusEnum.RESULTS_ANNOUNCED.getKey());
             unLuckPink.setOrderStatus(pinkOrderStatusEnum.getKey());
             unLuckPink.setStopTime(date);
-            update(unLuckPink);
+            Condition storePinkConditionForUpdate = new Condition(StorePink.class);
+            storePinkConditionForUpdate.createCriteria().andEqualTo("orderId",a.getOrderId());
+            int i = storePinkMapper.updateByConditionSelective(unLuckPink, storePinkConditionForUpdate);
+            //维护每日统计表
+            dailySalesSummaryOfProductsService.updateDailySalesSummaryOfProducts(a.getOrderId(),unLuckPink);
+
+
+            //**分库整改
+            //update(unLuckPink);
 
             //推进订单状态到未中奖关闭状态
             log.info("storeOrderService.updateOrderStatus"+JSONObject.toJSONString(a));
 
-            storeOrderService.updateOrderStatus(a.getOrderIdKey(),pinkOrderStatusEnum.getKey());
-            storeOrderStatusService.createLog(storeOrder.getId(), Constants.ORDER_STATUS_PINK_SUCCESS_ORDER, "拼团成功");
+            storeOrderService.updateOrderStatus(a.getOrderId(),pinkOrderStatusEnum.getKey());
+            storeOrderStatusService.createLog(storeOrder.getId(),storeOrder.getOrderId(),Constants.ORDER_STATUS_PINK_SUCCESS_ORDER, "拼团成功");
             noticeService.addOrderNotice(NoticeEnum.ORDER_GROUP_BUY_SUCCESS_LOSE,storeOrder.getOrderId(),storeOrder.getUid());
 
             //库存回退
@@ -340,8 +386,6 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
             throw new ServiceException(I18nUtil.get("refund.failed.for.users.who.did.not.win.the.group.buying.message")+result.getMessage());
         }
 
-
-
     }
 
 
@@ -366,13 +410,28 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
 
             List<Long> spsIdList = byCondition.stream().map(StorePinkSummary::getId).collect(Collectors.toList());
 
+            List<String> orderNoSetList = byCondition.stream().map(StorePinkSummary::getOrderNoSet).filter(a->!ObjectUtils.isEmpty(a)).collect(Collectors.toList());
+            Set<String> orderNoSetForSearch = new HashSet<>();
+            log.info("ongoingList.orderNoSetList:"+orderNoSetList);
+            if(!org.springframework.util.CollectionUtils.isEmpty(orderNoSetList)){
+                for (String s : orderNoSetList) {
+                    List<String> strings = JSONObject.parseArray(s, String.class);
+                    orderNoSetForSearch.addAll(strings);
+                }
+            }
+            log.info("ongoingList.orderNoSetForSearch:"+orderNoSetForSearch);
             Condition condition = new Condition(StorePink.class);
             Example.Criteria criteria = condition.createCriteria();
             criteria.andEqualTo("isDelete", 0);
-            criteria.andEqualTo("cid", storePink.getCid());
+           // criteria.andEqualTo("cid", storePink.getCid());
             criteria.andEqualTo("orderStatus",PinkOrderStatusEnum.GROUP_ORDER_PAID.getKey());
             //  criteria.andEqualTo("kid", 0);
-            criteria.andIn("spsId", spsIdList);
+
+            if(!org.springframework.util.CollectionUtils.isEmpty(orderNoSetForSearch)){
+                criteria.andIn("orderId",orderNoSetForSearch);
+            }else{
+                criteria.andIn("spsId", spsIdList);
+            }
             List<StorePink> pinkList = findByCondition(condition);
 
             Map<Long, List<StorePink>> collect = pinkList.stream().collect(Collectors.groupingBy(StorePink::getSpsId));
@@ -397,12 +456,15 @@ public class StorePinkServiceImpl extends AbstractService<StorePink> implements
         return list;
     }
 
+    @Resource
+    private DailySalesSummaryOfProductsMapper dailySalesSummaryOfProductsMapper;
+
     @Override
     public List<ProductCarouselVO> carousel(Long productId) {
-        List<ProductCarouselDTO> pinks = storePinkMapper.pinkByProductId(productId);
+        List<ProductCarouselDTO> pinks = dailySalesSummaryOfProductsMapper.pinkByProductId(productId);
         // 兜底
         if (CollectionUtil.isEmpty(pinks)) {
-            pinks = storePinkMapper.pinkByProductId(null);
+            pinks = dailySalesSummaryOfProductsMapper.pinkByProductId(null);
         }
         // 还是空那也没办法了
         if (CollectionUtil.isEmpty(pinks)) {

+ 58 - 14
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkSummaryServiceImpl.java

@@ -1,5 +1,6 @@
 package com.txz.mall.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
 import com.txz.mall.core.ServiceException;
 import com.txz.mall.dao.StorePinkMapper;
 import com.txz.mall.dao.StorePinkSummaryMapper;
@@ -18,7 +19,9 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 
 /**
@@ -35,25 +38,32 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
     private StorePinkMapper mStorePinkMapper;
 
     @Override
-    public Boolean maintainQuantityStatusOfTheStorePinkSummary(Long id) {
+    public Boolean maintainQuantityStatusOfTheStorePinkSummary(String spsCode) {
 
 
-        Condition condition = new Condition(StorePink.class);
 
-        Example.Criteria criteria = condition.createCriteria();
-
-        criteria.andEqualTo("spsId", id);
-        criteria.andEqualTo("isDelete",0);
-        List<StorePink> storePinks = mStorePinkMapper.selectByCondition(condition);
         int sumUnpayAndPaid = 0;
 
 
-
-        StorePinkSummary storePinkSummary = mStorePinkSummaryMapper.selectByPrimaryKey(id);
+        StorePinkSummary storePinkSummary = this.findBy("code", spsCode);
+       //**分库整改
+       // StorePinkSummary storePinkSummary = mStorePinkSummaryMapper.selectByPrimaryKey(id);
         if(ObjectUtils.isEmpty(storePinkSummary)){
-            throw new ServiceException(I18nUtil.get("group.buying.summary.does.not.exist.id")+id);
+            throw new ServiceException(I18nUtil.get("group.buying.summary.does.not.exist.id")+spsCode);
+        }
+        List<StorePink> storePinks = null;
+        String orderNoSet = storePinkSummary.getOrderNoSet();
+        if(!ObjectUtils.isEmpty(orderNoSet)){
+            List<String> orderNoSetList = JSONObject.parseArray(orderNoSet, String.class);
+
+            Condition condition = new Condition(StorePink.class);
+            Example.Criteria criteria = condition.createCriteria();
+            criteria.andIn("orderId", orderNoSetList);
+            criteria.andEqualTo("isDelete",0);
+            storePinks = mStorePinkMapper.selectByCondition(condition);
         }
 
+
         Integer status = storePinkSummary.getStatus();
         boolean successFlag = false;
 
@@ -94,14 +104,14 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
 
 
             if(stipulatedNumber < sumUnpayAndPaid){
-                throw new ServiceException(I18nUtil.get("group.buying.overcrowded.id")+id);
+                throw new ServiceException(I18nUtil.get("group.buying.overcrowded.id")+spsCode);
             }
 
 
             //成团标识只有成团后才返回true
 
             StorePinkSummary storePinkSummaryForUpdate = new StorePinkSummary();
-            storePinkSummaryForUpdate.setId(id);
+          //  storePinkSummaryForUpdate.setId(id);
             storePinkSummaryForUpdate.setPeopleCount(sumUnpayAndPaid);
 
 
@@ -141,11 +151,45 @@ public class StorePinkSummaryServiceImpl extends AbstractService<StorePinkSummar
            }
 
 
-
-            mStorePinkSummaryMapper.updateByPrimaryKeySelective(storePinkSummaryForUpdate);
+           //**分库整改
+            Condition conditionStorePinkSummaryForUpdate = new Condition(StorePinkSummary.class);
+            conditionStorePinkSummaryForUpdate.createCriteria().andEqualTo("code",spsCode);
+            mStorePinkSummaryMapper.updateByConditionSelective(storePinkSummaryForUpdate, conditionStorePinkSummaryForUpdate);
+            //  mStorePinkSummaryMapper.updateByPrimaryKeySelective(storePinkSummaryForUpdate);
         }
 
 
        return successFlag;
     }
+
+
+    @Override
+    public Boolean maintainOrderNoSetOfTheStorePinkSummary(String spsCode, String orderNo) {
+
+        Condition storePinkSummarycCondition = new Condition(StorePinkSummary.class);
+        storePinkSummarycCondition.createCriteria().andEqualTo("code",spsCode);
+        List<StorePinkSummary> storePinkSummaries = mStorePinkSummaryMapper.selectByCondition(storePinkSummarycCondition);
+        if(CollectionUtils.isEmpty(storePinkSummaries)){
+            throw new ServiceException(I18nUtil.get("group.buying.summary.does.not.exist.id")+spsCode);
+        }
+        StorePinkSummary storePinkSummary = storePinkSummaries.get(0);
+
+        String orderNoSet = storePinkSummary.getOrderNoSet();
+        Set<String> resultSet = new HashSet<>();
+
+        if(!ObjectUtils.isEmpty(orderNoSet)){
+            List<String> orderNoSetList = JSONObject.parseArray(orderNoSet, String.class);
+            boolean b = resultSet.addAll(orderNoSetList);
+            resultSet.add(orderNo);
+        }
+        if(!ObjectUtils.isEmpty(resultSet)){
+            StorePinkSummary storePinkSummaryForUpdate = new StorePinkSummary();
+            storePinkSummaryForUpdate.setOrderNoSet(JSONObject.toJSONString(resultSet));
+            mStorePinkSummaryMapper.updateByConditionSelective(storePinkSummaryForUpdate,storePinkSummarycCondition);
+        }else{
+            throw new ServiceException(I18nUtil.get("store.pink.summary.order.no.set.not.exist")+spsCode);
+        }
+
+        return true;
+    }
 }

+ 8 - 4
mall-service/src/main/java/com/txz/mall/service/impl/UserSignServiceImpl.java

@@ -111,7 +111,8 @@ public class UserSignServiceImpl extends AbstractService<UserSign> implements Us
         Condition condition = new Condition(UserSign.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("uid", uid);
-        criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "%");
+        criteria.andEqualTo("createDay", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
+       // criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + "%");
         return !userSignMapper.selectByCondition(condition).isEmpty();
     }
 
@@ -121,7 +122,8 @@ public class UserSignServiceImpl extends AbstractService<UserSign> implements Us
         Condition condition = new Condition(UserSign.class);
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("uid", uid);
-        criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(yesterday) + "%");
+        criteria.andEqualTo("createDay", new SimpleDateFormat("yyyy-MM-dd").format(yesterday));
+       // criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(yesterday) + "%");
         condition.setOrderByClause("id desc");
         List<UserSign> list = userSignMapper.selectByCondition(condition);
         return list.isEmpty() ? null : list.get(0);
@@ -148,10 +150,12 @@ public class UserSignServiceImpl extends AbstractService<UserSign> implements Us
         criteria.andEqualTo("uid", userId);
         Date date = new Date();
         if(hasSignedToday) {
-            criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(date) + "%");
+            //criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(date) + "%");
+            criteria.andEqualTo("createDay", new SimpleDateFormat("yyyy-MM-dd").format(date));
         }else{
             DateTime dateTime = DateUtil.offsetDay(date, -1);
-            criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(dateTime) + "%");
+           // criteria.andLike("createDay", new SimpleDateFormat("yyyy-MM-dd").format(dateTime) + "%");
+            criteria.andEqualTo("createDay", new SimpleDateFormat("yyyy-MM-dd").format(dateTime));
         }
         condition.orderBy("id").desc();
 

+ 22 - 5
mall-service/src/main/java/com/txz/mall/task/GeneralJob.java

@@ -1,18 +1,18 @@
 package com.txz.mall.task;
 
-import cn.hutool.core.collection.CollUtil;
+
+import com.txz.mall.service.DailySalesSummaryOfProductsService;
 import com.txz.mall.service.StoreFlashActivityService;
 import com.txz.mall.service.StoreOrderService;
 import com.xxl.job.core.biz.model.ReturnT;
 import com.xxl.job.core.handler.annotation.XxlJob;
 import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+
 import org.springframework.stereotype.Component;
-import tk.mybatis.mapper.entity.Condition;
+
 
 import javax.annotation.Resource;
-import java.util.List;
+
 
 /**
  * 常规job
@@ -37,6 +37,9 @@ public class GeneralJob {
     @Resource
     private StoreFlashActivityService storeFlashActivityService;
 
+    @Resource
+    private DailySalesSummaryOfProductsService dailySalesSummaryOfProductsService;
+
     /**
      * 1、简单任务示例(Bean模式)
      */
@@ -97,4 +100,18 @@ public class GeneralJob {
     }
 
 
+    @XxlJob("dailySalesSummaryOfProductsDailyDataCleaning")
+    public ReturnT<String> dailySalesSummaryOfProductsDailyDataCleaning(String param) throws Exception {
+        try {
+            log.info("dailySalesSummaryOfProductsDailyDataCleaning start");
+            dailySalesSummaryOfProductsService.dailyDataCleaning();
+            log.info("dailySalesSummaryOfProductsDailyDataCleaning end");
+        } catch (Exception e) {
+            log.error("dailySalesSummaryOfProductsDailyDataCleaning:e{}", e);
+            return ReturnT.FAIL;
+        }
+        return ReturnT.SUCCESS;
+    }
+
+
 }

+ 2 - 3
mall-service/src/main/java/com/txz/mall/util/OrderUtils.java

@@ -110,8 +110,8 @@ public class OrderUtils {
      * 团购编码
      * @return
      */
-    public static String getTGCode() {
-        return TG_CODE + getCode();
+    public static String getTGCode(String prefix) {
+        return TG_CODE + prefix + getCode() % 10000;
     }
 
 
@@ -119,7 +119,6 @@ public class OrderUtils {
     /**
      * 生成订单单号编码(调用方法)
      */
-
     public static String getOrderCode() {
 
         DateFormat sdf = new SimpleDateFormat("yyMMdd");

+ 131 - 0
mall-service/src/main/java/com/txz/mall/web/mng/DailySalesSummaryOfProductsController.java

@@ -0,0 +1,131 @@
+//package com.txz.mall.web.mng;
+//import com.txz.mall.core.Result;
+//import com.txz.mall.dto.DailySalesSummaryOfProductsDTO;
+//import com.txz.mall.model.DailySalesSummaryOfProducts;
+//import com.txz.mall.service.DailySalesSummaryOfProductsService;
+//
+//import com.txz.mall.core.ResultCode;
+//
+//import com.github.pagehelper.PageHelper;
+//import com.github.pagehelper.PageInfo;
+//import org.springframework.web.bind.annotation.PostMapping;
+//import org.springframework.web.bind.annotation.RequestBody;
+//import org.springframework.web.bind.annotation.RequestMapping;
+//import org.springframework.web.bind.annotation.RequestParam;
+//import org.springframework.web.bind.annotation.RestController;
+//import org.slf4j.Logger;
+//import org.slf4j.LoggerFactory;
+//import io.swagger.annotations.Api;
+//import io.swagger.annotations.ApiOperation;
+//import tk.mybatis.mapper.entity.Condition;
+//import tk.mybatis.mapper.entity.Example.Criteria;
+//import org.springframework.web.bind.annotation.*;
+//import org.springframework.validation.annotation.Validated;
+//import javax.annotation.Resource;
+//import java.util.List;
+//import java.util.Date;
+//
+///**
+//* Created by CodeGenerator on 2025/10/21.
+//*/
+//@Api(tags = "[后台]dailySalesSummaryOfProducts管理")
+//@RestController
+//@RequestMapping("/daily/sales/summary/of/products")
+//public class DailySalesSummaryOfProductsController {
+//
+//	private static Logger log = LoggerFactory.getLogger(DailySalesSummaryOfProductsController.class);
+//
+//    @Resource
+//    private DailySalesSummaryOfProductsService dailySalesSummaryOfProductsService;
+//
+//    @PostMapping("/add")
+//	@ApiOperation(value = "dailySalesSummaryOfProducts新增")
+//	public Result add(@RequestBody DailySalesSummaryOfProducts dailySalesSummaryOfProducts) {
+//    	if(dailySalesSummaryOfProducts == null){
+//    		return Result.fail(ResultCode.OBJECT_IS_NULL);
+//    	}
+//    	try {
+//    		dailySalesSummaryOfProducts.setCreateTime(new Date());
+////            dailySalesSummaryOfProducts.setCreateUserId(userId);
+//    		dailySalesSummaryOfProductsService.save(dailySalesSummaryOfProducts);
+//		} catch (Exception e) {
+//			log.error("新增对象操作异常e:{}",e);
+//			return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+//		}
+//        return Result.success();
+//    }
+//
+//    @DeleteMapping("/delete")
+//	@ApiOperation(value = "dailySalesSummaryOfProducts删除")
+//	public Result delete(@RequestParam Long id) {
+//    	if(id == null){
+//    		return Result.fail(ResultCode.ID_IS_NULL);
+//    	}
+//    	try {
+//            DailySalesSummaryOfProducts dailySalesSummaryOfProducts = new DailySalesSummaryOfProducts();
+//			dailySalesSummaryOfProducts.setId(id);
+//			dailySalesSummaryOfProducts.setIsDelete(1);
+//			dailySalesSummaryOfProductsService.update(dailySalesSummaryOfProducts);
+//		} catch (Exception e) {
+//			log.error("删除对象操作异常e:{}",e);
+//			return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+//		}
+//        return Result.success();
+//    }
+//
+//    @PutMapping("/update")
+//	@ApiOperation(value = "dailySalesSummaryOfProducts更新")
+//	public Result update(@RequestBody DailySalesSummaryOfProducts dailySalesSummaryOfProducts) {
+//    	if(dailySalesSummaryOfProducts == null){
+//    		return Result.fail(ResultCode.OBJECT_IS_NULL);
+//    	}
+//    	if(dailySalesSummaryOfProducts.getId() == null){
+//    		return Result.fail(ResultCode.ID_IS_NULL);
+//    	}
+//    	try {
+//    		dailySalesSummaryOfProducts.setUpdateTime(new Date());
+////            dailySalesSummaryOfProducts.setUpdateUserId(userId);
+//    		dailySalesSummaryOfProductsService.update(dailySalesSummaryOfProducts);
+//		} catch (Exception e) {
+//			log.error("更新对象操作异常e:{}",e);
+//			return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+//		}
+//        return Result.success();
+//    }
+//
+//    @GetMapping("/detail")
+//	@ApiOperation(value = "dailySalesSummaryOfProducts获取详情")
+//	public Result<DailySalesSummaryOfProducts> detail(@RequestParam Long id) {
+//    	if(id == null){
+//    		return Result.fail(ResultCode.ID_IS_NULL);
+//    	}
+//    	DailySalesSummaryOfProducts dailySalesSummaryOfProducts = null;
+//    	try {
+//    		dailySalesSummaryOfProducts = dailySalesSummaryOfProductsService.findById(id);
+//		} catch (Exception e) {
+//			log.error("查询对象操作异常e:{}",e);
+//			return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+//		}
+//        return Result.success(dailySalesSummaryOfProducts);
+//    }
+//
+//    @PostMapping("/list")
+//	@ApiOperation(value = "dailySalesSummaryOfProducts获取列表")
+//	public Result<List<DailySalesSummaryOfProducts>> list(@Validated @RequestBody DailySalesSummaryOfProductsDTO dto) {
+//        PageHelper.startPage(dto.getPage(), dto.getSize());
+//
+//        Condition condition = new Condition(DailySalesSummaryOfProducts.class);
+//        Criteria criteria = condition.createCriteria();
+//		criteria.andEqualTo("isDelete", 0);
+//		condition.setOrderByClause("create_time DESC");
+//		PageInfo pageInfo = null;
+//		try {
+//    		 List<DailySalesSummaryOfProducts> list = dailySalesSummaryOfProductsService.findByCondition(condition);
+//    		 pageInfo = new PageInfo(list);
+//		} catch (Exception e) {
+//			log.error("查询对象操作异常e:{}",e);
+//			return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+//		}
+//        return Result.success(pageInfo);
+//    }
+//}

+ 4 - 0
mall-service/src/main/java/dto/GoPinkDTO.java

@@ -37,4 +37,8 @@ public class GoPinkDTO implements Serializable {
     @ApiModelProperty(value = "m_store_order.id")
     private Long orderIdKey;
 
+    //这个变量作为后端数据传递的变量前端无需感知
+    @ApiModelProperty(value = "m_store_pink.sps_code")
+    private String spsCode;
+
 }

+ 8 - 1
mall-service/src/main/java/dto/StoreOrderAppDTO.java

@@ -10,7 +10,8 @@ import com.txz.mall.web.param.BasePageParam;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.io.Serializable;
+
+import java.util.Date;
 
 @Data
 public class StoreOrderAppDTO extends BasePageParam {
@@ -19,4 +20,10 @@ public class StoreOrderAppDTO extends BasePageParam {
     private Integer type;
 
     private Long userId;
+
+    @ApiModelProperty(value = "开始时间")
+    private Date startDate;
+
+    @ApiModelProperty(value = "结束时间")
+    private Date endDate;
 }

+ 2 - 0
mall-service/src/main/java/vo/StorePinkDetailVO.java

@@ -69,4 +69,6 @@ public class StorePinkDetailVO implements Serializable {
     private Long spsId;
     @ApiModelProperty(value = "团长id 0为团长")
     private Integer kId;
+    @ApiModelProperty(value = "拼团汇总表编码")
+    private String spsCode;
 }

+ 20 - 2
mall-service/src/main/resources/bootstrap.properties

@@ -40,7 +40,7 @@ spring.cloud.nacos.config.file-extension=properties
 #spring.cloud.nacos.config.ext-config[2].refresh=true
 spring.cloud.nacos.config.extension-configs[0]=mq-${spring.profiles.active}.properties
 spring.cloud.nacos.config.extension-configs[1]=redis-${spring.profiles.active}.properties
-spring.cloud.nacos.config.extension-configs[2]=${spring.application.name}-${spring.profiles.active}.properties
+#spring.cloud.nacos.config.extension-configs[2]=${spring.application.name}-${spring.profiles.active}.properties
 
 #spring.cloud.nacos.config.extension-configs[3]=xxljob-${spring.profiles.active}.properties
 dubbo.protocol.serialization=kryo
@@ -111,4 +111,22 @@ xxl.job.accessToken=${${spring.profiles.active}.accessToken}
 xxl.job.executor.ip=
 xxl.job.executor.port=4444
 xxl.job.executor.logpath=/var/logs/xxljob/${spring.application.name}/jobhandler
-xxl.job.executor.logretentiondays=4
+xxl.job.executor.logretentiondays=4
+
+
+
+
+jbs.url=http://vip.cellocation.com/cell/fdhbyshf.php
+spring.datasource.type=com.zaxxer.hikari.HikariDataSource
+spring.datasource.hikari.connection-timeout=30000
+spring.datasource.hikari.minimum-idle=4
+#spring.datasource.hikari.maximum-pool-size=15
+spring.datasource.hikari.auto-commit=true
+spring.datasource.hikari.idle-timeout=60000
+spring.datasource.hikari.pool-name=DatebookHikariCP
+spring.datasource.hikari.max-lifetime=28740000
+spring.datasource.hikari.connection-test-query=SELECT 1
+
+spring.main.allow-bean-definition-overriding=true
+
+

+ 6 - 1
mall-service/src/main/resources/i18n/messages_en_US.properties

@@ -166,4 +166,9 @@ does.not.exist=does not exist
 internal.error.please.contact.the.administrator=internal error please contact the administrator
 exception.occurred=exception occurred
 method=method
-exception.summary=exception summary:
+exception.summary=exception summary:
+yixiashixinzengshuju
+the.group.buying.summary.data.does.not.exist=the group buying summary data does not exist
+store.pink.summary.order.no.set.not.exist=store pink summary order no set not exist
+order.code.is.empty=order code is empty
+cid.store.pink.summary.order.no.set.not.exist=cid store pink summary order no set not exist 

+ 4 - 1
mall-service/src/main/resources/i18n/messages_zh_CN.properties

@@ -164,5 +164,8 @@ internal.error.please.contact.the.administrator=\u5185\u90E8\u5F02\u5E38\uFF0C\u
 exception.occurred=\u53D1\u751F\u5F02\u5E38
 method=\u65B9\u6CD5
 exception.summary=\u5F02\u5E38\u6982\u8981:
-
+the.group.buying.summary.data.does.not.exist=\u62FC\u56E2\u6C47\u603B\u6570\u636E\u4E0D\u5B58\u5728
+store.pink.summary.order.no.set.not.exist=\u62FC\u56E2\u6C47\u603B\u8868\u65E0\u8BA2\u5355\u7F16\u7801\u96C6
+order.code.is.empty=\u8BA2\u5355\u7F16\u7801\u4E3A\u7A7A
+cid.store.pink.summary.order.no.set.not.exist=\u4F7F\u7528cid\u7684\u67E5\u8BE2pinksummary\u83B7\u53D6\u5230\u5230orderNoSet\u5168\u4E3A\u7A7A
 

+ 1 - 1
mall-service/src/main/resources/logback.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration debug="false">
     <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
-    <property name="LOG_HOME" value="/var/logs/mall" />
+    <property name="LOG_HOME" value="./mall" />
     <!-- 控制台输出 -->
     <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
         <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">

+ 54 - 0
mall-service/src/main/resources/mapper/DailySalesSummaryOfProductsMapper.xml

@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.txz.mall.dao.DailySalesSummaryOfProductsMapper">
+  <resultMap id="BaseResultMap" type="com.txz.mall.model.DailySalesSummaryOfProducts">
+    <!--
+      WARNING - @mbg.generated
+    -->
+    <id column="id" jdbcType="BIGINT" property="id" />
+    <result column="uid" jdbcType="BIGINT" property="uid" />
+    <result column="sps_id" jdbcType="BIGINT" property="spsId" />
+    <result column="order_id" jdbcType="VARCHAR" property="orderId" />
+    <result column="order_id_key" jdbcType="BIGINT" property="orderIdKey" />
+    <result column="total_num" jdbcType="INTEGER" property="totalNum" />
+    <result column="total_price" jdbcType="DECIMAL" property="totalPrice" />
+    <result column="cid" jdbcType="BIGINT" property="cid" />
+    <result column="pid" jdbcType="BIGINT" property="pid" />
+    <result column="people" jdbcType="INTEGER" property="people" />
+    <result column="price" jdbcType="DECIMAL" property="price" />
+    <result column="add_time" jdbcType="TIMESTAMP" property="addTime" />
+    <result column="stop_time" jdbcType="TIMESTAMP" property="stopTime" />
+    <result column="l_id" jdbcType="INTEGER" property="lId" />
+    <result column="k_id" jdbcType="INTEGER" property="kId" />
+    <result column="is_tpl" jdbcType="TINYINT" property="isTpl" />
+    <result column="is_refund" jdbcType="TINYINT" property="isRefund" />
+    <result column="status" jdbcType="TINYINT" property="status" />
+    <result column="order_status" jdbcType="TINYINT" property="orderStatus" />
+    <result column="is_virtual" jdbcType="BIT" property="isVirtual" />
+    <result column="nickname" jdbcType="VARCHAR" property="nickname" />
+    <result column="avatar" jdbcType="VARCHAR" property="avatar" />
+    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
+    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
+    <result column="create_user_id" jdbcType="BIGINT" property="createUserId" />
+    <result column="update_user_id" jdbcType="BIGINT" property="updateUserId" />
+    <result column="is_delete" jdbcType="TINYINT" property="isDelete" />
+    <result column="sps_code" jdbcType="VARCHAR" property="spsCode" />
+  </resultMap>
+
+
+  <select id="getRankNew" resultType="map">
+
+    select pid as pid ,count(*) as num
+    from m_daily_sales_summary_of_products
+    where order_status in (3,4,5,6,7,8)
+    and pid in
+    <foreach collection='productSet' item='item' open='(' separator=',' close=')'>
+      #{item}
+    </foreach>
+    and create_time > #{date}
+    group by pid
+    ORDER BY num desc limit 20
+
+  </select>
+
+</mapper>

+ 1 - 1
mall-service/src/test/java/CodeGenerator.java

@@ -47,7 +47,7 @@ public class CodeGenerator {
 	public static void main(String[] args) {
 //		genCode("o_lottery","o_lottery_prize","o_lottery_record");
 		// genCode("输入表名","输入自定义Model名称");
-		genCode("m_create_sequence");
+		// genCode("m_daily_sales_summary_of_products");
 		//genCode("c_member_coupon");
 	}