Explorar o código

首页多数据源统计

zouxuan %!s(int64=2) %!d(string=hai) anos
pai
achega
dbd50feb30

+ 16 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/MultiDataSourceHomeStatsDao.java

@@ -0,0 +1,16 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface MultiDataSourceHomeStatsDao {
+
+
+    List<MultiDataSourceHomeStatsWrapper.IncomeByDate> clsSummerIncome(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+    List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gytSummerIncome(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+    List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gymSummerIncome(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+}

+ 41 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/MultiDataSourceHomeStatsWrapper.java

@@ -0,0 +1,41 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+public class MultiDataSourceHomeStatsWrapper {
+
+    @Data
+    public static class IncomeByDate{
+
+        private BigDecimal totalAmount;
+
+        private String date;
+    }
+
+    @Data
+    public static class summerIncome{
+
+        private String platform;
+
+        private BigDecimal totalAmount;
+
+        private List<IncomeByDate> incomeByDates;
+    }
+
+    @Data
+    public static class QueryDto{
+
+        private String startTime;
+
+        private String endTime;
+
+        private String organIds;
+
+        private String groupBy;
+
+        private String format;
+    }
+}

+ 14 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/MultiDataSourceHomeStatsService.java

@@ -0,0 +1,14 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public interface MultiDataSourceHomeStatsService{
+
+    //收入汇总
+    List<MultiDataSourceHomeStatsWrapper.summerIncome> summerIncome(MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+}

+ 97 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/MultiDataSourceHomeStatsServiceImpl.java

@@ -0,0 +1,97 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.MultiDataSourceHomeStatsDao;
+import com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper;
+import com.ym.mec.biz.service.MultiDataSourceHomeStatsService;
+import com.ym.mec.util.date.DateUtil;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class MultiDataSourceHomeStatsServiceImpl implements MultiDataSourceHomeStatsService {
+
+    @Resource
+    private MultiDataSourceHomeStatsDao multiDataSourceHomeStatsDao;
+
+    @Override
+    public List<MultiDataSourceHomeStatsWrapper.summerIncome> summerIncome(MultiDataSourceHomeStatsWrapper.QueryDto queryDto) {
+        Date startTime = DateUtil.stringToDate(queryDto.getStartTime(),DateUtil.DEFAULT_PATTERN);
+        Date endTime = DateUtil.stringToDate(queryDto.getEndTime(),DateUtil.DEFAULT_PATTERN);
+        List<String> dates;
+        if(DateUtil.daysBetween(startTime, endTime) <= 31){
+            queryDto.setGroupBy("%Y年-%m月-%d日");
+            queryDto.setFormat("%Y年%m月%d日");
+            dates = DateUtil.getDatesBetweenByDay(startTime, endTime);
+        } else if (DateUtil.monthsBetween(startTime, endTime) <= 12) {
+            queryDto.setGroupBy("%Y-%m");
+            queryDto.setFormat("%Y年%m月");
+            dates = DateUtil.getDatesBetweenByMonth(startTime, endTime);
+        }else {
+            queryDto.setGroupBy("%Y");
+            queryDto.setFormat("%Y年");
+            dates = DateUtil.getDatesBetweenByYear(startTime, endTime);
+        }
+        //获取酷乐秀收入
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> clsIncomeDateList = multiDataSourceHomeStatsDao.clsSummerIncome(queryDto);
+        //获取管乐团收入
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gytIncomeDateList = multiDataSourceHomeStatsDao.gytSummerIncome(queryDto);
+        //获取管乐迷收入
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gymIncomeDateList = multiDataSourceHomeStatsDao.gymSummerIncome(queryDto);
+
+        Map<String, MultiDataSourceHomeStatsWrapper.IncomeByDate> clsMap = clsIncomeDateList.stream().
+                collect(Collectors.groupingBy(e -> e.getDate(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+        Set<String> clsKeySet = clsMap.keySet();
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> clsList = new ArrayList<>();
+
+        Map<String, MultiDataSourceHomeStatsWrapper.IncomeByDate> gytMap = gytIncomeDateList.stream().
+                collect(Collectors.groupingBy(e -> e.getDate(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+        Set<String> gytKeySet = gytMap.keySet();
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gytList = new ArrayList<>();
+
+        Map<String, MultiDataSourceHomeStatsWrapper.IncomeByDate> gymMap = gymIncomeDateList.stream().
+                collect(Collectors.groupingBy(e -> e.getDate(), Collectors.collectingAndThen(Collectors.toList(), v -> v.get(0))));
+        Set<String> gymKeySet = gymMap.keySet();
+        List<MultiDataSourceHomeStatsWrapper.IncomeByDate> gymList = new ArrayList<>();
+
+        // 遍历日期列表,补全数据并添加到结果集中
+        for (String date : dates) {
+            this.addItem(clsKeySet,clsList,date,clsMap);
+            this.addItem(gytKeySet,gytList,date,gytMap);
+            this.addItem(gymKeySet,gymList,date,gymMap);
+        }
+        List<MultiDataSourceHomeStatsWrapper.summerIncome> result = new ArrayList<>();
+        result.add(this.init("cls",clsList));
+        result.add(this.init("gyt",gytList));
+        result.add(this.init("gym",gymList));
+        return result;
+    }
+
+    private MultiDataSourceHomeStatsWrapper.summerIncome init(String platForm,List<MultiDataSourceHomeStatsWrapper.IncomeByDate> itemList){
+        MultiDataSourceHomeStatsWrapper.summerIncome income = new MultiDataSourceHomeStatsWrapper.summerIncome();
+        income.setPlatform(platForm);
+        income.setTotalAmount(itemList.stream().map(e->e.getTotalAmount()).reduce(BigDecimal.ZERO,BigDecimal::add));
+        income.setIncomeByDates(itemList);
+        return income;
+    }
+
+    private void addItem(Set<String> keySet,List<MultiDataSourceHomeStatsWrapper.IncomeByDate> itemList,String date,
+                        Map<String, MultiDataSourceHomeStatsWrapper.IncomeByDate> itemMap){
+        if (keySet.contains(date)) {
+            // 如果存在对应日期的数据,则添加到结果集中
+            itemList.add(itemMap.get(date));
+        } else {
+            // 如果不存在对应日期的数据,则创建一个新的IncomeByDate对象,并设置totalAmount为0
+            MultiDataSourceHomeStatsWrapper.IncomeByDate newIncomeByDate = new MultiDataSourceHomeStatsWrapper.IncomeByDate();
+            newIncomeByDate.setDate(date);
+            newIncomeByDate.setTotalAmount(BigDecimal.ZERO);
+            itemList.add(newIncomeByDate);
+        }
+    }
+
+
+}

+ 34 - 0
mec-biz/src/main/resources/config/mybatis/MultiDataSourceHomeStatsMapper.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.MultiDataSourceHomeStatsDao">
+
+    <select id="clsSummerIncome"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$IncomeByDate">
+        select DATE_FORMAT(account_period_time_,#{queryDto.format}) `date`,SUM(trans_amount_) totalAmount
+        from cooleshow_pro.platform_cash_account_record where in_or_out_ = 'IN' AND post_status_ = 'RECORDED'
+        AND DATE_FORMAT(account_period_time_,'%Y-%m-%d') BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        group by DATE_FORMAT(account_period_time_,#{queryDto.groupBy});
+    </select>
+    <select id="gytSummerIncome"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$IncomeByDate">
+        select DATE_FORMAT(create_time_,#{queryDto.format}) `date`,SUM(current_price_) totalAmount
+        from jmedu_pro.user_payment_order where status_ = 'PAID'
+        AND DATE_FORMAT(create_time_,'%Y-%m-%d') BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        group by DATE_FORMAT(create_time_,#{queryDto.groupBy})
+    </select>
+    <select id="gymSummerIncome"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$IncomeByDate">
+        SELECT DATE_FORMAT(pay_time_,#{queryDto.format}) `date`,SUM(CASE WHEN actual_amount_ IS NULL THEN 0 ELSE actual_amount_ END +
+        CASE WHEN balance_payment_amount_ IS NULL THEN 0 ELSE balance_payment_amount_ END) totalAmount
+        FROM student_payment_order
+        where status_ = 'SUCCESS' AND DATE_FORMAT(pay_time_,'%Y-%m-%d') BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+        <if test="queryDto.organIds != null and queryDto.organIds != ''">
+            AND FIND_IN_SET(organ_id_,#{queryDto.organIds})
+        </if>
+        GROUP BY DATE_FORMAT(pay_time_,#{queryDto.groupBy})
+    </select>
+</mapper>

+ 40 - 15
mec-util/src/main/java/com/ym/mec/util/date/DateUtil.java

@@ -29,6 +29,10 @@ public class DateUtil {
 
 	public static final String DATE_FORMAT_MIN = "yyyy年MM月dd日";
 
+	public static final String DATE_FORMAT_MONTH = "yyyy年MM月";
+
+	public static final String DATE_FORMAT_YEAR = "yyyy年";
+
 	/**
 	 * 默认使用的Locale。默认Locale为 US
 	 */
@@ -966,6 +970,42 @@ public class DateUtil {
 		return df.format(date);
 	}
 
+	public static List<String> getDatesBetweenByDay(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_MIN);
+			dates.add(dateString);
+			currentDate = DateUtil.addMonths(currentDate,1);
+		}
+		return dates;
+	}
+
+	public static List<String> getDatesBetweenByMonth(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_MONTH);
+			dates.add(dateString);
+			currentDate = DateUtil.addMonths(currentDate,1);
+		}
+		return dates;
+	}
+
+	public static List<String> getDatesBetweenByYear(Date startTime, Date endTime) {
+		List<String> dates = new ArrayList<>();
+		// 循环遍历日期并格式化为字符串
+		Date currentDate = startTime;
+		while (!currentDate.after(endTime)) {
+			String dateString = DateUtil.format(currentDate,DATE_FORMAT_YEAR);
+			dates.add(dateString);
+			currentDate = DateUtil.addYears(currentDate,1);
+		}
+		return dates;
+	}
+
 	/**
 	 * @describe 获取时间段内对应星期数的集合
 	 * @author Joburgess
@@ -1387,19 +1427,4 @@ public class DateUtil {
 		}
 		return false;
 	}
-
-	public static void main(String[] args) throws ParseException {
-		// DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
-//		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-//		 System.out.println(daysBetween(df.parse("2017-07-20 10:07:42"), df.parse(df.format(new Date()))));
-//		System.out.println(getWeekMondayWithDate(new Date()));
-//		System.out.println(getNextWeekMonday(new Date()));
-//		System.out.println(getNextWeekSunday(new Date()));
-//		System.out.println(dayEnd(new Date()));
-//		System.out.println(format(getLastDayOfMonth(new Date()),CHINESE_DATA_FORMAT));
-//		System.out.println(monthsBetween(df1.parse("2020-01-18 12:00:00"),df1.parse("2020-04-19 12:00:00")));
-//		System.out.println(getNextWeekMonday(new Date()));
-
-		contents("2022-10-25 10:11:11","2022-10-25 11:11:11",new Date());
-	}
 }

+ 38 - 0
mec-web/src/main/java/com/ym/mec/web/controller/MultiDataSourceHomeStatsController.java

@@ -0,0 +1,38 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.ActivityPlanAddDto;
+import com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper;
+import com.ym.mec.biz.service.ActivityPlanService;
+import com.ym.mec.biz.service.MultiDataSourceHomeStatsService;
+import com.ym.mec.biz.service.OrganizationService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@Api(tags = "首页多数据源统计")
+@RequestMapping("multiDataSourceHomeStats")
+@RestController
+public class MultiDataSourceHomeStatsController extends BaseController {
+
+    @Autowired
+    private MultiDataSourceHomeStatsService multiDataSourceHomeStatsService;
+    @Autowired
+    private OrganizationService organizationService;
+
+    @ApiOperation(value = "收入统计")
+    @PostMapping("/summerIncome")
+    @PreAuthorize("@pcs.hasPermissions('multiDataSourceHomeStats/summerIncome')")
+    public HttpResponseResult<List<MultiDataSourceHomeStatsWrapper.summerIncome>> summerIncome(@RequestBody MultiDataSourceHomeStatsWrapper.QueryDto queryDto){
+        queryDto.setOrganIds(organizationService.getEmployeeOrgan(queryDto.getOrganIds()));
+        return succeed(multiDataSourceHomeStatsService.summerIncome(queryDto));
+    }
+}