Merge branch 'refs/heads/price_inquery'

This commit is contained in:
2025-09-17 17:03:37 +08:00
5 changed files with 105 additions and 6 deletions

View File

@@ -7,6 +7,7 @@ import com.ycwl.basic.pricing.dto.CouponClaimRequest;
import com.ycwl.basic.pricing.dto.CouponClaimResult;
import com.ycwl.basic.pricing.dto.req.VoucherPrintReq;
import com.ycwl.basic.pricing.dto.resp.VoucherPrintResp;
import com.ycwl.basic.pricing.enums.CouponType;
import com.ycwl.basic.pricing.service.ICouponService;
import com.ycwl.basic.pricing.service.VoucherPrintService;
import com.ycwl.basic.repository.FaceRepository;
@@ -19,6 +20,9 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.math.BigDecimal;
import java.math.RoundingMode;
@RestController
@RequestMapping("/api/mobile/claim/v1")
@AllArgsConstructor
@@ -80,6 +84,24 @@ public class AppClaimController {
if (claimResult.isSuccess()) {
// 领到了
claimResp.setHasCoupon(true);
switch (claimResult.getCoupon().getCouponType()) {
case CouponType.PERCENTAGE:
claimResp.setCouponType("折扣优惠券");
claimResp.setCouponDesc("" + (BigDecimal.valueOf(1).setScale(2, RoundingMode.HALF_UP).subtract(claimResult.getCoupon().getDiscountValue())).multiply(BigDecimal.valueOf(10)) + "");
break;
case CouponType.FIXED_AMOUNT:
if (claimResult.getCoupon().getMinAmount().compareTo(BigDecimal.ZERO) > 0) {
claimResp.setCouponType("满减优惠券");
claimResp.setCouponDesc("" + claimResult.getCoupon().getMinAmount() + "" + claimResult.getCoupon().getDiscountValue());
} else {
claimResp.setCouponType("直减优惠券");
claimResp.setCouponDesc("直减" + claimResult.getCoupon().getDiscountValue());
}
break;
default:
claimResp.setCouponType("普通优惠券");
break;
}
claimResp.setCouponDesc(scenicConfig.getString("coupon_desc_for_type_" + req.getType(), "专属折扣券"));
claimResp.setCouponCountdown(scenicConfig.getString("coupon_countdown_for_type_" + req.getType(), "送你优惠,保存美好!"));
return ApiResponse.success(claimResp);

View File

@@ -8,6 +8,7 @@ public class ClaimResp {
private String printType;
private String printCode;
private Boolean hasCoupon;
private String couponType;
private String couponDesc;
private String couponCountdown;
}

View File

@@ -1,6 +1,7 @@
package com.ycwl.basic.pricing.dto;
import com.ycwl.basic.pricing.entity.PriceCouponClaimRecord;
import com.ycwl.basic.pricing.entity.PriceCouponConfig;
import lombok.Data;
import java.util.Date;
@@ -55,16 +56,18 @@ public class CouponClaimResult {
* 景区ID
*/
private String scenicId;
private PriceCouponConfig coupon;
/**
* 创建成功结果
*/
public static CouponClaimResult success(PriceCouponClaimRecord record, String couponName) {
public static CouponClaimResult success(PriceCouponClaimRecord record, PriceCouponConfig coupon) {
CouponClaimResult result = new CouponClaimResult();
result.coupon = coupon;
result.success = true;
result.claimRecordId = record.getId();
result.couponId = record.getCouponId();
result.couponName = couponName;
result.couponName = coupon.getCouponName();
result.claimTime = record.getClaimTime();
result.userId = record.getUserId();
result.scenicId = record.getScenicId();

View File

@@ -274,7 +274,7 @@ public class CouponServiceImpl implements ICouponService {
request.getUserId(), request.getCouponId(), claimRecord.getId());
// 10. 返回成功结果
return CouponClaimResult.success(claimRecord, coupon.getCouponName());
return CouponClaimResult.success(claimRecord, coupon);
} catch (Exception e) {
log.error("领取优惠券失败: userId={}, couponId={}",

View File

@@ -137,8 +137,81 @@ public class VoucherUsageServiceImpl implements IVoucherUsageService {
@Override
public List<VoucherUsageStatsResp> getBatchUsageStats(Long batchId) {
// 这里可以实现批次统计,暂时返回空列表
return new ArrayList<>();
if (batchId == null) {
return new ArrayList<>();
}
// 查询批次配置
PriceVoucherBatchConfig batchConfig = batchConfigMapper.selectById(batchId);
if (batchConfig == null || batchConfig.getDeleted() == 1) {
log.warn("批次配置不存在或已删除: batchId={}", batchId);
return new ArrayList<>();
}
// 查询该批次下的所有券码
List<PriceVoucherCode> voucherCodes = voucherCodeMapper.selectByBatchId(batchId);
if (voucherCodes == null || voucherCodes.isEmpty()) {
log.info("批次下无券码数据: batchId={}", batchId);
return new ArrayList<>();
}
List<VoucherUsageStatsResp> statsList = new ArrayList<>();
for (PriceVoucherCode voucherCode : voucherCodes) {
if (voucherCode.getDeleted() == 1) {
continue;
}
VoucherUsageStatsResp stats = new VoucherUsageStatsResp();
stats.setVoucherCodeId(voucherCode.getId());
stats.setVoucherCode(voucherCode.getCode());
stats.setBatchId(batchConfig.getId());
stats.setBatchName(batchConfig.getBatchName());
stats.setScenicId(voucherCode.getScenicId());
stats.setStatus(voucherCode.getStatus());
// 设置状态名称
VoucherCodeStatus statusEnum = VoucherCodeStatus.getByCode(voucherCode.getStatus());
if (statusEnum != null) {
stats.setStatusName(statusEnum.getName());
}
// 设置使用次数相关信息
Integer currentUseCount = voucherCode.getCurrentUseCount() != null ?
voucherCode.getCurrentUseCount() : 0;
stats.setCurrentUseCount(currentUseCount);
stats.setMaxUseCount(batchConfig.getMaxUseCount());
stats.setMaxUsePerUser(batchConfig.getMaxUsePerUser());
stats.setUseIntervalHours(batchConfig.getUseIntervalHours());
// 计算是否还能使用
boolean canUseMore = true;
if (batchConfig.getMaxUseCount() != null) {
canUseMore = currentUseCount < batchConfig.getMaxUseCount();
}
stats.setCanUseMore(canUseMore);
// 计算剩余使用次数
if (batchConfig.getMaxUseCount() != null) {
int remaining = batchConfig.getMaxUseCount() - currentUseCount;
stats.setRemainingUseCount(Math.max(0, remaining));
}
// 获取使用记录数
List<PriceVoucherUsageRecord> usageRecords = usageRecordMapper.selectByVoucherCodeId(voucherCode.getId());
stats.setTotalUsageRecords(usageRecords != null ? usageRecords.size() : 0);
// 格式化最后使用时间
if (voucherCode.getLastUsedTime() != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
stats.setLastUsedTime(sdf.format(voucherCode.getLastUsedTime()));
}
statsList.add(stats);
}
log.info("批次统计完成: batchId={}, 券码数量={}", batchId, statsList.size());
return statsList;
}
@Override