从202301到目前的统计

This commit is contained in:
wuchunlei
2026-02-05 17:58:21 +08:00
parent 9dfd623a88
commit 0289ad75eb

View File

@@ -40,6 +40,303 @@ public class StatisticsController {
@Autowired @Autowired
private IFinanceOrderService financeOrderService; 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<Map<String,Object>> resultList = new ArrayList<>();
for (Date d=beginDate;!d.equals(nowDate);d = DateUtils.addMonths(d,1)){
String date = sdfmonth.format(d);
Map<String,Object> resultMap = new HashMap<>();
BigDecimal monthTotal = new BigDecimal("0");
resultMap.put("01月份",date);
Orders physical = ordersService.getOne(new MPJLambdaWrapper<Orders>()
.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<Orders>()
.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<Orders> vipOrders = ordersService.list(new MPJLambdaWrapper<Orders>()
.eq(Orders::getUseFlag,1).eq(Orders::getType,1));
//吴门医述订单
List<String> wumenOrderIds = vipOrders.stream().filter(o -> o.getSource() == 1).map(Orders::getOrderOldId).collect(Collectors.toList());
List<Map<String,Object>> buyOrders = buyOrderService.listMaps(new MPJLambdaWrapper<BuyOrder>()
.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<String,Object> buyOrdersMap = new HashMap<>();
for (Map<String,Object> m : buyOrders) {
List<Map<String,Object>> l = new ArrayList<>();
if(buyOrdersMap.get(m.get("oid").toString())!=null){
l = (List<Map<String, Object>>) buyOrdersMap.get(m.get("oid").toString());
}
l.add(m);
buyOrdersMap.put(m.get("oid").toString(),l);
}
for(Orders orders:vipOrders){
List<Map<String,Object>> list = new ArrayList<>();
if (orders.getSource()==1){
List<Map<String,Object>> l = (List<Map<String, Object>>) buyOrdersMap.get(orders.getOrderOldId());
for (Map<String,Object> m : l) {
if (m.get("fee")!=null){
Map<String,Object> 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<String,Object> 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<String,Object> 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<String,Object> 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(month).getTime()) {
}
//摊销完成
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
//未开始摊销
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
if (sdfmonth.parse(sdfmonth.format(orders.getOrderTime())).getTime()<=sdfmonth.parse(month).getTime()){
}
//摊销中
}else {
//总天数
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
//日摊销
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),2, BigDecimal.ROUND_HALF_UP);
//已摊销天数
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
if (alreadyDays>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<Map<String,Object>> courseOrders = ordersService.listMaps(new MPJLambdaWrapper<Orders>()
.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<String> taihuOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("一路健康"))
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
Map<String,Map<String,Object>> taihuClassMap = customerApplyCurriculumService.listMaps(new MPJLambdaWrapper<TCustomerApplyCurriculum>()
.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<String,Map<String,Object>> ctc = customerTaihuClassService.listMaps(new MPJLambdaWrapper<TCustomerTaihuClass>()
.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<String> courseWumenOrderIds = courseOrders.stream().filter(o -> o.get("source").equals("吴门医述"))
.map(map->map.get("orderOldId").toString()).collect(Collectors.toList());
List<Map<String,Object>> buyOrdersList = buyOrderService.listMaps(new MPJLambdaWrapper<BuyOrder>()
.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<String,Object> courseBuyOrdersMap = new HashMap<>();
for (Map<String,Object> m : buyOrdersList) {
List<Map<String,Object>> l = new ArrayList<>();
if(courseBuyOrdersMap.get(m.get("oid").toString())!=null){
l = (List<Map<String, Object>>) courseBuyOrdersMap.get(m.get("oid").toString());
}
l.add(m);
courseBuyOrdersMap.put(m.get("oid").toString(),l);
}
List<Map<String,Object>> result = new ArrayList<>();
for(Map<String,Object> courseOrder:courseOrders){
String orderTime = courseOrder.get("orderTime").toString().substring(0,10);
if (courseOrder.get("source").equals("一路健康")){
Map<String,Object> res = new HashMap<>();
Map<String,Object> taihuClass = taihuClassMap.get(courseOrder.get("orderOldId").toString());
Map<String, Object> 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<Map<String,Object>> l = (List<Map<String, Object>>) courseBuyOrdersMap.get(courseOrder.get("orderOldId"));
if (l!=null){
for (int i=0;i<l.size();i++) {
Map<String,Object> res = new HashMap<>();
Map<String,Object> 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<String,Object> 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<String,Object> 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(month).getTime()) {
}
}else if (sdfmonth.parse(day).getTime()>sdfmonth.parse(endTime).getTime()){
}else if (sdfday.parse(day).getTime()<sdfday.parse(startTime).getTime()){
if (sdfmonth.parse(map.get("orderTime").toString()).getTime()<=sdfmonth.parse(month).getTime()){
}
}else {
//总天数
int totalDays = Math.toIntExact((sdfday.parse(endTime).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24)+1;
//日摊销
BigDecimal dayAmount = fee.divide(new BigDecimal(totalDays),3, BigDecimal.ROUND_HALF_UP);
//已摊销天数
int alreadyDays = Math.toIntExact((sdfmonth.parse(month).getTime() - sdfday.parse(startTime).getTime()) / 1000 / 60 / 60 / 24);
if (alreadyDays>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") @RequestMapping("/getStatistics")
public R getStatistics(@RequestBody Map<String,Object> params){ public R getStatistics(@RequestBody Map<String,Object> params){