From b977bf61c82b7dc39079974d7316b7a80cf520fa Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期一, 02 九月 2024 09:36:28 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master-v2' into master-v2 --- src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java | 7 src/main/java/com/mzl/flower/service/payment/OrderService.java | 100 ++++++++++ src/main/表设计-二期.xlsx | 0 src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java | 4 src/main/java/com/mzl/flower/constant/Constants.java | 3 src/main/java/com/mzl/flower/entity/payment/Order.java | 30 +++ src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java | 2 src/main/表设计.xlsx | 0 src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java | 15 - src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java | 14 + src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java | 3 src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java | 8 src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java | 21 ++ src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java | 3 src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java | 16 + src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java | 26 ++ src/main/java/com/mzl/flower/entity/payment/OrderItem.java | 11 + src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java | 29 ++- src/main/resources/mapper/point/CustomerPointDetailMapper.xml | 20 ++ src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml | 5 src/main/java/com/mzl/flower/schedule/PointScheduleService.java | 90 ++++++++++ src/main/java/com/mzl/flower/service/point/CustomerPointService.java | 21 +- src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java | 6 src/main/java/com/mzl/flower/service/customer/CustomerService.java | 19 + src/main/resources/mapper/payment/OrderMapper.xml | 7 src/main/resources/script/db-v2.sql | 22 ++ src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java | 18 ++ src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java | 14 + src/main/java/com/mzl/flower/utils/DateUtils.java | 14 + 29 files changed, 465 insertions(+), 63 deletions(-) diff --git a/src/main/java/com/mzl/flower/constant/Constants.java b/src/main/java/com/mzl/flower/constant/Constants.java index c25d452..eae0d70 100644 --- a/src/main/java/com/mzl/flower/constant/Constants.java +++ b/src/main/java/com/mzl/flower/constant/Constants.java @@ -483,7 +483,8 @@ activity("活动获取"), giveaway("积分赠送"), deduction("积分扣减"), - exchange("积分兑换"); + exchange("积分兑换"), + expired("积分过期"); POINT_TYPE(String desc) { this.desc = desc; diff --git a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java index 884f18f..c338f50 100644 --- a/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java +++ b/src/main/java/com/mzl/flower/dto/request/payment/OrderCommitDTO.java @@ -26,4 +26,10 @@ @NotBlank(message = "微信code不能为空") private String wxcode; + + @ApiModelProperty(value = "用户优惠券id") + private String couponRecordId; + + @ApiModelProperty(value = "用户积分商品兑换券id列表") + private List<Long> goodsRecordIdList; } diff --git a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java index 3e21102..e878c48 100644 --- a/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java +++ b/src/main/java/com/mzl/flower/dto/response/payment/DeliveryOrderItemSettlementDTO.java @@ -64,6 +64,9 @@ @ApiModelProperty(value = "售后退款") private BigDecimal salesFee; + @ApiModelProperty(value = "售后数量") + private Integer salesNum; + @ApiModelProperty(value = "服务费率") private Double serviceFeeRate; diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java index 8f9210e..207a25d 100644 --- a/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java +++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderDTO.java @@ -9,6 +9,7 @@ import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.List; @Data public class OrderDTO extends AbstractTransDTO { @@ -135,4 +136,7 @@ @ApiModelProperty(value = "支付单号") private String paymentTrId; + + @ApiModelProperty(value = "积分商品列表") + private List<OrderPointGoodsListDTO> pointGoodsList; } diff --git a/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java new file mode 100644 index 0000000..51f9a7b --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/payment/OrderPointGoodsListDTO.java @@ -0,0 +1,26 @@ +package com.mzl.flower.dto.response.payment; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class OrderPointGoodsListDTO { + @ApiModelProperty(value = "积分商品ID") + private Long goodsId; + + @ApiModelProperty(value = "商品名称") + private String name; + + @ApiModelProperty(value = "商品描述") + private String description; + + @ApiModelProperty(value = "商品封面图") + private String cover; + + @ApiModelProperty(value = "商品图片") + private String pictures; + + @ApiModelProperty(value = "兑换数量") + private Integer num; + +} diff --git a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java index fde99f8..48ba6dc 100644 --- a/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java +++ b/src/main/java/com/mzl/flower/dto/response/payment/PreOrderDTO.java @@ -19,7 +19,25 @@ @ApiModelProperty(value = "商品总金额") private BigDecimal totalAmount; + @ApiModelProperty(value = "商品会员价总金额") + private BigDecimal totalMemberAmount; + @ApiModelProperty(value = "打包费") private BigDecimal packing; + @ApiModelProperty(value = "会员等级id") + private Long memberId; + + @ApiModelProperty(value = "会员等级名称") + private String memberName; + + @ApiModelProperty(value = "折扣类型(discount_type)") + private String memberDiscountType; + + @ApiModelProperty(value = "会员折扣") + private BigDecimal memberDiscountRatio; + + @ApiModelProperty(value = "优惠金额(每扎)") + private BigDecimal memberDiscountAmount; + } diff --git a/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java b/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java new file mode 100644 index 0000000..54a395b --- /dev/null +++ b/src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java @@ -0,0 +1,16 @@ +package com.mzl.flower.dto.response.point; + + +import lombok.Data; + +@Data +public class ExpiredPointDTO { + + private String userId; + + private Long customerId; + + private Integer addPoint; + + private Integer reducePoint; +} diff --git a/src/main/java/com/mzl/flower/entity/payment/Order.java b/src/main/java/com/mzl/flower/entity/payment/Order.java index 7706db4..438c5f4 100644 --- a/src/main/java/com/mzl/flower/entity/payment/Order.java +++ b/src/main/java/com/mzl/flower/entity/payment/Order.java @@ -16,7 +16,7 @@ private String orderNo;//单号 @TableField("flower_amount") - private BigDecimal flowerAmount;//商品金额 + private BigDecimal flowerAmount;//商品金额(会员价) @TableField("packing_fee") private BigDecimal packingFee;//打包费 @@ -134,4 +134,32 @@ @TableField("wx_delivery_msg") private String wxDeliveryMsg;// 微信发货返回消息 + + @TableField("member_coupon_id") + private String memberCouponId;//用户优惠券id + + @TableField("member_coupon_code") + private String memberCouponCode;//优惠券编码 + + @TableField("member_coupon_name") + private String memberCouponName;//优惠券名称 + + @TableField("member_coupon_amount") + private BigDecimal memberCouponAmount;//优惠券金额 + + @TableField("member_id") + private Long memberId;//会员等级id + + @TableField("member_name") + private String memberName;//会员等级名称 + + @TableField("member_discount_type") + private String memberDiscountType;//折扣类型(discount_type) + + @TableField("member_discount_ratio") + private BigDecimal memberDiscountRatio;//会员折扣 + + @TableField("member_discount_amount") + private BigDecimal memberDiscountAmount;//优惠金额(每扎) + } diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java index 5d1167b..84c559f 100644 --- a/src/main/java/com/mzl/flower/entity/payment/OrderItem.java +++ b/src/main/java/com/mzl/flower/entity/payment/OrderItem.java @@ -61,7 +61,7 @@ private BigDecimal markupPartner;//合伙人加价 @TableField("price") - private BigDecimal price;//商品售价 + private BigDecimal price;//商品售价(会员价) @TableField("total") private BigDecimal total;//总金额 @@ -84,4 +84,13 @@ @TableField("deduct_amount") private BigDecimal deductAmount;//扣款金额 + @TableField("coupon_amount") + private BigDecimal couponAmount;//优惠券金额/扎 + + @TableField("original_price") + private BigDecimal originalPrice;//优惠前售价/扎 + + @TableField("real_price") + private BigDecimal realPrice;//真实成交价格/每扎 + } diff --git a/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java b/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java new file mode 100644 index 0000000..6c91533 --- /dev/null +++ b/src/main/java/com/mzl/flower/entity/payment/OrderPointGoods.java @@ -0,0 +1,21 @@ +package com.mzl.flower.entity.payment; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mzl.flower.base.BaseEntity; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@TableName("t_order_point_goods") +public class OrderPointGoods extends BaseEntity { + + @TableField("order_id") + private String orderId;//订单id + + @TableField("goods_record_id") + private Long goodsRecordId;//客户商品id + +} diff --git a/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java b/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java index 3bd0fae..e025402 100644 --- a/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java +++ b/src/main/java/com/mzl/flower/entity/point/CustomerPointDetail.java @@ -37,14 +37,8 @@ @ApiModelProperty("积分类型:增加(消费获取、活动获取、积分赠送),减少(积分扣减、积分兑换)") private String type; - @ApiModelProperty("积分(积分=使用积分+过期积分)") + @ApiModelProperty("积分变更数量") private Integer point; - - @ApiModelProperty("使用积分") - private Integer usePoint; - - @ApiModelProperty("过期积分") - private Integer expiredPoint; @ApiModelProperty("备注(可记录积分的来源或去向,如订单号、兑换内容、活动名称等)") private String remarks; diff --git a/src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java b/src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java index 992e750..951aa12 100644 --- a/src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java +++ b/src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java @@ -19,5 +19,5 @@ PartnerDTO getCurrentPartner(@Param("userId")String userId); - Partner getByIdOrUserId(@Param("partnerUserId") String partnerUserId); + List<Partner> getByIdOrUserId(@Param("partnerUserId") String partnerUserId); } diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java index 3e945c6..8068b0d 100644 --- a/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java +++ b/src/main/java/com/mzl/flower/mapper/payment/OrderMapper.java @@ -3,10 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.dto.request.payment.OrderQueryDTO; -import com.mzl.flower.dto.response.payment.OrderCheckListDTO; -import com.mzl.flower.dto.response.payment.OrderListDTO; -import com.mzl.flower.dto.response.payment.OrderStatusCountDTO; -import com.mzl.flower.dto.response.payment.SupplierNumDTO; +import com.mzl.flower.dto.response.payment.*; import com.mzl.flower.entity.payment.Order; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; @@ -37,4 +34,6 @@ , @Param("endTime")LocalDateTime endTime); Order getUserLastOrder(@Param("userId") String userId); + + List<OrderPointGoodsListDTO> getPointGoodsList(@Param("orderId") String orderId); } diff --git a/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java b/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java new file mode 100644 index 0000000..6cf35fe --- /dev/null +++ b/src/main/java/com/mzl/flower/mapper/payment/OrderPointGoodsMapper.java @@ -0,0 +1,14 @@ +package com.mzl.flower.mapper.payment; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mzl.flower.entity.payment.OrderPointGoods; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface OrderPointGoodsMapper extends BaseMapper<OrderPointGoods> { + +} diff --git a/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java b/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java index fb896a7..6482846 100644 --- a/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java +++ b/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java @@ -3,28 +3,21 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.mzl.flower.dto.request.point.CustomerPointDetailQueryDTO; -import com.mzl.flower.dto.request.point.PointGoodQueryDTO; import com.mzl.flower.dto.response.point.CustomerPointDetailVO; -import com.mzl.flower.dto.response.point.PointGoodVO; +import com.mzl.flower.dto.response.point.ExpiredPointDTO; import com.mzl.flower.entity.point.CustomerPointDetail; -import com.mzl.flower.entity.point.PointGood; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; -/** - * @author fanghaowei - * @version version2.0 - * @className CustomerPointDetailMapper - * @date 2024/8/29 - * @description CustomerPointDetailMapper - */ -@SuppressWarnings("ALL") + @Repository public interface CustomerPointDetailMapper extends BaseMapper<CustomerPointDetail> { List<CustomerPointDetailVO> queryPage(@Param("dto") CustomerPointDetailQueryDTO dto, Page page); + List<ExpiredPointDTO> tongjiExpiredPoint(@Param("lastYear") LocalDate lastYear); } diff --git a/src/main/java/com/mzl/flower/schedule/PointScheduleService.java b/src/main/java/com/mzl/flower/schedule/PointScheduleService.java new file mode 100644 index 0000000..ca05ac0 --- /dev/null +++ b/src/main/java/com/mzl/flower/schedule/PointScheduleService.java @@ -0,0 +1,90 @@ +package com.mzl.flower.schedule; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mzl.flower.constant.Constants; +import com.mzl.flower.dto.response.point.ExpiredPointDTO; +import com.mzl.flower.entity.flower.FlowerCategory; +import com.mzl.flower.entity.partner.Partner; +import com.mzl.flower.entity.point.CustomerPoint; +import com.mzl.flower.entity.point.CustomerPointDetail; +import com.mzl.flower.mapper.point.CustomerPointDetailMapper; +import com.mzl.flower.mapper.point.CustomerPointMapper; +import com.mzl.flower.utils.DateUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateFormatUtils; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.temporal.ChronoUnit; +import java.util.List; + +@Component +@Slf4j +public class PointScheduleService { + + + private final CustomerPointMapper customerPointMapper; + + private final CustomerPointDetailMapper customerPointDetailMapper; + + public PointScheduleService(CustomerPointMapper customerPointMapper, CustomerPointDetailMapper customerPointDetailMapper) { + this.customerPointMapper = customerPointMapper; + this.customerPointDetailMapper = customerPointDetailMapper; + } + + + /** + * 定时计算用户过期积分 + */ + @Scheduled(cron = "0 20 9 * * ?") + public void calculatingExpiredPoint() { + log.info("过期积分计算开始:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + LocalDate now = LocalDate.now().minusDays(1);//前一天 + LocalDate lastYear = now.minus(1, ChronoUnit.YEARS); // 日期减去一年 + List<ExpiredPointDTO> pointDTOS = customerPointDetailMapper.tongjiExpiredPoint(lastYear); + if(pointDTOS != null && pointDTOS.size() > 0){ + for (ExpiredPointDTO pointDTO : pointDTOS) { + if(pointDTO.getAddPoint().intValue()> pointDTO.getReducePoint().intValue()){ //积分增加大于减少 + Integer expiredPoint = pointDTO.getAddPoint().intValue() - pointDTO.getReducePoint().intValue(); + CustomerPointDetail customerPointDetail = new CustomerPointDetail(); + customerPointDetail.setUserId(pointDTO.getUserId()); + customerPointDetail.setCustomerId(pointDTO.getCustomerId()); + customerPointDetail.setChangeType(Constants.POINT_CHANGE_TYPE.reduce.name()); + customerPointDetail.setType(Constants.POINT_TYPE.expired.name()); + customerPointDetail.setPoint(expiredPoint); + customerPointDetail.setRecordDate(now); + customerPointDetail.create("sys"); + customerPointDetail.setRemarks(DateUtils.toString(now,"yyyy-MM-dd")+"过期积分结算"); + customerPointDetailMapper.insert(customerPointDetail); + + //更新用户积分记录 + CustomerPoint customerPoint = customerPointMapper.selectOne(new LambdaQueryWrapper<CustomerPoint>() + .eq(CustomerPoint::getCustomerId, pointDTO.getCustomerId()) + .eq(CustomerPoint::getUserId, pointDTO.getUserId())); + if(customerPoint == null ){ + customerPoint = new CustomerPoint(); + customerPoint.setCustomerId(pointDTO.getCustomerId()); + customerPoint.setUserId(pointDTO.getUserId()); + customerPoint.setTotalPoint(0); + customerPoint.setUsedPoint(0); + customerPoint.setExpiredPoint(0); + customerPoint.create("sys"); + customerPointMapper.insert(customerPoint); + }else { + customerPoint.setExpiredPoint(expiredPoint); + customerPointMapper.updateById(customerPoint); + } + + } + } + } + + + log.info("过期积分计算结束:" + DateFormatUtils.format(System.currentTimeMillis(), "yyyy-MM-dd HH:mm:ss")); + } + + +} diff --git a/src/main/java/com/mzl/flower/service/customer/CustomerService.java b/src/main/java/com/mzl/flower/service/customer/CustomerService.java index 4fec567..0176b71 100644 --- a/src/main/java/com/mzl/flower/service/customer/CustomerService.java +++ b/src/main/java/com/mzl/flower/service/customer/CustomerService.java @@ -16,6 +16,7 @@ import com.mzl.flower.entity.partner.Partner; import com.mzl.flower.mapper.customer.CustomerMapper; import com.mzl.flower.mapper.partner.PartnerMapper; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; @@ -25,6 +26,7 @@ @Service @Transactional +@Slf4j public class CustomerService { @@ -169,10 +171,14 @@ } // Partner partner = partnerMapper.selectOne(new QueryWrapper<Partner>() // .eq("user_id", dto.getPartnerUserId())); - Partner partner = partnerMapper.getByIdOrUserId(dto.getPartnerUserId()); //适配id和userId - if (partner == null) { + List<Partner> partners = partnerMapper.getByIdOrUserId(dto.getPartnerUserId()); //适配id和userId + if(partners== null || partners.size() == 0){ throw new ValidationException("合伙人不存在"); } + if(partners.size() > 1){ + log.error("合伙人信息重复,userId:{}", dto.getPartnerUserId()); + } + Partner partner = partners.get(0); if (!"P".equals(partner.getStatus())) { throw new ValidationException("合伙人信息未审核通过,请联系客服人员"); } @@ -182,7 +188,14 @@ public String getPartnerName(String partnerUserId) { if (StringUtils.isNotBlank(partnerUserId)) { - Partner partner = partnerMapper.getByIdOrUserId(partnerUserId); + List<Partner> partners = partnerMapper.getByIdOrUserId(partnerUserId); //适配id和userId + if(partners== null || partners.size() == 0){ + throw new ValidationException("合伙人不存在"); + } + if(partners.size() > 1){ + log.error("合伙人信息重复,userId:{}", partnerUserId); + } + Partner partner = partners.get(0); if (partner == null) { throw new ValidationException("合伙人不存在"); } diff --git a/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java index 719d57a..a113506 100644 --- a/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/menber/impl/MemberGrowthRecordServiceImpl.java @@ -129,9 +129,6 @@ @Override public void deleteMemberGrowthRecord(String id) { - if(id.equals(Constants.DEFAULT_MEMBER_ID)){ - throw new ValidationException("默认普通会员只能编辑,不能删除"); - } MemberGrowthRecord memberGrowthRecord = memberGrowthRecordMapper.selectById(id); if (memberGrowthRecord == null) { throw new ValidationException("成长记录信息不存在"); diff --git a/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java b/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java index 710513c..6978b15 100644 --- a/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java +++ b/src/main/java/com/mzl/flower/service/menber/impl/MemberServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mzl.flower.config.exception.ValidationException; import com.mzl.flower.config.security.SecurityUtils; +import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.request.menber.MemberDTO; import com.mzl.flower.dto.request.menber.MemberQueryDTO; import com.mzl.flower.dto.response.member.MemberVO; @@ -43,18 +44,21 @@ if (member.getStartPoint() > member.getEndPoint()) { throw new ValidationException("成长点开始不能大于结束"); } - - int discountRatio1 = member.getDiscountRatio().compareTo(BigDecimal.ZERO); - if (discountRatio1 == -1) { - throw new ValidationException("会员折扣百分比不能小于0"); + if (!StringUtils.isEmpty(member.getDiscountRatio())) { + int discountRatio1 = member.getDiscountRatio().compareTo(BigDecimal.ZERO); + if (discountRatio1 == -1) { + throw new ValidationException("会员折扣百分比不能小于0"); + } + int discountRatio2 = member.getDiscountRatio().compareTo(new BigDecimal(100)); + if (discountRatio2 == 1) { + throw new ValidationException("会员折扣百分比不能大于100"); + } } - int discountRatio2 = member.getDiscountRatio().compareTo(new BigDecimal(100)); - if (discountRatio2 == 1) { - throw new ValidationException("会员折扣百分比不能大于100"); - } - int discountAmount = member.getDiscountAmount().compareTo(BigDecimal.ZERO); - if (discountAmount == -1) { - throw new ValidationException("会员折扣固定金额不能小于0"); + if (!StringUtils.isEmpty(member.getDiscountAmount())) { + int discountAmount = member.getDiscountAmount().compareTo(BigDecimal.ZERO); + if (discountAmount == -1) { + throw new ValidationException("会员折扣固定金额不能小于0"); + } } //保存时判断是否有重复的名称 @@ -88,6 +92,9 @@ @Override public void deleteMember(String id) { + if(id.equals(Constants.DEFAULT_MEMBER_ID)){ + throw new ValidationException("默认普通会员只能编辑,不能删除"); + } Member member = memberMapper.selectById(id); if (member == null) { throw new ValidationException("会员等级信息不存在"); diff --git a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java index 944ca71..8cca07c 100644 --- a/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/DeliveryOrderService.java @@ -591,6 +591,20 @@ throw new ValidationException("处理数量不能大于商品数量"); } + List<OrderItemCheck> cLs = orderItemCheckMapper.selectList(new QueryWrapper<OrderItemCheck>() + .ne("type", dto.getType()) + .eq("order_item_id", dto.getOrderItemId()) + ); + int otherNum = 0; + if(cLs != null && cLs.size() > 0){ + for(OrderItemCheck c : cLs){ + otherNum += c.getNum(); + } + } + if(otherNum + dto.getNum() > oi.getNum()){ + throw new ValidationException("处理总数量不能大于商品数量"); + } + BigDecimal deduct = new BigDecimal(0); if(Constants.CHECK_TYPE.replace.name().equals(dto.getType())){ deduct = oi.getSupplierPrice().multiply(new BigDecimal(dto.getNum())); diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java index c9bab5f..5d8fa5a 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -21,6 +21,7 @@ import com.mzl.flower.dto.response.system.CodeValueDTO; import com.mzl.flower.dto.response.transport.TransportOrderDTO; import com.mzl.flower.dto.response.warehouse.WarehouseLocationDTO; +import com.mzl.flower.entity.coupon.CouponRecordDO; import com.mzl.flower.entity.customer.Address; import com.mzl.flower.entity.customer.Customer; import com.mzl.flower.entity.flower.FlowerSupplierSaleNum; @@ -131,6 +132,9 @@ @Autowired private OrderItemCheckMapper orderItemCheckMapper; + + @Autowired + private OrderPointGoodsMapper pointGoodsMapper; public void changeFlower2Cart(CartSaveDTO dto) { String userId = SecurityUtils.getUserId(); @@ -273,10 +277,18 @@ Long partnerId = customer.getPartnerId(); Long levelId = customer.getLevelId(); Member member = getMember(levelId); + if (member != null) { + result.setMemberId(levelId); + result.setMemberName(member.getName()); + result.setMemberDiscountType(member.getDiscountType()); + result.setMemberDiscountRatio(member.getDiscountRatio()); + result.setMemberDiscountAmount(member.getDiscountAmount()); + } double totalWeight = 0D; int num = 0; BigDecimal totalAmount = new BigDecimal(0); + BigDecimal totalMemberAmount = new BigDecimal(0); for (FlowerCartListDTO c : ls) { if (!Constants.FLOWER_STATUS.UP.name().equals(c.getStatus())) { throw new ValidationException("商品" + c.getName() + "已下架,请重新提交"); @@ -307,6 +319,7 @@ totalWeight += c.getWeight() * c.getNum(); totalAmount = totalAmount.add(c.getTotal()); + totalMemberAmount = totalMemberAmount.add(c.getTotalMember()); num += c.getNum(); } @@ -317,6 +330,7 @@ result.setFlowers(ls); result.setPacking(packing); result.setTotalAmount(totalAmount); + result.setTotalMemberAmount(totalMemberAmount); result.setTotalWeight(totalWeight); return result; @@ -350,7 +364,8 @@ } Address address = addressMapper.selectById(dto.getAddressId()); - List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address, p.getTotalWeight(), dto.getTransportId()); + List<TransportOrderDTO> tLs = transportService.getPreOrderTransportList(address + , p.getTotalWeight(), dto.getTransportId()); BigDecimal transportFee = new BigDecimal(0); String deliveryName = ""; if (tLs != null && tLs.size() > 0) { @@ -359,23 +374,41 @@ deliveryName = d.getName(); } - //TODO 优惠券和会员价相关修改 - String userId = SecurityUtils.getUserId(); Order order = new Order(); order.setId(UUIDGenerator.getUUID()); + + final List<Long> goodsRecordIdList = dto.getGoodsRecordIdList(); + usePointGoods(order.getId(), goodsRecordIdList);//使用积分商品兑换券 + order.create(userId); order.setRemarks(dto.getRemarks()); order.setSpecialNeeds(dto.getSpecialNeeds()); order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.PENDING.name()); order.setStatus(Constants.ORDER_STATUS.PENDING.name()); - order.setFlowerAmount(p.getTotalAmount()); + //设置下单时的会员信息 + order.setMemberId(p.getMemberId()); + order.setMemberName(p.getMemberName()); + order.setMemberDiscountType(p.getMemberDiscountType()); + order.setMemberDiscountRatio(p.getMemberDiscountRatio()); + order.setMemberCouponAmount(p.getMemberDiscountAmount()); + + order.setFlowerAmount(p.getTotalMemberAmount());//使用会员价总价 order.setPackingFee(p.getPacking()); order.setTransportFee(transportFee); order.setDeliveryName(deliveryName); - BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee); + BigDecimal totalAmount = order.getFlowerAmount().add(p.getPacking()).add(transportFee);//使用优惠券之前的总价 + CouponRecordDO coupon = useCouponRecord(order.getId(), totalAmount, dto.getCouponRecordId()); + if(coupon != null){ + order.setMemberCouponId(coupon.getId()); + order.setMemberCouponCode(coupon.getCouponCode()); + order.setMemberCouponName(coupon.getCouponName()); + order.setMemberCouponAmount(coupon.getCouponDiscountValue()); + + totalAmount = totalAmount.subtract(order.getMemberCouponAmount());//满足条件需要减去优惠券金额 + } order.setTotalAmount(totalAmount); order.setCustomer(address.getName()); @@ -396,6 +429,8 @@ //商品列表处理 List<FlowerCartListDTO> flowers = p.getFlowers(); Map<Long, List<ParamItemDTO>> paramMap = new HashMap<>(); + final BigDecimal flowerAmount = order.getFlowerAmount();//订单商品总价 + final BigDecimal memberCouponAmount = order.getMemberCouponAmount();//使用优惠券面值 for (FlowerCartListDTO f : flowers) { OrderItem t = new OrderItem(); t.setId(UUIDGenerator.getUUID()); @@ -421,8 +456,13 @@ t.setMarkupOne(pp.getFirstFee()); t.setMarkupTwo(pp.getSecondFee()); t.setMarkupPartner(pp.getPartnerFee()); - t.setPrice(pp.getPrice()); - t.setTotal(f.getTotal()); + t.setPrice(f.getPriceMember());//使用会员单价 + t.setTotal(f.getTotalMember());//使用会员总价 + + t.setOriginalPrice(pp.getPrice());//非会员售价 + BigDecimal couponAmount = calculateCoupon(memberCouponAmount, t.getTotal(), flowerAmount, t.getNum()); + t.setCouponAmount(couponAmount);//每扎平摊的优惠券面值 + t.setRealPrice(t.getPrice().subtract(couponAmount));//退款时使用的真实成交价 t.create(userId); orderItemMapper.insert(t); @@ -434,9 +474,52 @@ order.setPayOpenid(openId); orderMapper.insert(order); + //处理积分商品兑换券 + if(goodsRecordIdList != null && goodsRecordIdList.size() > 0){ + for(Long goodsRecordId : goodsRecordIdList){ + OrderPointGoods g = new OrderPointGoods(); + g.setId(UUIDGenerator.getUUID()); + g.setOrderId(order.getId()); + g.setGoodsRecordId(goodsRecordId); + g.create(userId); + pointGoodsMapper.insert(g); + } + } + Map map = paymentV3Service.wxPrepay(order); map.put("_testV2OrderId", order.getId()); return map; + } + + private void usePointGoods(String orderId, List<Long> goodsRecordIdList){ + //TODO 使用积分商品兑换券 + } + + /** + * 计算订单中每种商品每扎平摊的优惠券面值,保留2位小数 + * + * @param couponAmount + * @param itemTotalAmount + * @param totalAmount + * @param num + * @return + */ + private BigDecimal calculateCoupon(BigDecimal couponAmount, BigDecimal itemTotalAmount + , BigDecimal totalAmount, Integer num){ + if(couponAmount == null){ + return new BigDecimal(0); + } + BigDecimal radio = itemTotalAmount.divide(totalAmount, 2, RoundingMode.HALF_UP);//计算该商品总价在订单中的占比 + BigDecimal subCoupon = couponAmount.multiply(radio);//占有的优惠券面值 + return subCoupon.divide(BigDecimal.valueOf(num), 2, RoundingMode.HALF_UP); + } + + private CouponRecordDO useCouponRecord(String orderId, BigDecimal amount, String couponRecordId){ + if(StringUtils.isNotEmpty(couponRecordId)){ + //TODO 优惠券使用和验证,如果不符合使用条件需要抛出异常。需调用优惠券使用方法 + } + + return null; } private String getOrderNo() { @@ -780,6 +863,9 @@ boolean couldCheckRefund = StringUtils.isEmpty(transferId) && count == 0 && cc == 0; dto.setCouldCheckRefund(couldCheckRefund); + List<OrderPointGoodsListDTO> pointGoodsList = orderMapper.getPointGoodsList(id); + dto.setPointGoodsList(pointGoodsList); + return dto; } diff --git a/src/main/java/com/mzl/flower/service/point/CustomerPointService.java b/src/main/java/com/mzl/flower/service/point/CustomerPointService.java index bb55190..04800ee 100644 --- a/src/main/java/com/mzl/flower/service/point/CustomerPointService.java +++ b/src/main/java/com/mzl/flower/service/point/CustomerPointService.java @@ -84,16 +84,15 @@ if(POINT_CHANGE_TYPE.add.name().equals(detail.getChangeType())){ point.setTotalPoint(point.getTotalPoint() + detail.getPoint()); - point.setUsedPoint(point.getUsedPoint() + detail.getUsePoint()); - point.setExpiredPoint(point.getExpiredPoint() + detail.getExpiredPoint()); }else if(POINT_CHANGE_TYPE.reduce.name().equals(detail.getChangeType())){ -// if(point.getTotalPoint()!= null && point.getTotalPoint()!=0 && point.getTotalPoint()>= detail.getPoint()){ -// point.setTotalPoint(point.getTotalPoint() - detail.getPoint()); -// }else{ -// //积分不足,直接清0 -// point.setTotalPoint(0); -// } - point.setTotalPoint(point.getTotalPoint() - detail.getPoint()); + if(point.getTotalPoint()!= null && point.getTotalPoint()!=0 && point.getTotalPoint()>= detail.getPoint()){ + point.setTotalPoint(point.getTotalPoint() - detail.getPoint()); + }else{ + //积分不足,直接清0 + point.setTotalPoint(0); + detail.setPoint(point.getTotalPoint()); + detail.setRemarks(detail.getRemarks()+",积分不足,扣除剩余积分"+point.getTotalPoint()); + } } if(isAdd){ customerPointMapper.insert(point); @@ -114,10 +113,10 @@ detail.setChangeType(POINT_CHANGE_TYPE.reduce.name()); detail.setType(POINT_TYPE.deduction.name()); detail.create(SecurityUtils.getUserId()); - customerPointDetailMapper.insert(detail); - //更新汇总表 updateCustomerPoint(detail); + + customerPointDetailMapper.insert(detail); } public void consumptionPoint(BigDecimal orderAmount, String orderNo,String userId) { diff --git a/src/main/java/com/mzl/flower/utils/DateUtils.java b/src/main/java/com/mzl/flower/utils/DateUtils.java index fdbaaa3..9970c68 100644 --- a/src/main/java/com/mzl/flower/utils/DateUtils.java +++ b/src/main/java/com/mzl/flower/utils/DateUtils.java @@ -2,6 +2,7 @@ import org.apache.poi.util.LocaleUtil; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Calendar; @@ -40,6 +41,19 @@ } + /** + * 将LocalDateTime对象转换为字符串 + * @return + */ + public static String toString(LocalDate date,String format) { + // 定义日期时间格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); + String str = date.format(formatter); + return str; + } + + + public static Date getJavaDate(double date) { return getJavaDate(date, false, (TimeZone)null, false); } diff --git a/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml b/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml index f6b9e26..d944053 100644 --- a/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml +++ b/src/main/resources/mapper/payment/DeliveryOrderItemMapper.xml @@ -26,7 +26,7 @@ </select> <select id="selectDoItemListByTime" resultType="com.mzl.flower.dto.response.payment.DeliveryOrderItemStatisticsDTO"> - SELECT oi.flower_name, oi.flower_level, sum(oi.num) num, sum(oi.supplier_price) price + SELECT oi.flower_name, oi.flower_level, sum(oi.num) num, sum(oi.supplier_price*oi.num) price FROM t_delivery_order_item doi join t_delivery_order q on q.id = doi.delivery_id join t_order_item oi on oi.id = doi.order_item_id @@ -46,6 +46,7 @@ , ois.check_num, ois.check_fee, ois.replace_num, ois.replace_fee, ois.lack_num, ois.lack_fee_supplier lackFee , ois.station_fee, ois.sales_fee_supplier salesFee, ois.service_fee_rate, ois.service_fee, ois.income_supplier , o.status_backend, o.create_time orderTime + , (select count(1) from t_order_item_sales sa where sa.order_item_id = oi.id) salesNum FROM t_delivery_order_item doi join t_delivery_order q on q.id = doi.delivery_id join t_order o on o.id = q.order_id @@ -65,7 +66,7 @@ </select> <select id="getSupplierStatisticsByTime" resultType="com.mzl.flower.dto.response.payment.DeliveryOrderItemStatisticsDTO"> - SELECT sum(oi.num) num, sum(oi.supplier_price) price + SELECT sum(oi.num) num, sum(oi.supplier_price*oi.num) price FROM t_delivery_order_item doi join t_delivery_order q on q.id = doi.delivery_id join t_order_item oi on oi.id = doi.order_item_id diff --git a/src/main/resources/mapper/payment/OrderMapper.xml b/src/main/resources/mapper/payment/OrderMapper.xml index 6cdbeaf..f46921d 100644 --- a/src/main/resources/mapper/payment/OrderMapper.xml +++ b/src/main/resources/mapper/payment/OrderMapper.xml @@ -249,4 +249,11 @@ order by o.receive_time desc limit 1 </select> + + <select id="getPointGoodsList" resultType="com.mzl.flower.dto.response.payment.OrderPointGoodsListDTO"> + select gr.* + from t_point_goods_record gr + join t_order_point_goods opg on opg.goods_record_id = gr.id + where opg.order_id = #{orderId} + </select> </mapper> \ No newline at end of file diff --git a/src/main/resources/mapper/point/CustomerPointDetailMapper.xml b/src/main/resources/mapper/point/CustomerPointDetailMapper.xml index f61dd52..6e4689e 100644 --- a/src/main/resources/mapper/point/CustomerPointDetailMapper.xml +++ b/src/main/resources/mapper/point/CustomerPointDetailMapper.xml @@ -17,4 +17,24 @@ </if> order by t.c desc </select> + <select id="tongjiExpiredPoint" resultType="com.mzl.flower.dto.response.point.ExpiredPointDTO" + parameterType="java.time.LocalDate"> + SELECT + p.user_id, + p.customer_id, + SUM(CASE WHEN p.change_type = 'add' THEN point ELSE 0 END) AS addPoint, + SUM(CASE WHEN p.change_type = 'reduce' THEN point ELSE 0 END) AS reducePoint + FROM + t_customer_point_detail p + WHERE p.deleted= 0 + <if test="lastYear!=null "> + <![CDATA[ + and p.record_date <= #{lastYear} + ]]> + </if> + GROUP BY + p.user_id, + p.customer_id + </select> + </mapper> \ No newline at end of file diff --git a/src/main/resources/script/db-v2.sql b/src/main/resources/script/db-v2.sql new file mode 100644 index 0000000..c8c0f76 --- /dev/null +++ b/src/main/resources/script/db-v2.sql @@ -0,0 +1,22 @@ +==================================================20240831 +ALTER TABLE `t_order` ADD `member_coupon_id` varchar(50) COMMENT '用户优惠券id'; +ALTER TABLE `t_order` ADD `member_coupon_code` varchar(50) COMMENT '优惠券编码'; +ALTER TABLE `t_order` ADD `member_coupon_name` varchar(50) COMMENT '优惠券名称'; +ALTER TABLE `t_order` ADD `member_coupon_amount` DECIMAL(11,2) COMMENT '优惠券金额'; +ALTER TABLE `t_order` ADD `member_id` bigint(25) COMMENT '会员等级id'; +ALTER TABLE `t_order` ADD `member_name` varchar(50) COMMENT '会员等级名称'; +ALTER TABLE `t_order` ADD `member_discount_type` varchar(50) COMMENT '折扣类型(discount_type)'; +ALTER TABLE `t_order` ADD `member_discount_ratio` DECIMAL(11,2) COMMENT '会员折扣'; +ALTER TABLE `t_order` ADD `member_discount_amount` DECIMAL(11,2) COMMENT '优惠金额(每扎)'; + +ALTER TABLE `t_order_item` ADD `coupon_amount` DECIMAL(11,2) COMMENT '优惠券金额/扎'; +ALTER TABLE `t_order_item` ADD `original_price` DECIMAL(11,2) COMMENT '优惠前售价/扎'; +ALTER TABLE `t_order_item` ADD `real_price` DECIMAL(11,2) COMMENT '真实成交价格/每扎'; + + + + + + + + diff --git "a/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx" index 6d5b14e..9f1c3d5 100644 --- "a/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx" +++ "b/src/main/\350\241\250\350\256\276\350\256\241-\344\272\214\346\234\237.xlsx" Binary files differ diff --git "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx" index 341bd45..1eb580f 100644 --- "a/src/main/\350\241\250\350\256\276\350\256\241.xlsx" +++ "b/src/main/\350\241\250\350\256\276\350\256\241.xlsx" Binary files differ -- Gitblit v1.9.3