1.展示店铺的商品数量、收藏数量

2.动态时间优惠券进行状态判断。
3.导出订单API
This commit is contained in:
lifenlong 2021-06-04 15:42:35 +08:00
parent 9db40c197d
commit 73002148d4
10 changed files with 189 additions and 70 deletions

View File

@ -1,12 +1,12 @@
package cn.lili.timetask.handler.impl.promotion;
import cn.hutool.core.date.DateTime;
import cn.lili.modules.order.cart.entity.vo.FullDiscountVO;
import cn.lili.modules.promotion.entity.dos.MemberCoupon;
import cn.lili.modules.promotion.entity.dos.PromotionGoods;
import cn.lili.modules.promotion.entity.dos.Seckill;
import cn.lili.modules.promotion.entity.enums.MemberCouponStatusEnum;
import cn.lili.modules.promotion.entity.enums.PromotionStatusEnum;
import cn.lili.modules.promotion.entity.vos.CouponVO;
import cn.lili.modules.promotion.entity.vos.PintuanVO;
import cn.lili.modules.promotion.service.*;
import cn.lili.modules.search.service.EsGoodsIndexService;
@ -66,7 +66,6 @@ public class PromotionEverydayExecute implements EveryDayExecute {
private SeckillService seckillService;
/**
* 将已过期的促销活动置为结束
*/
@ -81,11 +80,11 @@ public class PromotionEverydayExecute implements EveryDayExecute {
List<String> promotionIds = new ArrayList<>();
//关闭满减活动
endFullDiscount(promotionIds,query);
endFullDiscount(promotionIds, query);
//关闭拼团活动
endPintuan(promotionIds,query);
endPintuan(promotionIds, query);
//关闭优惠券
endCoupon(promotionIds,query);
endCoupon();
//每日新增秒杀活动
addSeckill();
promotionGoodsService.update(this.getUpdatePromotionGoodsWrapper(promotionIds));
@ -96,19 +95,20 @@ public class PromotionEverydayExecute implements EveryDayExecute {
* 从系统设置中获取秒杀活动的配置
* 添加30天后的秒杀活动
*/
private void addSeckill(){
private void addSeckill() {
Setting setting = settingService.get(SettingEnum.SECKILL_SETTING.name());
SeckillSetting seckillSetting=new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
Seckill seckill=new Seckill(seckillSetting.getHours(),seckillSetting.getSeckillRule());
SeckillSetting seckillSetting = new Gson().fromJson(setting.getSettingValue(), SeckillSetting.class);
Seckill seckill = new Seckill(seckillSetting.getHours(), seckillSetting.getSeckillRule());
seckillService.saveSeckill(seckill);
}
/**
* 修改满额活动下的商品
*
* @param promotionIds 促销活动ID
* @param query 查询Wrapper
* @param query 查询Wrapper
*/
private void endFullDiscount(List<String> promotionIds,Query query){
private void endFullDiscount(List<String> promotionIds, Query query) {
//关闭满减活动
List<FullDiscountVO> fullDiscountVOS = mongoTemplate.find(query, FullDiscountVO.class);
if (!fullDiscountVOS.isEmpty()) {
@ -131,10 +131,11 @@ public class PromotionEverydayExecute implements EveryDayExecute {
/**
* 修改拼团活动下的商品
*
* @param promotionIds 促销活动ID
* @param query 查询Wrapper
* @param query 查询Wrapper
*/
private void endPintuan(List<String> promotionIds,Query query){
private void endPintuan(List<String> promotionIds, Query query) {
List<PintuanVO> pintuanVOS = mongoTemplate.find(query, PintuanVO.class);
if (!pintuanVOS.isEmpty()) {
//准备修改活动的id
@ -157,36 +158,19 @@ public class PromotionEverydayExecute implements EveryDayExecute {
/**
* 修改优惠券下的商品
* @param promotionIds 促销活动ID
* @param query 查询Wrapper
*/
private void endCoupon(List<String> promotionIds,Query query){
List<CouponVO> couponVOS = mongoTemplate.find(query, CouponVO.class);
if (!couponVOS.isEmpty()) {
List<String> ids = new ArrayList<>();
for (CouponVO vo : couponVOS) {
vo.setPromotionStatus(PromotionStatusEnum.END.name());
if (vo.getPromotionGoodsList() != null && !vo.getPromotionGoodsList().isEmpty()) {
for (PromotionGoods promotionGoods : vo.getPromotionGoodsList()) {
promotionGoods.setPromotionStatus(PromotionStatusEnum.END.name());
esGoodsIndexService.deleteEsGoodsPromotionByPromotionId(promotionGoods.getSkuId(), vo.getId());
}
}
mongoTemplate.save(vo);
ids.add(vo.getId());
}
couponService.update(this.getUpdatePromotionWrapper(ids));
LambdaUpdateWrapper<MemberCoupon> memberCouponLambdaUpdateWrapper = new LambdaUpdateWrapper<MemberCoupon>()
.in(MemberCoupon::getCouponId, ids)
.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
memberCouponService.update(memberCouponLambdaUpdateWrapper);
promotionIds.addAll(ids);
}
private void endCoupon() {
//修改超时的动态时间优惠券的状态
LambdaUpdateWrapper<MemberCoupon> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.NEW.name())
.le(MemberCoupon::getEndTime, new DateTime())
.set(MemberCoupon::getMemberCouponStatus, MemberCouponStatusEnum.EXPIRE.name());
memberCouponService.update(lambdaUpdateWrapper);
}
/**
* 获取促销修改查询条件 修改活动状态
*
* @param ids 促销活动ID
* @return 促销活动商品查询Wrapper
*/
@ -196,8 +180,10 @@ public class PromotionEverydayExecute implements EveryDayExecute {
updateWrapper.set("promotion_status", PromotionStatusEnum.END.name());
return updateWrapper;
}
/**
* 获取商品的促销修改查询条件 修改商品状态
*
* @param ids 促销活动ID
* @return 促销活动商品修改Wrapper
*/

View File

@ -0,0 +1,95 @@
package cn.lili.modules.order.order.entity.dto;
import cn.lili.modules.order.order.entity.enums.DeliverStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderStatusEnum;
import cn.lili.modules.order.order.entity.enums.PayStatusEnum;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* 订单导出DTO
* @author Bulbasaur
* @date: 2021/6/3 6:36 下午
*
*/
@Data
public class OrderExportDTO {
@ApiModelProperty("订单编号")
private String sn;
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value = "创建时间")
private Date createTime;
@ApiModelProperty(value = "用户名")
private String memberName;
@ApiModelProperty(value = "收件人姓名")
private String consigneeName;
@ApiModelProperty(value = "收件人手机")
private String consigneeMobile;
@ApiModelProperty(value = "收件人地址")
private String consigneeAddressPath;
@ApiModelProperty(value = "详细地址")
private String consigneeDetail;
@ApiModelProperty(value = "支付方式")
private String paymentMethod;
@ApiModelProperty(value = "物流公司名称")
private String logisticsName;
@ApiModelProperty(value = "运费")
private Double freightPrice;
@ApiModelProperty(value = "商品价格")
private Double goodsPrice;
@ApiModelProperty(value = "优惠的金额")
private Double discountPrice;
@ApiModelProperty(value = "总价格")
private Double flowPrice;
@ApiModelProperty(value = "商品名称")
private String goodsName;
@ApiModelProperty(value = "商品数量")
private Integer num;
@ApiModelProperty(value = "买家订单备注")
private String remark;
/**
* @see OrderStatusEnum
*/
@ApiModelProperty(value = "订单状态")
private String orderStatus;
/**
* @see PayStatusEnum
*/
@ApiModelProperty(value = "付款状态")
private String payStatus;
/**
* @see DeliverStatusEnum
*/
@ApiModelProperty(value = "货运状态")
private String deliverStatus;
@ApiModelProperty(value = "是否需要发票")
private Boolean needReceipt;
@ApiModelProperty(value = "店铺名称")
private String storeName;
}

View File

@ -204,9 +204,6 @@ public class OrderSearchParams extends PageVO {
wrapper.like("o.client_type", clientType);
}
wrapper.eq("o.delete_flag", false);
wrapper.groupBy("o.id");
wrapper.orderByDesc("o.id");
return wrapper;
}

View File

@ -1,6 +1,7 @@
package cn.lili.modules.order.order.mapper;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
import cn.lili.modules.order.order.entity.vo.PaymentLog;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
@ -38,6 +39,11 @@ public interface OrderMapper extends BaseMapper<Order> {
" FROM li_order o INNER JOIN li_order_item AS oi on o.sn = oi.order_sn ${ew.customSqlSegment} ")
IPage<OrderSimpleVO> queryByParams(IPage<OrderSimpleVO> page, @Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
@Select("SELECT o.sn,o.create_time,o.member_name,o.consignee_name,o.consignee_mobile,o.consignee_address_path,o.consignee_detail," +
"o.payment_method, o.logistics_name,o.freight_price,o.goods_price,o.discount_price,o.flow_price,oi.goods_name,oi.num," +
"o.remark,o.order_status,o.pay_status,o.deliver_status,o.need_receipt,o.store_name FROM li_order_item oi INNER JOIN li_order o ON oi.order_sn=o.sn")
List<OrderExportDTO> queryExportOrder(@Param(Constants.WRAPPER) Wrapper<OrderSimpleVO> queryWrapper);
@Select("select * from li_order ${ew.customSqlSegment} ")
IPage<PaymentLog> queryPaymentLogs(IPage<PaymentLog> page, @Param(Constants.WRAPPER) Wrapper<PaymentLog> queryWrapper);

View File

@ -5,6 +5,7 @@ import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.cart.entity.dto.TradeDTO;
import cn.lili.modules.order.order.entity.dos.Order;
import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO;
import cn.lili.modules.order.order.entity.dto.OrderExportDTO;
import cn.lili.modules.order.order.entity.dto.OrderMessage;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
@ -49,6 +50,14 @@ public interface OrderService extends IService<Order> {
*/
IPage<OrderSimpleVO> queryByParams(OrderSearchParams orderSearchParams);
/**
* 查询导出订单列表
* @param orderSearchParams 查询参数
* @return 导出订单列表
*/
List<OrderExportDTO> queryExportOrder(OrderSearchParams orderSearchParams);
/**
* 订单详细
*

View File

@ -37,10 +37,7 @@ import cn.lili.modules.order.order.aop.OrderLogPoint;
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.dos.Receipt;
import cn.lili.modules.order.order.entity.dto.OrderBatchDeliverDTO;
import cn.lili.modules.order.order.entity.dto.OrderMessage;
import cn.lili.modules.order.order.entity.dto.OrderSearchParams;
import cn.lili.modules.order.order.entity.dto.PriceDetailDTO;
import cn.lili.modules.order.order.entity.dto.*;
import cn.lili.modules.order.order.entity.enums.*;
import cn.lili.modules.order.order.entity.vo.OrderDetailVO;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
@ -176,7 +173,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
@Override
public IPage<OrderSimpleVO> queryByParams(OrderSearchParams orderSearchParams) {
return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), orderSearchParams.queryWrapper());
QueryWrapper queryWrapper=orderSearchParams.queryWrapper();
queryWrapper.groupBy("o.id");
queryWrapper.orderByDesc("o.id");
return this.baseMapper.queryByParams(PageUtil.initPage(orderSearchParams), queryWrapper);
}
@Override
public List<OrderExportDTO> queryExportOrder(OrderSearchParams orderSearchParams) {
return this.baseMapper.queryExportOrder(orderSearchParams.queryWrapper());
}
@Override

View File

@ -26,8 +26,6 @@ public class CouponActivity extends BasePromotion {
/**
* @see CouponActivityTypeEnum
* @author Bulbasaur
* @date: 2021/5/24 10:28 上午
*
*/
@NotNull(message = "优惠券活动类型不能为空")

View File

@ -87,16 +87,19 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
this.save(coupon);
// 如果优惠券类型为部分商品则将促销活动商品更新
this.updateScopePromotionGoods(coupon);
// 保存到MONGO中
this.mongoTemplate.save(coupon);
PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
coupon.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(coupon.getStartTime().getTime()));
// 如果是动态时间优惠券不走延时任务
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
// 保存到MONGO中
this.mongoTemplate.save(coupon);
PromotionMessage promotionMessage = new PromotionMessage(coupon.getId(), PromotionTypeEnum.COUPON.name(), PromotionStatusEnum.START.name(), coupon.getStartTime(), coupon.getEndTime());
TimeTriggerMsg timeTriggerMsg = new TimeTriggerMsg(TimeExecuteConstant.PROMOTION_EXECUTOR,
coupon.getStartTime().getTime(),
promotionMessage,
DelayQueueTools.wrapperUniqueKey(DelayQueueType.PROMOTION, (promotionMessage.getPromotionType() + promotionMessage.getPromotionId())),
rocketmqCustomProperties.getPromotionTopic());
// 发送促销活动开始的延时任务
this.timeTrigger.addDelay(timeTriggerMsg, DateUtil.getDelayTime(coupon.getStartTime().getTime()));
}
return coupon;
}
@ -263,31 +266,37 @@ public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> impleme
* @param coupon 优惠券信息
*/
private void checkParam(CouponVO coupon) {
//判断优惠券领取数量限制
if (coupon.getCouponLimitNum() < 0) {
throw new ServiceException("领取限制数量不能为负数");
}
//领取数量不能超过发放数量
if (coupon.getCouponLimitNum() > coupon.getPublishNum()) {
throw new ServiceException("领取限制数量超出发行数量");
}
//判断优惠券面额
if (coupon.getCouponType().equals(CouponTypeEnum.PRICE.name()) && coupon.getPrice() > coupon.getConsumeThreshold()) {
throw new ServiceException("优惠券面额必须小于优惠券消费限额");
} else if (coupon.getCouponType().equals(CouponTypeEnum.DISCOUNT.name()) && (coupon.getCouponDiscount() < 0 && coupon.getCouponDiscount() > 10)) {
throw new ServiceException("优惠券折扣必须小于10且大于0");
}
//判断优惠券时间
long nowTime = DateUtil.getDateline() * 1000;
if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) {
throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作");
if (coupon.getRangeDayType().equals(CouponRangeDayEnum.FIXEDTIME.name())) {
if (coupon.getStartTime().getTime() < nowTime && coupon.getEndTime().getTime() > nowTime) {
throw new ServiceException("活动时间小于当前时间,不能进行编辑删除操作");
}
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime());
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
this.promotionStatusEmpty(coupon);
} else {
//动态时间优惠券需设置有限期并为活动赠送优惠券
if (coupon.getEffectiveDays() == null || coupon.getGetType().equals(CouponGetEnum.FREE.name())) {
throw new ServiceException("活动赠送优惠券需设置有限期");
}
}
PromotionTools.checkPromotionTime(coupon.getStartTime().getTime(), coupon.getEndTime().getTime());
this.checkCouponScope(coupon);
//对状态的处理.如果未传递状态则需要 根据当前时间来确认优惠券状态
this.promotionStatusEmpty(coupon);
}
/**

View File

@ -43,9 +43,16 @@ public class StoreBasicInfoVO {
@ApiModelProperty(value = "是否自营")
private String selfOperated;
@ApiModelProperty(value = "商品数量")
private Integer goodsNum;
@ApiModelProperty(value = "收藏数量")
private Integer collectionNum;
@ApiModelProperty(value = "腾讯云智服唯一标识")
private String yzfSign;
@ApiModelProperty(value = "腾讯云智服小程序唯一标识")
private String yzfMpSign;
}

View File

@ -1,10 +1,10 @@
package cn.lili.controller.trade;
import cn.lili.common.enums.ResultCode;
import cn.lili.common.enums.ResultUtil;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
import cn.lili.modules.order.order.entity.dos.Order;
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.vo.OrderDetailVO;
import cn.lili.modules.order.order.entity.vo.OrderSimpleVO;
@ -21,6 +21,7 @@ import springfox.documentation.annotations.ApiIgnore;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;
/**
* 管理端,订单API
@ -31,7 +32,6 @@ import javax.validation.constraints.NotNull;
@RestController
@RequestMapping("/manager/orders")
@Api(tags = "管理端,订单API")
public class OrderManagerController {
//订单
@ -48,6 +48,13 @@ public class OrderManagerController {
return ResultUtil.data(orderService.queryByParams(orderSearchParams));
}
@ApiOperation(value = "查询订单导出列表")
@GetMapping("/queryExportOrder")
public ResultMessage<List<OrderExportDTO>> queryExportOrder(OrderSearchParams orderSearchParams) {
return ResultUtil.data(orderService.queryExportOrder(orderSearchParams));
}
@ApiOperation(value = "订单明细")
@ApiImplicitParam(name = "orderSn", value = "订单编号", required = true, dataType = "String", paramType = "path")
@GetMapping(value = "/{orderSn}")