yonge 1 week ago
parent
commit
b9e8707bad

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

@@ -5,15 +5,23 @@ 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 com.ym.mec.util.date.DateUtil;
+import com.ym.mec.util.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
 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 javax.servlet.http.HttpServletResponse;
+import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 @Api(tags = "首页多数据源统计")
@@ -21,6 +29,23 @@ import java.util.List;
 @RestController
 public class MultiDataSourceHomeStatsController extends BaseController {
 
+    private static final String GYM_SHEET_NAME = "管乐迷";
+    private static final String CLS_SHEET_NAME = "酷乐秀";
+    private static final String KT_SHEET_NAME = "音乐数字课堂";
+
+    private static final String[] GYM_HEADER = {"分部", "分账用户", "银行卡号", "学生编号", "学生姓名", "系统订单编号",
+            "支付对象ID(流水号)", "分账金额", "手续费", "到账金额", "分账日期"};
+    private static final String[] GYM_BODY = {"organName", "merNo", "cardNo", "userId", "username", "orderNo",
+            "transNo", "routeAmount", "serviceFee", "actualAmount", "routeDate"};
+
+    private static final String[] CLS_HEADER = {"订单号", "流水号", "付款金额", "支付渠道", "付款时间", "付款人姓名", "付款人编号"};
+    private static final String[] CLS_BODY = {"orderNo", "transNo", "actualPrice", "payChannel", "payTime", "username", "userId"};
+
+    private static final String[] KT_HEADER = {"订单编号", "流水号", "付款金额", "付款渠道", "付款客户端", "付款时间",
+            "付款人编号", "付款人姓名", "订单状态"};
+    private static final String[] KT_BODY = {"orderNo", "transNo", "paymentCashAmount", "paymentVender", "paymentChannel",
+            "payTime", "userId", "nickname", "statusName"};
+
     @Autowired
     private MultiDataSourceHomeStatsService multiDataSourceHomeStatsService;
     @Autowired
@@ -33,4 +58,42 @@ public class MultiDataSourceHomeStatsController extends BaseController {
         queryDto.setOrganIds(organizationService.getEmployeeOrgan(queryDto.getOrganIds()));
         return succeed(multiDataSourceHomeStatsService.summerIncome(queryDto));
     }
+
+    @ApiOperation(value = "三平台支付流水导出(管乐迷/酷乐秀/音乐数字课堂)")
+    @GetMapping("/exportPaymentFlow")
+    @PreAuthorize("@pcs.hasPermissions('multiDataSourceHomeStats/exportPaymentFlow')")
+    public void exportPaymentFlow(MultiDataSourceHomeStatsWrapper.QueryDto queryDto, HttpServletResponse response) throws Exception {
+        MultiDataSourceHomeStatsWrapper.PaymentFlowExport data = multiDataSourceHomeStatsService.paymentFlow(queryDto);
+
+        List<MultiDataSourceHomeStatsWrapper.GymPaymentFlowDto> gymList =
+                data.getGymList() == null ? new ArrayList<>() : data.getGymList();
+        List<MultiDataSourceHomeStatsWrapper.ClsPaymentFlowDto> clsList =
+                data.getClsList() == null ? new ArrayList<>() : data.getClsList();
+        List<MultiDataSourceHomeStatsWrapper.KtPaymentFlowDto> ktList =
+                data.getKtList() == null ? new ArrayList<>() : data.getKtList();
+
+        response.setContentType("application/octet-stream");
+        response.setHeader("Content-Disposition", "attachment;filename=paymentFlow-" + DateUtil.getDate(new Date()) + ".xls");
+        response.flushBuffer();
+
+        OutputStream outputStream = response.getOutputStream();
+        try {
+            // 依次写入三个sheet,multipleSheetExportExcel 只会创建无名sheet,需手动命名
+            HSSFWorkbook workbook = POIUtil.multipleSheetExportExcel(GYM_HEADER, GYM_BODY, gymList, null);
+            workbook.setSheetName(0, GYM_SHEET_NAME);
+
+            workbook = POIUtil.multipleSheetExportExcel(CLS_HEADER, CLS_BODY, clsList, workbook);
+            workbook.setSheetName(1, CLS_SHEET_NAME);
+
+            workbook = POIUtil.multipleSheetExportExcel(KT_HEADER, KT_BODY, ktList, workbook);
+            workbook.setSheetName(2, KT_SHEET_NAME);
+
+            workbook.write(outputStream);
+            outputStream.flush();
+        } finally {
+            if (outputStream != null) {
+                outputStream.close();
+            }
+        }
+    }
 }

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

@@ -17,4 +17,19 @@ public interface MultiDataSourceHomeStatsDao {
     List<MultiDataSourceHomeStatsWrapper.IncomeByDate> ktSummerIncome(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
 
     List<MultiDataSourceHomeStatsWrapper.IncomeByDate> clsOrgSummerIncome(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+    /**
+     * 管乐迷支付分账流水
+     */
+    List<MultiDataSourceHomeStatsWrapper.GymPaymentFlowDto> gymPaymentFlow(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+    /**
+     * 酷乐秀支付流水
+     */
+    List<MultiDataSourceHomeStatsWrapper.ClsPaymentFlowDto> clsPaymentFlow(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
+    /**
+     * 音乐数字课堂支付流水
+     */
+    List<MultiDataSourceHomeStatsWrapper.KtPaymentFlowDto> ktPaymentFlow(@Param("queryDto") MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
 }

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

@@ -3,6 +3,7 @@ package com.ym.mec.biz.dal.wrapper;
 import lombok.Data;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
 
 public class MultiDataSourceHomeStatsWrapper {
@@ -38,4 +39,122 @@ public class MultiDataSourceHomeStatsWrapper {
 
         private String format;
     }
+
+    /**
+     * 管乐迷支付分账流水
+     */
+    @Data
+    public static class GymPaymentFlowDto{
+
+        /** 分部 */
+        private String organName;
+
+        /** 分账用户 */
+        private String merNo;
+
+        /** 银行卡号 */
+        private String cardNo;
+
+        /** 学生编号 */
+        private String userId;
+
+        /** 学生姓名 */
+        private String username;
+
+        /** 系统订单编号 */
+        private String orderNo;
+
+        /** 支付对象ID(流水号) */
+        private String transNo;
+
+        /** 分账金额 */
+        private BigDecimal routeAmount;
+
+        /** 手续费 */
+        private BigDecimal serviceFee;
+
+        /** 到账金额 */
+        private BigDecimal actualAmount;
+
+        /** 分账日期 */
+        private String routeDate;
+    }
+
+    /**
+     * 酷乐秀支付流水
+     */
+    @Data
+    public static class ClsPaymentFlowDto{
+
+        /** 订单号 */
+        private String orderNo;
+
+        /** 流水号 */
+        private String transNo;
+
+        /** 付款金额 */
+        private BigDecimal actualPrice;
+
+        /** 支付渠道 */
+        private String payChannel;
+
+        /** 付款时间 */
+        private String payTime;
+
+        /** 付款人姓名 */
+        private String username;
+
+        /** 付款人编号 */
+        private String userId;
+    }
+
+    /**
+     * 音乐数字课堂支付流水
+     */
+    @Data
+    public static class KtPaymentFlowDto{
+
+        /** 订单编号 */
+        private String orderNo;
+
+        /** 流水号 */
+        private String transNo;
+
+        /** 付款金额 */
+        private BigDecimal paymentCashAmount;
+
+        /** 付款渠道 */
+        private String paymentVender;
+
+        /** 付款客户端 */
+        private String paymentChannel;
+
+        /** 付款时间 */
+        private String payTime;
+
+        /** 付款人编号 */
+        private String userId;
+
+        /** 付款人姓名 */
+        private String nickname;
+
+        /** 订单状态 */
+        private String statusName;
+    }
+
+    /**
+     * 三平台支付流水导出数据集
+     */
+    @Data
+    public static class PaymentFlowExport{
+
+        /** 管乐迷 */
+        private List<GymPaymentFlowDto> gymList = new ArrayList<>();
+
+        /** 酷乐秀 */
+        private List<ClsPaymentFlowDto> clsList = new ArrayList<>();
+
+        /** 音乐数字课堂 */
+        private List<KtPaymentFlowDto> ktList = new ArrayList<>();
+    }
 }

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

@@ -11,4 +11,9 @@ public interface MultiDataSourceHomeStatsService{
     //收入汇总
     List<MultiDataSourceHomeStatsWrapper.summerIncome> summerIncome(MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
 
+    /**
+     * 三平台(管乐迷/酷乐秀/音乐数字课堂)支付流水,用于导出
+     */
+    MultiDataSourceHomeStatsWrapper.PaymentFlowExport paymentFlow(MultiDataSourceHomeStatsWrapper.QueryDto queryDto);
+
 }

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

@@ -3,7 +3,9 @@ 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.common.exception.BizException;
 import com.ym.mec.util.date.DateUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
@@ -97,6 +99,21 @@ public class MultiDataSourceHomeStatsServiceImpl implements MultiDataSourceHomeS
         return income;
     }
 
+    @Override
+    public MultiDataSourceHomeStatsWrapper.PaymentFlowExport paymentFlow(MultiDataSourceHomeStatsWrapper.QueryDto queryDto) {
+        if (StringUtils.isBlank(queryDto.getStartTime()) || StringUtils.isBlank(queryDto.getEndTime())) {
+            throw new BizException("开始日期和结束日期不能为空");
+        }
+        MultiDataSourceHomeStatsWrapper.PaymentFlowExport export = new MultiDataSourceHomeStatsWrapper.PaymentFlowExport();
+        // 管乐迷(当前库)
+        export.setGymList(multiDataSourceHomeStatsDao.gymPaymentFlow(queryDto));
+        // 酷乐秀(cooleshow_pro)
+        export.setClsList(multiDataSourceHomeStatsDao.clsPaymentFlow(queryDto));
+        // 音乐数字课堂(cooleshow_edu_pro)
+        export.setKtList(multiDataSourceHomeStatsDao.ktPaymentFlow(queryDto));
+        return export;
+    }
+
     private void addItem(Set<String> keySet,List<MultiDataSourceHomeStatsWrapper.IncomeByDate> itemList,String date,
                         Map<String, MultiDataSourceHomeStatsWrapper.IncomeByDate> itemMap){
         if (keySet.contains(date)) {

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

@@ -45,4 +45,75 @@
         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="gymPaymentFlow"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$GymPaymentFlowDto">
+        SELECT
+            o.name_ AS organName,
+            spro.mer_no_ AS merNo,
+            m.card_no_ AS cardNo,
+            spo.user_id_ AS userId,
+            u.username_ AS username,
+            spro.order_no_ AS orderNo,
+            spro.trans_no_ AS transNo,
+            spro.route_amount_ AS routeAmount,
+            spro.service_fee_ AS serviceFee,
+            (IFNULL(spro.route_amount_, 0) - IFNULL(spro.service_fee_, 0)) AS actualAmount,
+            DATE_FORMAT(spro.update_time_, '%Y-%m-%d') AS routeDate
+        FROM student_payment_route_order spro
+        LEFT JOIN student_payment_order spo ON spro.order_no_ = spo.order_no_
+        LEFT JOIN organization o ON o.id_ = spro.route_organ_id_
+        LEFT JOIN sys_user u ON u.id_ = spo.user_id_
+        LEFT JOIN hf_member m ON m.member_id_ = spro.mer_no_
+        WHERE spo.status_ = 'SUCCESS'
+        AND DATE(spro.update_time_) BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+    </select>
+
+    <!-- 酷乐秀支付流水(cooleshow_pro) -->
+    <select id="clsPaymentFlow"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$ClsPaymentFlowDto">
+        SELECT
+            t.order_no_ AS orderNo,
+            p.trans_no_ AS transNo,
+            t.actual_price_ AS actualPrice,
+            CASE WHEN IFNULL(p.pay_channel_, t.payment_channel_) LIKE 'wx%' THEN '微信'
+                 WHEN IFNULL(p.pay_channel_, t.payment_channel_) LIKE 'ali%' THEN '支付宝'
+                 ELSE '汇付' END AS payChannel,
+            DATE_FORMAT(t.pay_time_, '%Y-%m-%d %H:%i:%s') AS payTime,
+            u.username_ AS username,
+            u.id_ AS userId
+        FROM cooleshow_pro.user_order t
+        LEFT JOIN cooleshow_pro.user_order_payment p ON t.order_no_ = p.order_no_ AND p.status_ = 'succeeded'
+        LEFT JOIN cooleshow_pro.sys_user u ON t.user_id_ = u.id_
+        WHERE u.del_flag_ = 0
+        AND t.status_ = 'PAID'
+        AND t.actual_price_ > 0
+        AND DATE(t.pay_time_) BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+    </select>
+
+    <!-- 音乐数字课堂支付流水(cooleshow_edu_pro) -->
+    <select id="ktPaymentFlow"
+            resultType="com.ym.mec.biz.dal.wrapper.MultiDataSourceHomeStatsWrapper$KtPaymentFlowDto">
+        SELECT
+            upo.order_no_ AS orderNo,
+            upo.trans_no_ AS transNo,
+            upo.payment_cash_amount_ AS paymentCashAmount,
+            CASE WHEN upo.payment_vender_ LIKE 'adapay%' THEN '汇付'
+                 WHEN upo.payment_vender_ LIKE 'yeepay%' THEN '易宝'
+                 ELSE '直连' END AS paymentVender,
+            CASE WHEN upo.payment_channel_ LIKE 'wx%' THEN '微信'
+                 WHEN upo.payment_channel_ LIKE 'alipay%' THEN '支付宝' END AS paymentChannel,
+            DATE_FORMAT(FROM_UNIXTIME(upo.pay_time_ / 1000), '%Y-%m-%d %H:%i:%s') AS payTime,
+            s.id_ AS userId,
+            s.nickname_ AS nickname,
+            CASE WHEN upo.status_ = 'PAID' THEN '付款成功'
+                 WHEN upo.status_ = 'REFUNDED' THEN '退款成功'
+                 ELSE '未知' END AS statusName
+        FROM cooleshow_edu_pro.user_payment_order upo
+        LEFT JOIN cooleshow_edu_pro.student s ON upo.user_id_ = s.id_
+        WHERE upo.status_ IN ('PAID', 'REFUNDED')
+        AND upo.payment_cash_amount_ > 0
+        AND DATE(FROM_UNIXTIME(upo.pay_time_ / 1000)) BETWEEN #{queryDto.startTime} AND #{queryDto.endTime}
+    </select>
 </mapper>