diff --git a/src/main/java/com/ycwl/basic/biz/CouponBiz.java b/src/main/java/com/ycwl/basic/biz/CouponBiz.java new file mode 100644 index 0000000..96130d4 --- /dev/null +++ b/src/main/java/com/ycwl/basic/biz/CouponBiz.java @@ -0,0 +1,91 @@ +package com.ycwl.basic.biz; + +import com.ycwl.basic.mapper.CouponMapper; +import com.ycwl.basic.mapper.CouponRecordMapper; +import com.ycwl.basic.model.pc.coupon.entity.CouponEntity; +import com.ycwl.basic.model.pc.couponRecord.entity.CouponRecordEntity; +import com.ycwl.basic.model.pc.couponRecord.resp.CouponRecordQueryResp; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Optional; + +@Component +public class CouponBiz { + @Autowired + private CouponMapper couponMapper; + @Autowired + private CouponRecordMapper couponRecordMapper; + + public CouponRecordQueryResp queryUserCouponRecord(Long scenicId, Long memberId, Long faceId, String goodsId) { + CouponRecordQueryResp resp = new CouponRecordQueryResp(); + List recordList = couponRecordMapper.queryByUserWithGoodsId(scenicId, memberId, goodsId); + if (recordList != null && !recordList.isEmpty()) { + Optional record = recordList.stream().filter(item -> item.getStatus() == 0).filter(item -> item.getFaceId() == null || item.getFaceId().equals(faceId)).findAny(); + if (record.isPresent()) { + CouponRecordEntity recordEntity = record.get(); + resp.setExist(true); + resp.setId(recordEntity.getId()); + resp.setCouponId(recordEntity.getCouponId()); + CouponEntity coupon = couponMapper.getById(recordEntity.getCouponId()); + if (coupon != null) { + resp.setMemberId(recordEntity.getMemberId()); + resp.setFaceId(recordEntity.getFaceId()); + resp.setStatus(recordEntity.getStatus()); + resp.setCreateTime(recordEntity.getCreateTime()); + resp.setUsedTime(recordEntity.getUsedTime()); + resp.setUsedOrderId(recordEntity.getUsedOrderId()); + resp.setCoupon(coupon); + } else { + resp.setExist(false); + } + } else { + Optional usedRecord = recordList.stream().filter(item -> item.getStatus() != 0).filter(item -> item.getFaceId() == null || item.getFaceId().equals(faceId)).findAny(); + if (usedRecord.isPresent()) { + CouponRecordEntity recordEntity = usedRecord.get(); + resp.setExist(true); + resp.setId(recordEntity.getId()); + resp.setCouponId(recordEntity.getCouponId()); + CouponEntity coupon = couponMapper.getById(recordEntity.getCouponId()); + if (coupon != null) { + resp.setMemberId(recordEntity.getMemberId()); + resp.setFaceId(recordEntity.getFaceId()); + resp.setStatus(recordEntity.getStatus()); + resp.setCreateTime(recordEntity.getCreateTime()); + resp.setUsedTime(recordEntity.getUsedTime()); + resp.setUsedOrderId(recordEntity.getUsedOrderId()); + resp.setCoupon(coupon); + } else { + resp.setExist(false); + } + } + } + } + return resp; + } + + public boolean userGetCoupon(Long memberId, Long faceId, Integer couponId) { + CouponEntity coupon = couponMapper.getById(couponId); + if (coupon == null) { + return false; + } + CouponRecordEntity entity = new CouponRecordEntity(); + entity.setCouponId(couponId); + entity.setFaceId(faceId); + entity.setMemberId(memberId); + entity.setStatus(0); + entity.setCreateTime(new Date()); + return couponRecordMapper.insert(entity) > 0; + } + + public boolean userUseCoupon(Long memberId, Long faceId, Integer couponRecordId, Long orderId) { + CouponRecordEntity entity = new CouponRecordEntity(); + entity.setId(couponRecordId); + entity.setStatus(1); + entity.setUsedTime(new Date()); + entity.setUsedOrderId(orderId); + return couponRecordMapper.updateById(entity) > 0; + } +} diff --git a/src/main/java/com/ycwl/basic/biz/OrderBiz.java b/src/main/java/com/ycwl/basic/biz/OrderBiz.java index 7849b9e..7b8eed2 100644 --- a/src/main/java/com/ycwl/basic/biz/OrderBiz.java +++ b/src/main/java/com/ycwl/basic/biz/OrderBiz.java @@ -8,6 +8,8 @@ import com.ycwl.basic.mapper.VideoMapper; import com.ycwl.basic.model.mobile.order.IsBuyRespVO; import com.ycwl.basic.model.mobile.order.PriceObj; import com.ycwl.basic.model.mobile.statistic.req.StatisticsRecordAddReq; +import com.ycwl.basic.model.pc.coupon.entity.CouponEntity; +import com.ycwl.basic.model.pc.couponRecord.resp.CouponRecordQueryResp; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.order.entity.OrderEntity; import com.ycwl.basic.model.pc.order.entity.OrderItemEntity; @@ -70,6 +72,8 @@ public class OrderBiz { private VideoTaskRepository videoTaskRepository; @Autowired private BrokerBiz brokerBiz; + @Autowired + private CouponBiz couponBiz; public PriceObj queryPrice(Long scenicId, int goodsType, Long goodsId) { PriceObj priceObj = new PriceObj(); @@ -172,8 +176,8 @@ public class OrderBiz { respVO.setOrderId(orderEntity.getId()); } } - // 还是没买 respVO.setBuy(isBuy); + // 还是没买 if (!isBuy) { PriceObj priceObj = queryPrice(scenicId, goodsType, goodsId); if (priceObj == null) { @@ -184,6 +188,36 @@ public class OrderBiz { respVO.setGoodsId(goodsId); respVO.setOrigPrice(priceObj.getPrice()); respVO.setSlashPrice(priceObj.getSlashPrice()); + switch (goodsType) { + case 0: // vlog + VideoEntity video = videoRepository.getVideo(goodsId); + TaskEntity taskById = videoTaskRepository.getTaskById(video.getTaskId()); + if (taskById != null) { + CouponRecordQueryResp recordQueryResp = couponBiz.queryUserCouponRecord(scenicId, userId, taskById.getFaceId(), taskById.getTemplateId().toString()); + if (recordQueryResp.isUsable()) { + respVO.setCouponId(recordQueryResp.getCouponId()); + respVO.setCouponRecordId(recordQueryResp.getId()); + CouponEntity coupon = recordQueryResp.getCoupon(); + if (coupon != null) { + respVO.setCouponPrice(coupon.calculateDiscountPrice(priceObj.getPrice())); + } + } + } + break; + case 1: + case 2: + CouponRecordQueryResp recordQueryResp = couponBiz.queryUserCouponRecord(scenicId, userId, goodsId, String.valueOf(goodsType)); + if (recordQueryResp.isUsable()) { + respVO.setCouponId(recordQueryResp.getCouponId()); + respVO.setCouponRecordId(recordQueryResp.getId()); + CouponEntity coupon = recordQueryResp.getCoupon(); + if (coupon != null) { + respVO.setCouponPrice(coupon.calculateDiscountPrice(priceObj.getPrice())); + } + } + break; + + } } return respVO; } @@ -206,6 +240,9 @@ public class OrderBiz { } }); orderRepository.clearOrderCache(orderId); // 更新完了,清理下 + if (order.getCouponRecordId() != null) { + couponBiz.userUseCoupon(order.getMemberId(), order.getFaceId(), order.getCouponRecordId(), orderId); + } //支付时间 OrderAppRespVO orderDetail = orderMapper.appDetail(orderId); diff --git a/src/main/java/com/ycwl/basic/biz/PriceBiz.java b/src/main/java/com/ycwl/basic/biz/PriceBiz.java index a6b6d77..3d550c8 100644 --- a/src/main/java/com/ycwl/basic/biz/PriceBiz.java +++ b/src/main/java/com/ycwl/basic/biz/PriceBiz.java @@ -1,7 +1,8 @@ package com.ycwl.basic.biz; import com.ycwl.basic.model.mobile.order.IsBuyBatchRespVO; -import com.ycwl.basic.model.mobile.order.IsBuyRespVO; +import com.ycwl.basic.model.pc.coupon.entity.CouponEntity; +import com.ycwl.basic.model.pc.couponRecord.resp.CouponRecordQueryResp; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.order.entity.OrderEntity; import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; @@ -34,6 +35,8 @@ public class PriceBiz { private OrderBiz orderBiz; @Autowired private FaceRepository faceRepository; + @Autowired + private CouponBiz couponBiz; public List listGoodsByScenic(Long scenicId) { List goodsList = new ArrayList<>(); @@ -96,6 +99,30 @@ public class PriceBiz { return respVO; } } + switch (type) { + case 0: // 单个定价 + CouponRecordQueryResp recordQueryResp = couponBiz.queryUserCouponRecord(scenicId, userId, faceId, goodsIds); + if (recordQueryResp.isUsable()) { + respVO.setCouponId(recordQueryResp.getCouponId()); + respVO.setCouponRecordId(recordQueryResp.getId()); + CouponEntity coupon = recordQueryResp.getCoupon(); + if (coupon != null) { + respVO.setCouponPrice(coupon.calculateDiscountPrice(priceConfig.getPrice())); + } + } + break; + case -1: + CouponRecordQueryResp oneCouponRecordQueryResp = couponBiz.queryUserCouponRecord(scenicId, userId, faceId, "-1"); + if (oneCouponRecordQueryResp.isUsable()) { + respVO.setCouponId(oneCouponRecordQueryResp.getCouponId()); + respVO.setCouponRecordId(oneCouponRecordQueryResp.getId()); + CouponEntity coupon = oneCouponRecordQueryResp.getCoupon(); + if (coupon != null) { + respVO.setCouponPrice(coupon.calculateDiscountPrice(priceConfig.getPrice())); + } + } + break; + } respVO.setConfigId(priceConfig.getId()); respVO.setGoodsIds(goodsIds); respVO.setType(type); diff --git a/src/main/java/com/ycwl/basic/controller/pc/CouponController.java b/src/main/java/com/ycwl/basic/controller/pc/CouponController.java index 4667a19..c4bb84d 100644 --- a/src/main/java/com/ycwl/basic/controller/pc/CouponController.java +++ b/src/main/java/com/ycwl/basic/controller/pc/CouponController.java @@ -1,9 +1,11 @@ package com.ycwl.basic.controller.pc; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.biz.PriceBiz; import com.ycwl.basic.model.pc.coupon.entity.CouponEntity; import com.ycwl.basic.model.pc.coupon.req.CouponQueryReq; import com.ycwl.basic.model.pc.coupon.resp.CouponRespVO; +import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO; import com.ycwl.basic.service.pc.CouponService; import com.ycwl.basic.utils.ApiResponse; import io.swagger.annotations.Api; @@ -19,6 +21,15 @@ import java.util.List; public class CouponController { @Autowired private CouponService couponService; + @Autowired + private PriceBiz priceBiz; + + @GetMapping("/{scenicId}/goodsList") + public ApiResponse> scenicGoodsList(@PathVariable Long scenicId) { + List data = priceBiz.listGoodsByScenic(scenicId); + data.add(new GoodsListRespVO(-1L, "一口价")); + return ApiResponse.success(data); + } @ApiOperation("新增优惠券") @PostMapping("/add") diff --git a/src/main/java/com/ycwl/basic/mapper/CouponMapper.java b/src/main/java/com/ycwl/basic/mapper/CouponMapper.java index 3e97b8c..3676c7c 100644 --- a/src/main/java/com/ycwl/basic/mapper/CouponMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/CouponMapper.java @@ -12,4 +12,6 @@ public interface CouponMapper extends BaseMapper { List selectByQuery(CouponQueryReq query); int updateStatus(Integer id); + + CouponEntity getById(Integer couponId); } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/mapper/CouponRecordMapper.java b/src/main/java/com/ycwl/basic/mapper/CouponRecordMapper.java new file mode 100644 index 0000000..c71138e --- /dev/null +++ b/src/main/java/com/ycwl/basic/mapper/CouponRecordMapper.java @@ -0,0 +1,12 @@ +package com.ycwl.basic.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.ycwl.basic.model.pc.couponRecord.entity.CouponRecordEntity; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface CouponRecordMapper extends BaseMapper { + List queryByUserWithGoodsId(Long scenicId, Long memberId, String goodsId); +} diff --git a/src/main/java/com/ycwl/basic/mapper/OrderMapper.java b/src/main/java/com/ycwl/basic/mapper/OrderMapper.java index a68b97f..afc534b 100644 --- a/src/main/java/com/ycwl/basic/mapper/OrderMapper.java +++ b/src/main/java/com/ycwl/basic/mapper/OrderMapper.java @@ -49,7 +49,10 @@ public interface OrderMapper { OrderItemEntity getOrderItem(Long orderItemId); + int updateOrderPrice(OrderEntity updateEntity); int updateOrder(OrderEntity updateEntity); OrderEntity queryTypeOrder(Long userId, Long scenicId, int orderType, Integer priceConfigId); + + OrderEntity getUserOrderItem(Long userId, Long scenicId, int orderType, Long configId, Integer goodsType, Long goodsId); } diff --git a/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyBatchRespVO.java b/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyBatchRespVO.java index 854b79e..474902c 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyBatchRespVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyBatchRespVO.java @@ -13,10 +13,21 @@ public class IsBuyBatchRespVO { private int type; private String goodsIds; private BigDecimal origPrice = BigDecimal.ZERO; + private Integer couponId; + private Integer couponRecordId; private BigDecimal couponPrice = BigDecimal.ZERO; - private BigDecimal slashPrice = BigDecimal.ZERO; + private BigDecimal slashPrice; public BigDecimal getPrice() { return origPrice.subtract(couponPrice); } + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(origPrice); + } } diff --git a/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyRespVO.java b/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyRespVO.java index 3956d16..9ad118e 100644 --- a/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyRespVO.java +++ b/src/main/java/com/ycwl/basic/model/mobile/order/IsBuyRespVO.java @@ -12,10 +12,21 @@ public class IsBuyRespVO { private int goodsType; private Long goodsId; private BigDecimal origPrice = BigDecimal.ZERO; + private Integer couponId; + private Integer couponRecordId; private BigDecimal couponPrice = BigDecimal.ZERO; - private BigDecimal slashPrice = BigDecimal.ZERO; + private BigDecimal slashPrice; public BigDecimal getPrice() { return origPrice.subtract(couponPrice); } + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(origPrice); + } } diff --git a/src/main/java/com/ycwl/basic/model/pc/coupon/entity/CouponEntity.java b/src/main/java/com/ycwl/basic/model/pc/coupon/entity/CouponEntity.java index cb2ae0b..6ce8885 100644 --- a/src/main/java/com/ycwl/basic/model/pc/coupon/entity/CouponEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/coupon/entity/CouponEntity.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Date; @Data @@ -36,4 +37,12 @@ public class CouponEntity { */ private Integer status; private Date createAt; + + public BigDecimal calculateDiscountPrice(BigDecimal originalPrice) { + if (discountType == 0) { + return discountPrice; + } else { + return originalPrice.divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_DOWN).multiply(discountPrice); + } + } } \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/model/pc/couponRecord/entity/CouponRecordEntity.java b/src/main/java/com/ycwl/basic/model/pc/couponRecord/entity/CouponRecordEntity.java new file mode 100644 index 0000000..5e578ca --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/couponRecord/entity/CouponRecordEntity.java @@ -0,0 +1,20 @@ +package com.ycwl.basic.model.pc.couponRecord.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +import java.util.Date; + +@Data +public class CouponRecordEntity { + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + private Integer couponId; + private Long memberId; + private Long faceId; + private Integer status; + private Date createTime; + private Date usedTime; + private Long usedOrderId; +} diff --git a/src/main/java/com/ycwl/basic/model/pc/couponRecord/req/CouponRecordUserQueryReq.java b/src/main/java/com/ycwl/basic/model/pc/couponRecord/req/CouponRecordUserQueryReq.java new file mode 100644 index 0000000..04e8211 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/couponRecord/req/CouponRecordUserQueryReq.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.model.pc.couponRecord.req; + +import lombok.Data; + +@Data +public class CouponRecordUserQueryReq { + private Long scenicId; + private Long memberId; + private Long faceId; + private Integer couponType; +} diff --git a/src/main/java/com/ycwl/basic/model/pc/couponRecord/resp/CouponRecordQueryResp.java b/src/main/java/com/ycwl/basic/model/pc/couponRecord/resp/CouponRecordQueryResp.java new file mode 100644 index 0000000..15537c7 --- /dev/null +++ b/src/main/java/com/ycwl/basic/model/pc/couponRecord/resp/CouponRecordQueryResp.java @@ -0,0 +1,26 @@ +package com.ycwl.basic.model.pc.couponRecord.resp; + +import com.ycwl.basic.model.pc.coupon.entity.CouponEntity; +import lombok.Data; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +public class CouponRecordQueryResp { + private boolean exist = false; + private Integer id; + private Long scenicId; + private Integer couponId; + private Long memberId; + private Long faceId; + private Integer status; + private Date createTime; + private Date usedTime; + private Long usedOrderId; + private CouponEntity coupon; + + public boolean isUsable() { + return Integer.valueOf(0).equals(status); + } +} diff --git a/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java b/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java index 687b4d1..bedb909 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/entity/OrderEntity.java @@ -35,6 +35,9 @@ public class OrderEntity { * 划线价 */ private BigDecimal slashPrice; + private BigDecimal couponPrice = BigDecimal.ZERO; + private Integer couponId; + private Integer couponRecordId; /** * 优惠价格 */ @@ -88,4 +91,13 @@ public class OrderEntity { */ private Date refundAt; + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(price); + } } diff --git a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderAppRespVO.java b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderAppRespVO.java index 032a85f..f050cfd 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderAppRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderAppRespVO.java @@ -89,4 +89,14 @@ public class OrderAppRespVO { private Integer goodsType; @ApiModelProperty("订单明细") private List orderItemList; + + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(price); + } } diff --git a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderRespVO.java b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderRespVO.java index 3d028b9..eb9f669 100644 --- a/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/order/resp/OrderRespVO.java @@ -108,4 +108,14 @@ public class OrderRespVO { private List orderItemList; private Long scenicId; private String scenicName; + + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(price); + } } diff --git a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java index a88e73b..b2f0a91 100644 --- a/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java +++ b/src/main/java/com/ycwl/basic/model/pc/video/resp/VideoRespVO.java @@ -63,4 +63,14 @@ public class VideoRespVO { private Integer height; private Integer width; private BigDecimal duration; + + public BigDecimal getDiscountPrice() { + if (slashPrice == null) { + return BigDecimal.ZERO; + } + if (slashPrice.compareTo(BigDecimal.ZERO) <= 0) { + return BigDecimal.ZERO; + } + return slashPrice.subtract(templatePrice); + } } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java index 3dfca7f..648a776 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/OrderServiceImpl.java @@ -2,6 +2,7 @@ package com.ycwl.basic.service.pc.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.biz.CouponBiz; import com.ycwl.basic.biz.OrderBiz; import com.ycwl.basic.biz.PriceBiz; import com.ycwl.basic.constant.BaseContextHandler; @@ -13,6 +14,7 @@ import com.ycwl.basic.model.mobile.order.IsBuyRespVO; import com.ycwl.basic.model.mobile.order.OrderAppPageReq; import com.ycwl.basic.model.mobile.order.PriceObj; import com.ycwl.basic.model.mobile.order.RefundOrderReq; +import com.ycwl.basic.model.pc.couponRecord.resp.CouponRecordQueryResp; import com.ycwl.basic.model.pc.face.entity.FaceEntity; import com.ycwl.basic.model.pc.member.resp.MemberRespVO; import com.ycwl.basic.model.pc.order.entity.OrderEntity; @@ -28,6 +30,7 @@ import com.ycwl.basic.model.pc.orderOp.entity.OrderOperationEntity; import com.ycwl.basic.model.pc.price.entity.PriceConfigEntity; import com.ycwl.basic.model.pc.price.resp.GoodsListRespVO; import com.ycwl.basic.model.pc.source.entity.SourceEntity; +import com.ycwl.basic.model.pc.task.entity.TaskEntity; import com.ycwl.basic.model.pc.video.entity.VideoEntity; import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WxPayRespVO; @@ -84,6 +87,8 @@ public class OrderServiceImpl implements OrderService { private PriceBiz priceBiz; @Autowired private FaceRepository faceRepository; + @Autowired + private CouponBiz couponBiz; @Override public ApiResponse> pageQuery(OrderReqQuery query) { @@ -147,12 +152,12 @@ public class OrderServiceImpl implements OrderService { if (orderItems.size() > 1) { goodsName = "多项景区Vlog商品"; } else { - int type = orderItems.get(NumberConstant.ZERO).getGoodsType(); - if (type == NumberConstant.ZERO) { + int type = orderItems.get(0).getGoodsType(); + if (type == 0) { goodsName = "景区Vlog视频"; - } else if (type == NumberConstant.ONE) { + } else if (type == 1) { goodsName = "景区录像包"; - } else if (type == NumberConstant.TWO) { + } else if (type == 2) { goodsName = "景区照片包"; } } @@ -310,44 +315,81 @@ public class OrderServiceImpl implements OrderService { if (isBuy.isBuy()) { return ApiResponse.fail("您已购买此内容,无需重复购买!"); } - OrderEntity order = new OrderEntity(); - Long orderId = SnowFlakeUtil.getLongId(); - order.setId(orderId); - order.setMemberId(userId); - MemberRespVO member = memberMapper.getById(userId); - order.setOpenId(member.getOpenId()); - order.setScenicId(createOrderReqVO.getScenicId()); + // 看看有没有之前购买的订单 + OrderEntity order = orderMapper.getUserOrderItem(userId, createOrderReqVO.getScenicId(), 0, null, createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId()); + boolean haveOldOrder = order != null; + if (!haveOldOrder) { + order = new OrderEntity(); + order.setId(SnowFlakeUtil.getLongId()); + order.setMemberId(userId); + MemberRespVO member = memberMapper.getById(userId); + order.setOpenId(member.getOpenId()); + order.setScenicId(createOrderReqVO.getScenicId()); + + PriceObj priceObj = orderBiz.queryPrice(order.getScenicId(), createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId()); + order.setSlashPrice(priceObj.getSlashPrice()); + order.setPrice(priceObj.getPrice()); + // 判断是否是本人数据 + FaceEntity goodsFace = faceRepository.getFace(priceObj.getFaceId()); + if (goodsFace != null && !goodsFace.getMemberId().equals(userId)) { + return ApiResponse.fail("您无权购买此内容!"); + } + // promo code + order.setPayPrice(priceObj.getPrice()); + order.setPayPrice(order.getPayPrice().subtract(order.getCouponPrice())); + if (order.getPayPrice().compareTo(BigDecimal.ZERO) < NumberConstant.ZERO) { + // 至少需要支付0.01 + order.setPayPrice(BigDecimal.valueOf(0.01)); + } + order.setFaceId(priceObj.getFaceId()); + if (order.getPayPrice().equals(BigDecimal.ZERO)) { + order.setStatus(OrderStateEnum.PAID.getState()); + order.setPayAt(new Date()); + } else { + order.setStatus(OrderStateEnum.UNPAID.getState()); + } + } + // coupon + CouponRecordQueryResp couponRecord = null; + switch (createOrderReqVO.getGoodsType()) { + case 0: // vlog + VideoEntity video = videoRepository.getVideo(createOrderReqVO.getGoodsId()); + TaskEntity taskById = videoTaskRepository.getTaskById(video.getTaskId()); + if (taskById != null) { + couponRecord = couponBiz.queryUserCouponRecord(order.getScenicId(), userId, order.getFaceId(), taskById.getTemplateId().toString()); + } + break; + case 1: + case 2: + couponRecord = couponBiz.queryUserCouponRecord(order.getScenicId(), userId, order.getFaceId(), String.valueOf(createOrderReqVO.getGoodsType())); + break; + } + order.setCouponPrice(BigDecimal.ZERO); + order.setCouponRecordId(null); + order.setCouponId(null); + if (couponRecord != null) { + if (couponRecord.isUsable()) { + order.setCouponId(couponRecord.getCouponId()); + order.setCouponRecordId(couponRecord.getId()); + order.setCouponPrice(couponRecord.getCoupon().calculateDiscountPrice(order.getPrice())); + } + } List orderItems = new ArrayList<>(); OrderItemEntity orderItem = new OrderItemEntity(); orderItem.setGoodsId(createOrderReqVO.getGoodsId()); orderItem.setGoodsType(createOrderReqVO.getGoodsType()); - orderItem.setOrderId(orderId); + orderItem.setOrderId(order.getId()); orderItems.add(orderItem); - PriceObj priceObj = orderBiz.queryPrice(order.getScenicId(), createOrderReqVO.getGoodsType(), createOrderReqVO.getGoodsId()); - order.setSlashPrice(priceObj.getSlashPrice()); - order.setPrice(priceObj.getPrice()); - // 判断是否是本人数据 - FaceEntity goodsFace = faceRepository.getFace(priceObj.getFaceId()); - if (goodsFace != null && !goodsFace.getMemberId().equals(userId)) { - return ApiResponse.fail("您无权购买此内容!"); - } - // promo code - // coupon - order.setPayPrice(priceObj.getPrice()); - order.setFaceId(priceObj.getFaceId()); - if (order.getPayPrice().equals(BigDecimal.ZERO)) { - order.setStatus(OrderStateEnum.PAID.getState()); - order.setPayAt(new Date()); + if (!haveOldOrder) { + orderMapper.add(order); + int addOrderItems = orderMapper.addOrderItems(orderItems); + if (addOrderItems == NumberConstant.ZERO) { + log.error("订单明细添加失败"); + return ApiResponse.fail("订单添加失败"); + } } else { - order.setStatus(OrderStateEnum.UNPAID.getState()); + orderMapper.updateOrderPrice(order); } - orderMapper.add(order); - int addOrderItems = orderMapper.addOrderItems(orderItems); - if (addOrderItems == NumberConstant.ZERO) { - log.error("订单明细添加失败"); - return ApiResponse.fail("订单添加失败"); - } - //点击支付按钮统计 if (order.getPayPrice().compareTo(BigDecimal.ZERO) <= 0) { orderBiz.paidOrder(order.getId()); return ApiResponse.success(new WxPayRespVO()); diff --git a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java index eae14e6..b829567 100644 --- a/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/task/impl/TaskTaskServiceImpl.java @@ -716,7 +716,7 @@ public class TaskTaskServiceImpl implements TaskService { } ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId()); String title = "您在【" + scenic.getName() + "】的专属影像"; - String page = "pages/videoSynthesis/index?scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); + String page = "pages/videoSynthesis/index?type=1&scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); /** * 视频名称 {{thing1.DATA}} * 生成时间 {{time4.DATA}} diff --git a/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java b/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java index c5da82e..597b2a3 100644 --- a/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java +++ b/src/main/java/com/ycwl/basic/task/DownloadNotificationTasker.java @@ -59,7 +59,7 @@ public class DownloadNotificationTasker { log.info("发送模板消息"); ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId()); String title = "您在【" + scenic.getName() + "】的专属影像"; - String page = "pages/videoSynthesis/index?scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); + String page = "pages/videoSynthesis/index?type=2&scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); /** * 景区 {{thing1.DATA}} * 备注 {{thing3.DATA}} @@ -105,7 +105,7 @@ public class DownloadNotificationTasker { log.info("发送模板消息"); ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId()); String title = "您在【" + scenic.getName() + "】的专属影像"; - String page = "pages/videoSynthesis/index?scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); + String page = "pages/videoSynthesis/index?type=3&scenicId=" + item.getScenicId() + "&faceId=" + item.getFaceId(); /** * 影像名称 {{thing1.DATA}} * 过期时间 {{time2.DATA}} diff --git a/src/main/resources/mapper/CouponMapper.xml b/src/main/resources/mapper/CouponMapper.xml index 288e926..4c5d26e 100644 --- a/src/main/resources/mapper/CouponMapper.xml +++ b/src/main/resources/mapper/CouponMapper.xml @@ -29,4 +29,7 @@ ORDER BY create_time DESC + \ No newline at end of file diff --git a/src/main/resources/mapper/CouponRecordMapper.xml b/src/main/resources/mapper/CouponRecordMapper.xml new file mode 100644 index 0000000..c5efaf3 --- /dev/null +++ b/src/main/resources/mapper/CouponRecordMapper.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/OrderMapper.xml b/src/main/resources/mapper/OrderMapper.xml index f00294b..b75cd8f 100644 --- a/src/main/resources/mapper/OrderMapper.xml +++ b/src/main/resources/mapper/OrderMapper.xml @@ -144,8 +144,8 @@ - insert into `order`(id, member_id, openid, face_id, `type`, `price_config_id`, slash_price, price, pay_price, remark, broker_id, promo_code, scenic_id, status) - VALUES (#{id}, #{memberId}, #{openId}, #{faceId}, #{type}, #{priceConfigId}, #{slashPrice}, #{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode}, #{scenicId}, #{status}) + insert into `order`(id, member_id, openid, face_id, `type`, `price_config_id`, slash_price, price, pay_price, remark, broker_id, promo_code, scenic_id, status, coupon_price, coupon_id, coupon_record_id) + VALUES (#{id}, #{memberId}, #{openId}, #{faceId}, #{type}, #{priceConfigId}, #{slashPrice}, #{price}, #{payPrice}, #{remark}, #{brokerId}, #{promoCode}, #{scenicId}, #{status}, #{couponPrice}, #{couponId}, #{couponRecordId}) insert into order_item(order_id,goods_type, goods_id) VALUES @@ -186,6 +186,7 @@ where id = #{id} + update `order` @@ -213,11 +214,21 @@ where id = #{id} + + update `order` + set + coupon_price = #{couponPrice}, + coupon_id = #{couponId}, + coupon_record_id = #{couponRecordId}, + pay_price = `price` - `coupon_price` + where id = #{id} + delete from `order` where id = #{id} + \ No newline at end of file