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