CouponServiceImpl.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package com.qmrb.system.service.impl;
  2. import java.math.BigDecimal;
  3. import java.time.Instant;
  4. import java.time.LocalDateTime;
  5. import java.time.ZoneId;
  6. import java.util.ArrayList;
  7. import java.util.Collections;
  8. import java.util.List;
  9. import java.util.Set;
  10. import java.util.stream.Collectors;
  11. import com.qmrb.system.common.util.AesUtils;
  12. import com.qmrb.system.framework.security.CaConstants;
  13. import com.qmrb.system.framework.security.util.SecurityUtils;
  14. import com.qmrb.system.pojo.entity.BarnRecord;
  15. import com.qmrb.system.pojo.entity.Contract;
  16. import com.qmrb.system.pojo.entity.SysUser;
  17. import com.qmrb.system.service.IBarnRecordService;
  18. import com.qmrb.system.service.IContractService;
  19. import com.qmrb.system.service.SysUserService;
  20. import com.qmrb.system.service.UserService;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  23. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  24. import com.qmrb.system.common.enums.StatusEnum;
  25. import com.qmrb.system.pojo.vo.Option;
  26. import com.qmrb.system.converter.CouponConverter;
  27. import com.qmrb.system.pojo.entity.Coupon;
  28. import com.qmrb.system.pojo.form.CouponForm;
  29. import com.qmrb.system.pojo.vo.CouponVO;
  30. import com.qmrb.system.pojo.query.CouponQuery;
  31. import com.qmrb.system.mapper.CouponMapper;
  32. import com.qmrb.system.service.ICouponService;
  33. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  34. import org.springframework.data.redis.core.RedisTemplate;
  35. import org.springframework.stereotype.Service;
  36. import cn.hutool.core.collection.CollectionUtil;
  37. import cn.hutool.core.util.StrUtil;
  38. import cn.hutool.core.lang.Assert;
  39. import jakarta.validation.Valid;
  40. import javax.swing.*;
  41. /**
  42. * <p>
  43. * 优惠券表 服务实现类
  44. * </p>
  45. *
  46. * @author gs
  47. * @since 2025-03-07
  48. */
  49. @Service
  50. public class CouponServiceImpl extends ServiceImpl<CouponMapper, Coupon> implements ICouponService {
  51. @Autowired
  52. private CouponConverter converter;
  53. @Autowired
  54. private IContractService contractService;
  55. @Autowired
  56. private SysUserService userService;
  57. @Autowired
  58. private RedisTemplate redisTemplate;
  59. @Autowired
  60. private IBarnRecordService barnRecordService;
  61. /**
  62. * 分页查询
  63. */
  64. @Override
  65. public Page<CouponVO> getPage(CouponQuery queryParams) {
  66. // 查询参数
  67. int pageNum = queryParams.getPageNum();
  68. int pageSize = queryParams.getPageSize();
  69. Integer status = queryParams.getStatus();
  70. // String keywords = queryParams.getKeywords();
  71. // 查询数据
  72. Page<Coupon> dictItemPage = this.page(
  73. new Page<>(pageNum, pageSize),
  74. new LambdaQueryWrapper<Coupon>()
  75. .eq(status != null, Coupon::getStatus, status)
  76. .le(StrUtil.isNotBlank(queryParams.getEffectiveTimeEnd()),Coupon::getEffectiveTime,queryParams.getEffectiveTimeEnd())
  77. .ge(StrUtil.isNotBlank(queryParams.getEffectiveTimeBegin()),Coupon::getEffectiveTime,queryParams.getEffectiveTimeBegin())
  78. //.like(StrUtil.isNotBlank(keywords), Coupon::getCategoryName, keywords)
  79. );
  80. // 实体转换
  81. Page<CouponVO> pageResult = converter.entity2Page(dictItemPage);
  82. List<CouponVO> records = pageResult.getRecords();
  83. if (CollectionUtil.isNotEmpty(records)) {
  84. for (CouponVO record : records) {
  85. List<BarnRecord> list = barnRecordService.list(new LambdaQueryWrapper<BarnRecord>().eq(BarnRecord::getId, record.getGoodsId()).orderByDesc(BarnRecord::getCreateTime));
  86. if (CollectionUtil.isNotEmpty(list)) {
  87. record.setCarNumber(list.get(0).getCarNumber());
  88. }
  89. }
  90. }
  91. return pageResult;
  92. }
  93. /**
  94. * 保存表单
  95. */
  96. @Override
  97. public CouponForm saveForm(@Valid CouponForm form) {
  98. // 校验是否已领取过优惠券
  99. List<Coupon> list = this.list(new LambdaQueryWrapper<Coupon>().eq(Coupon::getToUserId, SecurityUtils.getUserId()).eq(Coupon::getGoodsId, form.getGoodsId()));
  100. Assert.isTrue(CollectionUtil.isEmpty(list), "已存在领取的优惠券");
  101. Object contractIdEnc = redisTemplate.opsForValue().get(form.getContractIdEnc());
  102. Assert.isTrue(contractIdEnc != null, "二维码已过期");
  103. String contractId = contractIdEnc.toString();
  104. form.setContractId(Long.parseLong(contractId));
  105. // 根据协议id生成优惠券
  106. if (form.getContractId() != null) {
  107. Contract contract = contractService.getById(form.getContractId());
  108. Assert.isTrue(contract != null, "关联协议数据不存在");
  109. // 校验协议用户是否还有优惠券
  110. Long count = this.count(new LambdaQueryWrapper<Coupon>().eq(Coupon::getContractId, form.getContractId()));
  111. Assert.isTrue(count != null && contract.getMaxCouponCount() != null && count < contract.getMaxCouponCount() , "优惠券已领完");
  112. SysUser user = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getContractId, form.getContractId()));
  113. Assert.isTrue(user != null, "关联协议用户数据不存在");
  114. form.setFromUserId(user.getId());
  115. form.setToUserId(SecurityUtils.getUserId());
  116. form.setScenes(1);// 使用场景(1-停车场, 2-其他场景
  117. // 1 扫码抵用金额 2扫码抵用时长
  118. if (contract.getScanType().equals("1")) {
  119. form.setDenomination(contract.getDiscountAmount());
  120. form.setCouponType(1);// 优惠券类型(1-金额券, 2-时长券)
  121. } else if (contract.getScanType().equals("2")) {
  122. form.setDenomination(contract.getDiscountMinute() != null ? new BigDecimal(contract.getDiscountMinute()) : BigDecimal.ZERO);
  123. form.setCouponType(2);// 优惠券类型(1-金额券, 2-时长券)
  124. }
  125. form.setEffectiveTime(LocalDateTime.now());
  126. // 将 Date 转换为 Instant
  127. Instant outInstant = contract.getEndDate().toInstant();
  128. // 将 Instant 转换为 LocalDateTime(假设使用系统默认时区)
  129. LocalDateTime outDateTime = outInstant.atZone(ZoneId.systemDefault()).toLocalDateTime();
  130. form.setExpireTime(outDateTime);
  131. form.setStatus(0);// 状态(0-已使用, 1-未使用, 2-锁定)
  132. }
  133. // 实体对象转换 form->entity
  134. Coupon entity = converter.form2Entity(form);
  135. // 持久化
  136. this.save(entity);
  137. CouponForm result = converter.entity2Form(entity);
  138. return result;
  139. }
  140. /**
  141. * 更新
  142. */
  143. @Override
  144. public boolean updateForm(Long id, CouponForm form) {
  145. Coupon entity = converter.form2Entity(form);
  146. entity.setId(id);
  147. boolean result = this.updateById(entity);
  148. return result;
  149. }
  150. /**
  151. * 获取表单数据
  152. */
  153. @Override
  154. public CouponForm getFormData(Long id) {
  155. // 获取entity
  156. Coupon entity = this.getById(id);
  157. Assert.isTrue(entity != null, "优惠券表不存在");
  158. // 实体转换
  159. CouponForm form = converter.entity2Form(entity);
  160. return form;
  161. }
  162. }