diff --git a/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/excel/HardMchOrderExcelVo.java b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/excel/HardMchOrderExcelVo.java new file mode 100644 index 000000000..edac50125 --- /dev/null +++ b/pjcloud-hardware/pjcloud-hardware-api/src/main/java/com/bsd/pjcloud/hard/api/vo/order/excel/HardMchOrderExcelVo.java @@ -0,0 +1,50 @@ +package com.bsd.pjcloud.hard.api.vo.order.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 商户流水导出 + */ +@Data +@ColumnWidth(30) +public class HardMchOrderExcelVo { + + @ExcelProperty("商户") + private String merchantName; + + @ExcelProperty("姓名") + private String username; + + @ExcelProperty("手机号") + private String userMobile; + + @ExcelProperty("支付方式") + private String payType; + + @ExcelProperty("商品总价") + private Double totalPrice; + + @ExcelProperty("额外支付") + private Double extraPrice; + + @ExcelProperty("实际支付") + private Double payPrice; + + @ExcelProperty("退款金额") + private Double refundPrice; + + @ExcelProperty("订单支付时间") + private LocalDateTime payTime; + + /** + * 导出相关 + */ + @Schema(description = "列号") + private Long lineNumber; + +} diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java index e1a02c57e..0a5a3a4f2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/controller/order/HardOrderTotalController.java @@ -12,7 +12,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.bsd.pjcloud.admin.api.dto.UserInfo; import com.bsd.pjcloud.admin.api.feign.RemoteUserService; import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum; +import com.bsd.pjcloud.common.core.util.BeanUtils; import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.data.datascope.DataScope; import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.service.PjcloudUser; import com.bsd.pjcloud.common.security.util.SecurityUtils; @@ -21,11 +23,11 @@ import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum; import com.bsd.pjcloud.hard.api.constant.order.HardPayTypeEnum; import com.bsd.pjcloud.hard.api.dto.order.HardDeptTotalDto; import com.bsd.pjcloud.hard.api.dto.order.HardOrderDto; -import com.bsd.pjcloud.hard.api.vo.order.HardDeptTotalVo; -import com.bsd.pjcloud.hard.api.vo.order.HardOrderCsVo; -import com.bsd.pjcloud.hard.api.vo.order.HardOrderPayTypeVo; -import com.bsd.pjcloud.hard.api.vo.order.HardOrderSbVo; +import com.bsd.pjcloud.hard.api.vo.order.*; +import com.bsd.pjcloud.hard.api.vo.order.excel.HardMchOrderExcelVo; +import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper; import com.bsd.pjcloud.hard.service.HardManagerService; +import com.bsd.pjcloud.hard.service.HardOrderService; import com.bsd.pjcloud.hard.service.HardOrderTotalService; import com.bsd.pjcloud.wallet.api.feign.RemoteMchService; import com.bsd.pjcloud.wallet.api.vo.MchManageVo; @@ -54,9 +56,12 @@ import java.util.Map; @SecurityRequirement(name = HttpHeaders.AUTHORIZATION) public class HardOrderTotalController { + private final HardOrderService hardOrderService; private final HardOrderTotalService hardOrderTotalService; private final HardManagerService hardManagerService; + private final HardOrderMapper hardOrderMapper; + private final RemoteMchService mchService; private final RemoteUserService userService; @@ -222,6 +227,83 @@ public class HardOrderTotalController { } } + @Operation(summary = "单个商户交易流水导出", description = "单个商户交易流水导出") + @PostMapping("/export-mch-cs") + @SysLog("单个商户交易流水导出") + public void exportMchCs(HttpServletResponse response, @RequestBody HardOrderDto dto) throws IOException { + dto.setOrderStatusCodes(HardOrderStatusEnum.getPayPrice()); + // 查询商户和下面的子商户 + List mchDtoIds = new ArrayList<>(); + if (ObjectUtil.isNotEmpty(dto.getMerchantId())) { + List mchList = mchService.getByParentId(dto.getMerchantId()).getData(); + if (ObjectUtil.isNotEmpty(mchList)) { + List mchIds = mchList.stream().map(MchManageVo::getId).toList(); + mchDtoIds.add(dto.getMerchantId()); + mchDtoIds.addAll(mchIds); + dto.setMerchantId(null); + dto.setMchIds(mchDtoIds); + } + } + // 查询商户 + MchManageVo mch = mchService.getById(dto.getMerchantId()).getData(); + if (ObjectUtil.isEmpty(mch)) throw new RuntimeException("商户不存在"); + + Long count = hardOrderMapper.count(dto, DataScope.of()); + if (count > 5000) throw new RuntimeException("导出数据超出5000条,请缩小查询范围"); + List list = hardOrderService.scopeList(dto, DataScope.of()); + List excelList = BeanUtils.toBean(list, HardMchOrderExcelVo.class); + + try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/商户交易流水导出.xlsx")).build()) { + WriteSheet writeSheet = EasyExcel.writerSheet().build(); + FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); + Map map = new HashMap(); + if (ObjectUtil.isNotEmpty(dto.getPayTimeList())) { + map.put("timeSpan", " 到 "); + map.put("startTime", LocalDateTimeUtil.format(dto.getPayTimeList()[0], DatePattern.NORM_DATETIME_PATTERN)); + map.put("endTime", LocalDateTimeUtil.format(dto.getPayTimeList()[1], DatePattern.NORM_DATETIME_PATTERN)); + } + map.put("merchantName", mch.getName()); + if (ObjectUtil.isNotEmpty(excelList)) { + BigDecimal totalPriceSum = BigDecimal.ZERO; + BigDecimal extraPriceSum = BigDecimal.ZERO; + BigDecimal payPriceSum = BigDecimal.ZERO; + BigDecimal refundPriceSum = BigDecimal.ZERO; + Long lineNumber = 1L; + for (HardMchOrderExcelVo v : excelList) { + v.setLineNumber(lineNumber); + lineNumber++; + if (ObjectUtil.isNotEmpty(v.getTotalPrice())) { + totalPriceSum = totalPriceSum.add(BigDecimal.valueOf(v.getTotalPrice())); + v.setTotalPrice(BigDecimal.valueOf(v.getTotalPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } + if (ObjectUtil.isNotEmpty(v.getExtraPrice())) { + extraPriceSum = extraPriceSum.add(BigDecimal.valueOf(v.getExtraPrice())); + v.setExtraPrice(BigDecimal.valueOf(v.getExtraPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } + if (ObjectUtil.isNotEmpty(v.getPayPrice())) { + payPriceSum = payPriceSum.add(BigDecimal.valueOf(v.getPayPrice())); + v.setPayPrice(BigDecimal.valueOf(v.getPayPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } + if (ObjectUtil.isNotEmpty(v.getRefundPrice())) { + refundPriceSum = refundPriceSum.add(BigDecimal.valueOf(v.getRefundPrice())); + v.setRefundPrice(BigDecimal.valueOf(v.getRefundPrice()).divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).doubleValue()); + } + if (ObjectUtil.isNotEmpty(v.getPayType())) { + HardPayTypeEnum hardPayTypeEnum = HardPayTypeEnum.valueOfByType(v.getPayType()); + if (ObjectUtil.isNotEmpty(hardPayTypeEnum)) { + v.setPayType(hardPayTypeEnum.getDescription()); + } + } + } + map.put("totalPriceSum", totalPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("extraPriceSum", extraPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("payPriceSum", payPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + map.put("refundPriceSum", refundPriceSum.divide(BigDecimal.valueOf(100)).setScale(2, RoundingMode.HALF_UP).toString()); + } + excelWriter.fill(map, writeSheet); + excelWriter.fill(excelList, fillConfig, writeSheet); + } + } @Operation(summary = "商户交易记录导出", description = "商户交易记录导出") @PostMapping("/export-cs") diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java index 7f5ea38d6..1c4472a2f 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/java/com/bsd/pjcloud/hard/mapper/order/HardOrderMapper.java @@ -112,6 +112,8 @@ public interface HardOrderMapper extends PjcloudBaseMapper { List scopeList(@Param("dto") HardOrderDto dto, DataScope dataScope); + Long count(HardOrderDto dto, DataScope dataScope); + List listSb(@Param("dto") HardOrderDto dto, DataScope dataScope); List listRefundSb(@Param("dto") HardOrderDto refundDto, @Param("refundDataScope") DataScope refundDataScope); diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易流水导出.xlsx b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易流水导出.xlsx new file mode 100644 index 000000000..943218ced Binary files /dev/null and b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/file/商户交易流水导出.xlsx differ diff --git a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml index fb9d5dc12..045f97bf2 100644 --- a/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml +++ b/pjcloud-hardware/pjcloud-hardware-biz/src/main/resources/mapper/order/HardOrderMapper.xml @@ -231,6 +231,28 @@ + +