diff --git a/README.md b/README.md index bd427c9..ae69c0b 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ -# gold-java +# Gold项目 + +## springBoot:3.3.6 + +## java :JDK21 + +## Maven:3.9.8 + +## Mysql:5.7.44 地址端口号:18.143.76.3:3306 + +### 测试 :数据库:正式 hwgold aDiw7MERSATdfGta 测试 hwgoldc zB48T55wCsHC8KPz + +## 域名 + +### 测试:hwjb.homilychart.com + +### 正式: + + + + + + diff --git a/src/main/java/com/example/demo/controller/ExportController.java b/src/main/java/com/example/demo/controller/ExportController.java index b773b02..f4f4408 100644 --- a/src/main/java/com/example/demo/controller/ExportController.java +++ b/src/main/java/com/example/demo/controller/ExportController.java @@ -1,10 +1,12 @@ package com.example.demo.controller; import com.example.demo.Util.BusinessException; +import com.example.demo.Util.JWTUtil; import com.example.demo.Util.RedisLockUtil; import com.example.demo.domain.DTO.ConsumeDTO; import com.example.demo.domain.DTO.RechargeDTO; import com.example.demo.domain.DTO.RefundDTO; +import com.example.demo.domain.entity.Admin; import com.example.demo.domain.entity.Export; import com.example.demo.domain.vo.Result; import com.example.demo.service.ExportExcelService; @@ -14,6 +16,7 @@ import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -42,12 +45,14 @@ public class ExportController { @Autowired private ExportService exportService; @PostMapping("/export") - public Result export(@RequestBody Export Export)throws Exception{ + public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception { try { - return Result.success(exportExcelService.getExcel(Export)); + UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class); + export.setAccount(Integer.valueOf(token1.getUsername())); + return Result.success(exportExcelService.getExcel(export)); } catch (Exception e) { log.error("导出失败", e.getMessage()); - return Result.error("导出失败"+e.getMessage()); + return Result.error("导出失败" + e.getMessage()); } } @PostMapping("/exportRecharge") @@ -90,15 +95,10 @@ public class ExportController { String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁) long expireTime = 5000; // 锁过期时间(5秒)s try { - // 尝试获取锁 - if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) { - throw new BusinessException("操作太频繁,请稍后重试"); - } - // 执行业务逻辑 return exportService.addExportConsume(dto); } finally { // 释放锁 redisLockUtil.unlock(lockKey, requestId); } } -} +} \ No newline at end of file diff --git a/src/main/java/com/example/demo/domain/vo/RefundAudit.java b/src/main/java/com/example/demo/domain/vo/RefundAudit.java index 727b2e4..3d994d6 100644 --- a/src/main/java/com/example/demo/domain/vo/RefundAudit.java +++ b/src/main/java/com/example/demo/domain/vo/RefundAudit.java @@ -33,6 +33,7 @@ public class RefundAudit { private Integer permanentGold; // 永久金币 private Integer freeGold; // 免费金币 private Integer freeJune; // 6月免费金币 + private String refundType; //退款类型 private Integer freeDecember; // 12月免费金币 private Integer taskGold; // 任务金币 private String remark; // 备注 diff --git a/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java index 5195f5b..e84b9d1 100644 --- a/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java +++ b/src/main/java/com/example/demo/domain/vo/WorkbenchMarketCard.java @@ -31,21 +31,21 @@ public class WorkbenchMarketCard implements Serializable { private Integer currentFree; // 免费金币余量(currentFreeJune + currentFreeDecember) // 卡片二:充值相关 - private Integer recharge; // 当日充值金币数 - private Integer money; // 当日金额(永久金币) + private Integer recharge; // 昨日充值金币数 + private Integer money; // 昨日金额(永久金币) private Integer yearlyRecharge; // 全年累计充值金币数 private Integer yearlyMoney; // 全年累计金额 // 卡片三:当日消费/退款/消耗相关 - private Integer consumePermanent; // 当日新增消费(永久) - private Integer consumeFreeJune; // 当日新增消费(六月免费) - private Integer consumeFreeDecember; // 当日新增消费(十二月免费) - private Integer consumeTask; // 当日新增消费(任务) - private Integer refundPermanent; // 当日新增退款(永久) - private Integer refundFreeJune; // 当日新增退款(六月免费) - private Integer refundFreeDecember; // 当日新增退款(十二月免费) - private Integer refundTask; // 当日新增退款(任务) - private Integer dailyReduce; // 当日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask) + private Integer consumePermanent; // 昨日新增消费(永久) + private Integer consumeFreeJune; // 昨日新增消费(六月免费) + private Integer consumeFreeDecember; // 昨日新增消费(十二月免费) + private Integer consumeTask; // 昨日新增消费(任务) + private Integer refundPermanent; // 昨日新增退款(永久) + private Integer refundFreeJune; // 昨日新增退款(六月免费) + private Integer refundFreeDecember; // 昨日新增退款(十二月免费) + private Integer refundTask; // 昨日新增退款(任务) + private Integer dailyReduce; // 昨日总消耗 = consumePermanent + consumeFreeJune + consumeFreeDecember + consumeTask - (refundPermanent + refundFreeJune + refundFreeDecember + refundTask) private Integer yearlyConsume; // 全年累计消费 private Integer yearlyRefund; // 全年累计退款金币数 private Integer yearlyReduce; // 全年累计消耗金币数 = yearlyConsume - yearlyRefund diff --git a/src/main/java/com/example/demo/mapper/ConsumeMapper.java b/src/main/java/com/example/demo/mapper/ConsumeMapper.java index fd6bf53..60ca6a7 100644 --- a/src/main/java/com/example/demo/mapper/ConsumeMapper.java +++ b/src/main/java/com/example/demo/mapper/ConsumeMapper.java @@ -25,4 +25,6 @@ public interface ConsumeMapper { void add(UserGoldRecord userGoldRecord); void updateIsRefund(String orderCode); + + List selectOrderCodeByJwcode(String jwcode,String orderCode); } diff --git a/src/main/java/com/example/demo/service/WorkbenchService.java b/src/main/java/com/example/demo/service/WorkbenchService.java index 35542c3..fa011c1 100644 --- a/src/main/java/com/example/demo/service/WorkbenchService.java +++ b/src/main/java/com/example/demo/service/WorkbenchService.java @@ -22,7 +22,7 @@ public interface WorkbenchService { //获取不同地区的工作台统计卡片 WorkbenchCard getCard(String token); //获取卡片数据 - WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, Date yearlyStartDate, Date currentDate); + WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics currentStatistics,Statistics ydayStatistics, Date yearlyStartDate, Date currentDate); //获取不同地区的工作台柱状图数据(根据类型,起止时间,地区查询) WorkbenchCard getGraph(String token, Date startDate, Date endDate, List markets); //根据类型获取年初至今的统计数据 diff --git a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java index 7ea5776..8ba488c 100644 --- a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java @@ -46,7 +46,7 @@ public class AuditServiceImpl implements AuditService { updateOrder.setAuditStatus(2); updateOrder.setRejectReason(rejectReason); updateOrder.setAuditTime(new Date()); - auditMapper.updateOrder(updateOrder); + if (order.getType()==2) { //退款 //2.获取对应的消费订单(退款订单号去掉开头"TK"即为对应消费订单) String consumeOrderCode = order.getOrderCode().replaceFirst("TK", ""); diff --git a/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java index ffe7dac..db3e664 100644 --- a/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/RefundServiceImpl.java @@ -90,13 +90,14 @@ public class RefundServiceImpl implements RefundService { List refundUsers = refundMapper.selectBy(refundUser); return new PageInfo<>(refundUsers); } + @Transactional @Override public Result add(RefundUser refundUser) { - if(refundUser.getTaskGold()==null||refundUser.getFreeGold()==null||refundUser.getPermanentGold()==null){ + if (refundUser.getTaskGold() == null || refundUser.getFreeGold() == null || refundUser.getPermanentGold() == null) { return Result.error("金币不能为空"); } - if(refundUser.getTaskGold()<0||refundUser.getFreeGold()<0||refundUser.getPermanentGold()<0){ + if (refundUser.getTaskGold() < 0 || refundUser.getFreeGold() < 0 || refundUser.getPermanentGold() < 0) { return Result.error("金币不能为负数"); } UserGoldRecord userGoldRecord = new UserGoldRecord(); @@ -141,6 +142,10 @@ public class RefundServiceImpl implements RefundService { userGoldRecord.setType((byte) 2); userGoldRecord.setAuditStatus(0); userGoldRecord.setCreateTime(new Date()); + List list = consumeMapper.selectOrderCodeByJwcode(userGoldRecord.getJwcode().toString(), orderCode); + if (list == null || list.isEmpty()) { + return Result.error("该用户没有该订单号"); + } refundMapper.add(userGoldRecord); consumeMapper.updateIsRefund(orderCode); return Result.success(); @@ -172,7 +177,7 @@ public class RefundServiceImpl implements RefundService { String combined = orderCode + "_" + goodsName; RefundUser refundUser = new RefundUser(); refundUser.setGoodsName(combined); - refundUser.setSumGold(record.getPermanentGold()+record.getFreeGold()+record.getTaskGold()); + refundUser.setSumGold(record.getPermanentGold() + record.getFreeGold() + record.getTaskGold()); refundUser.setPermanentGold(record.getPermanentGold()); refundUser.setFreeGold(record.getFreeGold()); refundUser.setTaskGold(record.getTaskGold()); diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java index e495b0d..afc3d8a 100644 --- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java @@ -40,14 +40,20 @@ public class WorkbenchServiceImpl implements WorkbenchService { private StatisticsMapper statisticsMapper; @Override public WorkbenchCard getCard(String token) { - Date date=new Date(); + Date date=new Date();//当天 + Date yday=generalService.getYesterday(); // 获取开始时间和结束时间(当天) LocalDateTime startOfDay = date.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDateTime() .with(LocalTime.MIN); - LocalDateTime endOfDay = startOfDay.plusDays(1).minusSeconds(1); + // 获取开始时间和结束时间(当天) + LocalDateTime startOfYday = yday.toInstant() + .atZone(ZoneId.systemDefault()) + .toLocalDateTime() + .with(LocalTime.MIN); + LocalDateTime endOfYday = startOfYday.plusDays(1).minusSeconds(1); // 获取当前日期 LocalDate today = LocalDate.now(); // 获取当前年份的第一天 @@ -61,13 +67,18 @@ public class WorkbenchServiceImpl implements WorkbenchService { .filter(market -> market != null && !market.trim().isEmpty()) .map(market -> { // 根据市场名称和日期范围查询统计信息 - Statistics statistics = statisticsMapper.selectByMarketAndDate( + Statistics currentStatistics = statisticsMapper.selectByMarketAndDate( market, Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()), Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()) ); + Statistics ydayStatistics = statisticsMapper.selectByMarketAndDate( + market, + Date.from(startOfYday.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endOfYday.atZone(ZoneId.systemDefault()).toInstant()) + ); // 创建并返回市场卡片对象 - return createWorkbenchMarketCard(market, statistics, yearlyStartDate, date); + return createWorkbenchMarketCard(market, currentStatistics,ydayStatistics, yearlyStartDate, date); }) // 收集并行流结果为列表 .collect(Collectors.toList()); @@ -137,48 +148,48 @@ public class WorkbenchServiceImpl implements WorkbenchService { 获取卡片数据 */ @Override - public WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, Date yearlyStartDate, Date currentDate) { + public WorkbenchMarketCard createWorkbenchMarketCard(String market,Statistics currentStatistics, Statistics ydayStatistics, Date yearlyStartDate, Date currentDate) { Date date=new Date(); WorkbenchMarketCard card = new WorkbenchMarketCard(); card.setMarket(market); - if (statistics != null) { + if (currentStatistics != null&& ydayStatistics != null) { // 一次性获取全年统计数据(从年初到今天) Map yearlyStats = calculateAllSum(market, yearlyStartDate, date); // 卡片一:当前金币相关 - card.setCurrentPermanent(statistics.getCurrentPermanent());//余量-永久金币 - card.setCurrentFreeJune(statistics.getCurrentFreeJune()); //余量-免费六月金币 - card.setCurrentFreeDecember(statistics.getCurrentFreeDecember()); //余量-免费十二月金币 - card.setCurrentTask(statistics.getCurrentTask()); //余量-任务金币 + card.setCurrentPermanent(currentStatistics.getCurrentPermanent());//余量-永久金币 + card.setCurrentFreeJune(currentStatistics.getCurrentFreeJune()); //余量-免费六月金币 + card.setCurrentFreeDecember(currentStatistics.getCurrentFreeDecember()); //余量-免费十二月金币 + card.setCurrentTask(currentStatistics.getCurrentTask()); //余量-任务金币 card.setCurrentFree(card.getCurrentFreeJune() + card.getCurrentFreeDecember()); //余量-免费金币 card.setCurrentGold(card.getCurrentPermanent() + card.getCurrentFree() + card.getCurrentTask()); //余量-总金币 - card.setDailyChange(statistics.getDailyChange()); //较前一日变化 + card.setDailyChange(currentStatistics.getDailyChange()); //较前一日变化 // 卡片二:充值相关 - card.setRecharge(statistics.getRecharge()); //充值-当日充值 - card.setMoney(statistics.getMoney()); //充值-当日金额(永久) + card.setRecharge(ydayStatistics.getRecharge()); //充值-昨日充值 + card.setMoney(ydayStatistics.getMoney()); //充值-昨日金额(永久) card.setYearlyRecharge(yearlyStats.getOrDefault("recharge", 0)); // 充值-全年累计充值 card.setYearlyMoney(yearlyStats.getOrDefault("money", 0)); // 充值-全年累计金额(永久)//充值-全年累计金额(永久) // 卡片三:消费与退款 - card.setConsumePermanent(statistics.getConsumePermanent());//消费-永久金币 - card.setConsumeFreeJune(statistics.getConsumeFreeJune());//消费-免费六月金币 - card.setConsumeFreeDecember(statistics.getConsumeFreeDecember());//消费-免费十二月金币 - card.setConsumeTask(statistics.getConsumeTask());//消费-任务金币 - card.setRefundPermanent(statistics.getRefundPermanent());//退款-永久金币 - card.setRefundFreeJune(statistics.getRefundFreeJune());//退款-免费六月金币 - card.setRefundFreeDecember(statistics.getRefundFreeDecember());//退款-免费十二月金币 - card.setRefundTask(statistics.getRefundTask());//退款-任务金币 - //当日总消费 + card.setConsumePermanent(ydayStatistics.getConsumePermanent());//昨日消费-永久金币 + card.setConsumeFreeJune(ydayStatistics.getConsumeFreeJune());//昨日消费-免费六月金币 + card.setConsumeFreeDecember(ydayStatistics.getConsumeFreeDecember());//昨日消费-免费十二月金币 + card.setConsumeTask(ydayStatistics.getConsumeTask());//昨日消费-任务金币 + card.setRefundPermanent(ydayStatistics.getRefundPermanent());//昨日退款-永久金币 + card.setRefundFreeJune(ydayStatistics.getRefundFreeJune());//昨日退款-免费六月金币 + card.setRefundFreeDecember(ydayStatistics.getRefundFreeDecember());//昨日退款-免费十二月金币 + card.setRefundTask(ydayStatistics.getRefundTask());//昨日退款-任务金币 + //昨日总消费 int totalConsume = card.getConsumePermanent() + card.getConsumeFreeJune() + card.getConsumeFreeDecember() + card.getConsumeTask(); - //当日总退款 + //昨日总退款 int totalRefund = card.getRefundPermanent() + card.getRefundFreeJune() + card.getRefundFreeDecember() + card.getRefundTask(); - card.setDailyReduce(totalConsume - totalRefund);//当日总消耗 + card.setDailyReduce(totalConsume - totalRefund);//昨日总消耗 card.setYearlyConsume(yearlyStats.getOrDefault("consume", 0)); // 年累计消费 card.setYearlyRefund(yearlyStats.getOrDefault("refund", 0)); // 年累计退款 card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗 // 卡片四:人头数相关 - card.setRechargeNum(statistics.getRechargeNum()); - card.setFirstRecharge(statistics.getFirstRecharge()); + card.setRechargeNum(currentStatistics.getRechargeNum()); + card.setFirstRecharge(currentStatistics.getFirstRecharge()); card.setYearlyRechargeNum(yearlyStats.getOrDefault("rechargeNum", 0)); diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 0f627ee..aacbef8 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -9,6 +9,8 @@ reject_reason = #{rejectReason}, audit_time = #{auditTime} where order_code = #{orderCode} + order by create_time DESC + limit 1 @@ -34,6 +36,8 @@ + + INSERT INTO user_gold_record diff --git a/src/main/resources/mapper/PermissionMapper.xml b/src/main/resources/mapper/PermissionMapper.xml index f8379ae..3f2b03e 100644 --- a/src/main/resources/mapper/PermissionMapper.xml +++ b/src/main/resources/mapper/PermissionMapper.xml @@ -56,6 +56,7 @@ admin.postiton=#{postiton} + order by admin.admin_status desc