diff --git a/src/main/java/com/example/demo/controller/AuditController.java b/src/main/java/com/example/demo/controller/AuditController.java index bec1e92..349df97 100644 --- a/src/main/java/com/example/demo/controller/AuditController.java +++ b/src/main/java/com/example/demo/controller/AuditController.java @@ -1,9 +1,6 @@ package com.example.demo.controller; -import com.example.demo.domain.vo.AuditRequest; -import com.example.demo.domain.vo.Page; -import com.example.demo.domain.vo.RechargeAudit; -import com.example.demo.domain.vo.RefundAudit; +import com.example.demo.domain.vo.*; import com.example.demo.service.AuditService; import com.github.pagehelper.PageInfo; import lombok.RequiredArgsConstructor; @@ -59,4 +56,20 @@ public class AuditController { return auditService.selectRefundBy(pageNum, pageSize, refundAudit); } + //充值审核合计数 + @PostMapping("sumRechargeGold") + public Gold sumRechargeGold(@RequestBody Page page) { + Integer pageNum = page.getPageNum(); + Integer pageSize = page.getPageSize(); + RechargeAudit rechargeAudit = page.getRechargeAudit(); + return auditService.sumRechargeGold(pageNum, pageSize, rechargeAudit); + } + //退款审核合计数 + @PostMapping("sumRefundGold") + public Gold sumRefundGold(@RequestBody Page page) { + Integer pageNum = page.getPageNum(); + Integer pageSize = page.getPageSize(); + RefundAudit refundAudit = page.getRefundAudit(); + return auditService.sumRefundGold(pageNum, pageSize, refundAudit); + } } diff --git a/src/main/java/com/example/demo/domain/vo/Gold.java b/src/main/java/com/example/demo/domain/vo/Gold.java index a38a574..94119e2 100644 --- a/src/main/java/com/example/demo/domain/vo/Gold.java +++ b/src/main/java/com/example/demo/domain/vo/Gold.java @@ -20,6 +20,7 @@ import java.io.Serializable; @AllArgsConstructor public class Gold implements Serializable { private static final long serialVersionUID = 1L; + private Integer totalNum; //总条数 private Integer permanentGolds; // 永久金币总数 private Integer freeGolds; // 免费金币总数 private Integer taskGolds; // 任务金币总数 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 f7715c8..3c18eb6 100644 --- a/src/main/java/com/example/demo/domain/vo/RefundAudit.java +++ b/src/main/java/com/example/demo/domain/vo/RefundAudit.java @@ -25,16 +25,15 @@ public class RefundAudit { private Integer jwcode; // 精网号 private String orderCode; // 订单号 private String market; // 所属地区 - private Byte refundModel; // 退款方式-全额 部分 + private Integer refundModel; // 退款方式-全额 部分 private String goodsName; // 商品名称 private Integer sumGold; // 退款金额 private Integer permanentGold; // 永久金币 private Integer freeGold; // 免费金币 private Integer freeJune; // 6月免费金币 private Integer freeDecember; // 12月免费金币 + private Integer taskGold; // 任务金币 private String remark; // 备注 - private String payModel; //支付方式 - private String voucher; //支付凭证 private Integer adminId; //提交人Id private String adminName; //提交人姓名 private String auditStatus; //审核状态 diff --git a/src/main/java/com/example/demo/mapper/AuditMapper.java b/src/main/java/com/example/demo/mapper/AuditMapper.java index 1287ccd..23041e2 100644 --- a/src/main/java/com/example/demo/mapper/AuditMapper.java +++ b/src/main/java/com/example/demo/mapper/AuditMapper.java @@ -28,7 +28,7 @@ public interface AuditMapper { //修改用户余额 int updateUserGold(User user); //修改消费订单为以退款 - int updateOrderRefund(String orderCode); + int updateOrderRefund(String orderCode ,Byte isRefund); //多条件查询充值审核订单 List selectRechargeBy(@Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize, diff --git a/src/main/java/com/example/demo/service/AuditService.java b/src/main/java/com/example/demo/service/AuditService.java index 36107e2..5324288 100644 --- a/src/main/java/com/example/demo/service/AuditService.java +++ b/src/main/java/com/example/demo/service/AuditService.java @@ -22,6 +22,8 @@ public interface AuditService { PageInfo selectRechargeBy(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit); //多条件查询退款审核订单 PageInfo selectRefundBy(Integer pageNum, Integer pageSize, RefundAudit refundAudit); - //金币合计数 - Gold sumRechargeGold(); + //充值审核金币合计数 + Gold sumRechargeGold(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit); + //退款审核金币合计数 + Gold sumRefundGold(Integer pageNum, Integer pageSize,RefundAudit refundAudit); } diff --git a/src/main/java/com/example/demo/service/StatisticsService.java b/src/main/java/com/example/demo/service/StatisticsService.java index 30dcd01..fe06f8e 100644 --- a/src/main/java/com/example/demo/service/StatisticsService.java +++ b/src/main/java/com/example/demo/service/StatisticsService.java @@ -15,7 +15,7 @@ import java.util.Date; public interface StatisticsService { - //12点,18点,23点30分执行定时任务更新当天part2数据 + //1点,12点,18点,23点30分执行定时任务更新当天part1数据 public void runHourlyTaskPart1(); //12点,18点执行定时任务更新当天part2数据 public void runHourlyTaskPart2(); diff --git a/src/main/java/com/example/demo/service/WorkbenchService.java b/src/main/java/com/example/demo/service/WorkbenchService.java index c66e860..0207e5c 100644 --- a/src/main/java/com/example/demo/service/WorkbenchService.java +++ b/src/main/java/com/example/demo/service/WorkbenchService.java @@ -1,5 +1,6 @@ package com.example.demo.service; +import com.example.demo.domain.entity.Statistics; import com.example.demo.domain.vo.WorkbenchCard; import com.example.demo.domain.vo.WorkbenchMarketCard; @@ -19,6 +20,8 @@ import java.util.List; public interface WorkbenchService { //获取不同地区的工作台统计卡片 WorkbenchCard getCard(String token); + //获取卡片数据 + WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, 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 8019806..7ea5776 100644 --- a/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/AuditServiceImpl.java @@ -12,6 +12,7 @@ import com.github.pagehelper.PageInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.Date; import java.util.List; /** @@ -44,10 +45,22 @@ public class AuditServiceImpl implements AuditService { if (action==2){ //驳回 updateOrder.setAuditStatus(2); updateOrder.setRejectReason(rejectReason); + updateOrder.setAuditTime(new Date()); auditMapper.updateOrder(updateOrder); - return true; + if (order.getType()==2) { //退款 + //2.获取对应的消费订单(退款订单号去掉开头"TK"即为对应消费订单) + String consumeOrderCode = order.getOrderCode().replaceFirst("TK", ""); + //3.更新消费订单是否已退款状态为0 + UserGoldRecord consumeOrder = auditMapper.selectOrderByOrderCode(consumeOrderCode); + if (consumeOrderCode != null&&consumeOrder.getType()==1){ //确保是消费订单 + auditMapper.updateOrderRefund(consumeOrderCode,(byte)0); + }else { + throw new IllegalArgumentException("找不到对应的订单或不是有效订单"); + } + } }else if (action==1) { //通过 updateOrder.setAuditStatus(1); + updateOrder.setAuditTime(new Date()); } // 执行审核更新 auditMapper.updateOrder(updateOrder); @@ -66,23 +79,16 @@ public class AuditServiceImpl implements AuditService { update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币 auditMapper.updateUserGold(update); }else if (order.getType()==2) { //退款 - //1.更新用户余额,并标记对应的消费订单为已退款 + //更新用户余额 User update = new User(); update.setJwcode(order.getJwcode()); update.setCurrentPermanentGold(order.getPermanentGold()); //当前永久金币 update.setCurrentFreeJune(order.getFreeJune()); //当前六月免费金币 update.setCurrentFreeDecember(order.getFreeDecember()); //当前十二月免费金币 update.setCurrentTaskGold(order.getTaskGold()); //当前任务金币 + auditMapper.updateUserGold(update); - //2.获取对应的消费订单(退款订单号去掉开头"TK"即为对应消费订单) - String consumeOrderCode = order.getOrderCode().replaceFirst("TK", ""); - //3.更新消费订单是否已退款状态为1 - UserGoldRecord consumeOrder = auditMapper.selectOrderByOrderCode(consumeOrderCode); - if (consumeOrderCode != null&&consumeOrder.getType()==1){ //确保是消费订单 - auditMapper.updateOrderRefund(consumeOrderCode); - }else { - throw new IllegalArgumentException("找不到对应的订单或不是有效订单"); - } + } return true; } @@ -94,25 +100,88 @@ public class AuditServiceImpl implements AuditService { PageHelper.startPage(pageNum, pageSize); List rechargeAudits = auditMapper.selectRechargeBy(pageNum, pageSize, rechargeAudit); + // rechargeAudit.setFreeGold(rechargeAudit.getFreeJune()+rechargeAudit.getFreeDecember()); return new PageInfo<>(rechargeAudits); } - + /* + 多条件查询退款订单 + */ @Override public PageInfo selectRefundBy(Integer pageNum, Integer pageSize, RefundAudit refundAudit) { PageHelper.startPage(pageNum, pageSize); List refundAudits = auditMapper.selectRefundBy(pageNum, pageSize, refundAudit); - + //refundAudit.setFreeGold(refundAudit.getFreeJune()+refundAudit.getFreeDecember()); return new PageInfo<>(refundAudits); } /* - 金币合计数 + 充值审核金币合计数 */ @Override - public Gold sumRechargeGold() { + public Gold sumRechargeGold(Integer pageNum, Integer pageSize, RechargeAudit rechargeAudit) { Gold gold = new Gold(); //获取充值审核订单列表 - List rechargeAudits = auditMapper.selectRechargeBy(1, 1000, null); - return null; + List rechargeAudits = auditMapper.selectRechargeBy(1, 500000, rechargeAudit); + // 初始化累加器 + int totalNum=0; + int permanentGoldSum = 0; + int freeGoldSum = 0; +// 遍历消费记录并累加金币 + for (RechargeAudit recharge : rechargeAudits) { + // 累加永久金币 + if (recharge.getPermanentGold() != null) { + permanentGoldSum += recharge.getPermanentGold(); + } + // 累加免费金币 + if (recharge.getFreeJune() != null||recharge.getFreeDecember() != null) { + freeGoldSum = freeGoldSum+recharge.getFreeJune()+recharge.getFreeDecember(); + } + + // 每遍历一条记录,总条数加1 + totalNum++; + } + // 将累加结果设置到Gold对象 + gold.setPermanentGolds(permanentGoldSum); + gold.setFreeGolds(freeGoldSum); + gold.setTotalNum(totalNum); + return gold; + } + + /* + 退款审核合计数 + */ + @Override + public Gold sumRefundGold(Integer pageNum, Integer pageSize, RefundAudit refundAudit) { + Gold gold = new Gold(); + //获取充值审核订单列表 + List refundAudits = auditMapper.selectRefundBy(1, 500000, refundAudit); + // 初始化累加器 + int totalNum=0; + int permanentGoldSum = 0; + int freeGoldSum = 0; + int taskGoldSum = 0; +// 遍历消费记录并累加金币 + for (RefundAudit refund : refundAudits) { + // 累加永久金币 + if (refund.getPermanentGold() != null) { + permanentGoldSum += refund.getPermanentGold(); + } + // 累加免费金币 + if (refund.getFreeJune() != null||refund.getFreeDecember()!=null) { + freeGoldSum += refund.getFreeJune()+refund.getFreeDecember(); + } + //累加任务金币 + if(refund.getTaskGold()!=null) + taskGoldSum+=refund.getTaskGold(); + + // 每遍历一条记录,总条数加1 + totalNum++; + } + // 将累加结果设置到Gold对象 + gold.setPermanentGolds(permanentGoldSum); + gold.setFreeGolds(freeGoldSum); + gold.setTotalNum(totalNum); + gold.setTaskGolds(taskGoldSum); + return gold; } } diff --git a/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java index 8e346db..d93852e 100644 --- a/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/StatisticsServiceImpl.java @@ -39,7 +39,7 @@ public class StatisticsServiceImpl implements StatisticsService { 12点,18点,23点30分执行定时任务更新当天part1数据 */ @Override - @Scheduled(cron = "0 0 12,18 * * ?") // 分别在 12:00 和 18:00 执行 + @Scheduled(cron = "0 0 1,12,18 * * ?") // 分别在 1:00 12:00 和 18:00 执行 @Scheduled(cron = "0 30 23 * * ?") // 在 23:30 执行 public void runHourlyTaskPart1() { Date today = new Date(); //取当天日期 diff --git a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java index 9dad75b..35c8833 100644 --- a/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java +++ b/src/main/java/com/example/demo/serviceImpl/WorkbenchServiceImpl.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** * @program: gold-java @@ -52,10 +53,29 @@ public class WorkbenchServiceImpl implements WorkbenchService { LocalDate today = LocalDate.now(); // 获取当前年份的第一天 LocalDate firstDayOfYear = today.withDayOfYear(1); + // 将年份的第一天日期转换为Date类型 Date yearlyStartDate=Date.from(firstDayOfYear.atStartOfDay(ZoneId.systemDefault()).toInstant()); List markets = generalService.getMarket(); - List marketCards = new ArrayList<>(); - // 遍历每个 marketCard 并填充数据 + // 并行处理市场列表,创建市场卡片列表 + List marketCards = markets.parallelStream() + // 过滤掉空或全空格的市场名称 + .filter(market -> market != null && !market.trim().isEmpty()) + .map(market -> { + // 根据市场名称和日期范围查询统计信息 + Statistics statistics = statisticsMapper.selectByMarketAndDate( + market, + Date.from(startOfDay.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant()) + ); + // 创建并返回市场卡片对象 + return createWorkbenchMarketCard(market, statistics, yearlyStartDate, date); + }) + // 收集并行流结果为列表 + .collect(Collectors.toList()); + + return new WorkbenchCard(token, marketCards, markets, date, date); + /* List marketCards = new ArrayList<>(); + // 遍历每个 marketCard 并填充数据 for (String market : markets) { if (market == null || market.trim().isEmpty()) continue; @@ -112,7 +132,58 @@ public class WorkbenchServiceImpl implements WorkbenchService { } } - return new WorkbenchCard(token, marketCards,markets,date,date); + return new WorkbenchCard(token, marketCards,markets,date,date);*/ + } + /* + 获取卡片数据 + */ + @Override + public WorkbenchMarketCard createWorkbenchMarketCard(String market, Statistics statistics, Date yearlyStartDate, Date currentDate) { + Date date=new Date(); + WorkbenchMarketCard card = new WorkbenchMarketCard(); + card.setMarket(market); + if (statistics != null) { + // 卡片一:当前金币相关 + card.setCurrentPermanent(statistics.getCurrentPermanent());//余量-永久金币 + card.setCurrentFreeJune(statistics.getCurrentFreeJune()); //余量-免费六月金币 + card.setCurrentFreeDecember(statistics.getCurrentFreeDecember()); //余量-免费十二月金币 + card.setCurrentTask(statistics.getCurrentTask()); //余量-任务金币 + card.setCurrentFree(card.getCurrentFreeJune() + card.getCurrentFreeDecember()); //余量-免费金币 + card.setCurrentGold(card.getCurrentPermanent() + card.getCurrentFree() + card.getCurrentTask()); //余量-总金币 + card.setDailyChange(statistics.getDailyChange()); //较前一日变化 + // 卡片二:充值相关 + card.setRecharge(statistics.getRecharge()); //充值-当日充值 + card.setMoney(statistics.getMoney()); //充值-当日金额(永久) + card.setYearlyRecharge(calculateSum(market, "recharge",yearlyStartDate ,date));//充值-全年累计充值 + card.setYearlyMoney(calculateSum(market, "money",yearlyStartDate ,date)); //充值-全年累计金额(永久) + // 卡片三:消费与退款 + 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());//退款-任务金币 + //当日总消费 + 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.setYearlyConsume(calculateSum(market, "consume", yearlyStartDate,date));//年累计消费 + card.setYearlyRefund(calculateSum(market, "refund",yearlyStartDate ,date));//年累计退款 + card.setYearlyReduce(card.getYearlyConsume() - card.getYearlyRefund());//年累计消耗 + // 卡片四:人头数相关 + card.setRechargeNum(statistics.getRechargeNum()); + card.setFirstRecharge(statistics.getFirstRecharge()); + card.setYearlyRechargeNum(calculateSum(market,"rechargeNum",yearlyStartDate,date)); + + + // 周环比、日同比 + card.setWow(calculateWeekOverWeek(market, currentDate)); + card.setDaily(calculateDayOverDay(market, currentDate)); + } + return card; } @Override diff --git a/src/main/resources/mapper/AuditMapper.xml b/src/main/resources/mapper/AuditMapper.xml index 71dd88c..ff9c12c 100644 --- a/src/main/resources/mapper/AuditMapper.xml +++ b/src/main/resources/mapper/AuditMapper.xml @@ -25,7 +25,7 @@ update user_gold_record - set is_refund = 1 + set is_refund = #{isRefund} where order_code = #{orderCode} @@ -82,10 +82,10 @@ LEFT JOIN admin a2 ON ugr.audit_id = a2.id - + AND ugr.jwcode = #{refundAudit.jwcode} - + AND ugr.refund_model = #{refundAudit.refundModel} diff --git a/src/main/resources/mapper/StatisticsMapper.xml b/src/main/resources/mapper/StatisticsMapper.xml index 700ed65..9ecf964 100644 --- a/src/main/resources/mapper/StatisticsMapper.xml +++ b/src/main/resources/mapper/StatisticsMapper.xml @@ -103,9 +103,8 @@ SELECT * FROM statistics WHERE market = #{market} - AND current_datetime >= #{startDate} - AND current_datetime <= #{endDate} - LIMIT 1 + AND current_datetime BETWEEN #{startDate} AND #{endDate} +