From cffb16b1767f5a5282e953cce8e674bade546178 Mon Sep 17 00:00:00 2001
From: peng <peng.com>
Date: 星期一, 07 七月 2025 17:02:39 +0800
Subject: [PATCH] 添加改价记录功能 修改结算流程 添加定时任务

---
 framework/src/main/resources/mapper/lmk/PriceChangeMapper.xml                               |   68 +
 framework/src/main/java/cn/lili/modules/lmk/domain/query/PriceChangeQuery.java              |   17 
 framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java          |   72 +
 framework/src/main/java/cn/lili/modules/lmk/domain/query/CommissionRecordQuery.java         |   17 
 framework/src/main/resources/mapper/lmk/CommissionRecordMapper.xml                          |   86 +
 lmk-job/src/main/java/cn/lili/handler/impl/order/OrderEveryDayTaskExecute.java              |  287 ++++++
 framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceOperationTypeEnum.java |   28 
 framework/src/main/java/cn/lili/modules/lmk/mapper/CommissionRecordMapper.java              |   32 
 lmk-job/src/main/java/cn/lili/handler/EveryDayExecute.java                                  |   18 
 framework/src/main/java/cn/lili/modules/lmk/service/CommissionRecordService.java            |   65 +
 framework/src/main/java/cn/lili/modules/lmk/mapper/PriceChangeMapper.java                   |   32 
 seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java                 |    1 
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/PriceChangeVO.java                    |   75 +
 lmk-job/src/main/java/cn/lili/handler/impl/order/CancelOrderTaskExecute.java                |   61 +
 framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceAudioStatusEnum.java   |   29 
 lmk-job/src/main/java/cn/lili/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java        |   86 +
 buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java                  |   10 
 lmk-job/src/main/java/cn/lili/handler/EveryMinuteExecute.java                               |   17 
 lmk-job/src/main/java/cn/lili/handler/impl/broadcast/BroadcastExecute.java                  |   25 
 buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java              |   13 
 framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java                  |    2 
 lmk-job/src/main/java/cn/lili/handler/impl/store/StoreExecute.java                          |   49 +
 framework/src/main/java/cn/lili/modules/lmk/domain/form/PriceChangeForm.java                |   79 +
 lmk-job/src/main/java/cn/lili/handler/impl/statistics/OnlineMemberStatistics.java           |  114 ++
 lmk-job/src/main/java/cn/lili/handler/impl/order/RechargeOrderTaskExecute.java              |   61 +
 lmk-job/src/main/java/cn/lili/handler/impl/store/StoreRatingExecute.java                    |   60 +
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java       |   27 
 framework/src/main/java/cn/lili/modules/lmk/service/PriceChangeService.java                 |   65 +
 lmk-job/src/main/java/cn/lili/handler/EveryHourExecute.java                                 |   17 
 framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java               |    4 
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/PriceChange.java                  |   72 +
 lmk-job/src/main/java/cn/lili/handler/impl/statistics/MemberStatisticsExecute.java          |   55 +
 framework/src/main/java/cn/lili/modules/lmk/service/impl/CommissionRecordServiceImpl.java   |  119 ++
 framework/src/main/java/cn/lili/modules/lmk/domain/entity/CommissionRecord.java             |   92 ++
 lmk-job/src/main/java/cn/lili/handler/impl/coupon/CouponExecute.java                        |   55 +
 lmk-job/src/main/java/cn/lili/handler/impl/goods/GoodsExecute.java                          |   48 +
 lmk-job/src/main/java/cn/lili/handler/impl/promotion/MemberCouponSignEverydayExecute.java   |   35 
 framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java             |    4 
 lmk-job/src/main/java/cn/lili/handler/impl/promotion/PromotionEverydayExecute.java          |   85 +
 framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java   |    1 
 framework/src/main/java/cn/lili/modules/lmk/service/impl/PriceChangeServiceImpl.java        |  119 ++
 framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java        |   21 
 lmk-job/src/main/java/cn/lili/handler/impl/view/PageViewStatisticsExecute.java              |  195 ++++
 lmk-job/src/main/java/cn/lili/job/TimedTaskJobHandler.java                                  |  104 ++
 framework/src/main/java/cn/lili/modules/lmk/domain/form/CommissionRecordForm.java           |  104 ++
 framework/src/main/java/cn/lili/modules/lmk/domain/vo/CommissionRecordVO.java               |  100 ++
 46 files changed, 2,710 insertions(+), 16 deletions(-)

diff --git a/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java
index 4f4b802..68a8a0f 100644
--- a/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/order/AfterSaleBuyerController.java
@@ -3,6 +3,7 @@
 import cn.lili.common.aop.annotation.PreventDuplicateSubmissions;
 import cn.lili.common.enums.ResultUtil;
 import cn.lili.common.security.OperationalJudgment;
+import cn.lili.common.utils.StringUtils;
 import cn.lili.common.vo.ResultMessage;
 import cn.lili.modules.order.aftersale.entity.dos.AfterSale;
 import cn.lili.modules.order.aftersale.entity.dos.AfterSaleLog;
@@ -15,6 +16,7 @@
 import cn.lili.modules.order.aftersale.service.AfterSaleReasonService;
 import cn.lili.modules.order.aftersale.service.AfterSaleService;
 import cn.lili.modules.store.entity.dto.StoreAfterSaleAddressDTO;
+import cn.lili.utils.COSUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -55,6 +57,8 @@
     @Autowired
     private AfterSaleLogService afterSaleLogService;
 
+    @Autowired
+    private COSUtil cosUtil;
     @ApiOperation(value = "鏌ョ湅鍞悗鏈嶅姟璇︽儏")
     @ApiImplicitParam(name = "sn", value = "鍞悗鍗曞彿", required = true, paramType = "path")
     @GetMapping(value = "/get/{sn}")
@@ -66,7 +70,14 @@
     @ApiOperation(value = "鍒嗛〉鑾峰彇鍞悗鏈嶅姟")
     @GetMapping(value = "/page")
     public ResultMessage<IPage<AfterSaleVO>> getByPage(AfterSaleSearchParams searchParams) {
-        return ResultUtil.data(afterSaleService.getAfterSalePages(searchParams));
+        IPage<AfterSaleVO> afterSalePages = afterSaleService.getAfterSalePages(searchParams);
+        afterSalePages.getRecords().forEach(item->{
+            String goodsImage = item.getGoodsImage();
+            if (StringUtils.isNotBlank(goodsImage)&&!goodsImage.contains("http")) {
+                item.setGoodsImage(cosUtil.getPreviewUrl(goodsImage));
+            }
+        });
+        return ResultUtil.data(afterSalePages);
     }
 
     @ApiOperation(value = "鑾峰彇鐢宠鍞悗椤甸潰淇℃伅")
diff --git a/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java b/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java
index 35bdfbd..b450be5 100644
--- a/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java
+++ b/buyer-api/src/main/java/cn/lili/controller/store/StoreBuyerController.java
@@ -3,6 +3,7 @@
 import cn.lili.common.enums.ResultUtil;
 import cn.lili.common.security.AuthUser;
 import cn.lili.common.security.context.UserContext;
+import cn.lili.common.utils.StringUtils;
 import cn.lili.common.vo.PageVO;
 import cn.lili.common.vo.ResultMessage;
 import cn.lili.modules.goods.entity.vos.StoreGoodsLabelVO;
@@ -14,6 +15,7 @@
 import cn.lili.modules.store.entity.vos.*;
 import cn.lili.modules.store.service.StoreDetailService;
 import cn.lili.modules.store.service.StoreService;
+import cn.lili.utils.COSUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -52,6 +54,8 @@
      */
     @Autowired
     private StoreDetailService storeDetailService;
+    @Autowired
+    private COSUtil cosUtil;
 
     @ApiOperation(value = "鑾峰彇搴楅摵鍒楄〃鍒嗛〉")
     @GetMapping
@@ -77,7 +81,11 @@
     @ApiImplicitParam(name = "id", value = "搴楅摵ID", required = true, paramType = "path")
     @GetMapping(value = "/get/detail/{id}")
     public ResultMessage<StoreBasicInfoVO> detail(@NotNull @PathVariable String id) {
-        return ResultUtil.data(storeDetailService.getStoreBasicInfoDTO(id));
+        StoreBasicInfoVO storeBasicInfoDTO = storeDetailService.getStoreBasicInfoDTO(id);
+        if (StringUtils.isNotBlank(storeBasicInfoDTO.getStoreLogo())&&!storeBasicInfoDTO.getStoreLogo().contains("http")) {
+            storeBasicInfoDTO.setStoreLogo(cosUtil.getPreviewUrl(storeBasicInfoDTO.getStoreLogo()));
+        }
+        return ResultUtil.data(storeBasicInfoDTO);
     }
 
     @ApiOperation(value = "閫氳繃id鑾峰彇搴楅摵璇︾粏淇℃伅-钀ヤ笟鎵х収")
diff --git a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java
index 61b555e..ab11843 100644
--- a/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java
+++ b/framework/src/main/java/cn/lili/modules/goods/service/GoodsSkuService.java
@@ -60,7 +60,7 @@
      * @param goods             鍟嗗搧淇℃伅
      * @param goodsOperationDTO 鍟嗗搧鎿嶄綔淇℃伅
      */
-    void update(Goods goods, GoodsOperationDTO goodsOperationDTO);
+    void update(Goods goods, GoodsOperationDTO goodsOperationDTO,Goods previousGoods);
 
     /**
      * 鏇存柊鍟嗗搧sku
diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
index 8465e1b..48a6b24 100644
--- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsServiceImpl.java
@@ -47,7 +47,6 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.rocketmq.spring.core.RocketMQTemplate;
@@ -218,10 +217,11 @@
         if (goodsOperationDTO.getGoodsParamsDTOList() != null && !goodsOperationDTO.getGoodsParamsDTOList().isEmpty()) {
             goods.setParams(JSONUtil.toJsonStr(goodsOperationDTO.getGoodsParamsDTOList()));
         }
+        Goods previousGoods = this.getById(goodsId);
         //淇敼鍟嗗搧
         this.updateById(goods);
         //淇敼鍟嗗搧sku淇℃伅
-        this.goodsSkuService.update(goods, goodsOperationDTO);
+        this.goodsSkuService.update(goods, goodsOperationDTO,previousGoods);
         //娣诲姞鐩稿唽
         if (goodsOperationDTO.getGoodsGalleryList() != null && !goodsOperationDTO.getGoodsGalleryList().isEmpty()) {
             this.goodsGalleryService.add(goodsOperationDTO.getGoodsGalleryList(), goods.getId());
diff --git a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java
index e05801a..0d8e1d9 100644
--- a/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/goods/serviceimpl/GoodsSkuServiceImpl.java
@@ -37,7 +37,11 @@
 import cn.lili.modules.goods.service.WholesaleService;
 import cn.lili.modules.goods.sku.GoodsSkuBuilder;
 import cn.lili.modules.goods.sku.render.SalesModelRender;
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import cn.lili.modules.lmk.enums.general.ChangePriceAudioStatusEnum;
+import cn.lili.modules.lmk.enums.general.ChangePriceOperationTypeEnum;
 import cn.lili.modules.lmk.enums.general.ViewTypeEnum;
+import cn.lili.modules.lmk.service.PriceChangeService;
 import cn.lili.modules.member.entity.dos.FootPrint;
 import cn.lili.modules.promotion.entity.dos.Coupon;
 import cn.lili.modules.promotion.entity.dos.PromotionGoods;
@@ -56,6 +60,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.apache.poi.ss.usermodel.*;
@@ -73,8 +78,10 @@
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.InputStream;
+import java.math.BigDecimal;
 import java.net.URLEncoder;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -137,6 +144,9 @@
     @Autowired
     private List<SalesModelRender> salesModelRenders;
 
+    @Autowired
+    private PriceChangeService priceChangeService;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void add(Goods goods, GoodsOperationDTO goodsOperationDTO) {
@@ -151,12 +161,29 @@
         if (!goodsSkus.isEmpty()) {
             this.saveOrUpdateBatch(goodsSkus);
             this.updateGoodsStock(goodsSkus);
+            //璁板綍浠锋牸鍙樺姩
+            List<PriceChange> priceChangeList = goodsSkus.stream().map(item -> {
+                PriceChange priceChange = new PriceChange();
+                priceChange.setCurrentPrice(BigDecimal.valueOf(item.getPrice()));
+                priceChange.setSkuId(item.getId());
+                priceChange.setGoodsId(item.getGoodsId());
+                priceChange.setPreviousPrice(BigDecimal.ZERO);
+                priceChange.setPreviousCommission(BigDecimal.ZERO);
+                priceChange.setCurrentCommission(goods.getCommission());
+                priceChange.setOperatorType(ChangePriceOperationTypeEnum.STORE.name());
+                priceChange.setExamineStatus(ChangePriceAudioStatusEnum.APPLY.name());
+                priceChange.setOperatorId(UserContext.getCurrentUser().getId());
+                priceChange.setOperatorName(UserContext.getCurrentUser().getNickName());
+                priceChange.setStoreId(item.getStoreId());
+                return priceChange;
+            }).collect(Collectors.toList());
+            priceChangeService.saveBatch(priceChangeList);
         }
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void update(Goods goods, GoodsOperationDTO goodsOperationDTO) {
+    public void update(Goods goods, GoodsOperationDTO goodsOperationDTO,Goods previousGoods) {
         // 鏄惁瀛樺湪瑙勬牸
         if (goodsOperationDTO.getSkuList() == null || goodsOperationDTO.getSkuList().isEmpty()) {
             throw new ServiceException(ResultCode.MUST_HAVE_GOODS_SKU);
@@ -199,9 +226,41 @@
             unnecessarySkuIdsQuery.eq(GoodsSku::getGoodsId, goods.getId());
             unnecessarySkuIdsQuery.notIn(GoodsSku::getId,
                     skuList.stream().map(BaseEntity::getId).collect(Collectors.toList()));
+            LambdaQueryWrapper<GoodsSku> skuIdsQuery = new LambdaQueryWrapper<>();
+            skuIdsQuery.eq(GoodsSku::getGoodsId, goods.getId());
+            skuIdsQuery.in(GoodsSku::getId,
+                    skuList.stream().map(BaseEntity::getId).collect(Collectors.toList()));
+            Map<String, GoodsSku> skuMap = this.list(skuIdsQuery).stream().collect(Collectors.toMap(GoodsSku::getId, Function.identity()));
             this.remove(unnecessarySkuIdsQuery);
             this.saveOrUpdateBatch(skuList);
             this.updateGoodsStock(skuList);
+            //璁板綍浠锋牸鍙樺姩
+            //鍒犻櫎褰撳墠瀹℃牳鐘舵�佷负鐢宠鐨勬敼浠风殑鍟嗗搧 搴楅摵id涓�鑷村晢鍝乮d涓�鑷翠笖涓虹敵璇风姸鎬佺殑绉婚櫎
+            LambdaQueryWrapper<PriceChange> needRemove = Wrappers.<PriceChange>lambdaQuery()
+                    .eq(PriceChange::getGoodsId, goods.getId())
+                    .eq(PriceChange::getStoreId, goods.getStoreId())
+                    .eq(PriceChange::getExamineStatus, ChangePriceAudioStatusEnum.APPLY.name());
+            priceChangeService.remove(needRemove);
+            //閲嶆柊娣诲姞鏀逛环鍟嗗搧
+            List<PriceChange> priceChangeList = skuList.stream().map(item -> {
+                PriceChange priceChange = new PriceChange();
+                priceChange.setCurrentPrice(BigDecimal.valueOf(item.getPrice()));
+                GoodsSku goodsSku = skuMap.get(item.getId());
+                priceChange.setSkuId(item.getId());
+                priceChange.setGoodsId(item.getGoodsId());
+                if (Objects.nonNull(goodsSku)) {
+                    priceChange.setPreviousPrice(BigDecimal.valueOf(goodsSku.getPrice()));
+                }
+                priceChange.setPreviousCommission(previousGoods.getCommission());
+                priceChange.setCurrentCommission(goods.getCommission());
+                priceChange.setOperatorType(ChangePriceOperationTypeEnum.STORE.name());
+                priceChange.setExamineStatus(ChangePriceAudioStatusEnum.APPLY.name());
+                priceChange.setOperatorId(UserContext.getCurrentUser().getId());
+                priceChange.setOperatorName(UserContext.getCurrentUser().getNickName());
+                priceChange.setStoreId(item.getStoreId());
+                return priceChange;
+            }).collect(Collectors.toList());
+            priceChangeService.saveBatch(priceChangeList);
         }
     }
 
@@ -389,6 +448,17 @@
         updateWrapper.set(GoodsSku::getDeleteFlag, goods.getDeleteFlag());
         boolean update = this.update(updateWrapper);
         if (Boolean.TRUE.equals(update)) {
+            //淇敼璁㈠崟鏀逛环鐘舵�佷负閫氳繃鎴栬�呭け璐�
+            LambdaUpdateWrapper<PriceChange> updatePriceChange = Wrappers.<PriceChange>lambdaUpdate()
+                    .eq(PriceChange::getGoodsId, goods.getId())
+                    .eq(PriceChange::getStoreId, goods.getStoreId())
+                    .eq(PriceChange::getExamineStatus, ChangePriceAudioStatusEnum.APPLY.name());
+            if (GoodsAuthEnum.PASS.name().equals(goods.getAuthFlag())) {
+                updatePriceChange.set(PriceChange::getExamineStatus, ChangePriceAudioStatusEnum.PASS.name());
+            }else {
+                updatePriceChange.set(PriceChange::getExamineStatus, ChangePriceAudioStatusEnum.REFUSE.name());
+            }
+            priceChangeService.update(updatePriceChange);
             List<GoodsSku> goodsSkus = this.getGoodsSkuListByGoodsId(goods.getId());
             for (GoodsSku sku : goodsSkus) {
                 cache.remove(GoodsSkuService.getCacheKeys(sku.getId()));
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/CommissionRecord.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/CommissionRecord.java
new file mode 100644
index 0000000..cb457ee
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/CommissionRecord.java
@@ -0,0 +1,92 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import cn.lili.mybatis.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 鎶芥垚璁板綍琛�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Data
+@TableName("lmk_commission_record")
+public class CommissionRecord extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("store_id")
+    /** 搴楅摵id */
+    private Long storeId;
+
+    @TableField("goods_id")
+    /** 鍟嗗搧id */
+    private Long goodsId;
+
+    @TableField("sku_id")
+    /** skuId */
+    private Long skuId;
+
+    @TableField("goods_name")
+    /** 鍟嗗搧鍚嶇О */
+    private String goodsName;
+
+    @TableField("img_url")
+    /** 鍟嗗搧鍥剧墖鍦板潃 */
+    private String imgUrl;
+
+    @TableField("price")
+    /** 鍟嗗搧鍗曚环 */
+    private BigDecimal price;
+
+    @TableField("num")
+    /** 鍟嗗搧鏁伴噺 */
+    private BigDecimal num;
+
+    @TableField("sum_price")
+    /** 鍟嗗搧鎬讳环 */
+    private BigDecimal sumPrice;
+
+    @TableField("commission")
+    /** 褰撳墠鎶芥垚姣斾緥 */
+    private BigDecimal commission;
+
+    @TableField("commission_price")
+    /** 骞冲彴鎶芥垚閲戦 */
+    private BigDecimal commissionPrice;
+
+    @TableField("remain_money")
+    /** 鎵i櫎骞冲彴鎶芥垚閲戦 */
+    private BigDecimal remainMoney;
+
+    @TableField("settlement_status")
+    /** 缁撶畻璁㈠崟鐘舵�� */
+    private String settlementStatus;
+
+    @TableField("can_settlement_time")
+    /** 鍙互缁撶畻鏃堕棿 */
+    private LocalDateTime canSettlementTime;
+
+    @TableField("trade_sn")
+    /** 浜ゆ槗鍗曞彿 */
+    private String tradeSn;
+
+    @TableField("sn")
+    /** 瀛愯鍗曞彿 */
+    private String sn;
+
+    @TableField("type")
+    /** 鎶芥垚绫诲瀷锛堥��娆鹃��浣i噾锛� */
+    private String type;
+
+    @TableField("delivery_status")
+    /** 鍚︾‘璁ゆ敹璐� */
+    private String deliveryStatus;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PriceChange.java b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PriceChange.java
new file mode 100644
index 0000000..dc33c80
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/entity/PriceChange.java
@@ -0,0 +1,72 @@
+package cn.lili.modules.lmk.domain.entity;
+
+import cn.lili.modules.lmk.enums.general.ChangePriceAudioStatusEnum;
+import cn.lili.mybatis.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * 浠锋牸鍙樺姩琛�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Data
+@TableName("lmk_price_change")
+public class PriceChange extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableField("store_id")
+    /** 搴楅摵id */
+    private String storeId;
+
+    @TableField("goods_id")
+    /** 鍟嗗搧id */
+    private String goodsId;
+
+    @TableField("sku_id")
+    /** 鏈�灏忛攢鍞崟鍏僫d */
+    private String skuId;
+
+    @TableField("previous_price")
+    /** 鍘熶环 */
+    private BigDecimal previousPrice;
+
+    @TableField("current_price")
+    /** 鐜颁环 */
+    private BigDecimal currentPrice;
+
+    @TableField("previous_commission")
+    /** 鍘熸娊鎴愭瘮渚� */
+    private BigDecimal previousCommission;
+
+    @TableField("current_commission")
+    /** 鐜板湪鎶芥垚姣斾緥 */
+    private BigDecimal currentCommission;
+
+    @TableField("operator_name")
+    /** 鎿嶄綔浜哄憳濮撳悕 */
+    private String operatorName;
+
+    @TableField("operator_id")
+    /** 鎿嶄綔浜哄憳id */
+    private String operatorId;
+
+    @TableField("examine_status")
+    /**
+     * 瀹℃牳鐘舵��
+     *
+     * @see  ChangePriceAudioStatusEnum
+     * */
+    private String examineStatus;
+
+    @TableField("operator_type")
+    /** 鎿嶄綔浜哄憳绫诲瀷 */
+    private String operatorType;
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/CommissionRecordForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/CommissionRecordForm.java
new file mode 100644
index 0000000..2ce8bbb
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/CommissionRecordForm.java
@@ -0,0 +1,104 @@
+package cn.lili.modules.lmk.domain.form;
+
+import cn.lili.base.AbsForm;
+import cn.lili.group.Add;
+import cn.lili.group.Update;
+import cn.lili.modules.lmk.domain.entity.CommissionRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.NonNull;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鎶芥垚璁板綍琛ㄨ〃鍗�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Data
+@ApiModel(value = "CommissionRecord琛ㄥ崟", description = "鎶芥垚璁板綍琛ㄨ〃鍗�")
+public class CommissionRecordForm extends AbsForm {
+
+    @NotNull(message = "搴楅摵id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    @NotNull(message = "鍟嗗搧id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧id")
+    private Long goodsId;
+
+    @NotNull(message = "skuId涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("skuId")
+    private Long skuId;
+
+    @NotBlank(message = "鍟嗗搧鍚嶇О涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧鍚嶇О")
+    private String goodsName;
+
+    @NotBlank(message = "鍟嗗搧鍥剧墖鍦板潃涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧鍥剧墖鍦板潃")
+    private String imgUrl;
+
+    @NotNull(message = "鍟嗗搧鍗曚环涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧鍗曚环")
+    private BigDecimal price;
+
+    @NotNull(message = "鍟嗗搧鏁伴噺涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧鏁伴噺")
+    private BigDecimal num;
+
+    @NotNull(message = "鍟嗗搧鎬讳环涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧鎬讳环")
+    private BigDecimal sumPrice;
+
+    @NotNull(message = "褰撳墠鎶芥垚姣斾緥涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("褰撳墠鎶芥垚姣斾緥")
+    private BigDecimal commission;
+
+    @NotNull(message = "骞冲彴鎶芥垚閲戦涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("骞冲彴鎶芥垚閲戦")
+    private BigDecimal commissionPrice;
+
+    @NotNull(message = "鎵i櫎骞冲彴鎶芥垚閲戦涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鎵i櫎骞冲彴鎶芥垚閲戦")
+    private BigDecimal remainMoney;
+
+    @NotBlank(message = "缁撶畻璁㈠崟鐘舵�佷笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("缁撶畻璁㈠崟鐘舵��")
+    private String settlementStatus;
+
+    @NotNull(message = "鍙互缁撶畻鏃堕棿涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍙互缁撶畻鏃堕棿")
+    private Date canSettlementTime;
+
+    @NotBlank(message = "浜ゆ槗鍗曞彿涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("浜ゆ槗鍗曞彿")
+    private String tradeSn;
+
+    @NotBlank(message = "瀛愯鍗曞彿涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("瀛愯鍗曞彿")
+    private String sn;
+
+    @NotBlank(message = "鎶芥垚绫诲瀷锛堥��娆鹃��浣i噾锛変笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("鎶芥垚绫诲瀷锛堥��娆鹃��浣i噾锛�")
+    private String type;
+
+    @NotBlank(message = "鍚︾‘璁ゆ敹璐т笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍚︾‘璁ゆ敹璐�")
+    private String deliveryStatus;
+
+    public static CommissionRecord getEntityByForm(@NonNull CommissionRecordForm form, CommissionRecord entity) {
+        if(entity == null) {
+          entity = new CommissionRecord();
+        }
+        BeanUtils.copyProperties(form, entity);
+        return entity;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/form/PriceChangeForm.java b/framework/src/main/java/cn/lili/modules/lmk/domain/form/PriceChangeForm.java
new file mode 100644
index 0000000..4ebb3b2
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/form/PriceChangeForm.java
@@ -0,0 +1,79 @@
+package cn.lili.modules.lmk.domain.form;
+
+import cn.lili.base.AbsForm;
+import cn.lili.group.Add;
+import cn.lili.group.Update;
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.NonNull;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+/**
+ * 浠锋牸鍙樺姩琛ㄨ〃鍗�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Data
+@ApiModel(value = "PriceChange琛ㄥ崟", description = "浠锋牸鍙樺姩琛ㄨ〃鍗�")
+public class PriceChangeForm extends AbsForm {
+
+    @NotNull(message = "搴楅摵id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    @NotNull(message = "鍟嗗搧id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍟嗗搧id")
+    private Long goodsId;
+
+    @NotNull(message = "鏈�灏忛攢鍞崟鍏僫d涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鏈�灏忛攢鍞崟鍏僫d")
+    private Long skuId;
+
+    @NotNull(message = "鍘熶环涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍘熶环")
+    private BigDecimal previousPrice;
+
+    @NotNull(message = "鐜颁环涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鐜颁环")
+    private BigDecimal currentPrice;
+
+    @NotNull(message = "鍘熸娊鎴愭瘮渚嬩笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("鍘熸娊鎴愭瘮渚�")
+    private BigDecimal previousCommission;
+
+    @NotNull(message = "鐜板湪鎶芥垚姣斾緥涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鐜板湪鎶芥垚姣斾緥")
+    private BigDecimal currentCommission;
+
+    @NotBlank(message = "鎿嶄綔浜哄憳濮撳悕涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鎿嶄綔浜哄憳濮撳悕")
+    private String operatorName;
+
+    @NotNull(message = "鎿嶄綔浜哄憳id涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鎿嶄綔浜哄憳id")
+    private Long operatorId;
+
+    @NotBlank(message = "瀹℃牳鐘舵�佷笉鑳戒负绌�", groups = {Add.class, Update.class})
+    @ApiModelProperty("瀹℃牳鐘舵��")
+    private String examineStatus;
+
+    @NotBlank(message = "鎿嶄綔浜哄憳绫诲瀷涓嶈兘涓虹┖", groups = {Add.class, Update.class})
+    @ApiModelProperty("鎿嶄綔浜哄憳绫诲瀷")
+    private String operatorType;
+
+    public static PriceChange getEntityByForm(@NonNull PriceChangeForm form, PriceChange entity) {
+        if(entity == null) {
+          entity = new PriceChange();
+        }
+        BeanUtils.copyProperties(form, entity);
+        return entity;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/CommissionRecordQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/CommissionRecordQuery.java
new file mode 100644
index 0000000..3ddb581
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/CommissionRecordQuery.java
@@ -0,0 +1,17 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 鎶芥垚璁板綍琛ㄦ煡璇�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Data
+@ApiModel(value = "CommissionRecord鏌ヨ鍙傛暟", description = "鎶芥垚璁板綍琛ㄦ煡璇㈠弬鏁�")
+public class CommissionRecordQuery extends AbsQuery {
+}
+
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/query/PriceChangeQuery.java b/framework/src/main/java/cn/lili/modules/lmk/domain/query/PriceChangeQuery.java
new file mode 100644
index 0000000..6616853
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/query/PriceChangeQuery.java
@@ -0,0 +1,17 @@
+package cn.lili.modules.lmk.domain.query;
+
+import cn.lili.base.AbsQuery;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 浠锋牸鍙樺姩琛ㄦ煡璇�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Data
+@ApiModel(value = "PriceChange鏌ヨ鍙傛暟", description = "浠锋牸鍙樺姩琛ㄦ煡璇㈠弬鏁�")
+public class PriceChangeQuery extends AbsQuery {
+}
+
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CommissionRecordVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CommissionRecordVO.java
new file mode 100644
index 0000000..149f1c5
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/CommissionRecordVO.java
@@ -0,0 +1,100 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import cn.lili.base.AbsVo;
+import cn.lili.modules.lmk.domain.entity.CommissionRecord;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.NonNull;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 鎶芥垚璁板綍琛ㄥ睍绀�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Data
+@ApiModel(value = "鎶芥垚璁板綍琛ㄥ搷搴旀暟鎹�", description = "鎶芥垚璁板綍琛ㄥ搷搴旀暟鎹�")
+public class CommissionRecordVO extends AbsVo {
+
+    /** 搴楅摵id */
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    /** 鍟嗗搧id */
+    @ApiModelProperty("鍟嗗搧id")
+    private Long goodsId;
+
+    /** skuId */
+    @ApiModelProperty("skuId")
+    private Long skuId;
+
+    /** 鍟嗗搧鍚嶇О */
+    @ApiModelProperty("鍟嗗搧鍚嶇О")
+    private String goodsName;
+
+    /** 鍟嗗搧鍥剧墖鍦板潃 */
+    @ApiModelProperty("鍟嗗搧鍥剧墖鍦板潃")
+    private String imgUrl;
+
+    /** 鍟嗗搧鍗曚环 */
+    @ApiModelProperty("鍟嗗搧鍗曚环")
+    private BigDecimal price;
+
+    /** 鍟嗗搧鏁伴噺 */
+    @ApiModelProperty("鍟嗗搧鏁伴噺")
+    private BigDecimal num;
+
+    /** 鍟嗗搧鎬讳环 */
+    @ApiModelProperty("鍟嗗搧鎬讳环")
+    private BigDecimal sumPrice;
+
+    /** 褰撳墠鎶芥垚姣斾緥 */
+    @ApiModelProperty("褰撳墠鎶芥垚姣斾緥")
+    private BigDecimal commission;
+
+    /** 骞冲彴鎶芥垚閲戦 */
+    @ApiModelProperty("骞冲彴鎶芥垚閲戦")
+    private BigDecimal commissionPrice;
+
+    /** 鎵i櫎骞冲彴鎶芥垚閲戦 */
+    @ApiModelProperty("鎵i櫎骞冲彴鎶芥垚閲戦")
+    private BigDecimal remainMoney;
+
+    /** 缁撶畻璁㈠崟鐘舵�� */
+    @ApiModelProperty("缁撶畻璁㈠崟鐘舵��")
+    private String settlementStatus;
+
+    /** 鍙互缁撶畻鏃堕棿 */
+    @ApiModelProperty("鍙互缁撶畻鏃堕棿")
+    private Date canSettlementTime;
+
+    /** 浜ゆ槗鍗曞彿 */
+    @ApiModelProperty("浜ゆ槗鍗曞彿")
+    private String tradeSn;
+
+    /** 瀛愯鍗曞彿 */
+    @ApiModelProperty("瀛愯鍗曞彿")
+    private String sn;
+
+    /** 鎶芥垚绫诲瀷锛堥��娆鹃��浣i噾锛� */
+    @ApiModelProperty("鎶芥垚绫诲瀷锛堥��娆鹃��浣i噾锛�")
+    private String type;
+
+    /** 鍚︾‘璁ゆ敹璐� */
+    @ApiModelProperty("鍚︾‘璁ゆ敹璐�")
+    private String deliveryStatus;
+
+    public static CommissionRecordVO getVoByEntity(@NonNull CommissionRecord entity, CommissionRecordVO vo) {
+        if(vo == null) {
+            vo = new CommissionRecordVO();
+        }
+        BeanUtils.copyProperties(entity, vo);
+        return vo;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PriceChangeVO.java b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PriceChangeVO.java
new file mode 100644
index 0000000..25836bc
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/domain/vo/PriceChangeVO.java
@@ -0,0 +1,75 @@
+package cn.lili.modules.lmk.domain.vo;
+
+import cn.lili.base.AbsVo;
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.beans.BeanUtils;
+import org.springframework.lang.NonNull;
+
+import java.math.BigDecimal;
+
+/**
+ * 浠锋牸鍙樺姩琛ㄥ睍绀�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Data
+@ApiModel(value = "浠锋牸鍙樺姩琛ㄥ搷搴旀暟鎹�", description = "浠锋牸鍙樺姩琛ㄥ搷搴旀暟鎹�")
+public class PriceChangeVO extends AbsVo {
+
+    /** 搴楅摵id */
+    @ApiModelProperty("搴楅摵id")
+    private Long storeId;
+
+    /** 鍟嗗搧id */
+    @ApiModelProperty("鍟嗗搧id")
+    private Long goodsId;
+
+    /** 鏈�灏忛攢鍞崟鍏僫d */
+    @ApiModelProperty("鏈�灏忛攢鍞崟鍏僫d")
+    private Long skuId;
+
+    /** 鍘熶环 */
+    @ApiModelProperty("鍘熶环")
+    private BigDecimal previousPrice;
+
+    /** 鐜颁环 */
+    @ApiModelProperty("鐜颁环")
+    private BigDecimal currentPrice;
+
+    /** 鍘熸娊鎴愭瘮渚� */
+    @ApiModelProperty("鍘熸娊鎴愭瘮渚�")
+    private BigDecimal previousCommission;
+
+    /** 鐜板湪鎶芥垚姣斾緥 */
+    @ApiModelProperty("鐜板湪鎶芥垚姣斾緥")
+    private BigDecimal currentCommission;
+
+    /** 鎿嶄綔浜哄憳濮撳悕 */
+    @ApiModelProperty("鎿嶄綔浜哄憳濮撳悕")
+    private String operatorName;
+
+    /** 鎿嶄綔浜哄憳id */
+    @ApiModelProperty("鎿嶄綔浜哄憳id")
+    private Long operatorId;
+
+    /** 瀹℃牳鐘舵�� */
+    @ApiModelProperty("瀹℃牳鐘舵��")
+    private String examineStatus;
+
+    /** 鎿嶄綔浜哄憳绫诲瀷 */
+    @ApiModelProperty("鎿嶄綔浜哄憳绫诲瀷")
+    private String operatorType;
+
+    public static PriceChangeVO getVoByEntity(@NonNull PriceChange entity, PriceChangeVO vo) {
+        if(vo == null) {
+            vo = new PriceChangeVO();
+        }
+        BeanUtils.copyProperties(entity, vo);
+        return vo;
+    }
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceAudioStatusEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceAudioStatusEnum.java
new file mode 100644
index 0000000..120c2ab
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceAudioStatusEnum.java
@@ -0,0 +1,29 @@
+package cn.lili.modules.lmk.enums.general;
+
+/**
+ * 鍟嗗搧浠锋牸鏀瑰姩璁板綍琛ㄥ鏍哥姸鎬�
+ *
+ * @author peng
+ * @since 2025-07-03 15:00
+ */
+public enum ChangePriceAudioStatusEnum {
+
+    /**
+     * 鍟嗗搧浠锋牸鏀瑰姩璁板綍琛ㄥ鏍哥姸鎬�
+     */
+    APPLY("鐢宠涓�"),
+    PASS("宸查�氳繃"),
+    REFUSE("宸叉嫆缁�");
+
+    private final String description;
+
+    ChangePriceAudioStatusEnum(String description) {
+        this.description = description;
+    }
+
+    public String description() {
+        return description;
+    }
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceOperationTypeEnum.java b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceOperationTypeEnum.java
new file mode 100644
index 0000000..5a83d4c
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/enums/general/ChangePriceOperationTypeEnum.java
@@ -0,0 +1,28 @@
+package cn.lili.modules.lmk.enums.general;
+
+/**
+ * 鍟嗗搧浠锋牸鏀瑰姩璁板綍琛ㄦ搷浣滀汉鍛樼被鍨�
+ *
+ * @author peng
+ * @since 2025-07-03 15:00
+ */
+public enum ChangePriceOperationTypeEnum {
+
+    /**
+     * 鍟嗗搧浠锋牸鏀瑰姩璁板綍琛ㄦ搷浣滀汉鍛樼被鍨�
+     */
+    PLATFORM("骞冲彴"),
+    STORE("鍟嗗");
+
+    private final String description;
+
+    ChangePriceOperationTypeEnum(String description) {
+        this.description = description;
+    }
+
+    public String description() {
+        return description;
+    }
+
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/CommissionRecordMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/CommissionRecordMapper.java
new file mode 100644
index 0000000..13d7f37
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/CommissionRecordMapper.java
@@ -0,0 +1,32 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.CommissionRecord;
+import cn.lili.modules.lmk.domain.query.CommissionRecordQuery;
+import cn.lili.modules.lmk.domain.vo.CommissionRecordVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 鎶芥垚璁板綍琛� Mapper 鎺ュ彛
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Mapper
+public interface CommissionRecordMapper extends BaseMapper<CommissionRecord> {
+
+    /**
+     * id鏌ユ壘鎶芥垚璁板綍琛�
+     * @param id
+     * @return
+     */
+    CommissionRecordVO getById(String id);
+
+    /**
+    *  鍒嗛〉
+    */
+    IPage getPage(IPage page, @Param("query") CommissionRecordQuery query);
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/mapper/PriceChangeMapper.java b/framework/src/main/java/cn/lili/modules/lmk/mapper/PriceChangeMapper.java
new file mode 100644
index 0000000..6a9d6d1
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/mapper/PriceChangeMapper.java
@@ -0,0 +1,32 @@
+package cn.lili.modules.lmk.mapper;
+
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import cn.lili.modules.lmk.domain.query.PriceChangeQuery;
+import cn.lili.modules.lmk.domain.vo.PriceChangeVO;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 浠锋牸鍙樺姩琛� Mapper 鎺ュ彛
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Mapper
+public interface PriceChangeMapper extends BaseMapper<PriceChange> {
+
+    /**
+     * id鏌ユ壘浠锋牸鍙樺姩琛�
+     * @param id
+     * @return
+     */
+    PriceChangeVO getById(String id);
+
+    /**
+    *  鍒嗛〉
+    */
+    IPage getPage(IPage page, @Param("query") PriceChangeQuery query);
+
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/CommissionRecordService.java b/framework/src/main/java/cn/lili/modules/lmk/service/CommissionRecordService.java
new file mode 100644
index 0000000..c9bca07
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/CommissionRecordService.java
@@ -0,0 +1,65 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.CommissionRecord;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.CommissionRecordForm;
+import cn.lili.modules.lmk.domain.query.CommissionRecordQuery;
+import java.util.List;
+
+/**
+ * 鎶芥垚璁板綍琛� 鏈嶅姟绫�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+public interface CommissionRecordService extends IService<CommissionRecord> {
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    Result add(CommissionRecordForm form);
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    Result update(CommissionRecordForm form);
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    Result remove(List<String> ids);
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    Result removeById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    Result page(CommissionRecordQuery query);
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    Result detail(String id);
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    Result all();
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/PriceChangeService.java b/framework/src/main/java/cn/lili/modules/lmk/service/PriceChangeService.java
new file mode 100644
index 0000000..22c0962
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/PriceChangeService.java
@@ -0,0 +1,65 @@
+package cn.lili.modules.lmk.service;
+
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.lili.base.Result;
+import cn.lili.modules.lmk.domain.form.PriceChangeForm;
+import cn.lili.modules.lmk.domain.query.PriceChangeQuery;
+import java.util.List;
+
+/**
+ * 浠锋牸鍙樺姩琛� 鏈嶅姟绫�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+public interface PriceChangeService extends IService<PriceChange> {
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    Result add(PriceChangeForm form);
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    Result update(PriceChangeForm form);
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    Result remove(List<String> ids);
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    Result removeById(String id);
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    Result page(PriceChangeQuery query);
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    Result detail(String id);
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    Result all();
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/CommissionRecordServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/CommissionRecordServiceImpl.java
new file mode 100644
index 0000000..ceefc10
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/CommissionRecordServiceImpl.java
@@ -0,0 +1,119 @@
+package cn.lili.modules.lmk.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.lili.modules.lmk.domain.entity.CommissionRecord;
+import cn.lili.modules.lmk.mapper.CommissionRecordMapper;
+import cn.lili.modules.lmk.service.CommissionRecordService;
+import cn.lili.base.Result;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.lili.modules.lmk.domain.form.CommissionRecordForm;
+import cn.lili.modules.lmk.domain.vo.CommissionRecordVO;
+import cn.lili.modules.lmk.domain.query.CommissionRecordQuery;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import cn.lili.utils.PageUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.Assert;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鎶芥垚璁板綍琛� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author peng
+ * @since 2025-07-04
+ */
+@Service
+@RequiredArgsConstructor
+public class CommissionRecordServiceImpl extends ServiceImpl<CommissionRecordMapper, CommissionRecord> implements CommissionRecordService {
+
+    private final CommissionRecordMapper commissionRecordMapper;
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    @Override
+    public Result add(CommissionRecordForm form) {
+        CommissionRecord entity = CommissionRecordForm.getEntityByForm(form, null);
+        baseMapper.insert(entity);
+        return Result.ok("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    @Override
+    public Result update(CommissionRecordForm form) {
+        CommissionRecord entity = baseMapper.selectById(form.getId());
+
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        BeanUtils.copyProperties(form, entity);
+        baseMapper.updateById(entity);
+        return Result.ok("淇敼鎴愬姛");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @Override
+    public Result remove(List<String> ids) {
+        baseMapper.deleteBatchIds(ids);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @Override
+    public Result removeById(String id) {
+        baseMapper.deleteById(id);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result page(CommissionRecordQuery query) {
+        IPage<CommissionRecordVO> page = PageUtil.getPage(query, CommissionRecordVO.class);
+        baseMapper.getPage(page, query);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    @Override
+    public Result detail(String id) {
+        CommissionRecordVO vo = baseMapper.getById(id);
+        Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
+        return Result.ok().data(vo);
+    }
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    @Override
+    public Result all() {
+        List<CommissionRecord> entities = baseMapper.selectList(null);
+        List<CommissionRecordVO> vos = entities.stream()
+                .map(entity -> CommissionRecordVO.getVoByEntity(entity, null))
+                .collect(Collectors.toList());
+        return Result.ok().data(vos);
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/lmk/service/impl/PriceChangeServiceImpl.java b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PriceChangeServiceImpl.java
new file mode 100644
index 0000000..981ec78
--- /dev/null
+++ b/framework/src/main/java/cn/lili/modules/lmk/service/impl/PriceChangeServiceImpl.java
@@ -0,0 +1,119 @@
+package cn.lili.modules.lmk.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.lili.modules.lmk.domain.entity.PriceChange;
+import cn.lili.modules.lmk.mapper.PriceChangeMapper;
+import cn.lili.modules.lmk.service.PriceChangeService;
+import cn.lili.base.Result;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.lili.modules.lmk.domain.form.PriceChangeForm;
+import cn.lili.modules.lmk.domain.vo.PriceChangeVO;
+import cn.lili.modules.lmk.domain.query.PriceChangeQuery;
+import org.springframework.stereotype.Service;
+import lombok.RequiredArgsConstructor;
+import cn.lili.utils.PageUtil;
+import org.springframework.beans.BeanUtils;
+import org.springframework.util.Assert;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 浠锋牸鍙樺姩琛� 鏈嶅姟瀹炵幇绫�
+ *
+ * @author peng
+ * @since 2025-07-03
+ */
+@Service
+@RequiredArgsConstructor
+public class PriceChangeServiceImpl extends ServiceImpl<PriceChangeMapper, PriceChange> implements PriceChangeService {
+
+    private final PriceChangeMapper priceChangeMapper;
+
+    /**
+     * 娣诲姞
+     * @param form
+     * @return
+     */
+    @Override
+    public Result add(PriceChangeForm form) {
+        PriceChange entity = PriceChangeForm.getEntityByForm(form, null);
+        baseMapper.insert(entity);
+        return Result.ok("娣诲姞鎴愬姛");
+    }
+
+    /**
+     * 淇敼
+     * @param form
+     * @return
+     */
+    @Override
+    public Result update(PriceChangeForm form) {
+        PriceChange entity = baseMapper.selectById(form.getId());
+
+        // 涓虹┖鎶汭llegalArgumentException锛屽仛鍏ㄥ眬寮傚父澶勭悊
+        Assert.notNull(entity, "璁板綍涓嶅瓨鍦�");
+        BeanUtils.copyProperties(form, entity);
+        baseMapper.updateById(entity);
+        return Result.ok("淇敼鎴愬姛");
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎
+     * @param ids
+     * @return
+     */
+    @Override
+    public Result remove(List<String> ids) {
+        baseMapper.deleteBatchIds(ids);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * id鍒犻櫎
+     * @param id
+     * @return
+     */
+    @Override
+    public Result removeById(String id) {
+        baseMapper.deleteById(id);
+        return Result.ok("鍒犻櫎鎴愬姛");
+    }
+
+    /**
+     * 鍒嗛〉鏌ヨ
+     * @param query
+     * @return
+     */
+    @Override
+    public Result page(PriceChangeQuery query) {
+        IPage<PriceChangeVO> page = PageUtil.getPage(query, PriceChangeVO.class);
+        baseMapper.getPage(page, query);
+        return Result.ok().data(page.getRecords()).total(page.getTotal());
+    }
+
+    /**
+     * 鏍规嵁id鏌ユ壘
+     * @param id
+     * @return
+     */
+    @Override
+    public Result detail(String id) {
+        PriceChangeVO vo = baseMapper.getById(id);
+        Assert.notNull(vo, "璁板綍涓嶅瓨鍦�");
+        return Result.ok().data(vo);
+    }
+
+    /**
+     * 鍒楄〃
+     * @return
+     */
+    @Override
+    public Result all() {
+        List<PriceChange> entities = baseMapper.selectList(null);
+        List<PriceChangeVO> vos = entities.stream()
+                .map(entity -> PriceChangeVO.getVoByEntity(entity, null))
+                .collect(Collectors.toList());
+        return Result.ok().data(vos);
+    }
+}
diff --git a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java
index 8d35dba..d2f95b9 100644
--- a/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java
+++ b/framework/src/main/java/cn/lili/modules/order/cart/render/impl/CommissionRender.java
@@ -1,11 +1,12 @@
 package cn.lili.modules.order.cart.render.impl;
 
-import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import cn.lili.common.enums.PromotionTypeEnum;
 import cn.lili.common.utils.CurrencyUtil;
+import cn.lili.modules.goods.entity.dos.Goods;
 import cn.lili.modules.goods.service.CategoryService;
+import cn.lili.modules.goods.service.GoodsService;
 import cn.lili.modules.order.cart.entity.dto.TradeDTO;
 import cn.lili.modules.order.cart.entity.enums.CartTypeEnum;
 import cn.lili.modules.order.cart.entity.enums.RenderStepEnums;
@@ -38,6 +39,8 @@
     @Autowired
     private CategoryService categoryService;
 
+    @Autowired
+    private GoodsService goodsService;
     @Override
     public RenderStepEnums step() {
         return RenderStepEnums.PLATFORM_COMMISSION;
@@ -64,11 +67,17 @@
 
                 PriceDetailDTO priceDetailDTO = cartSkuVO.getPriceDetailDTO();
                 //骞冲彴浣i噾鏍规嵁鍒嗙被璁$畻
-                String categoryId = cartSkuVO.getGoodsSku().getCategoryPath()
-                        .substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1);
-                if (CharSequenceUtil.isNotEmpty(categoryId)) {
-                    Double commissionRate = categoryService.getCategoryById(categoryId).getCommissionRate();
-                    priceDetailDTO.setPlatFormCommissionPoint(commissionRate);
+                //鏍规嵁鍟嗗搧鎶芥垚杩涜璁$畻浣i噾
+                String goodsId = cartSkuVO.getGoodsSku().getGoodsId();
+                Goods goods = goodsService.getById(goodsId);
+//                String categoryId = cartSkuVO.getGoodsSku().getCategoryPath()
+//                        .substring(cartSkuVO.getGoodsSku().getCategoryPath().lastIndexOf(",") + 1);
+//                if (CharSequenceUtil.isNotEmpty(categoryId)) {
+//                    Double commissionRate = categoryService.getCategoryById(categoryId).getCommissionRate();
+//                    priceDetailDTO.setPlatFormCommissionPoint(commissionRate);
+//                }
+                if (goods != null&&goods.getCommission()!=null) {
+                    priceDetailDTO.setPlatFormCommissionPoint(Double.valueOf(goods.getCommission().toString()));
                 }
 
                 //濡傛灉绉垎璁㈠崟 绉垎璁㈠崟锛屽崟鐙搷浣滆鍗曠粨绠楅噾棰濆拰鍟嗗缁撶畻瀛楁
diff --git a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java
index dd0e187..28e4ffe 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/entity/dos/OrderItem.java
@@ -22,6 +22,7 @@
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import java.math.BigDecimal;
 import java.util.stream.Collectors;
 
 /**
@@ -129,6 +130,9 @@
     @ApiModelProperty(value = "宸插彂璐ф暟閲�")
     private Integer deliverNumber;
 
+    @ApiModelProperty(value = "鎶芥垚姣斾緥")
+    private BigDecimal commission;
+    
     public Integer getDeliverNumber() {
         if(deliverNumber == null){
             return 0;
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
index dc4a066..afcc338 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -5,7 +5,6 @@
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.text.CharSequenceUtil;
-import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
 import cn.hutool.poi.excel.ExcelReader;
@@ -205,6 +204,12 @@
                     UserContext.getCurrentUser().getUsername(), message));
             item.getCheckedSkuList().forEach(
                     sku -> {
+//                        OrderItem e = new OrderItem(sku, item, tradeDTO);
+//                        String goodsId = e.getGoodsId();
+//                        Goods goods = goodsService.getById(goodsId);
+//                        item.getPriceDetailDTO().setPlatFormCommissionPoint(Double.valueOf(goods.getCommission().toString()));
+//                        e.setPriceDetailDTO(item.getPriceDetailDTO());
+//                        orderItems.add(e);
                         orderItems.add(new OrderItem(sku, item, tradeDTO));
                         currentOrderItems.add(new OrderItem(sku, item, tradeDTO));
                     }
@@ -454,7 +459,25 @@
 
         //璁板綍搴楅摵璁㈠崟鏀粯娴佹按
         storeFlowService.payOrder(orderSn);
-
+        //todo 鐢熸垚璁㈠崟璁板綍琛�
+//        //鑾峰彇瀛愯鍗曟暟鎹�
+//        List<OrderItem> orderItems = orderItemService.getByOrderSn(orderSn);
+//        List<String> goodsIds = orderItems.stream().map(OrderItem::getGoodsId).distinct().collect(Collectors.toList());
+//
+//        Map<String, OrderItem> orderItem = orderItems.stream()
+//                .collect(Collectors.toMap(OrderItem::getGoodsId, Function.identity()
+//                        ,(oldValue, newValue) -> oldValue));
+//        //鏍规嵁璁㈠崟item椤瑰垱寤烘娊鎴愭祦姘磋鍗�
+//        List<CommissionRecord> commissionRecords = new ArrayList<>();
+//        CommissionRecord commissionRecord;
+//        for (OrderItem item : orderItems) {
+//            commissionRecord = new CommissionRecord();
+//            commissionRecord.setSn(item.getSn());
+//            BigDecimal commission = item.getCommission();
+//            commissionRecord.setCommission(commission);
+//            commissionRecord.setCommissionPrice();
+//
+//        }
         //鍙戦�佽鍗曞凡浠樻娑堟伅
         OrderMessage orderMessage = new OrderMessage();
         orderMessage.setOrderSn(order.getSn());
diff --git a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java
index ae91f6b..daf4a78 100644
--- a/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java
+++ b/framework/src/main/java/cn/lili/modules/order/order/serviceimpl/StoreFlowServiceImpl.java
@@ -26,7 +26,6 @@
 import cn.lili.modules.store.entity.vos.StoreFlowPayDownloadVO;
 import cn.lili.modules.store.entity.vos.StoreFlowRefundDownloadVO;
 import cn.lili.modules.store.service.BillService;
-import cn.lili.modules.system.entity.dto.payment.WechatPaymentSetting;
 import cn.lili.mybatis.util.PageUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
diff --git a/framework/src/main/resources/mapper/lmk/CommissionRecordMapper.xml b/framework/src/main/resources/mapper/lmk/CommissionRecordMapper.xml
new file mode 100644
index 0000000..8296ca6
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/CommissionRecordMapper.xml
@@ -0,0 +1,86 @@
+<?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="cn.lili.modules.lmk.mapper.CommissionRecordMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.CommissionRecordVO">
+        <id column="id" property="id"/>
+        <result column="store_id" property="storeId" />
+        <result column="goods_id" property="goodsId" />
+        <result column="sku_id" property="skuId" />
+        <result column="goods_name" property="goodsName" />
+        <result column="img_url" property="imgUrl" />
+        <result column="price" property="price" />
+        <result column="num" property="num" />
+        <result column="sum_price" property="sumPrice" />
+        <result column="commission" property="commission" />
+        <result column="commission_price" property="commissionPrice" />
+        <result column="remain_money" property="remainMoney" />
+        <result column="settlement_status" property="settlementStatus" />
+        <result column="can_settlement_time" property="canSettlementTime" />
+        <result column="trade_sn" property="tradeSn" />
+        <result column="sn" property="sn" />
+        <result column="type" property="type" />
+        <result column="delivery_status" property="deliveryStatus" />
+    </resultMap>
+
+
+
+
+
+
+
+    <select id="getById" resultMap="BaseResultMap">
+        SELECT
+            LCR.store_id,
+            LCR.goods_id,
+            LCR.sku_id,
+            LCR.goods_name,
+            LCR.img_url,
+            LCR.price,
+            LCR.num,
+            LCR.sum_price,
+            LCR.commission,
+            LCR.commission_price,
+            LCR.remain_money,
+            LCR.settlement_status,
+            LCR.can_settlement_time,
+            LCR.trade_sn,
+            LCR.sn,
+            LCR.type,
+            LCR.delivery_status,
+            LCR.id
+        FROM
+            lmk_commission_record LCR
+        WHERE
+            LCR.id = #{id} AND LCR.delete_flag = 0
+    </select>
+
+
+    <select id="getPage" resultMap="BaseResultMap">
+        SELECT
+            LCR.store_id,
+            LCR.goods_id,
+            LCR.sku_id,
+            LCR.goods_name,
+            LCR.img_url,
+            LCR.price,
+            LCR.num,
+            LCR.sum_price,
+            LCR.commission,
+            LCR.commission_price,
+            LCR.remain_money,
+            LCR.settlement_status,
+            LCR.can_settlement_time,
+            LCR.trade_sn,
+            LCR.sn,
+            LCR.type,
+            LCR.delivery_status,
+            LCR.id
+        FROM
+            lmk_commission_record LCR
+        WHERE
+            LCR.delete_flag = 0
+    </select>
+
+</mapper>
diff --git a/framework/src/main/resources/mapper/lmk/PriceChangeMapper.xml b/framework/src/main/resources/mapper/lmk/PriceChangeMapper.xml
new file mode 100644
index 0000000..740ead2
--- /dev/null
+++ b/framework/src/main/resources/mapper/lmk/PriceChangeMapper.xml
@@ -0,0 +1,68 @@
+<?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="cn.lili.modules.lmk.mapper.PriceChangeMapper">
+
+    <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+    <resultMap id="BaseResultMap" type="cn.lili.modules.lmk.domain.vo.PriceChangeVO">
+        <id column="id" property="id"/>
+        <result column="store_id" property="storeId" />
+        <result column="goods_id" property="goodsId" />
+        <result column="sku_id" property="skuId" />
+        <result column="previous_price" property="previousPrice" />
+        <result column="current_price" property="currentPrice" />
+        <result column="previous_commission" property="previousCommission" />
+        <result column="current_commission" property="currentCommission" />
+        <result column="operator_name" property="operatorName" />
+        <result column="operator_id" property="operatorId" />
+        <result column="examine_status" property="examineStatus" />
+        <result column="operator_type" property="operatorType" />
+    </resultMap>
+
+
+
+
+
+
+
+    <select id="getById" resultMap="BaseResultMap">
+        SELECT
+            LPC.store_id,
+            LPC.goods_id,
+            LPC.sku_id,
+            LPC.previous_price,
+            LPC.current_price,
+            LPC.previous_commission,
+            LPC.current_commission,
+            LPC.operator_name,
+            LPC.operator_id,
+            LPC.examine_status,
+            LPC.operator_type,
+            LPC.id
+        FROM
+            lmk_price_change LPC
+        WHERE
+            LPC.id = #{id} AND LPC.delete_flag = 0
+    </select>
+
+
+    <select id="getPage" resultMap="BaseResultMap">
+        SELECT
+            LPC.store_id,
+            LPC.goods_id,
+            LPC.sku_id,
+            LPC.previous_price,
+            LPC.current_price,
+            LPC.previous_commission,
+            LPC.current_commission,
+            LPC.operator_name,
+            LPC.operator_id,
+            LPC.examine_status,
+            LPC.operator_type,
+            LPC.id
+        FROM
+            lmk_price_change LPC
+        WHERE
+            LPC.delete_flag = 0
+    </select>
+
+</mapper>
diff --git a/lmk-job/src/main/java/cn/lili/handler/EveryDayExecute.java b/lmk-job/src/main/java/cn/lili/handler/EveryDayExecute.java
new file mode 100644
index 0000000..8f17e5d
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/EveryDayExecute.java
@@ -0,0 +1,18 @@
+package cn.lili.handler;
+
+/**
+ * 姣忔棩浠诲姟
+ * 姣忔棩鍑屾櫒1鐐规墽琛�
+ *
+ * @author Chopper
+ * @since 2020/12/24 11:52
+ */
+public interface EveryDayExecute {
+
+    /**
+     * 鎵ц姣忔棩浠诲姟
+     */
+    void execute();
+
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/EveryHourExecute.java b/lmk-job/src/main/java/cn/lili/handler/EveryHourExecute.java
new file mode 100644
index 0000000..1cc031f
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/EveryHourExecute.java
@@ -0,0 +1,17 @@
+package cn.lili.handler;
+
+/**
+ * 姣忓皬鏃朵换鍔�
+ *
+ * @author Chopper
+ * @since 2020/12/24 11:52
+ */
+public interface EveryHourExecute {
+
+    /**
+     * 鎵ц
+     */
+    void execute();
+
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/EveryMinuteExecute.java b/lmk-job/src/main/java/cn/lili/handler/EveryMinuteExecute.java
new file mode 100644
index 0000000..a312dd9
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/EveryMinuteExecute.java
@@ -0,0 +1,17 @@
+package cn.lili.handler;
+
+/**
+ * 姣忓垎閽熶换鍔�
+ *
+ * @author Chopper
+ * @since 2020/12/24 11:52
+ */
+public interface EveryMinuteExecute {
+
+    /**
+     * 鎵ц
+     */
+    void execute();
+
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/broadcast/BroadcastExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/broadcast/BroadcastExecute.java
new file mode 100644
index 0000000..f2c5c1c
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/broadcast/BroadcastExecute.java
@@ -0,0 +1,25 @@
+package cn.lili.handler.impl.broadcast;
+
+import cn.lili.handler.EveryHourExecute;
+import cn.lili.modules.goods.service.CommodityService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 灏忕▼搴忕洿鎾姸鎬佽幏鍙�
+ *
+ * @author Bulbasaur
+ * @since 2021/5/20 2:52 涓嬪崍
+ */
+@Component
+public class BroadcastExecute implements EveryHourExecute {
+
+    @Autowired
+    private CommodityService commodityService;
+
+    @Override
+    public void execute() {
+        //鍚屾鐩存挱鍟嗗搧鐘舵��
+        commodityService.getGoodsWareHouse();
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/coupon/CouponExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/coupon/CouponExecute.java
new file mode 100644
index 0000000..b6ef48d
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/coupon/CouponExecute.java
@@ -0,0 +1,55 @@
+package cn.lili.handler.impl.coupon;
+
+import cn.lili.modules.promotion.entity.dos.MemberCoupon;
+import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
+import cn.lili.modules.promotion.service.MemberCouponService;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 浼樻儬鍒哥姸鎬佺洃娴�
+ *
+ * @author Bulbasaur
+ * @since 2021/5/24 10:08 涓婂崍
+ */
+@Component
+public class CouponExecute implements EveryDayExecute {
+
+    /**
+     * 杩囨湡甯搁噺锛岃繃鏈熷悗鎴栬�呬娇鐢ㄥ悗涓�瀹氭椂闂村唴锛屽垹闄ゆ棤鏁堢殑浼樻儬鍒革紝鐗╃悊鍒犻櫎
+     */
+    static final int EXPIRATION_DAY = 3;
+
+    @Autowired
+    private MemberCouponService memberCouponService;
+
+    /**
+     * 妫�娴嬩紭鎯犲埜鐨勪娇鐢ㄦ椂闂达紝瓒呮湡鏈娇鐢ㄥ垯澶辨晥
+     * 姝ゆ柟娉曠敤浜庨鍙�*澶╁悗澶辨晥浼樻儬鍒镐娇鐢�
+     */
+    @Override
+    public void execute() {
+        //灏嗚繃鏈熶紭鎯犲埜鍙樻洿涓鸿繃鏈熺姸鎬�
+        LambdaUpdateWrapper<MemberCoupon> updateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
+                .eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
+                .le(MemberCoupon::getEndTime, new Date())
+                .set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
+        this.memberCouponService.update(updateWrapper);
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - EXPIRATION_DAY);
+        Date removeTime = calendar.getTime();
+        //鍒犻櫎杩囨湡/宸蹭娇鐢ㄧ殑浼樻儬鍒�
+        LambdaUpdateWrapper<MemberCoupon> deleteWrapper = new LambdaUpdateWrapper<MemberCoupon>()
+                //濡傛灉缁撴潫鏃堕棿灏忎簬 褰撳墠鏃堕棿澧炲姞鎸囧畾鍒犻櫎鏃ユ湡锛屽垯鍒犻櫎
+                .le(MemberCoupon::getEndTime, removeTime);
+        this.memberCouponService.remove(deleteWrapper);
+
+
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/goods/GoodsExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/goods/GoodsExecute.java
new file mode 100644
index 0000000..6e57aeb
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/goods/GoodsExecute.java
@@ -0,0 +1,48 @@
+package cn.lili.handler.impl.goods;
+
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.goods.service.GoodsService;
+import cn.lili.modules.member.service.MemberEvaluationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 鍟嗗搧瀹氭椂鍣�
+ *
+ * @author Chopper
+ * @since 2021/3/18 3:23 涓嬪崍
+ */
+@Component
+public class GoodsExecute implements EveryDayExecute {
+    /**
+     * 浼氬憳璇勪环
+     */
+    @Autowired
+    private MemberEvaluationService memberEvaluationService;
+    /**
+     * 鍟嗗搧
+     */
+    @Autowired
+    private GoodsService goodsService;
+
+    /**
+     * 鏌ヨ宸蹭笂鏋剁殑鍟嗗搧鐨勮瘎浠锋暟閲忓苟璧嬪��
+     */
+    @Override
+    public void execute() {
+
+        //鏌ヨ涓婃缁熻鍒版湰娆$殑璇勪环鏁伴噺
+        List<Map<String, Object>> list = memberEvaluationService.memberEvaluationNum(DateUtil.yesterday(), new DateTime());
+
+        for (Map<String, Object> map : list) {
+            goodsService.addGoodsCommentNum(Convert.toInt(map.get("num").toString()), map.get("goods_id").toString());
+        }
+
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java
new file mode 100644
index 0000000..f299b93
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/hotwords/HotWordsEveryDayTaskExecute.java
@@ -0,0 +1,86 @@
+package cn.lili.handler.impl.hotwords;
+
+import cn.hutool.json.JSONUtil;
+import cn.lili.cache.Cache;
+import cn.lili.cache.CachePrefix;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.search.entity.dos.HotWordsHistory;
+import cn.lili.modules.search.service.HotWordsHistoryService;
+import cn.lili.modules.system.entity.dos.Setting;
+import cn.lili.modules.system.entity.dto.HotWordsSetting;
+import cn.lili.modules.system.entity.dto.HotWordsSettingItem;
+import cn.lili.modules.system.entity.enums.SettingEnum;
+import cn.lili.modules.system.service.SettingService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.DefaultTypedTuple;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author paulG
+ * @since 2021/3/11
+ **/
+@Slf4j
+@Component
+public class HotWordsEveryDayTaskExecute implements EveryDayExecute {
+
+    @Autowired
+    private Cache cache;
+
+    @Autowired
+    private HotWordsHistoryService hotWordsHistoryService;
+    @Autowired
+    private SettingService settingService;
+
+    /**
+     * 鎵ц姣忔棩浠诲姟
+     */
+    @Override
+    public void execute() {
+        //鑾峰彇澶т簬0鍒嗙殑鐑瘝
+        Set<DefaultTypedTuple> tuples = cache.zRangeByScore(CachePrefix.HOT_WORD.getPrefix(), 1, Integer.MAX_VALUE);
+        //濡傛灉浠诲姟涓嶄负绌�
+        if (!CollectionUtils.isEmpty(tuples)) {
+
+            //鍥犱负鏄浜屽ぉ缁熻绗竴澶╃殑鏁版嵁锛屾墍浠ヨ繖閲岃幏鍙栨槰澶╁噷鏅ㄧ殑鏃堕棿
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 0);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) - 1);
+
+            //鎵归噺淇濆瓨鐑瘝
+            List<HotWordsHistory> hotWordsHistories = new ArrayList<>();
+            for (DefaultTypedTuple tuple : tuples) {
+                String keywords = (String) tuple.getValue();
+                Double score = tuple.getScore();
+                hotWordsHistories.add(new HotWordsHistory(keywords, score.intValue(), calendar.getTime()));
+            }
+
+            hotWordsHistoryService.saveBatch(hotWordsHistories);
+        }
+        //绉婚櫎鏄ㄦ棩鐨勭儹鎼滆瘝
+        cache.remove(CachePrefix.HOT_WORD.getPrefix());
+
+        //璁剧疆浠婃棩榛樿鐑瘝
+        Setting setting = settingService.get(SettingEnum.HOT_WORDS.name());
+        if (setting == null) {
+            return;
+        }
+        HotWordsSetting hotWordsSetting = JSONUtil.toBean(setting.getSettingValue(), HotWordsSetting.class);
+        List<HotWordsSettingItem> hotWordsSettingItems = hotWordsSetting.getHotWordsSettingItems();
+        if (hotWordsSettingItems != null && !hotWordsSettingItems.isEmpty()) {
+            for (HotWordsSettingItem hotWordsSettingItem : hotWordsSettingItems) {
+                cache.zAdd(CachePrefix.HOT_WORD.getPrefix(), hotWordsSettingItem.getScore(), hotWordsSettingItem.getKeywords());
+            }
+        }
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/order/CancelOrderTaskExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/order/CancelOrderTaskExecute.java
new file mode 100644
index 0000000..371147f
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/order/CancelOrderTaskExecute.java
@@ -0,0 +1,61 @@
+package cn.lili.handler.impl.order;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import cn.lili.handler.EveryMinuteExecute;
+import cn.lili.modules.order.order.entity.dos.Order;
+import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
+import cn.lili.modules.order.order.service.OrderService;
+import cn.lili.modules.system.entity.dos.Setting;
+import cn.lili.modules.system.entity.dto.OrderSetting;
+import cn.lili.modules.system.entity.enums.SettingEnum;
+import cn.lili.modules.system.service.SettingService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 璁㈠崟鑷姩鍙栨秷锛堟瘡鍒嗛挓鎵ц锛�
+ *
+ * @author paulG
+ * @since 2021/3/11
+ **/
+@Slf4j
+@Component
+public class CancelOrderTaskExecute implements EveryMinuteExecute {
+    /**
+     * 璁㈠崟
+     */
+    @Autowired
+    private OrderService orderService;
+    /**
+     * 璁剧疆
+     */
+    @Autowired
+    private SettingService settingService;
+
+
+    @Override
+    public void execute() {
+        Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name());
+        OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class);
+        if (orderSetting != null && orderSetting.getAutoCancel() != null) {
+            //璁㈠崟鑷姩鍙栨秷鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍙栨秷鏃堕棿鍒嗛挓鏁�
+            DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel());
+            LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.UNPAID.name());
+            //璁㈠崟鍒涘缓鏃堕棿 <= 璁㈠崟鑷姩鍙栨秷鏃堕棿
+            queryWrapper.le(Order::getCreateTime, cancelTime);
+            List<Order> list = orderService.list(queryWrapper);
+            List<String> cancelSnList = list.stream().map(Order::getSn).collect(Collectors.toList());
+            for (String sn : cancelSnList) {
+                orderService.systemCancel(sn, "瓒呮椂鏈敮浠樿嚜鍔ㄥ彇娑�",false);
+            }
+        }
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/order/OrderEveryDayTaskExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/order/OrderEveryDayTaskExecute.java
new file mode 100644
index 0000000..40a1d6b
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/order/OrderEveryDayTaskExecute.java
@@ -0,0 +1,287 @@
+package cn.lili.handler.impl.order;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import cn.lili.common.enums.ResultCode;
+import cn.lili.common.exception.ServiceException;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.distribution.service.DistributionOrderService;
+import cn.lili.modules.member.entity.dto.MemberEvaluationDTO;
+import cn.lili.modules.member.entity.enums.EvaluationGradeEnum;
+import cn.lili.modules.member.service.MemberEvaluationService;
+import cn.lili.modules.order.order.entity.dos.Order;
+import cn.lili.modules.order.order.entity.dos.OrderItem;
+import cn.lili.modules.order.order.entity.dto.OrderItemOperationDTO;
+import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
+import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
+import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
+import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
+import cn.lili.modules.order.order.service.OrderItemService;
+import cn.lili.modules.order.order.service.OrderService;
+import cn.lili.modules.order.order.service.StoreFlowService;
+import cn.lili.modules.store.entity.dto.StoreSettlementDay;
+import cn.lili.modules.store.service.BillService;
+import cn.lili.modules.store.service.StoreDetailService;
+import cn.lili.modules.system.entity.dos.Setting;
+import cn.lili.modules.system.entity.dto.OrderSetting;
+import cn.lili.modules.system.entity.enums.SettingEnum;
+import cn.lili.modules.system.service.SettingService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author paulG
+ * @since 2021/3/11
+ **/
+@Slf4j
+@Component
+
+public class OrderEveryDayTaskExecute implements EveryDayExecute {
+
+    /**
+     * 璁㈠崟
+     */
+    @Autowired
+    private OrderService orderService;
+    /**
+     * 璁㈠崟璐х墿
+     */
+    @Autowired
+    private OrderItemService orderItemService;
+    /**
+     * 璁剧疆
+     */
+    @Autowired
+    private SettingService settingService;
+    /**
+     * 浼氬憳璇勪环
+     */
+    @Autowired
+    private MemberEvaluationService memberEvaluationService;
+
+    @Autowired
+    private DistributionOrderService distributionOrderService;
+
+    @Autowired
+    private StoreFlowService storeFlowService;
+
+    /**
+     * 缁撶畻鍗�
+     */
+    @Autowired
+    private BillService billService;
+    /**
+     * 搴楅摵璇︽儏
+     */
+    @Autowired
+    private StoreDetailService storeDetailService;
+
+    /**
+     * 鎵ц姣忔棩浠诲姟
+     */
+    @Override
+    public void execute() {
+
+        Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name());
+        //璁㈠崟璁剧疆
+        OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class);
+        if (orderSetting == null) {
+            throw new ServiceException(ResultCode.ORDER_SETTING_ERROR);
+        }
+
+        try {
+            //鑷姩纭鏀惰揣
+            completedOrder(orderSetting);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        try {
+            //鑷姩濂借瘎
+            memberEvaluation(orderSetting);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        try {
+            //鍏抽棴鍏佽鍞悗鐢宠
+            this.closeAfterSale(orderSetting);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        try {
+            //鍏抽棴鍏佽鎶曡瘔
+            closeComplaint(orderSetting);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+
+        //淇敼鍒嗚处鐘舵��
+        try {
+            storeFlowService.updateProfitSharingStatus();
+        } catch (Exception e) {
+            log.error("淇敼鍒嗚处鐘舵�佸け璐�", e);
+        }
+
+        //鐢熸垚搴楅摵缁撶畻鍗�
+        try {
+            createBill();
+        } catch (Exception e) {
+            log.error("鐢熸垚搴楅摵缁撶畻鍗�", e);
+        }
+
+
+    }
+
+    /**
+     * 鑷姩纭鏀惰幏锛岃鍗曞畬鎴�
+     *
+     * @param orderSetting 璁㈠崟璁剧疆
+     */
+    private void completedOrder(OrderSetting orderSetting) {
+
+        //璁㈠崟鑷姩鏀惰揣鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鏀惰揣鏃堕棿澶╂暟
+        DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoReceive());
+        LambdaQueryWrapper<Order> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(Order::getOrderStatus, OrderStatusEnum.DELIVERED.name());
+
+        //璁㈠崟鍙戣揣鏃堕棿 >= 璁㈠崟鑷姩鏀惰揣鏃堕棿
+        queryWrapper.le(Order::getLogisticsTime, receiveTime);
+        List<Order> list = orderService.list(queryWrapper);
+
+        try {
+            //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛岃繘琛岃鍗曞畬鎴愬鐞�
+            if (!list.isEmpty()) {
+                List<String> receiveSnList = list.stream().map(Order::getSn).collect(Collectors.toList());
+                for (String orderSn : receiveSnList) {
+                    orderService.systemComplete(orderSn);
+                }
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+    }
+
+    /**
+     * 鑷姩濂借瘎
+     *
+     * @param orderSetting 璁㈠崟璁剧疆
+     */
+    private void memberEvaluation(OrderSetting orderSetting) {
+        //璁㈠崟鑷姩鏀惰揣鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鏀惰揣鏃堕棿澶╂暟
+        DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getAutoEvaluation());
+
+        //璁㈠崟瀹屾垚鏃堕棿 <= 璁㈠崟鑷姩濂借瘎鏃堕棿
+        OrderItemOperationDTO orderItemOperationDTO =
+            OrderItemOperationDTO.builder().receiveTime(receiveTime).commentStatus(CommentStatusEnum.UNFINISHED.name())
+                .build();
+        List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(orderItemOperationDTO);
+
+        //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛岃繘琛岃嚜鍔ㄨ瘎浠峰鐞�
+        if (!orderItems.isEmpty()) {
+            for (OrderItem orderItem : orderItems) {
+                MemberEvaluationDTO memberEvaluationDTO = new MemberEvaluationDTO();
+                memberEvaluationDTO.setOrderItemSn(orderItem.getSn());
+                memberEvaluationDTO.setContent("绯荤粺榛樿濂借瘎");
+                memberEvaluationDTO.setGoodsId(orderItem.getGoodsId());
+                memberEvaluationDTO.setSkuId(orderItem.getSkuId());
+                memberEvaluationDTO.setGrade(EvaluationGradeEnum.GOOD.name());
+                memberEvaluationDTO.setDeliveryScore(5);
+                memberEvaluationDTO.setDescriptionScore(5);
+                memberEvaluationDTO.setServiceScore(5);
+
+                try {
+                    memberEvaluationService.addMemberEvaluation(memberEvaluationDTO, false);
+                } catch (Exception e) {
+                    // 淇敼璁㈠崟璐х墿璇勪环鐘舵�佷负宸茶瘎浠烽伩鍏嶆棤闄愯皟鐢ㄨ瘎浠峰紓甯�
+                    orderItemService.updateCommentStatus(orderItem.getSn(), CommentStatusEnum.FINISHED);
+                    log.error(e.getMessage(), e);
+                }
+            }
+        }
+    }
+
+    /**
+     * 鍏抽棴鍏佽鍞悗鐢宠
+     *
+     * @param orderSetting 璁㈠崟璁剧疆
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void closeAfterSale(OrderSetting orderSetting) {
+        //璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍏抽棴鍞悗鐢宠澶╂暟
+        DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseAfterSale());
+
+//        OrderItemOperationDTO build = OrderItemOperationDTO.builder().receiveTime(receiveTime)
+//            .afterSaleStatus(OrderItemAfterSaleStatusEnum.NOT_APPLIED.name()).build();
+//        List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(build);
+        //鍏抽棴鍞悗璁㈠崟=鏈敭鍚庤鍗�+灏忎簬璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿
+        orderItemService.expiredAfterSaleStatus(receiveTime);
+
+    }
+
+    /**
+     * 鍏抽棴鍏佽浜ゆ槗鎶曡瘔
+     *
+     * @param orderSetting 璁㈠崟璁剧疆
+     */
+    private void closeComplaint(OrderSetting orderSetting) {
+
+        //涓�0鍒欎笉闄愬埗
+        if (orderSetting.getCloseComplaint() == null || orderSetting.getCloseComplaint() == 0) {
+            return;
+        }
+        //璁㈠崟鍏抽棴浜ゆ槗鎶曡瘔鐢宠鏃堕棿 = 褰撳墠鏃堕棿 - 鑷姩鍏抽棴浜ゆ槗鎶曡瘔鐢宠澶╂暟
+        DateTime receiveTime = DateUtil.offsetDay(DateUtil.date(), -orderSetting.getCloseComplaint());
+
+        //鍏抽棴鍞悗璁㈠崟=鏈敭鍚庤鍗�+灏忎簬璁㈠崟鍏抽棴鍞悗鐢宠鏃堕棿
+        OrderItemOperationDTO build = OrderItemOperationDTO.builder().receiveTime(receiveTime)
+            .complainStatus(OrderComplaintStatusEnum.NO_APPLY.name()).build();
+        List<OrderItem> orderItems = orderItemService.waitOperationOrderItem(build);
+
+        //鍒ゆ柇鏄惁鏈夌鍚堟潯浠剁殑璁㈠崟锛屽叧闂厑璁稿敭鍚庣敵璇峰鐞�
+        if (!orderItems.isEmpty()) {
+
+            //鑾峰彇璁㈠崟璐х墿ID
+            List<String> orderItemIdList = orderItems.stream().map(OrderItem::getId).collect(Collectors.toList());
+
+            //淇敼璁㈠崟鎶曡瘔鐘舵��
+            LambdaUpdateWrapper<OrderItem> lambdaUpdateWrapper =
+                new LambdaUpdateWrapper<OrderItem>().set(OrderItem::getComplainStatus,
+                    OrderItemAfterSaleStatusEnum.EXPIRED.name()).in(OrderItem::getId, orderItemIdList);
+            orderItemService.update(lambdaUpdateWrapper);
+        }
+
+    }
+
+    /**
+     * 1.鏌ヨ浠婃棩寰呯粨绠楃殑鍟嗗
+     * 2.鏌ヨ鍟嗗涓婃缁撶畻鏃ユ湡锛岀敓鎴愭湰娆$粨绠楀崟
+     * 3.璁板綍鍟嗗缁撶畻鏃�
+     */
+    private void createBill() {
+        //鑾峰彇褰撳墠澶╂暟
+        int day = DateUtil.date().dayOfMonth();
+
+        //鑾峰彇寰呯粨绠楀晢瀹跺垪琛�
+        List<StoreSettlementDay> storeList = storeDetailService.getSettlementStore(day);
+
+        //鑾峰彇褰撳墠鏃堕棿
+        DateTime endTime = DateUtil.date();
+        //鎵归噺鍟嗗缁撶畻
+        for (StoreSettlementDay storeSettlementDay : storeList) {
+
+            //鐢熸垚缁撶畻鍗�
+            billService.createBill(storeSettlementDay.getStoreId(), storeSettlementDay.getSettlementDay(), endTime);
+
+            //淇敼搴楅摵缁撶畻鏃堕棿
+            storeDetailService.updateSettlementDay(storeSettlementDay.getStoreId(), endTime);
+        }
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/order/RechargeOrderTaskExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/order/RechargeOrderTaskExecute.java
new file mode 100644
index 0000000..7e44a39
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/order/RechargeOrderTaskExecute.java
@@ -0,0 +1,61 @@
+package cn.lili.handler.impl.order;
+
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import cn.lili.handler.EveryMinuteExecute;
+import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
+import cn.lili.modules.system.entity.dos.Setting;
+import cn.lili.modules.system.entity.dto.OrderSetting;
+import cn.lili.modules.system.entity.enums.SettingEnum;
+import cn.lili.modules.system.service.SettingService;
+import cn.lili.modules.wallet.entity.dos.Recharge;
+import cn.lili.modules.wallet.service.RechargeService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 鍏呭�艰鍗曡嚜鍔ㄥ彇娑堬紙姣忓垎閽熸墽琛岋級
+ *
+ * @author zhuhai
+ * @since 2021/3/11
+ **/
+@Slf4j
+@Component
+public class RechargeOrderTaskExecute implements EveryMinuteExecute {
+    /**
+     * 鍏呭��
+     */
+    @Autowired
+    private RechargeService rechargeService;
+    /**
+     * 璁剧疆
+     */
+    @Autowired
+    private SettingService settingService;
+
+
+    @Override
+    public void execute() {
+        Setting setting = settingService.get(SettingEnum.ORDER_SETTING.name());
+        OrderSetting orderSetting = JSONUtil.toBean(setting.getSettingValue(), OrderSetting.class);
+        if (orderSetting != null && orderSetting.getAutoCancel() != null) {
+            //鍏呭�艰鍗曡嚜鍔ㄥ彇娑堟椂闂� = 褰撳墠鏃堕棿 - 鑷姩鍙栨秷鏃堕棿鍒嗛挓鏁�
+            DateTime cancelTime = DateUtil.offsetMinute(DateUtil.date(), -orderSetting.getAutoCancel());
+            LambdaQueryWrapper<Recharge> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(Recharge::getPayStatus, PayStatusEnum.UNPAID.name());
+            //鍏呭�艰鍗曞垱寤烘椂闂� <= 璁㈠崟鑷姩鍙栨秷鏃堕棿
+            queryWrapper.le(Recharge::getCreateTime, cancelTime);
+            List<Recharge> list = rechargeService.list(queryWrapper);
+            List<String> cancelSnList = list.stream().map(Recharge::getRechargeSn).collect(Collectors.toList());
+            for (String sn : cancelSnList) {
+                rechargeService.rechargeOrderCancel(sn);
+            }
+        }
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/promotion/MemberCouponSignEverydayExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/promotion/MemberCouponSignEverydayExecute.java
new file mode 100644
index 0000000..1349183
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/promotion/MemberCouponSignEverydayExecute.java
@@ -0,0 +1,35 @@
+package cn.lili.handler.impl.promotion;
+
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.promotion.service.MemberCouponSignService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 淇冮攢娲诲姩姣忔棩瀹氭椂鍣�
+ *
+ * @author Chopper
+ * @since 2021/3/18 3:23 涓嬪崍
+ */
+@Slf4j
+@Component
+public class MemberCouponSignEverydayExecute implements EveryDayExecute {
+
+    @Autowired
+    private MemberCouponSignService memberCouponSignService;
+
+    /**
+     * 灏嗗凡杩囨湡鐨勪績閿�娲诲姩缃负缁撴潫
+     */
+    @Override
+    public void execute() {
+        try {
+            memberCouponSignService.clean();
+        } catch (Exception e) {
+            log.error("娓呴櫎棰嗗彇浼樻儬鍒告爣璁板紓甯�", e);
+        }
+
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/promotion/PromotionEverydayExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/promotion/PromotionEverydayExecute.java
new file mode 100644
index 0000000..626fe1c
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/promotion/PromotionEverydayExecute.java
@@ -0,0 +1,85 @@
+package cn.lili.handler.impl.promotion;
+
+import cn.lili.common.enums.PromotionTypeEnum;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.promotion.entity.dos.Seckill;
+import cn.lili.modules.promotion.service.SeckillService;
+import cn.lili.modules.promotion.tools.PromotionTools;
+import cn.lili.modules.search.service.EsGoodsIndexService;
+import cn.lili.modules.system.entity.dos.Setting;
+import cn.lili.modules.system.entity.dto.SeckillSetting;
+import cn.lili.modules.system.entity.enums.SettingEnum;
+import cn.lili.modules.system.service.SettingService;
+import com.google.gson.Gson;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 淇冮攢娲诲姩姣忔棩瀹氭椂鍣�
+ *
+ * @author Chopper
+ * @since 2021/3/18 3:23 涓嬪崍
+ */
+@Slf4j
+@Component
+public class PromotionEverydayExecute implements EveryDayExecute {
+
+    /**
+     * ES鍟嗗搧绱㈠紩
+     */
+    @Autowired
+    private EsGoodsIndexService esGoodsIndexService;
+    /**
+     * 绯荤粺璁剧疆
+     */
+    @Autowired
+    private SettingService settingService;
+    /**
+     * 绉掓潃娲诲姩
+     */
+    @Autowired
+    private SeckillService seckillService;
+
+    /**
+     * 灏嗗凡杩囨湡鐨勪績閿�娲诲姩缃负缁撴潫
+     */
+    @Override
+    public void execute() {
+        try {
+            //娓呴櫎鎵�鏈夊晢鍝佺储寮曠殑鏃犳晥淇冮攢娲诲姩
+            this.esGoodsIndexService.cleanInvalidPromotion();
+        } catch (Exception e) {
+            log.error("娓呮鍟嗗搧绱㈠紩涓棤鏁堜績閿�寮傚父", e);
+        }
+        try {
+            //瀹氭椂鍒涘缓娲诲姩
+            addSeckill();
+        } catch (Exception e) {
+            log.error("绉掓潃娲诲姩娣诲姞寮傚父", e);
+        }
+
+    }
+
+    /**
+     * 娣诲姞绉掓潃娲诲姩
+     * 浠庣郴缁熻缃腑鑾峰彇绉掓潃娲诲姩鐨勯厤缃�
+     * 娣诲姞鏄庡ぉ鍚庣殑绉掓潃娲诲姩
+     */
+    private void addSeckill() {
+        Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
+        SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
+        log.info("鐢熸垚绉掓潃娲诲姩璁剧疆锛歿}", seckillSetting);
+        for (int i = 1; i <= SeckillService.PRE_CREATION; i++) {
+            Seckill seckill = new Seckill(i, seckillSetting.getHours(), seckillSetting.getSeckillRule());
+            seckill.setApplyEndTime(null);
+
+            //濡傛灉宸茬粡瀛樺湪淇冮攢锛屽垯涓嶅啀娆′繚瀛�
+            if (seckillService.list(
+                    PromotionTools.checkActiveTime(seckill.getStartTime(), seckill.getEndTime(), PromotionTypeEnum.SECKILL, null, seckill.getId())).isEmpty()) {
+                boolean result = seckillService.savePromotions(seckill);
+                log.info("鐢熸垚绉掓潃娲诲姩鍙傛暟锛歿},缁撴灉锛歿}", seckill, result);
+            }
+        }
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/statistics/MemberStatisticsExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/statistics/MemberStatisticsExecute.java
new file mode 100644
index 0000000..07df271
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/statistics/MemberStatisticsExecute.java
@@ -0,0 +1,55 @@
+package cn.lili.handler.impl.statistics;
+
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.statistics.entity.dos.MemberStatisticsData;
+import cn.lili.modules.statistics.service.MemberStatisticsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * 浼氬憳鏁版嵁缁熻
+ *
+ * @author Chopper
+ * @since 2021-03-02 14:56
+ */
+@Slf4j
+@Component
+public class MemberStatisticsExecute implements EveryDayExecute {
+
+    /**
+     * 浼氬憳缁熻
+     */
+    @Autowired
+    private MemberStatisticsService memberStatisticsService;
+
+    @Override
+    public void execute() {
+
+        try {
+            //缁熻鐨勬椂闂达紙寮�濮嬨�傜粨鏉熸椂闂达級
+            Date startTime, endTime;
+            //鍒濆鍊�
+            Calendar calendar = Calendar.getInstance();
+            calendar.set(Calendar.SECOND, 0);
+            calendar.set(Calendar.MILLISECOND, 1);
+            calendar.set(Calendar.MINUTE, 0);
+            calendar.set(Calendar.HOUR_OF_DAY, 0);
+            endTime = calendar.getTime();
+            //-1澶╋紝鍗充负寮�濮嬫椂闂�
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.get(Calendar.DAY_OF_MONTH) - 1);
+            startTime = calendar.getTime();
+            MemberStatisticsData memberStatisticsData = new MemberStatisticsData();
+            memberStatisticsData.setMemberCount(memberStatisticsService.memberCount(endTime));
+            memberStatisticsData.setCreateDate(startTime);
+            memberStatisticsData.setActiveQuantity(memberStatisticsService.activeQuantity(startTime));
+            memberStatisticsData.setNewlyAdded(memberStatisticsService.newlyAdded(startTime, endTime));
+            memberStatisticsService.save(memberStatisticsData);
+        } catch (Exception e) {
+            log.error("姣忔棩浼氬憳缁熻鍔熻兘寮傚父锛�", e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/statistics/OnlineMemberStatistics.java b/lmk-job/src/main/java/cn/lili/handler/impl/statistics/OnlineMemberStatistics.java
new file mode 100644
index 0000000..32d05a6
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/statistics/OnlineMemberStatistics.java
@@ -0,0 +1,114 @@
+package cn.lili.handler.impl.statistics;
+
+import cn.lili.cache.Cache;
+import cn.lili.cache.CachePrefix;
+import cn.lili.common.properties.StatisticsProperties;
+import cn.lili.common.security.enums.UserEnums;
+import cn.lili.handler.EveryHourExecute;
+import cn.lili.modules.statistics.entity.vo.OnlineMemberVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+/**
+ * 瀹炴椂鍦ㄧ嚎浜烘暟缁熻
+ *
+ * @author Chopper
+ * @since 2021-02-21 09:47
+ */
+@Component
+public class OnlineMemberStatistics implements EveryHourExecute {
+
+    /**
+     * 缂撳瓨
+     */
+    @Autowired
+    private Cache<List<OnlineMemberVO>> cache;
+    /**
+     * 缁熻灏忔椂
+     */
+    @Autowired
+    private StatisticsProperties statisticsProperties;
+
+
+    @Override
+    public void execute() {
+
+        Calendar calendar = Calendar.getInstance();
+
+        List<OnlineMemberVO> onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix());
+
+        if (onlineMemberVOS == null) {
+            onlineMemberVOS = new ArrayList<>();
+        }
+
+        //杩囨护 鏈夋晥缁熻鏃堕棿
+        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - statisticsProperties.getOnlineMember());
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+
+        Calendar finalCalendar = calendar;
+
+        AtomicReference<Integer> lastNum = new AtomicReference<>(0);
+        onlineMemberVOS = onlineMemberVOS.stream()
+                .filter(onlineMemberVO -> {
+                    //濡傛灉涓鸿繃婊ゅ弬鏁帮紝鍒欒褰曚负杩囨湡鍙傛暟锛屽垯涓虹粺涓�鏃舵涓婁竴鍛ㄦ湡鐨勫湪绾夸汉鏁�
+                    if (!onlineMemberVO.getDate().after(finalCalendar.getTime())) {
+                        lastNum.set(onlineMemberVO.getNum());
+                    }
+                    return onlineMemberVO.getDate().after(finalCalendar.getTime());
+                })
+                .collect(Collectors.toList());
+
+        //璁″叆鏂版暟鎹�
+        calendar = Calendar.getInstance();
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        onlineMemberVOS.add(new OnlineMemberVO(calendar.getTime(), cache.keys(CachePrefix.ACCESS_TOKEN.getPrefix(UserEnums.MEMBER) + "*").size(),
+                lastNum.get()));
+
+        //鍐欏叆缂撳瓨
+        cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS);
+    }
+
+
+    /**
+     * 鎵嬪姩璁剧疆鏌愪竴鏃堕棿锛屾椿璺冧汉鏁�
+     *
+     * @param time 鏃堕棿
+     * @param num  浜烘暟
+     */
+    public void execute(Date time, Integer num) {
+
+        List<OnlineMemberVO> onlineMemberVOS = cache.get(CachePrefix.ONLINE_MEMBER.getPrefix());
+
+        if (onlineMemberVOS == null) {
+            onlineMemberVOS = new ArrayList<>();
+        }
+
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(time);
+        //杩囨护 鏈夋晥缁熻鏃堕棿
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - 48);
+
+        onlineMemberVOS = onlineMemberVOS.stream()
+                .filter(onlineMemberVO -> onlineMemberVO.getDate().after(calendar.getTime()))
+                .collect(Collectors.toList());
+        onlineMemberVOS.add(new OnlineMemberVO(time, num, num));
+
+        //鍐欏叆缂撳瓨
+        cache.put(CachePrefix.ONLINE_MEMBER.getPrefix(), onlineMemberVOS);
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreExecute.java
new file mode 100644
index 0000000..f6454c5
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreExecute.java
@@ -0,0 +1,49 @@
+package cn.lili.handler.impl.store;
+
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.goods.service.GoodsSkuService;
+import cn.lili.modules.store.entity.dos.Store;
+import cn.lili.modules.store.entity.enums.StoreStatusEnum;
+import cn.lili.modules.store.service.StoreService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 搴楅摵淇℃伅鏇存柊
+ *
+ * @author Chopper
+ * @since 2021/3/15 5:30 涓嬪崍
+ */
+@Component
+@Slf4j
+public class StoreExecute implements EveryDayExecute {
+    /**
+     * 搴楅摵
+     */
+    @Autowired
+    private StoreService storeService;
+
+    @Autowired
+    private GoodsSkuService goodsSkuService;
+
+    @Override
+    public void execute() {
+        //鑾峰彇鎵�鏈夊紑鍚殑搴楅摵
+        List<Store> storeList = storeService.list(new LambdaQueryWrapper<Store>().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()));
+
+        for (Store store : storeList) {
+            try {
+                Long num = goodsSkuService.countSkuNum(store.getId());
+                storeService.updateStoreGoodsNum(store.getId(), num);
+            } catch (Exception e) {
+                log.error("搴楅摵id涓簕},鏇存柊鍟嗗搧鏁伴噺澶辫触", store.getId(), e);
+            }
+        }
+
+
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreRatingExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreRatingExecute.java
new file mode 100644
index 0000000..67d90eb
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/store/StoreRatingExecute.java
@@ -0,0 +1,60 @@
+package cn.lili.handler.impl.store;
+
+import cn.lili.common.enums.SwitchEnum;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.member.entity.vo.StoreRatingVO;
+import cn.lili.modules.member.service.MemberEvaluationService;
+import cn.lili.modules.store.entity.dos.Store;
+import cn.lili.modules.store.entity.enums.StoreStatusEnum;
+import cn.lili.modules.store.service.StoreService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 搴楅摵璇勫垎
+ *
+ * @author Chopper
+ * @since 2021/3/15 5:30 涓嬪崍
+ */
+@Component
+public class StoreRatingExecute implements EveryDayExecute {
+    /**
+     * 搴楅摵
+     */
+    @Autowired
+    private StoreService storeService;
+    /**
+     * 浼氬憳璇勪环
+     */
+    @Autowired
+    private MemberEvaluationService memberEvaluationService;
+
+
+    @Override
+    public void execute() {
+        //鑾峰彇鎵�鏈夊紑鍚殑搴楅摵
+        List<Store> storeList = storeService.list(new LambdaQueryWrapper<Store>().eq(Store::getStoreDisable, StoreStatusEnum.OPEN.name()));
+        for (Store store : storeList) {
+            //搴楅摵鎵�鏈夊紑鍚殑璇勪环
+            StoreRatingVO storeRatingVO = memberEvaluationService.getStoreRatingVO(store.getId(), SwitchEnum.OPEN.name());
+
+            if (storeRatingVO != null) {
+                //淇濆瓨璇勫垎
+                LambdaUpdateWrapper<Store> lambdaUpdateWrapper = Wrappers.lambdaUpdate();
+                lambdaUpdateWrapper.eq(Store::getId, store.getId());
+                lambdaUpdateWrapper.set(Store::getDescriptionScore, storeRatingVO.getDescriptionScore());
+                lambdaUpdateWrapper.set(Store::getDeliveryScore, storeRatingVO.getDeliveryScore());
+                lambdaUpdateWrapper.set(Store::getServiceScore, storeRatingVO.getServiceScore());
+                storeService.update(lambdaUpdateWrapper);
+            }
+
+        }
+
+
+    }
+}
diff --git a/lmk-job/src/main/java/cn/lili/handler/impl/view/PageViewStatisticsExecute.java b/lmk-job/src/main/java/cn/lili/handler/impl/view/PageViewStatisticsExecute.java
new file mode 100644
index 0000000..8ea96ca
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/handler/impl/view/PageViewStatisticsExecute.java
@@ -0,0 +1,195 @@
+package cn.lili.handler.impl.view;
+
+import cn.hutool.core.convert.Convert;
+import cn.lili.cache.Cache;
+import cn.lili.cache.CachePrefix;
+import cn.lili.common.utils.BeanUtil;
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.modules.statistics.entity.dos.PlatformViewData;
+import cn.lili.modules.statistics.service.PlatformViewService;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 缁熻 鍏ュ簱
+ *
+ * @author Chopper
+ * @since 2021-01-15 18:20
+ */
+@Slf4j
+@Component
+public class PageViewStatisticsExecute implements EveryDayExecute {
+    /**
+     * 缂撳瓨
+     */
+    @Autowired
+    private Cache cache;
+    /**
+     * 骞冲彴PV缁熻
+     */
+    @Autowired
+    private PlatformViewService platformViewService;
+
+    @Override
+    public void execute() {
+
+        //1銆佺紦瀛榢eys 妯$硦鍖归厤
+        //2銆佽繃婊や粖鏃ョ殑鏁版嵁锛屽嵆浠婂ぉ鍙兘缁熻浠婃棩浠ュ墠鐨勬暟鎹�
+        //4瀵筴ey value 鍒嗗埆浠h〃骞冲彴PV銆佸钩鍙癠V銆佸簵閾篜V銆佸簵閾篣V
+        List<String> pvKeys = filterKeys(cache.keys(CachePrefix.PV.getPrefix() + "*"));
+        List<Integer> pvValues = cache.multiGet(pvKeys);
+
+        List<String> storePVKeys = filterKeys(cache.keys(CachePrefix.STORE_PV.getPrefix() + "*"));
+        List<Integer> storePvValues = cache.multiGet(storePVKeys);
+
+        //澶囦唤UV鏁版嵁锛岃繖閲岃祴鍊间箣鍚庯紝浼氳鍒犻櫎
+        List<String> uvKeys = new ArrayList<>();
+        List<String> storeUvKeys = new ArrayList<>();
+
+        log.debug("寮�濮嬬粺璁″钩鍙版暟鎹紝PV鍏辫銆恵}銆戞潯", pvKeys.size());
+        log.debug("寮�濮嬬粺璁″簵閾烘暟鎹紝PV鍏辫銆恵}銆戞潯", storePvValues.size());
+
+        //瀹氫箟瑕佺粺璁$殑鏁版嵁
+        List<PlatformViewData> platformViewDataList = new ArrayList<>();
+
+        //PV 缁熻
+        if (pvKeys.size() > 0) {
+            for (int i = 0; i < pvKeys.size(); i++) {
+                String key = pvKeys.get(i);
+                PageViewStatistics pageViewStatistics = new PageViewStatistics(key);
+                PlatformViewData platformPVData = new PlatformViewData();
+                BeanUtil.copyProperties(pageViewStatistics, platformPVData);
+                platformPVData.setPvNum(pvValues.get(i).longValue());
+                //鏍规嵁pvkey 鑾峰彇 uvkey
+                String uvKey = getUvKey(key);
+                uvKeys.add(uvKey);
+                platformPVData.setUvNum(cache.counter(uvKey));
+                platformPVData.setStoreId("-1");
+                platformViewDataList.add(platformPVData);
+            }
+            batchSave(pvKeys, uvKeys, platformViewDataList);
+        }
+        //搴楅摵 PV 缁熻
+        if (storePVKeys.size() > 0) {
+            platformViewDataList = new ArrayList<>();
+            for (int i = 0; i < storePVKeys.size(); i++) {
+                String key = storePVKeys.get(i);
+                PageViewStatistics pageViewStatistics = new PageViewStatistics(key);
+                PlatformViewData storePVData = new PlatformViewData();
+                BeanUtil.copyProperties(pageViewStatistics, storePVData);
+                storePVData.setPvNum(storePvValues.get(i).longValue());
+                //鏍规嵁pvkey 鑾峰彇 uvkey
+                String uvKey = getUvKey(key);
+                uvKeys.add(uvKey);
+                storePVData.setUvNum(cache.counter(uvKey));
+                platformViewDataList.add(storePVData);
+            }
+            batchSave(storePVKeys, storeUvKeys, platformViewDataList);
+        }
+    }
+
+    /**
+     * 鏍规嵁缂撳瓨鐨凱Vkey 鑾峰彇瀵瑰簲鐨刄Vkey
+     *
+     * @param key
+     * @return
+     */
+    private String getUvKey(String key) {
+        if (StringUtils.isNotEmpty(key)) {
+
+            key = key.replace(CachePrefix.PV.getPrefix(), CachePrefix.UV.getPrefix());
+            key = key.replace(CachePrefix.STORE_PV.getPrefix(), CachePrefix.STORE_UV.getPrefix());
+            return key;
+        }
+        return key;
+    }
+
+    /**
+     * 鎵归噺淇濆瓨鏁版嵁&&娓呴櫎淇濆瓨鏁版嵁鐨勭紦瀛�
+     *
+     * @param pvKeys           PV key
+     * @param uvKeys           UV key
+     * @param platformViewData DOS
+     */
+    @Transactional(rollbackFor = Exception.class)
+    void batchSave(List<String> pvKeys, List<String> uvKeys, List<PlatformViewData> platformViewData) {
+        log.debug("鎵归噺淇濆瓨娴侀噺鏁版嵁锛屽叡璁°�恵}銆戞潯", platformViewData.size());
+        platformViewService.saveBatch(platformViewData);
+        //鎵归噺鍒犻櫎缂撳瓨key
+        cache.multiDel(pvKeys);
+        cache.multiDel(uvKeys);
+        log.debug("娴侀噺鏁版嵁淇濆瓨瀹屾垚");
+    }
+
+
+    /**
+     * 杩囨护缂撳瓨key
+     *
+     * @param keys 缂撳瓨key闆嗗悎
+     */
+    private static List<String> filterKeys(List<String> keys) {
+
+        //鍙粺璁′竴澶╁墠鐨勬暟鎹�
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.HOUR_OF_DAY, -24);
+
+        List<String> result = new ArrayList<>();
+        for (String key : keys) {
+            PageViewStatistics temp = new PageViewStatistics(key);
+            //濡傛灉闇�瑕佺粺璁★紝鍒欏皢key鍐欏叆闆嗗悎
+            if (temp.getDate().before(calendar.getTime())) {
+                result.add(key);
+            }
+        }
+
+        return result;
+    }
+
+}
+
+/**
+ * 鏍规嵁缂撳瓨key 鑾峰彇鍏朵腑闇�瑕佺殑鍙傛暟锛屽勾鏈堟棩锛屼互鍙婂簵閾轰俊鎭�
+ */
+@Data
+class PageViewStatistics {
+    /**
+     * 骞� 銆� 鏈� 銆� 鏃� 銆� 搴楅摵id
+     */
+    private Date date;
+    private String storeId;
+
+    public PageViewStatistics(String str) {
+        //灏嗗瓧绗︿覆瑙f瀽鎴愰渶瑕佺殑瀵硅薄
+        str = str.substring(str.indexOf("}") + 2);
+        String[] dateStr = str.split("-");
+        Integer year = Convert.toInt(dateStr[0]);
+        Integer month = Convert.toInt(dateStr[1]);
+        Integer day;
+        //鏄惁鏈夊簵閾篿d
+        if (dateStr.length > 3) {
+            day = Convert.toInt(dateStr[2]);
+            this.storeId = dateStr[3];
+        } else {
+            day = Convert.toInt(dateStr[2]);
+        }
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(Calendar.YEAR, year);
+        calendar.set(Calendar.MONTH, month - 1);
+        calendar.set(Calendar.DAY_OF_MONTH, day);
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        this.date = calendar.getTime();
+    }
+
+}
diff --git a/lmk-job/src/main/java/cn/lili/job/TimedTaskJobHandler.java b/lmk-job/src/main/java/cn/lili/job/TimedTaskJobHandler.java
new file mode 100644
index 0000000..4cc8716
--- /dev/null
+++ b/lmk-job/src/main/java/cn/lili/job/TimedTaskJobHandler.java
@@ -0,0 +1,104 @@
+package cn.lili.job;
+
+import cn.lili.handler.EveryDayExecute;
+import cn.lili.handler.EveryHourExecute;
+import cn.lili.handler.EveryMinuteExecute;
+import com.xxl.job.core.biz.model.ReturnT;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * 瀹氭椂鍣ㄤ换鍔�
+ *
+ * @author Chopper
+ * @version v1.0
+ * 2020-12-24 11:51
+ */
+@Slf4j
+@Component
+public class TimedTaskJobHandler {
+
+    @Autowired(required = false)
+    private List<EveryMinuteExecute> everyMinuteExecutes;
+
+
+    @Autowired(required = false)
+    private List<EveryHourExecute> everyHourExecutes;
+
+
+    @Autowired(required = false)
+    private List<EveryDayExecute> everyDayExecutes;
+
+    /**
+     * 姣忓垎閽熶换鍔�
+     *
+     * @throws Exception
+     */
+    @XxlJob("everyMinuteExecute")
+    public ReturnT<String> everyMinuteExecute(String param)  {
+        log.info("姣忓垎閽熶换鍔℃墽琛�");
+        if (everyMinuteExecutes == null || everyMinuteExecutes.size() == 0) {
+            return ReturnT.SUCCESS;
+        }
+
+        for (int i = 0; i < everyMinuteExecutes.size(); i++) {
+            try {
+                everyMinuteExecutes.get(i).execute();
+            } catch (Exception e) {
+                log.error("姣忓垎閽熶换鍔″紓甯�", e);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     * 姣忓皬鏃朵换鍔�
+     *
+     * @throws Exception
+     */
+    @XxlJob("everyHourExecuteJobHandler")
+    public ReturnT<String> everyHourExecuteJobHandler(String param) {
+        log.info("姣忓皬鏃朵换鍔℃墽琛�");
+        if (everyHourExecutes == null || everyHourExecutes.size() == 0) {
+            return ReturnT.SUCCESS;
+        }
+
+        for (int i = 0; i < everyHourExecutes.size(); i++) {
+            try {
+                everyHourExecutes.get(i).execute();
+            } catch (Exception e) {
+                log.error("姣忓皬鏃朵换鍔″紓甯�", e);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+    /**
+     * 姣忔棩浠诲姟
+     *
+     * @throws Exception
+     */
+    @XxlJob("everyDayExecuteJobHandler")
+    public ReturnT<String> everyDayExecuteJobHandler(String param) {
+
+        log.info("姣忔棩浠诲姟鎵ц");
+        if (everyDayExecutes == null || everyDayExecutes.size() == 0) {
+            return ReturnT.SUCCESS;
+        }
+
+        for (int i = 0; i < everyDayExecutes.size(); i++) {
+            try {
+                everyDayExecutes.get(i).execute();
+            } catch (Exception e) {
+                log.error("姣忔棩浠诲姟寮傚父", e);
+            }
+        }
+        return ReturnT.SUCCESS;
+    }
+
+
+}
diff --git a/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java b/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java
index 3204355..f80547c 100644
--- a/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java
+++ b/seller-api/src/main/java/cn/lili/controller/order/OrderStoreController.java
@@ -12,7 +12,6 @@
 import cn.lili.common.vo.ResultMessage;
 import cn.lili.modules.member.entity.dto.MemberAddressDTO;
 import cn.lili.modules.member.service.StoreLogisticsService;
-import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
 import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
 import cn.lili.modules.order.order.entity.dto.PartDeliveryParamsDTO;
 import cn.lili.modules.order.order.entity.vo.OrderDetailVO;

--
Gitblit v1.8.0