From 0289ad75eb7080edea51af0a6590d056a5356f18 Mon Sep 17 00:00:00 2001 From: wuchunlei Date: Thu, 5 Feb 2026 17:58:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=8E202301=E5=88=B0=E7=9B=AE=E5=89=8D?= =?UTF-8?q?=E7=9A=84=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StatisticsController.java | 297 ++++++++++++++++++ 1 file changed, 297 insertions(+) diff --git a/src/main/java/com/zmzm/finance/common/controller/StatisticsController.java b/src/main/java/com/zmzm/finance/common/controller/StatisticsController.java index a0375e3..4dcade1 100644 --- a/src/main/java/com/zmzm/finance/common/controller/StatisticsController.java +++ b/src/main/java/com/zmzm/finance/common/controller/StatisticsController.java @@ -40,6 +40,303 @@ public class StatisticsController { @Autowired private IFinanceOrderService financeOrderService; + //全部统计 + @RequestMapping("/getMonthStatistics") + public R getMonthStatistics(HttpServletResponse response) throws ParseException { + SimpleDateFormat sdfmonth = new SimpleDateFormat("yyyy-MM"); + Date beginDate = sdfmonth.parse("2023-01"); + Date nowDate = sdfmonth.parse(sdfmonth.format(new Date())); + List> resultList = new ArrayList<>(); + for (Date d=beginDate;!d.equals(nowDate);d = DateUtils.addMonths(d,1)){ + String date = sdfmonth.format(d); + Map resultMap = new HashMap<>(); + BigDecimal monthTotal = new BigDecimal("0"); + resultMap.put("01月份",date); + + Orders physical = ordersService.getOne(new MPJLambdaWrapper() + .eq(Orders::getUseFlag,1).eq(Orders::getType,3) + .apply("DATE_FORMAT(t.order_time,'%Y-%m') = '"+date+"'") + .selectSum(Orders::getFee)); + BigDecimal physicalFee = physical==null?BigDecimal.ZERO:physical.getFee(); + resultMap.put("02实物",physicalFee); + monthTotal = monthTotal.add(physicalFee); + + Orders trangingClass = ordersService.getOne(new MPJLambdaWrapper() + .eq(Orders::getUseFlag,1).eq(Orders::getType,4) + .apply("DATE_FORMAT(t.order_time,'%Y-%m') = '"+date+"'") + .selectSum(Orders::getFee)); + BigDecimal trangingClassFee = trangingClass==null?BigDecimal.ZERO:trangingClass.getFee(); + resultMap.put("03培训班",trangingClassFee); + monthTotal = monthTotal.add(trangingClassFee); + + YearMonth yearMonth = YearMonth.parse(date); + SimpleDateFormat sdfday = new SimpleDateFormat("yyyy-MM-dd"); + String day = date+"-"+yearMonth.lengthOfMonth(); + String month = date; + BigDecimal vipNowTotal = BigDecimal.ZERO; + //所有vip订单 + List vipOrders = ordersService.list(new MPJLambdaWrapper() + .eq(Orders::getUseFlag,1).eq(Orders::getType,1)); + //吴门医述订单 + List wumenOrderIds = vipOrders.stream().filter(o -> o.getSource() == 1).map(Orders::getOrderOldId).collect(Collectors.toList()); + List> buyOrders = buyOrderService.listMaps(new MPJLambdaWrapper() + .leftJoin(UserVipLog.class,UserVipLog::getOrderSn,BuyOrder::getOrderSn) + .disableSubLogicDel() + .in(BuyOrder::getOrderId,wumenOrderIds) + .select("t.order_id oid,t1.price fee,DATE_FORMAT(start_time, '%Y-%m-%d %H:%i:%s') startTime,DATE_FORMAT(end_time, '%Y-%m-%d %H:%i:%s') endTime")); + Map buyOrdersMap = new HashMap<>(); + for (Map m : buyOrders) { + List> l = new ArrayList<>(); + if(buyOrdersMap.get(m.get("oid").toString())!=null){ + l = (List>) buyOrdersMap.get(m.get("oid").toString()); + } + l.add(m); + buyOrdersMap.put(m.get("oid").toString(),l); + } + for(Orders orders:vipOrders){ + List> list = new ArrayList<>(); + if (orders.getSource()==1){ + List> l = (List>) buyOrdersMap.get(orders.getOrderOldId()); + for (Map m : l) { + if (m.get("fee")!=null){ + Map map = new HashMap<>(); + map.put("fee",m.get("fee")); + map.put("startTime",m.get("startTime")); + map.put("endTime",m.get("endTime")); + list.add(map); + }else { + Map map = new HashMap<>(); + map.put("fee",orders.getFee()); + map.put("startTime",sdfday.format(orders.getOrderTime())); + map.put("endTime",sdfday.format(orders.getOrderTime())); + list.add(map); + } + } + }else { + FinanceOrder financeOrder = financeOrderService.getById(orders.getOrderOldId()); + Map map = new HashMap<>(); + map.put("fee",financeOrder.getRealMoney()); + map.put("startTime",sdfday.format(financeOrder.getStartTime())); + map.put("endTime",sdfday.format(financeOrder.getEndTime())); + list.add(map); + } + for (Map map:list){ + BigDecimal fee = (BigDecimal) map.get("fee"); + String startTime = map.get("startTime")==null?"":map.get("startTime").toString(); + String endTime = map.get("endTime")==null?"":map.get("endTime").toString(); + if (startTime.equals(endTime)){ + if (sdfmonth.format(orders.getOrderTime()).contains(month)){ + vipNowTotal = vipNowTotal.add(fee); + } else if (sdfmonth.parse(startTime).getTime()sdfmonth.parse(endTime).getTime()){ + //未开始摊销 + }else if (sdfday.parse(day).getTime()0){ + }else { + alreadyDays = 0; + } + //当前月天数 + int nowDays = Integer.parseInt(day.substring(8, 10)); + BigDecimal now = BigDecimal.ZERO; + //如果开始时间是当前月,月天数-开始日=当月摊销天数 + if (startTime.contains(month)){ + nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1; + now = dayAmount.multiply(new BigDecimal(nowDays)); + } else if (endTime.contains(month)) { + now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays))); + }else { + now = dayAmount.multiply(new BigDecimal(nowDays)); + } + vipNowTotal = vipNowTotal.add(now); + } + } + } + resultMap.put("04VIP月摊销",vipNowTotal); + monthTotal = monthTotal.add(vipNowTotal); + + BigDecimal courseNowTotal = BigDecimal.ZERO; + //所有课程订单 + List> courseOrders = ordersService.listMaps(new MPJLambdaWrapper() + .eq(Orders::getUseFlag,1).eq(Orders::getType,2) + .select("DATE_FORMAT(order_time, '%Y-%m-%d %H:%i:%s') orderTime,if(source=0,'一路健康',if(source=1,'吴门医述','管理员')) source,order_old_id orderOldId," + + "tel,order_sn,t.tel,t.fee realMoney") + .orderByAsc(Orders::getOrderTime)); + //一路健康订单课程 + List taihuOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("一路健康")) + .map(map->map.get("orderOldId").toString()).collect(Collectors.toList()); + Map> taihuClassMap = customerApplyCurriculumService.listMaps(new MPJLambdaWrapper() + .in("t.oid", taihuOrderIds) + .apply("t.valid=1 and t.status = '50'") + .select("t.oid,if(t.point>0,t.point,t.money) fee,curriculumID")) + .stream().collect(Collectors.toMap(m -> m.get("oid").toString(), m -> m)); + //订单开课记录 + Map> ctc = customerTaihuClassService.listMaps(new MPJLambdaWrapper() + .like(TCustomerTaihuClass::getDescription,"KC20") + .in(TCustomerTaihuClass::getStatus,10) + .gt(TCustomerTaihuClass::getStudydays,0) + .select("SUBSTRING(description, LOCATE('KC', description), 16) description,oid,DATE_FORMAT(startDate, '%Y-%m-%d') startDate,studyDays")) + .stream().collect(Collectors.toMap(m -> m.get("description").toString()+"-"+m.get("oid").toString(), m -> m)); + //吴门医述订单课程 + List courseWumenOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("吴门医述")) + .map(map->map.get("orderOldId").toString()).collect(Collectors.toList()); + List> buyOrdersList = buyOrderService.listMaps(new MPJLambdaWrapper() + .leftJoin("user_course_buy_log t1 on (t1.order_sn = t.order_sn )") + .leftJoin("user_course_buy t2 on t2.id = t1.user_course_buy_id") + .in("t.order_id",courseWumenOrderIds) + .gt(BuyOrder::getRealMoney,0) + .select("t.order_id oid,t1.id ucblid,if(t1.fee is null,t.real_money,t1.fee) fee,t1.days,t1.begin_day," + + "DATE_FORMAT(t2.start_time, '%Y-%m-%d %H:%i:%s') startTime")); + Map courseBuyOrdersMap = new HashMap<>(); + for (Map m : buyOrdersList) { + List> l = new ArrayList<>(); + if(courseBuyOrdersMap.get(m.get("oid").toString())!=null){ + l = (List>) courseBuyOrdersMap.get(m.get("oid").toString()); + } + l.add(m); + courseBuyOrdersMap.put(m.get("oid").toString(),l); + } + List> result = new ArrayList<>(); + for(Map courseOrder:courseOrders){ + String orderTime = courseOrder.get("orderTime").toString().substring(0,10); + if (courseOrder.get("source").equals("一路健康")){ + Map res = new HashMap<>(); + Map taihuClass = taihuClassMap.get(courseOrder.get("orderOldId").toString()); + Map tc = ctc.entrySet().stream().filter(e -> e.getKey() + .contains(taihuClass.get("curriculumID").toString())).map(Map.Entry::getValue).findFirst().orElse(null); + res.put("fee",courseOrder.get("realMoney")); + if (tc != null&&tc.get("startDate")!=null) { + res.put("startTime",tc.get("startDate")); + res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(tc.get("startDate").toString()), (Integer) tc.get("studyDays")))); + }else { + res.put("startTime",orderTime); + res.put("endTime",orderTime); + } + res.putAll(courseOrder); + result.add(res); + }else if(courseOrder.get("source").equals("吴门医述")){ + List> l = (List>) courseBuyOrdersMap.get(courseOrder.get("orderOldId")); + if (l!=null){ + for (int i=0;i res = new HashMap<>(); + Map m = l.get(i); + if (m.get("ucblid")!=null){ + if (new BigDecimal(m.get("fee").toString()).compareTo(BigDecimal.ZERO)>0){ + res.put("fee",m.get("fee")); + }else { + BigDecimal one = new BigDecimal(courseOrder.get("realMoney").toString()).divide(new BigDecimal(l.size()),2,BigDecimal.ROUND_HALF_UP); + if (i==l.size()-1){ + res.put("fee",new BigDecimal(courseOrder.get("realMoney").toString()).subtract(one.multiply(new BigDecimal(l.size()-1)))); + }else { + res.put("fee",one); + } + } + if (m.get("startTime")==null){ + res.put("startTime",null); + res.put("endTime",null); + }else { + if (Integer.parseInt(m.get("begin_day").toString())==0){ + res.put("startTime",m.get("startTime").toString()); + res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()), + Integer.parseInt(m.get("days").toString())-1))); + }else { + res.put("startTime",sdfday.format(DateUtils.addDays(sdfday.parse(m.get("startTime").toString()), + Integer.parseInt(m.get("days").toString())))); + res.put("endTime",sdfday.format(DateUtils.addDays(sdfday.parse(res.get("startTime").toString()), + Integer.parseInt(m.get("days").toString())-1))); + } + } + }else { + res.put("fee",courseOrder.get("realMoney")); + res.put("startTime",orderTime); + res.put("endTime",orderTime); + } + res.putAll(courseOrder); + result.add(res); + } + }else { + Map res = new HashMap<>(); + res.put("fee",courseOrder.get("realMoney")); + res.put("startTime",orderTime); + res.put("endTime",orderTime); + res.putAll(courseOrder); + result.add(res); + } + }else { + FinanceOrder financeOrder = financeOrderService.getById(courseOrder.get("orderOldId").toString()); + courseOrder.put("fee",financeOrder.getRealMoney()); + courseOrder.put("startTime",sdfday.format(financeOrder.getStartTime())); + courseOrder.put("endTime",sdfday.format(financeOrder.getEndTime())); + result.add(courseOrder); + } + } + for (Map map:result) { + BigDecimal fee = (BigDecimal) map.get("fee"); + String startTime = (String) map.get("startTime"); + String endTime = (String) map.get("endTime"); + if (startTime==null){ + if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){ + } + }else if (startTime.equals(endTime)){ + if (startTime.contains(month)){ + courseNowTotal = courseNowTotal.add(fee); + } else if (sdfmonth.parse(startTime).getTime()sdfmonth.parse(endTime).getTime()){ + }else if (sdfday.parse(day).getTime()0){ + }else { + alreadyDays = 0; + } + //当前月天数 + int nowDays = Integer.parseInt(day.substring(8, 10)); + BigDecimal now = BigDecimal.ZERO; + //如果开始时间是当前月,月天数-开始日=当月摊销天数 + if (startTime.contains(month)&&endTime.contains(month)){ + now = fee; + } else if (startTime.contains(month)){ + nowDays = Integer.parseInt(day.substring(8, 10))-Integer.parseInt(startTime.substring(8, 10))+1; + now = dayAmount.multiply(new BigDecimal(nowDays)); + } else if (endTime.contains(month)) { + now = fee.subtract(dayAmount.multiply(new BigDecimal(alreadyDays))); + }else { + now = dayAmount.multiply(new BigDecimal(nowDays)); + } + courseNowTotal = courseNowTotal.add(now); + } + } + resultMap.put("05课程月摊销",courseNowTotal); + monthTotal = monthTotal.add(courseNowTotal); + resultMap.put("06合计",monthTotal); + resultList.add(resultMap); + } + XSSFWorkbook wb = new XSSFWorkbook(); + Sheet sheet1 = wb.createSheet("全部汇总"); + exportCommon(sheet1 ,resultList); + exportTem(response,wb,"全部汇总.xlsx"); + return R.ok(); + } + //汇总统计 @RequestMapping("/getStatistics") public R getStatistics(@RequestBody Map params){