mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 20:28:44 +08:00 
			
		
		
		
	!610 营销活动+订单:完善大部分 TODO 提到的问题
Merge pull request !610 from puhui999/feature/mall_product
This commit is contained in:
		@@ -68,6 +68,14 @@ public class CommonResult<T> implements Serializable {
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static <T> CommonResult<T> success(T data, String msg) {
 | 
			
		||||
        CommonResult<T> result = new CommonResult<>();
 | 
			
		||||
        result.code = GlobalErrorCodeConstants.SUCCESS.getCode();
 | 
			
		||||
        result.data = data;
 | 
			
		||||
        result.msg = msg;
 | 
			
		||||
        return result;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static boolean isSuccess(Integer code) {
 | 
			
		||||
        return Objects.equals(code, GlobalErrorCodeConstants.SUCCESS.getCode());
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,18 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.bargain;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 砍价活动 Api 接口
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
public interface BargainActivityApi {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新砍价活动库存
 | 
			
		||||
     *
 | 
			
		||||
     * @param activityId 砍价活动编号
 | 
			
		||||
     * @param count      购买数量
 | 
			
		||||
     */
 | 
			
		||||
    void updateBargainActivityStock(Long activityId, Integer count);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.promotion.api.bargain.dto;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotEmpty;
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
 | 
			
		||||
// TODO @芋艿:这块要在看看
 | 
			
		||||
@@ -40,17 +39,7 @@ public class BargainRecordCreateReqDTO {
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull(message = "订单编号不能为空")
 | 
			
		||||
    private Long orderId;
 | 
			
		||||
    // TODO @puhui999:spuName、picUrl、 之类字段不用传递;
 | 
			
		||||
    /**
 | 
			
		||||
     * 商品名字
 | 
			
		||||
     */
 | 
			
		||||
    @NotEmpty(message = "商品名字不能为空")
 | 
			
		||||
    private String spuName;
 | 
			
		||||
    /**
 | 
			
		||||
     * 商品图片
 | 
			
		||||
     */
 | 
			
		||||
    @NotEmpty(message = "商品图片不能为空")
 | 
			
		||||
    private String picUrl;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 砍价商品单价
 | 
			
		||||
     */
 | 
			
		||||
@@ -61,17 +50,7 @@ public class BargainRecordCreateReqDTO {
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull(message = "商品原价不能为空")
 | 
			
		||||
    private Integer price;
 | 
			
		||||
    // TODO @puhui999:nickname、avatar 不用传递,去查询;
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户昵称
 | 
			
		||||
     */
 | 
			
		||||
    @NotEmpty(message = "用户昵称不能为空")
 | 
			
		||||
    private String nickname;
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户头像
 | 
			
		||||
     */
 | 
			
		||||
    @NotEmpty(message = "用户头像不能为空")
 | 
			
		||||
    private String avatar;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 开团状态:进行中 砍价成功 砍价失败
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.module.promotion.api.combination;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
 | 
			
		||||
 | 
			
		||||
import javax.validation.Valid;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
// TODO @芋艿:后面也再撸撸这几个接口
 | 
			
		||||
@@ -51,13 +51,29 @@ public interface CombinationRecordApi {
 | 
			
		||||
     */
 | 
			
		||||
    void validateCombinationLimitCount(Long activityId, Integer count, Integer sumCount);
 | 
			
		||||
 | 
			
		||||
    // TODO @puhui999:是不是搞成具体的方法,拼团成功,拼团失败,这种方法;
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新拼团状态为 成功
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId  用户编号
 | 
			
		||||
     * @param orderId 订单编号
 | 
			
		||||
     */
 | 
			
		||||
    void updateRecordStatusToSuccess(Long userId, Long orderId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新开团记录状态
 | 
			
		||||
     * 更新拼团状态为 失败
 | 
			
		||||
     *
 | 
			
		||||
     * @param reqDTO 请求 DTO
 | 
			
		||||
     * @param userId  用户编号
 | 
			
		||||
     * @param orderId 订单编号
 | 
			
		||||
     */
 | 
			
		||||
    void updateCombinationRecordStatus(CombinationRecordUpdateStatusReqDTO reqDTO);
 | 
			
		||||
    void updateRecordStatusToFailed(Long userId, Long orderId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新拼团状态为 进行中
 | 
			
		||||
     *
 | 
			
		||||
     * @param userId    用户编号
 | 
			
		||||
     * @param orderId   订单编号
 | 
			
		||||
     * @param startTime 开始时间
 | 
			
		||||
     */
 | 
			
		||||
    void updateRecordStatusToInProgress(Long userId, Long orderId, LocalDateTime startTime);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,39 +0,0 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.combination.dto;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import javax.validation.constraints.NotNull;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 拼团记录的更新状态 Request DTO
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class CombinationRecordUpdateStatusReqDTO {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 用户编号
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull(message = "用户编号不能为空")
 | 
			
		||||
    private Long userId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 订单编号
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull(message = "订单编号不能为空")
 | 
			
		||||
    private Long orderId;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 开团状态:正在开团 拼团成功 拼团失败
 | 
			
		||||
     */
 | 
			
		||||
    @NotNull(message = "开团状态不能为空")
 | 
			
		||||
    private Integer status;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 团开始时间
 | 
			
		||||
     */
 | 
			
		||||
    private LocalDateTime startTime;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,20 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.seckill;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 秒杀活动 API 接口
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
public interface SeckillActivityApi {
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新秒杀库存
 | 
			
		||||
     *
 | 
			
		||||
     * @param updateStockReqDTO 请求
 | 
			
		||||
     */
 | 
			
		||||
    void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -0,0 +1,46 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.seckill.dto;
 | 
			
		||||
 | 
			
		||||
import lombok.Data;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 更新秒杀库存 request DTO
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
@Data
 | 
			
		||||
public class SeckillActivityUpdateStockReqDTO {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 活动编号
 | 
			
		||||
     */
 | 
			
		||||
    private Long activityId;
 | 
			
		||||
    /**
 | 
			
		||||
     * 总购买数量
 | 
			
		||||
     */
 | 
			
		||||
    private Integer count;
 | 
			
		||||
    /**
 | 
			
		||||
     * 活动商品
 | 
			
		||||
     */
 | 
			
		||||
    private List<Item> items;
 | 
			
		||||
 | 
			
		||||
    @Data
 | 
			
		||||
    public static class Item {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * SPU 编号
 | 
			
		||||
         */
 | 
			
		||||
        private Long spuId;
 | 
			
		||||
        /**
 | 
			
		||||
         * SKU 编号
 | 
			
		||||
         */
 | 
			
		||||
        private Long skuId;
 | 
			
		||||
        /**
 | 
			
		||||
         * 购买数量
 | 
			
		||||
         */
 | 
			
		||||
        private Integer count;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -51,10 +51,11 @@ public interface ErrorCodeConstants {
 | 
			
		||||
 | 
			
		||||
    // ========== 秒杀活动 1013008000 ==========
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_NOT_EXISTS = new ErrorCode(1013008000, "秒杀活动不存在");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013008002, "存在商品参加了其它秒杀活动");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_SPU_CONFLICTS = new ErrorCode(1013008002, "存在商品参加了其它秒杀活动,秒杀时段冲突");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_UPDATE_FAIL_STATUS_CLOSED = new ErrorCode(1013008003, "秒杀活动已关闭,不能修改");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_DELETE_FAIL_STATUS_NOT_CLOSED_OR_END = new ErrorCode(1013008004, "秒杀活动未关闭或未结束,不能删除");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_CLOSE_FAIL_STATUS_CLOSED = new ErrorCode(1013008005, "秒杀活动已关闭,不能重复关闭");
 | 
			
		||||
    ErrorCode SECKILL_ACTIVITY_UPDATE_STOCK_FAIL = new ErrorCode(1013008006, "更新秒杀活动库存失败,原因秒杀库存不足");
 | 
			
		||||
 | 
			
		||||
    // ========== 秒杀时段 1013009000 ==========
 | 
			
		||||
    ErrorCode SECKILL_CONFIG_NOT_EXISTS = new ErrorCode(1013009000, "秒杀时段不存在");
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,39 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.bargain;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.controller.admin.bargain.vo.BargainActivityUpdateReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.bargain.BargainActivityDO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.service.bargain.BargainActivityService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.BARGAIN_ACTIVITY_NOT_EXISTS;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 砍价活动 Api 接口实现类
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class BargainActivityApiImpl implements BargainActivityApi {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private BargainActivityService bargainActivityService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateBargainActivityStock(Long activityId, Integer count) {
 | 
			
		||||
        // 查询砍价活动
 | 
			
		||||
        BargainActivityDO activity = bargainActivityService.getBargainActivity(activityId);
 | 
			
		||||
        if (activity == null) {
 | 
			
		||||
            throw exception(BARGAIN_ACTIVITY_NOT_EXISTS);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 更新砍价库存
 | 
			
		||||
        BargainActivityUpdateReqVO reqVO = new BargainActivityUpdateReqVO();
 | 
			
		||||
        reqVO.setId(activityId);
 | 
			
		||||
        reqVO.setStock(activity.getStock() - count);
 | 
			
		||||
        bargainActivityService.updateBargainActivity(reqVO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -2,13 +2,13 @@ package cn.iocoder.yudao.module.promotion.api.combination;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.service.combination.CombinationRecordService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -43,12 +43,19 @@ public class CombinationRecordApiImpl implements CombinationRecordApi {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateCombinationRecordStatus(CombinationRecordUpdateStatusReqDTO reqDTO) {
 | 
			
		||||
        if (null == reqDTO.getStartTime()) {
 | 
			
		||||
            recordService.updateCombinationRecordStatusByUserIdAndOrderId(reqDTO);
 | 
			
		||||
        } else {
 | 
			
		||||
            recordService.updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(reqDTO);
 | 
			
		||||
    public void updateRecordStatusToSuccess(Long userId, Long orderId) {
 | 
			
		||||
        recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.SUCCESS.getStatus(), userId, orderId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateRecordStatusToFailed(Long userId, Long orderId) {
 | 
			
		||||
        recordService.updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordStatusEnum.FAILED.getStatus(), userId, orderId);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateRecordStatusToInProgress(Long userId, Long orderId, LocalDateTime startTime) {
 | 
			
		||||
        recordService.updateRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordStatusEnum.IN_PROGRESS.getStatus(),
 | 
			
		||||
                userId, orderId, startTime);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,75 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.api.seckill;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillActivityDO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.seckill.seckillactivity.SeckillProductDO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.service.seckill.SeckillActivityService;
 | 
			
		||||
import org.springframework.stereotype.Service;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.SECKILL_ACTIVITY_UPDATE_STOCK_FAIL;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 秒杀活动接口 Api 接口实现类
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
@Service
 | 
			
		||||
public class SeckillActivityApiImpl implements SeckillActivityApi {
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private SeckillActivityService activityService;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateSeckillStock(SeckillActivityUpdateStockReqDTO updateStockReqDTO) {
 | 
			
		||||
        SeckillActivityDO seckillActivity = activityService.getSeckillActivity(updateStockReqDTO.getActivityId());
 | 
			
		||||
        if (seckillActivity.getStock() < updateStockReqDTO.getCount()) {
 | 
			
		||||
            throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
 | 
			
		||||
        }
 | 
			
		||||
        // 获取活动商品
 | 
			
		||||
        List<SeckillProductDO> productDOs = activityService.getSeckillProductListByActivityId(updateStockReqDTO.getActivityId());
 | 
			
		||||
        List<SeckillActivityUpdateStockReqDTO.Item> items = updateStockReqDTO.getItems();
 | 
			
		||||
        Map<Long, List<Long>> map = new HashMap<>();
 | 
			
		||||
        items.forEach(item -> {
 | 
			
		||||
            if (map.containsKey(item.getSpuId())) {
 | 
			
		||||
                List<Long> skuIds = map.get(item.getSpuId());
 | 
			
		||||
                skuIds.add(item.getSkuId());
 | 
			
		||||
                map.put(item.getSpuId(), skuIds);
 | 
			
		||||
            } else {
 | 
			
		||||
                List<Long> list = new ArrayList<>();
 | 
			
		||||
                list.add(item.getSkuId());
 | 
			
		||||
                map.put(item.getSpuId(), list);
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        // 过滤出购买的商品
 | 
			
		||||
        List<SeckillProductDO> productDOList = CollectionUtils.filterList(productDOs, item -> map.get(item.getSpuId()).contains(item.getSkuId()));
 | 
			
		||||
        Map<Long, SeckillActivityUpdateStockReqDTO.Item> productDOMap = CollectionUtils.convertMap(items, SeckillActivityUpdateStockReqDTO.Item::getSkuId, p -> p);
 | 
			
		||||
        // 检查活动商品库存是否充足
 | 
			
		||||
        boolean b = CollectionUtils.anyMatch(productDOList, item -> {
 | 
			
		||||
            SeckillActivityUpdateStockReqDTO.Item item1 = productDOMap.get(item.getSkuId());
 | 
			
		||||
            return (item.getStock() < item1.getCount()) || (item.getStock() - item1.getCount()) < 0;
 | 
			
		||||
        });
 | 
			
		||||
        if (b) {
 | 
			
		||||
            throw exception(SECKILL_ACTIVITY_UPDATE_STOCK_FAIL);
 | 
			
		||||
        }
 | 
			
		||||
        List<SeckillProductDO> doList = CollectionUtils.convertList(productDOList, item -> {
 | 
			
		||||
            item.setStock(item.getStock() - productDOMap.get(item.getSkuId()).getCount());
 | 
			
		||||
            return item;
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        // 更新活动库存
 | 
			
		||||
        seckillActivity.setStock(seckillActivity.getStock() + updateStockReqDTO.getCount());
 | 
			
		||||
        seckillActivity.setTotalStock(seckillActivity.getTotalStock() - updateStockReqDTO.getCount());
 | 
			
		||||
        activityService.updateSeckillActivity(seckillActivity);
 | 
			
		||||
        // 更新活动商品库存
 | 
			
		||||
        activityService.updateSeckillActivityProductByList(doList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -86,11 +86,11 @@ public class CombinationRecordDO extends BaseDO {
 | 
			
		||||
     */
 | 
			
		||||
    private Boolean virtualGroup;
 | 
			
		||||
    /**
 | 
			
		||||
     * 过期时间,单位:小时
 | 
			
		||||
     * 过期时间
 | 
			
		||||
     *
 | 
			
		||||
     * 关联 {@link CombinationActivityDO#getLimitDuration()}
 | 
			
		||||
     * {@link CombinationRecordDO#getStartTime()} + {@link CombinationActivityDO#getLimitDuration()} 计算
 | 
			
		||||
     */
 | 
			
		||||
    private Integer expireTime;
 | 
			
		||||
    private LocalDateTime expireTime;
 | 
			
		||||
    /**
 | 
			
		||||
     * 开始时间 (订单付款后开始的时间)
 | 
			
		||||
     */
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,9 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.service.combination;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -16,9 +16,11 @@ public interface CombinationRecordService {
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新拼团状态
 | 
			
		||||
     *
 | 
			
		||||
     * @param reqDTO 请求 DTO
 | 
			
		||||
     * @param status 状态
 | 
			
		||||
     * @param userId 用户编号
 | 
			
		||||
     * @param orderId 订单编号
 | 
			
		||||
     */
 | 
			
		||||
    void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO);
 | 
			
		||||
    void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 创建拼团记录
 | 
			
		||||
@@ -30,9 +32,12 @@ public interface CombinationRecordService {
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新拼团状态和开始时间
 | 
			
		||||
     *
 | 
			
		||||
     * @param reqDTO 请求 DTO
 | 
			
		||||
     * @param status 状态
 | 
			
		||||
     * @param userId 用户编号
 | 
			
		||||
     * @param orderId 订单编号
 | 
			
		||||
     * @param startTime 开始时间
 | 
			
		||||
     */
 | 
			
		||||
    void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO);
 | 
			
		||||
    void updateRecordStatusAndStartTimeByUserIdAndOrderId(Integer status, Long userId, Long orderId, LocalDateTime startTime);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得拼团状态
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.promotion.service.combination;
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordCreateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.convert.combination.CombinationActivityConvert;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationActivityDO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.dal.dataobject.combination.CombinationRecordDO;
 | 
			
		||||
@@ -21,6 +20,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
 | 
			
		||||
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.*;
 | 
			
		||||
 | 
			
		||||
// TODO 芋艿:等拼团记录做完,完整 review 下
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 拼团记录 Service 实现类
 | 
			
		||||
 *
 | 
			
		||||
@@ -38,27 +38,27 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void updateCombinationRecordStatusByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
 | 
			
		||||
    public void updateCombinationRecordStatusByUserIdAndOrderId(Integer status, Long userId, Long orderId) {
 | 
			
		||||
        // 校验拼团是否存在
 | 
			
		||||
        CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
 | 
			
		||||
        CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
 | 
			
		||||
 | 
			
		||||
        // 更新状态
 | 
			
		||||
        recordDO.setStatus(reqDTO.getStatus());
 | 
			
		||||
        recordDO.setStatus(status);
 | 
			
		||||
        recordMapper.updateById(recordDO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    @Transactional(rollbackFor = Exception.class)
 | 
			
		||||
    public void updateCombinationRecordStatusAndStartTimeByUserIdAndOrderId(CombinationRecordUpdateStatusReqDTO reqDTO) {
 | 
			
		||||
        CombinationRecordDO recordDO = validateCombinationRecord(reqDTO.getUserId(), reqDTO.getOrderId());
 | 
			
		||||
    public void updateRecordStatusAndStartTimeByUserIdAndOrderId(Integer status, Long userId, Long orderId, LocalDateTime startTime) {
 | 
			
		||||
        CombinationRecordDO recordDO = validateCombinationRecord(userId, orderId);
 | 
			
		||||
        // 更新状态
 | 
			
		||||
        recordDO.setStatus(reqDTO.getStatus());
 | 
			
		||||
        recordDO.setStatus(status);
 | 
			
		||||
        // 更新开始时间
 | 
			
		||||
        recordDO.setStartTime(reqDTO.getStartTime());
 | 
			
		||||
        recordDO.setStartTime(startTime);
 | 
			
		||||
        recordMapper.updateById(recordDO);
 | 
			
		||||
 | 
			
		||||
        // 更新拼团参入人数
 | 
			
		||||
        List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), reqDTO.getStatus());
 | 
			
		||||
        List<CombinationRecordDO> recordDOs = recordMapper.selectListByHeadIdAndStatus(recordDO.getHeadId(), status);
 | 
			
		||||
        if (CollUtil.isNotEmpty(recordDOs)) {
 | 
			
		||||
            recordDOs.forEach(item -> {
 | 
			
		||||
                item.setUserCount(recordDOs.size());
 | 
			
		||||
@@ -115,8 +115,7 @@ public class CombinationRecordServiceImpl implements CombinationRecordService {
 | 
			
		||||
        // 2. 创建拼团记录
 | 
			
		||||
        CombinationRecordDO record = CombinationActivityConvert.INSTANCE.convert(reqDTO);
 | 
			
		||||
        record.setVirtualGroup(false);
 | 
			
		||||
        // TODO @puhui999:过期时间,应该是 Date 哈;
 | 
			
		||||
        record.setExpireTime(activity.getLimitDuration());
 | 
			
		||||
        record.setExpireTime(record.getStartTime().plusHours(activity.getLimitDuration()));
 | 
			
		||||
        record.setUserSize(activity.getUserSize());
 | 
			
		||||
        recordMapper.insert(record);
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,20 @@ public interface SeckillActivityService {
 | 
			
		||||
     */
 | 
			
		||||
    void updateSeckillActivity(@Valid SeckillActivityUpdateReqVO updateReqVO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新秒杀活动
 | 
			
		||||
     *
 | 
			
		||||
     * @param activityDO 秒杀活动
 | 
			
		||||
     */
 | 
			
		||||
    void updateSeckillActivity(SeckillActivityDO activityDO);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新秒杀活动商品
 | 
			
		||||
     *
 | 
			
		||||
     * @param productDOList 活动商品列表
 | 
			
		||||
     */
 | 
			
		||||
    void updateSeckillActivityProductByList(List<SeckillProductDO> productDOList);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 关闭秒杀活动
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -92,15 +92,9 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
			
		||||
        if (activityId != null) { // 排除自己
 | 
			
		||||
            activityList.removeIf(item -> ObjectUtil.equal(item.getId(), activityId));
 | 
			
		||||
        }
 | 
			
		||||
        // TODO @puhui999:一个 spu,参与两个活动应该没关系,关键是活动时间不充能重叠;
 | 
			
		||||
        // 2.2 过滤出所有 spuId 有交集的活动,判断是否存在重叠
 | 
			
		||||
        List<SeckillActivityDO> activityDOs1 = filterList(activityList, s -> ObjectUtil.equal(s.getSpuId(), spuId));
 | 
			
		||||
        if (isNotEmpty(activityDOs1)) {
 | 
			
		||||
            throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
 | 
			
		||||
        }
 | 
			
		||||
        // 2.3 过滤出所有 configIds 有交集的活动,判断是否存在重叠
 | 
			
		||||
        List<SeckillActivityDO> activityDOs2 = filterList(activityList, s -> containsAny(s.getConfigIds(), configIds));
 | 
			
		||||
        if (isNotEmpty(activityDOs2)) {
 | 
			
		||||
        // 2.2 过滤出所有 configIds 有交集的活动,判断是否存在重叠
 | 
			
		||||
        List<SeckillActivityDO> activityDOs = filterList(activityList, s -> containsAny(s.getConfigIds(), configIds));
 | 
			
		||||
        if (isNotEmpty(activityDOs)) {
 | 
			
		||||
            throw exception(SECKILL_ACTIVITY_SPU_CONFLICTS);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -150,6 +144,16 @@ public class SeckillActivityServiceImpl implements SeckillActivityService {
 | 
			
		||||
        updateSeckillProduct(updateObj, updateReqVO.getProducts());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateSeckillActivity(SeckillActivityDO activityDO) {
 | 
			
		||||
        seckillActivityMapper.updateById(activityDO);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updateSeckillActivityProductByList(List<SeckillProductDO> productDOList) {
 | 
			
		||||
        seckillProductMapper.updateBatch(productDOList);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新秒杀商品
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -1,18 +1,9 @@
 | 
			
		||||
package cn.iocoder.yudao.module.promotion.util;
 | 
			
		||||
 | 
			
		||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
 | 
			
		||||
import cn.iocoder.yudao.module.product.api.sku.dto.ProductSkuRespDTO;
 | 
			
		||||
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Set;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.anyMatch;
 | 
			
		||||
import static cn.iocoder.yudao.module.product.enums.ErrorCodeConstants.SKU_NOT_EXISTS;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 活动工具类
 | 
			
		||||
@@ -31,21 +22,4 @@ public class PromotionUtils {
 | 
			
		||||
        return LocalDateTimeUtils.beforeNow(endTime) ? CommonStatusEnum.DISABLE.getStatus() : CommonStatusEnum.ENABLE.getStatus();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 校验商品 sku 是否都存在
 | 
			
		||||
     *
 | 
			
		||||
     * @param skus     数据库中的商品 skus
 | 
			
		||||
     * @param products 需要校验的商品
 | 
			
		||||
     * @param func     获取需要校验的商品的 skuId
 | 
			
		||||
     */
 | 
			
		||||
    public static <T> void validateProductSkuAllExists(List<ProductSkuRespDTO> skus, List<T> products, Function<T, Long> func) {
 | 
			
		||||
        // 校验 sku 个数是否一致
 | 
			
		||||
        Set<Long> skuIdsSet = CollectionUtils.convertSet(products, func);
 | 
			
		||||
        Set<Long> skuIdsSet1 = CollectionUtils.convertSet(skus, ProductSkuRespDTO::getId);
 | 
			
		||||
        // 校验 skuId 是否存在
 | 
			
		||||
        if (anyMatch(skuIdsSet, s -> !skuIdsSet1.contains(s))) {
 | 
			
		||||
            throw exception(SKU_NOT_EXISTS);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -86,6 +86,11 @@
 | 
			
		||||
            <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.iocoder.boot</groupId>
 | 
			
		||||
            <artifactId>yudao-spring-boot-starter-redis</artifactId>
 | 
			
		||||
        </dependency>
 | 
			
		||||
 | 
			
		||||
        <!-- Test 测试相关 -->
 | 
			
		||||
        <dependency>
 | 
			
		||||
            <groupId>cn.iocoder.boot</groupId>
 | 
			
		||||
 
 | 
			
		||||
@@ -36,6 +36,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
 | 
			
		||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 | 
			
		||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.AFTER_SALE_NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
@Tag(name = "管理后台 - 售后订单")
 | 
			
		||||
@RestController
 | 
			
		||||
@@ -76,6 +77,9 @@ public class TradeAfterSaleController {
 | 
			
		||||
    public CommonResult<TradeAfterSaleDetailRespVO> getOrderDetail(@RequestParam("id") Long id) {
 | 
			
		||||
        // 查询订单
 | 
			
		||||
        TradeAfterSaleDO afterSale = afterSaleService.getAfterSale(id);
 | 
			
		||||
        if (afterSale == null) {
 | 
			
		||||
            return success(null, AFTER_SALE_NOT_FOUND.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
        // 查询订单
 | 
			
		||||
        TradeOrderDO order = tradeOrderQueryService.getOrder(afterSale.getOrderId());
 | 
			
		||||
        // 查询订单项
 | 
			
		||||
@@ -92,7 +96,11 @@ public class TradeAfterSaleController {
 | 
			
		||||
            TradeAfterSaleLogRespDTO respVO = new TradeAfterSaleLogRespDTO();
 | 
			
		||||
            respVO.setId((long) i);
 | 
			
		||||
            respVO.setUserId((long) i);
 | 
			
		||||
            respVO.setUserType(1);
 | 
			
		||||
            respVO.setUserType(i % 2 == 0 ? 2 : 1);
 | 
			
		||||
            // 模拟系统操作
 | 
			
		||||
            if (i == 2) {
 | 
			
		||||
                respVO.setUserType(3);
 | 
			
		||||
            }
 | 
			
		||||
            respVO.setAfterSaleId(id);
 | 
			
		||||
            respVO.setOrderId((long) i);
 | 
			
		||||
            respVO.setOrderItemId((long) i);
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ public class TradeAfterSaleDetailRespVO extends TradeAfterSaleBaseVO {
 | 
			
		||||
    /**
 | 
			
		||||
     * 售后日志
 | 
			
		||||
     */
 | 
			
		||||
    private List<TradeAfterSaleLogRespVO> afterSaleLog;
 | 
			
		||||
    private List<TradeAfterSaleLogRespVO> logs;
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "管理后台 - 交易订单的详情的订单项目")
 | 
			
		||||
    @Data
 | 
			
		||||
 
 | 
			
		||||
@@ -25,6 +25,7 @@ import java.util.Map;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
			
		||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
@Tag(name = "管理后台 - 交易订单")
 | 
			
		||||
@RestController
 | 
			
		||||
@@ -67,6 +68,9 @@ public class TradeOrderController {
 | 
			
		||||
    public CommonResult<TradeOrderDetailRespVO> getOrderDetail(@RequestParam("id") Long id) {
 | 
			
		||||
        // 查询订单
 | 
			
		||||
        TradeOrderDO order = tradeOrderQueryService.getOrder(id);
 | 
			
		||||
        if (order == null) {
 | 
			
		||||
            return success(null, ORDER_NOT_FOUND.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
        // 查询订单项
 | 
			
		||||
        List<TradeOrderItemDO> orderItems = tradeOrderQueryService.getOrderItemListByOrderId(id);
 | 
			
		||||
        // orderLog
 | 
			
		||||
 
 | 
			
		||||
@@ -26,24 +26,23 @@ public class TradeOrderDetailRespVO extends TradeOrderBaseVO {
 | 
			
		||||
    private MemberUserRespVO user;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * TODO 订单操作日志, 先模拟一波;返回 logs,简洁,然后复数哈
 | 
			
		||||
     * TODO 订单操作日志, 先模拟一波
 | 
			
		||||
     */
 | 
			
		||||
    private List<OrderLog> orderLog;
 | 
			
		||||
    private List<OrderLog> logs;
 | 
			
		||||
 | 
			
		||||
    // TODO @puhui999:swagger 注解
 | 
			
		||||
    @Schema(description = "管理后台 - 交易订单的操作日志")
 | 
			
		||||
    @Data
 | 
			
		||||
    public static class OrderLog {
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 内容
 | 
			
		||||
         */
 | 
			
		||||
        @Schema(description = "操作详情", requiredMode = Schema.RequiredMode.REQUIRED, example = "订单发货")
 | 
			
		||||
        private String content;
 | 
			
		||||
 | 
			
		||||
        /**
 | 
			
		||||
         * 创建时间
 | 
			
		||||
         */
 | 
			
		||||
        @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2023-06-01 10:50:20")
 | 
			
		||||
        private LocalDateTime createTime;
 | 
			
		||||
 | 
			
		||||
        @Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
 | 
			
		||||
        private Integer userType;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Schema(description = "管理后台 - 交易订单的详情的订单项目")
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,6 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 | 
			
		||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
 | 
			
		||||
import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
 | 
			
		||||
import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.product.api.property.ProductPropertyValueApi;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.*;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemCommentCreateReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.app.order.vo.item.AppTradeOrderItemRespVO;
 | 
			
		||||
@@ -34,6 +33,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
 | 
			
		||||
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 | 
			
		||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
 | 
			
		||||
 | 
			
		||||
@Tag(name = "用户 App - 交易订单")
 | 
			
		||||
@RestController
 | 
			
		||||
@@ -83,7 +83,7 @@ public class AppTradeOrderController {
 | 
			
		||||
        // 查询订单
 | 
			
		||||
        TradeOrderDO order = tradeOrderQueryService.getOrder(getLoginUserId(), id);
 | 
			
		||||
        if (order == null) {
 | 
			
		||||
            return success(null);
 | 
			
		||||
            return success(null, ORDER_NOT_FOUND.getMsg());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 查询订单项
 | 
			
		||||
 
 | 
			
		||||
@@ -56,6 +56,10 @@ public class AppTradeOrderSettlementReqVO {
 | 
			
		||||
    @Schema(description = "拼团团长编号", example = "2048")
 | 
			
		||||
    private Long combinationHeadId;
 | 
			
		||||
 | 
			
		||||
    // ========== 砍价活动相关字段 ==========
 | 
			
		||||
    @Schema(description = "砍价活动编号", example = "123")
 | 
			
		||||
    private Long bargainActivityId;
 | 
			
		||||
 | 
			
		||||
    @Data
 | 
			
		||||
    @Schema(description = "用户 App - 商品项")
 | 
			
		||||
    @Valid
 | 
			
		||||
 
 | 
			
		||||
@@ -78,7 +78,7 @@ public interface TradeAfterSaleConvert {
 | 
			
		||||
        // 处理订单信息
 | 
			
		||||
        respVO.setOrder(convert(order));
 | 
			
		||||
        // 处理售后日志
 | 
			
		||||
        respVO.setAfterSaleLog(convertList1(logs));
 | 
			
		||||
        respVO.setLogs(convertList1(logs));
 | 
			
		||||
        return respVO;
 | 
			
		||||
    }
 | 
			
		||||
    List<TradeAfterSaleLogRespVO> convertList1(List<TradeAfterSaleLogRespDTO> list);
 | 
			
		||||
 
 | 
			
		||||
@@ -95,6 +95,7 @@ public interface TradeOrderConvert {
 | 
			
		||||
        items.forEach(item -> item.setIncrCount(-item.getIncrCount()));
 | 
			
		||||
        return new ProductSkuUpdateStockReqDTO(items);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    List<ProductSkuUpdateStockReqDTO.Item> convertList(List<TradeOrderItemDO> list);
 | 
			
		||||
 | 
			
		||||
    @Mappings({
 | 
			
		||||
@@ -153,9 +154,10 @@ public interface TradeOrderConvert {
 | 
			
		||||
            TradeOrderDetailRespVO.OrderLog orderLog = new TradeOrderDetailRespVO.OrderLog();
 | 
			
		||||
            orderLog.setContent("订单操作" + i);
 | 
			
		||||
            orderLog.setCreateTime(LocalDateTime.now());
 | 
			
		||||
            orderLog.setUserType(i % 2 == 0 ? 2 : 1);
 | 
			
		||||
            orderLogs.add(orderLog);
 | 
			
		||||
        }
 | 
			
		||||
        orderVO.setOrderLog(orderLogs);
 | 
			
		||||
        orderVO.setLogs(orderLogs);
 | 
			
		||||
        return orderVO;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,35 @@
 | 
			
		||||
package cn.iocoder.yudao.module.trade.dal.redis.no;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.date.DatePattern;
 | 
			
		||||
import cn.hutool.core.date.DateUtil;
 | 
			
		||||
import org.springframework.data.redis.core.StringRedisTemplate;
 | 
			
		||||
import org.springframework.stereotype.Repository;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Resource;
 | 
			
		||||
import java.time.LocalDateTime;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 订单序号的 Redis DAO
 | 
			
		||||
 *
 | 
			
		||||
 * @author HUIHUI
 | 
			
		||||
 */
 | 
			
		||||
@Repository
 | 
			
		||||
public class TradeOrderNoRedisDAO {
 | 
			
		||||
    public static final String TRADE_ORDER_NO_PREFIX = "O";
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private StringRedisTemplate stringRedisTemplate;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 生成序号
 | 
			
		||||
     *
 | 
			
		||||
     * @param prefix 前缀
 | 
			
		||||
     * @return 序号
 | 
			
		||||
     */
 | 
			
		||||
    public String generate(String prefix) {
 | 
			
		||||
        String noPrefix = prefix + DateUtil.format(LocalDateTime.now(), DatePattern.PURE_DATETIME_PATTERN);
 | 
			
		||||
        Long no = stringRedisTemplate.opsForValue().increment(noPrefix);
 | 
			
		||||
        return noPrefix + no;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@@ -90,12 +90,7 @@ public class TradeAfterSaleServiceImpl implements TradeAfterSaleService, AfterSa
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public TradeAfterSaleDO getAfterSale(Long id) {
 | 
			
		||||
        TradeAfterSaleDO afterSale = tradeAfterSaleMapper.selectById(id);
 | 
			
		||||
        // TODO @puhui999;读不到,不要这里报错哈;交给前端报错;一般是读取信息不到,message 提示,然后 close tab;
 | 
			
		||||
        if (afterSale == null) {
 | 
			
		||||
            throw exception(AFTER_SALE_NOT_FOUND);
 | 
			
		||||
        }
 | 
			
		||||
        return afterSale;
 | 
			
		||||
        return tradeAfterSaleMapper.selectById(id);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO 芋艿:拼团失败,要不要发起售后的方式退款?还是走取消逻辑?
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.trade.service.order;
 | 
			
		||||
 | 
			
		||||
import cn.hutool.core.collection.CollUtil;
 | 
			
		||||
import cn.hutool.core.lang.Assert;
 | 
			
		||||
import cn.hutool.core.util.IdUtil;
 | 
			
		||||
import cn.hutool.core.util.ObjectUtil;
 | 
			
		||||
import cn.hutool.core.util.StrUtil;
 | 
			
		||||
import cn.hutool.extra.spring.SpringUtil;
 | 
			
		||||
@@ -27,12 +26,14 @@ import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.product.api.comment.ProductCommentApi;
 | 
			
		||||
import cn.iocoder.yudao.module.product.api.comment.dto.ProductCommentCreateReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.product.api.sku.ProductSkuApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.bargain.BargainActivityApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.bargain.BargainRecordApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.CombinationRecordApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordRespDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.combination.dto.CombinationRecordUpdateStatusReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.coupon.CouponApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.coupon.dto.CouponUseReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.seckill.SeckillActivityApi;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.api.seckill.dto.SeckillActivityUpdateStockReqDTO;
 | 
			
		||||
import cn.iocoder.yudao.module.promotion.enums.combination.CombinationRecordStatusEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderDeliveryReqVO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.controller.admin.order.vo.TradeOrderRemarkReqVO;
 | 
			
		||||
@@ -48,6 +49,7 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.dal.redis.no.TradeOrderNoRedisDAO;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.enums.delivery.DeliveryTypeEnum;
 | 
			
		||||
import cn.iocoder.yudao.module.trade.enums.order.*;
 | 
			
		||||
@@ -73,7 +75,7 @@ import java.util.Set;
 | 
			
		||||
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 | 
			
		||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
 | 
			
		||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
 | 
			
		||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_EQUAL;
 | 
			
		||||
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.ORDER_UPDATE_PRICE_FAIL_PAID;
 | 
			
		||||
import static cn.iocoder.yudao.module.trade.enums.ErrorCodeConstants.*;
 | 
			
		||||
 | 
			
		||||
@@ -91,6 +93,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
    private TradeOrderMapper tradeOrderMapper;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TradeOrderItemMapper tradeOrderItemMapper;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private TradeOrderNoRedisDAO orderNoRedisDAO;
 | 
			
		||||
 | 
			
		||||
    @Resource
 | 
			
		||||
    private CartService cartService;
 | 
			
		||||
@@ -114,6 +118,10 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
    @Resource
 | 
			
		||||
    private BargainRecordApi bargainRecordApi;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private SeckillActivityApi seckillActivityApi;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private BargainActivityApi bargainActivityApi;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private MemberUserApi memberUserApi;
 | 
			
		||||
    @Resource
 | 
			
		||||
    private MemberLevelApi memberLevelApi;
 | 
			
		||||
@@ -194,6 +202,19 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
        // TODO @puhui999:这个逻辑,先抽个小方法;未来要通过设计模式,把这些拼团之类的逻辑,抽象出去
 | 
			
		||||
        // 拼团
 | 
			
		||||
        if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
 | 
			
		||||
            createCombinationRecord(userId, createReqVO, orderItems, order);
 | 
			
		||||
        }
 | 
			
		||||
        // 3.2 秒杀的特殊逻辑
 | 
			
		||||
        if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        // 3.3 砍价的特殊逻辑
 | 
			
		||||
 | 
			
		||||
        // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
 | 
			
		||||
        return order;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void createCombinationRecord(Long userId, AppTradeOrderCreateReqVO createReqVO, List<TradeOrderItemDO> orderItems, TradeOrderDO order) {
 | 
			
		||||
        MemberUserRespDTO user = memberUserApi.getUser(userId);
 | 
			
		||||
        List<CombinationRecordRespDTO> recordRespDTOS = combinationRecordApi.getRecordListByUserIdAndActivityId(userId, createReqVO.getCombinationActivityId());
 | 
			
		||||
        // TODO 拼团一次应该只能选择一种规格的商品
 | 
			
		||||
@@ -208,16 +229,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
 | 
			
		||||
        combinationRecordApi.createCombinationRecord(TradeOrderConvert.INSTANCE.convert(order, orderItemDO, createReqVO, user));
 | 
			
		||||
    }
 | 
			
		||||
        // 3.2 秒杀的特殊逻辑
 | 
			
		||||
        // TODO 秒杀扣减库存是下单就扣除还是等待订单支付成功再扣除
 | 
			
		||||
        if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), order.getType())) {
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
        // 3.3 砍价的特殊逻辑
 | 
			
		||||
 | 
			
		||||
        // TODO @LeeYan9: 是可以思考下, 订单的营销优惠记录, 应该记录在哪里, 微信讨论起来!
 | 
			
		||||
        return order;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO @puhui999:订单超时,自动取消;
 | 
			
		||||
 | 
			
		||||
@@ -245,8 +256,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
            address = validateAddress(userId, createReqVO.getAddressId());
 | 
			
		||||
        }
 | 
			
		||||
        TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(userId, clientIp, createReqVO, calculateRespBO, address);
 | 
			
		||||
        String no = orderNoRedisDAO.generate(TradeOrderNoRedisDAO.TRADE_ORDER_NO_PREFIX);
 | 
			
		||||
        order.setType(validateActivity(createReqVO));
 | 
			
		||||
        order.setNo(IdUtil.getSnowflakeNextId() + ""); // TODO @puhui999: 参考支付订单,的 no 生成哈;
 | 
			
		||||
        order.setNo(no);
 | 
			
		||||
        order.setStatus(TradeOrderStatusEnum.UNPAID.getStatus());
 | 
			
		||||
        order.setRefundStatus(TradeOrderRefundStatusEnum.NONE.getStatus());
 | 
			
		||||
        order.setProductCount(getSumValue(calculateRespBO.getItems(), TradePriceCalculateRespBO.OrderItem::getCount, Integer::sum));
 | 
			
		||||
@@ -298,19 +310,23 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
    private void afterCreateTradeOrder(Long userId, AppTradeOrderCreateReqVO createReqVO,
 | 
			
		||||
                                       TradeOrderDO tradeOrderDO, List<TradeOrderItemDO> orderItems,
 | 
			
		||||
                                       TradePriceCalculateRespBO calculateRespBO) {
 | 
			
		||||
        // 下单时扣减商品库存
 | 
			
		||||
        // TODO @puhui999:扣库存,需要前置;
 | 
			
		||||
        Integer count = getSumValue(orderItems, TradeOrderItemDO::getCount, Integer::sum);
 | 
			
		||||
        // 1)如果是秒杀商品:额外扣减秒杀的库存;
 | 
			
		||||
        // 2)如果是拼团活动:额外扣减拼团的库存;
 | 
			
		||||
        // 3)如果是砍价活动:额外扣减砍价的库存;
 | 
			
		||||
        productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems));
 | 
			
		||||
 | 
			
		||||
        // 删除购物车商品
 | 
			
		||||
        Set<Long> cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId);
 | 
			
		||||
        if (CollUtil.isNotEmpty(cartIds)) {
 | 
			
		||||
            cartService.deleteCart(userId, cartIds);
 | 
			
		||||
        if (Objects.equals(TradeOrderTypeEnum.SECKILL.getType(), tradeOrderDO.getType())) {
 | 
			
		||||
            SeckillActivityUpdateStockReqDTO updateStockReqDTO = new SeckillActivityUpdateStockReqDTO();
 | 
			
		||||
            updateStockReqDTO.setActivityId(createReqVO.getSeckillActivityId());
 | 
			
		||||
            updateStockReqDTO.setCount(count);
 | 
			
		||||
            updateStockReqDTO.setItems(CollectionUtils.convertList(orderItems, item -> {
 | 
			
		||||
                SeckillActivityUpdateStockReqDTO.Item item1 = new SeckillActivityUpdateStockReqDTO.Item();
 | 
			
		||||
                item1.setSpuId(item.getSpuId());
 | 
			
		||||
                item1.setSkuId(item.getSkuId());
 | 
			
		||||
                item1.setCount(item.getCount());
 | 
			
		||||
                return item1;
 | 
			
		||||
            }));
 | 
			
		||||
            seckillActivityApi.updateSeckillStock(updateStockReqDTO);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2)如果是砍价活动:额外扣减砍价的库存;
 | 
			
		||||
        bargainActivityApi.updateBargainActivityStock(createReqVO.getBargainActivityId(), count);
 | 
			
		||||
        // 扣减积分 TODO 芋艿:待实现,需要前置;
 | 
			
		||||
        // 这个是不是应该放到支付成功之后?如果支付后的话,可能积分可以重复使用哈。资源类,都要预扣
 | 
			
		||||
 | 
			
		||||
@@ -320,6 +336,15 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
                    .setOrderId(tradeOrderDO.getId()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 下单时扣减商品库存
 | 
			
		||||
        productSkuApi.updateSkuStock(TradeOrderConvert.INSTANCE.convertNegative(orderItems));
 | 
			
		||||
 | 
			
		||||
        // 删除购物车商品
 | 
			
		||||
        Set<Long> cartIds = convertSet(createReqVO.getItems(), AppTradeOrderSettlementReqVO.Item::getCartId);
 | 
			
		||||
        if (CollUtil.isNotEmpty(cartIds)) {
 | 
			
		||||
            cartService.deleteCart(userId, cartIds);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 生成预支付
 | 
			
		||||
        createPayOrder(tradeOrderDO, orderItems, calculateRespBO);
 | 
			
		||||
 | 
			
		||||
@@ -356,8 +381,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
        // 1、拼团活动
 | 
			
		||||
        if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
 | 
			
		||||
            // 更新拼团状态 TODO puhui999:订单支付失败或订单支付过期删除这条拼团记录
 | 
			
		||||
            combinationRecordApi.updateCombinationRecordStatus(new CombinationRecordUpdateStatusReqDTO().setUserId(order.getUserId())
 | 
			
		||||
                    .setOrderId(order.getId()).setStatus(CombinationRecordStatusEnum.IN_PROGRESS.getStatus()).setStartTime(LocalDateTime.now()));
 | 
			
		||||
            combinationRecordApi.updateRecordStatusToInProgress(order.getUserId(), order.getId(), LocalDateTime.now());
 | 
			
		||||
        }
 | 
			
		||||
        // TODO 芋艿:发送订单变化的消息
 | 
			
		||||
 | 
			
		||||
@@ -472,11 +496,6 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
     */
 | 
			
		||||
    private TradeOrderDO validateOrderDeliverable(Long id) {
 | 
			
		||||
        TradeOrderDO order = validateOrderExists(id);
 | 
			
		||||
        // 校验订单是否是待发货状态
 | 
			
		||||
        // TODO @puhui999:已经发货,可以重新发货,修改信息;
 | 
			
		||||
        if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) {
 | 
			
		||||
            throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED);
 | 
			
		||||
        }
 | 
			
		||||
        // 校验订单是否退款
 | 
			
		||||
        if (ObjectUtil.notEqual(TradeOrderRefundStatusEnum.NONE.getStatus(), order.getRefundStatus())) {
 | 
			
		||||
            throw exception(ORDER_DELIVERY_FAIL_REFUND_STATUS_NOT_NONE);
 | 
			
		||||
@@ -548,14 +567,25 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
 | 
			
		||||
        if (order.getPayStatus()) {
 | 
			
		||||
            throw exception(ORDER_UPDATE_PRICE_FAIL_PAID);
 | 
			
		||||
        }
 | 
			
		||||
        // TODO @puhui999:如果改价,需要校验下是否真的变化;
 | 
			
		||||
        if (ObjectUtil.equal(order.getAdjustPrice(), reqVO.getAdjustPrice())) {
 | 
			
		||||
            throw exception(ORDER_UPDATE_PRICE_FAIL_EQUAL);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 更新
 | 
			
		||||
        // TODO @puhui999:TradeOrderItemDO 需要做 adjustPrice 的分摊;另外,支付订单那的价格,需要 update 下;
 | 
			
		||||
        List<TradeOrderItemDO> itemDOs = tradeOrderItemMapper.selectListByOrderId(order.getId());
 | 
			
		||||
        // TradeOrderItemDO 需要做 adjustPrice 的分摊
 | 
			
		||||
        int price = reqVO.getAdjustPrice() / itemDOs.size();
 | 
			
		||||
        itemDOs.forEach(item -> {
 | 
			
		||||
            item.setAdjustPrice(price);
 | 
			
		||||
        });
 | 
			
		||||
        // 更新 TradeOrderItem
 | 
			
		||||
        tradeOrderItemMapper.updateBatch(itemDOs);
 | 
			
		||||
        // 更新订单
 | 
			
		||||
        TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO);
 | 
			
		||||
        update.setPayPrice(update.getPayPrice() + update.getAdjustPrice());
 | 
			
		||||
        // TODO @芋艿:改价时,赠送的积分,要不要做改动???
 | 
			
		||||
        tradeOrderMapper.updateById(update);
 | 
			
		||||
        // 更新支付订单
 | 
			
		||||
        payOrderApi.updatePayOrderPriceById(order.getPayOrderId(), update.getPayPrice());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 
 | 
			
		||||
@@ -29,4 +29,11 @@ public interface PayOrderApi {
 | 
			
		||||
     */
 | 
			
		||||
    PayOrderRespDTO getOrder(Long id);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新支付订单价格
 | 
			
		||||
     *
 | 
			
		||||
     * @param payOrderId 支付单编号
 | 
			
		||||
     * @param payPrice   支付单价格
 | 
			
		||||
     */
 | 
			
		||||
    void updatePayOrderPriceById(Long payOrderId, Integer payPrice);
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -28,6 +28,7 @@ public interface ErrorCodeConstants {
 | 
			
		||||
    ErrorCode ORDER_SUBMIT_CHANNEL_ERROR = new ErrorCode(1007002004, "发起支付报错,错误码:{},错误提示:{}");
 | 
			
		||||
    ErrorCode ORDER_REFUND_FAIL_STATUS_ERROR = new ErrorCode(1007002005, "支付订单退款失败,原因:状态不是已支付或已退款");
 | 
			
		||||
    ErrorCode ORDER_UPDATE_PRICE_FAIL_PAID = new ErrorCode(1007002006, "支付订单调价失败,原因:支付订单已付款,不能调价");
 | 
			
		||||
    ErrorCode ORDER_UPDATE_PRICE_FAIL_EQUAL = new ErrorCode(1007002007, "支付订单调价失败,原因:价格没有变化");
 | 
			
		||||
 | 
			
		||||
    // ========== ORDER 模块(拓展单) 1007003000 ==========
 | 
			
		||||
    ErrorCode ORDER_EXTENSION_NOT_FOUND = new ErrorCode(1007003000, "支付交易拓展单不存在");
 | 
			
		||||
 
 | 
			
		||||
@@ -31,4 +31,10 @@ public class PayOrderApiImpl implements PayOrderApi {
 | 
			
		||||
        return PayOrderConvert.INSTANCE.convert2(order);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updatePayOrderPriceById(Long payOrderId, Integer payPrice) {
 | 
			
		||||
        payOrderService.updatePayOrderPriceById(payOrderId, payPrice);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -98,6 +98,14 @@ public interface PayOrderService {
 | 
			
		||||
     */
 | 
			
		||||
    void updateOrderRefundPrice(Long id, Integer incrRefundPrice);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 更新支付订单价格
 | 
			
		||||
     *
 | 
			
		||||
     * @param payOrderId 支付单编号
 | 
			
		||||
     * @param payPrice   支付单价格
 | 
			
		||||
     */
 | 
			
		||||
    void updatePayOrderPriceById(Long payOrderId, Integer payPrice);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * 获得支付订单
 | 
			
		||||
     *
 | 
			
		||||
 
 | 
			
		||||
@@ -411,6 +411,17 @@ public class PayOrderServiceImpl implements PayOrderService {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void updatePayOrderPriceById(Long payOrderId, Integer payPrice) {
 | 
			
		||||
        PayOrderDO order = orderMapper.selectById(payOrderId);
 | 
			
		||||
        if (order == null) {
 | 
			
		||||
            throw exception(ORDER_NOT_FOUND);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        order.setPrice(payPrice);
 | 
			
		||||
        orderMapper.updateById(order);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public PayOrderExtensionDO getOrderExtension(Long id) {
 | 
			
		||||
        return orderExtensionMapper.selectById(id);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user