From db994385c62a32de344a5e6dc566b679435d9e54 Mon Sep 17 00:00:00 2001 From: gongzuming <gongzuming> Date: 星期一, 02 九月 2024 09:14:24 +0800 Subject: [PATCH] 积分过期 --- src/main/java/com/mzl/flower/dto/response/point/ExpiredPointDTO.java | 16 ++++ src/main/表设计-二期.xlsx | 0 src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java | 15 +-- src/main/resources/mapper/point/CustomerPointDetailMapper.xml | 20 +++++ src/main/java/com/mzl/flower/utils/DateUtils.java | 14 +++ src/main/java/com/mzl/flower/constant/Constants.java | 3 src/main/java/com/mzl/flower/mapper/partner/PartnerMapper.java | 2 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/entity/point/CustomerPointDetail.java | 8 - src/main/java/com/mzl/flower/service/customer/CustomerService.java | 19 ++++ 11 files changed, 174 insertions(+), 34 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/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/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/point/CustomerPointDetailMapper.java b/src/main/java/com/mzl/flower/mapper/point/CustomerPointDetailMapper.java index fb896a7..adadcb3 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(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..a122c69 --- /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 0 2 * * ?") + 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(lastYear,"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/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/point/CustomerPointDetailMapper.xml b/src/main/resources/mapper/point/CustomerPointDetailMapper.xml index f61dd52..4e7b369 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[ + 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/\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 -- Gitblit v1.9.3