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; 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; } 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; 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; } 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; } 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; } 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; } 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;//优惠金额(每扎) } 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;//真实成交价格/每扎 } 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 } 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; 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); } 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); } 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> { } 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); } 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")); } } 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("合伙人不存在"); } 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("成长记录信息不存在"); 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,7 +44,7 @@ if (member.getStartPoint() > member.getEndPoint()) { throw new ValidationException("成长点开始不能大于结束"); } if (!StringUtils.isEmpty(member.getDiscountRatio())) { int discountRatio1 = member.getDiscountRatio().compareTo(BigDecimal.ZERO); if (discountRatio1 == -1) { throw new ValidationException("会员折扣百分比不能小于0"); @@ -52,9 +53,12 @@ if (discountRatio2 == 1) { throw new ValidationException("会员折扣百分比不能大于100"); } } 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("会员等级信息不存在"); 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())); 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; } 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); // } 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) { 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); } 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 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> 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> 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 '真实成交价格/每扎'; src/main/表设计-二期.xlsxBinary files differ
src/main/表设计.xlsxBinary files differ