lixuesong 1 жил өмнө
parent
commit
ad39acc798

+ 83 - 23
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java

@@ -9,10 +9,10 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
-import com.deepoove.poi.data.RowRenderData;
 import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
 import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
+import com.qunzhixinxi.hnqz.admin.entity.SysDeptSub;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleInput;
@@ -23,10 +23,13 @@ import com.qunzhixinxi.hnqz.admin.enums.PackageFinishStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.PackageTypeEnum;
 import com.qunzhixinxi.hnqz.admin.enums.SettleStatusEnum;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
+import com.qunzhixinxi.hnqz.admin.enums.SubjectTypeEnum;
+import com.qunzhixinxi.hnqz.admin.service.SysDeptSubService;
 import com.qunzhixinxi.hnqz.admin.service.SysDictItemService;
 import com.qunzhixinxi.hnqz.admin.service.WmPayOffService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageSettleNoteService;
+import com.qunzhixinxi.hnqz.admin.util.AmountToCNUtil;
 import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.ding.enums.DingEnum;
@@ -54,11 +57,9 @@ import javax.validation.Valid;
 import java.io.BufferedOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -83,6 +84,7 @@ public class WmPayOffController {
 	private final WmPayOffService wmPayOffService;
 	private final WmScorePackageService wmScorePackageService;
 	private final WmScorePackageSettleNoteService wmScorePackageSettleNoteService;
+	private final SysDeptSubService sysDeptSubService;
 	private final RedisTemplate<String, Object> redisTemplate;
 	private final SysDictItemService dictItemService;
 
@@ -402,21 +404,73 @@ public class WmPayOffController {
 	@SysLog("导出结算单")
 	@GetMapping("/exportSettlementProof")
 	public void exportSettlementProof(@RequestParam("packageIds") List<String> packageIds, HttpServletResponse response) {
+		log.info("导出结算单参数packageIds={}", packageIds);
+
+		// 查询积分包
 		List<WmScorePackage> scorePackageList = wmScorePackageService.listByIds(packageIds);
+		// 查询结算信息
 		List<WmScorePackageSettleNote> settleNoteList =
 				wmScorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
-						.eq(WmScorePackageSettleNote::getPackageId, packageIds));
-
-		// 导出模板渲染
-		// 拼装数据
-		SettlementProofModel.PackageDetail packageDetail = new SettlementProofModel.PackageDetail();
-		packageDetail.setScorePackageName("111");
-		packageDetail.setSubjectLocation("12312");
-		packageDetail.setActualAmount("11");
-		packageDetail.setSettleAmount("123");
-		packageDetail.setNumber("1");
+						.in(WmScorePackageSettleNote::getPackageId, packageIds));
+		if (CollUtil.isEmpty(settleNoteList)) {
+			throw new RuntimeException("结算信息为空");
+		}
+
+		Map<String, List<WmScorePackageSettleNote>> settleNoteMap = settleNoteList.stream()
+				.collect(Collectors.groupingBy(WmScorePackageSettleNote::getPackageId));
+
+		SubjectLocation subjectLocation = settleNoteList.get(0).getSubjectLocation();
+		if (subjectLocation == null) {
+			throw new RuntimeException("结算渠道为空");
+		}
+
+		// 查询企业对应渠道的收款单位信息
+		SysDeptSub queryDeptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+				.eq(SysDeptSub::getDeptId, SecurityUtils.getUser().getDeptId())
+				.eq(SysDeptSub::getSubjectLocation, subjectLocation)
+				.eq(SysDeptSub::getEnableFlag, SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode()));
+		if (queryDeptSub == null) {
+			throw new RuntimeException("结算渠道配置为空");
+		}
+
+		// 导出数据整合
+		// 积分包列表
+		List<SettlementProofModel.PackageDetail> packageDetailList = new ArrayList<>();
+		// 申请金额小计
+		BigDecimal totalSettleAmount = BigDecimal.ZERO;
+		for (int i = 0; i < scorePackageList.size(); i++) {
+			WmScorePackage scorePackage = scorePackageList.get(i);
+			SettlementProofModel.PackageDetail packageDetail = new SettlementProofModel.PackageDetail();
+			packageDetail.setNumber(String.valueOf(i + 1));
+			packageDetail.setScorePackageName(scorePackage.getScorePackageName());
+			// 结算信息
+			List<WmScorePackageSettleNote> settleNotes = settleNoteMap.get(scorePackage.getId());
+			// 实际到账金额
+			BigDecimal settleAmount = settleNotes.stream()
+					.map(WmScorePackageSettleNote::getSettleAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+			// 实际结算金额
+			BigDecimal actualAmount = settleNotes.stream()
+					.map(WmScorePackageSettleNote::getActualAmount).reduce(BigDecimal.ZERO, BigDecimal::add);
+			totalSettleAmount = totalSettleAmount.add(settleAmount);
+			packageDetail.setSubjectLocation(subjectLocation.getDescription());
+			packageDetail.setSettleAmount(String.valueOf(settleAmount));
+			packageDetail.setActualAmount(String.valueOf(actualAmount));
+			packageDetailList.add(packageDetail);
+		}
 		SettlementProofModel settlementProofModel = new SettlementProofModel();
-		settlementProofModel.setPackageList(Collections.singletonList(packageDetail));
+		settlementProofModel.setPackageList(packageDetailList);
+
+		// 收款单位户名
+		String collectionName = "";
+		// 收款单位账号
+		String collectionAccount = "";
+		// 收款单位开户行
+		String collectionBankName = "";
+		if (queryDeptSub.getSettlementProofInfo() != null) {
+			collectionName = queryDeptSub.getSettlementProofInfo().getOrDefault("collection_name", "");
+			collectionAccount = queryDeptSub.getSettlementProofInfo().getOrDefault("collection_account", "");
+			collectionBankName = queryDeptSub.getSettlementProofInfo().getOrDefault("collection_bank_name", "");
+		}
 
 		// 服务器模板文件路径
 		String resourcePath = OsEnvUtils.getEachEnvPaths().get("EXCEL_FILE_PATH") + "settlement_application_form_template.docx";
@@ -425,26 +479,32 @@ public class WmPayOffController {
 
 		Configure config = Configure.newBuilder().bind("package_list", policy).build();
 
+		String finalCollectionName = collectionName;
+		String finalCollectionAccount = collectionAccount;
+		String finalCollectionBankName = collectionBankName;
+		BigDecimal finalTotalSettleAmount = totalSettleAmount;
 		XWPFTemplate template = XWPFTemplate.compile(resourcePath, config).render(
 				new HashMap<String, Object>() {{
+					// 积分包列表
 					put("package_list", settlementProofModel.getPackageList());
-					put("total_settle_amount", "111");
-					put("total_settle_amount_cn", "222");
-					put("collection_name", "222");
-					put("collection_account", "333");
-					put("collection_bank_name", "444");
+					// 实际到账金额
+					put("total_settle_amount", String.valueOf(finalTotalSettleAmount));
+					// 实际结算金额
+					put("total_settle_amount_cn", AmountToCNUtil.number2CNMontrayUnit(finalTotalSettleAmount));
+					put("collection_name", finalCollectionName);
+					put("collection_account", finalCollectionAccount);
+					put("collection_bank_name", finalCollectionBankName);
 				}}
 		);
 
 		try {
-
 			//清空response
 			response.reset();
 			//设置response的Header
 			response.addHeader("Content-Disposition",
-					String.format("attachment;filename=请款申请单(%s)-%s.docx", 123123, DateUtil.format(LocalDateTime.now(),
+					String.format("attachment;filename=请款申请单(%s)-%s.docx", String.join(",", packageIds), DateUtil.format(LocalDateTime.now(),
 							DatePattern.PURE_DATETIME_PATTERN)));
-			response.setContentType("application/msword");
+			response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
 			OutputStream os = new BufferedOutputStream(response.getOutputStream());
 
 			template.write(os);

+ 1 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java

@@ -104,6 +104,6 @@ public class SysDeptSub extends Model<SysDeptSub> {
 	 * 结算申请信息
 	 */
 	@TableField(typeHandler = FastjsonTypeHandler.class)
-	private Map<String, String> settlementApplicationInfo;
+	private Map<String, String> settlementProofInfo;
 
 }

+ 129 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/AmountToCNUtil.java

@@ -0,0 +1,129 @@
+package com.qunzhixinxi.hnqz.admin.util;
+
+import java.math.BigDecimal;
+
+/**
+ * 数字转换为汉语中人民币的大写
+ *
+ * @author lixuesong
+ * @date 2023/10/11
+ */
+public class AmountToCNUtil {
+
+    /**
+     * 汉语中数字大写
+     */
+    private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆",
+            "伍", "陆", "柒", "捌", "玖"};
+    /**
+     * 汉语中货币单位大写,这样的设计类似于占位符
+     */
+    private static final String[] CN_UPPER_MONETRAY_UNIT = {"分", "角", "元",
+            "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾",
+            "佰", "仟"};
+    /**
+     * 特殊字符:整
+     */
+    private static final String CN_FULL = "整";
+    /**
+     * 特殊字符:负
+     */
+    private static final String CN_NEGATIVE = "负";
+    /**
+     * 金额的精度,默认值为2
+     */
+    private static final int MONEY_PRECISION = 2;
+    /**
+     * 特殊字符:零元整
+     */
+    private static final String CN_ZEOR_FULL = "零元" + CN_FULL;
+
+    /**
+     * 把输入的金额转换为汉语中人民币的大写
+     *
+     * @param numberOfMoney 输入的金额
+     * @return 对应的汉语大写
+     */
+    public static String number2CNMontrayUnit(BigDecimal numberOfMoney) {
+        StringBuffer sb = new StringBuffer();
+        // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or
+        // positive.
+        int signum = numberOfMoney.signum();
+        // 零元整的情况
+        if (signum == 0) {
+            return CN_ZEOR_FULL;
+        }
+        // 这里会进行金额的四舍五入
+        long number = numberOfMoney.movePointRight(MONEY_PRECISION)
+                .setScale(0, 4).abs().longValue();
+        // 得到小数点后两位值
+        long scale = number % 100;
+        int numUnit = 0;
+        int numIndex = 0;
+        boolean getZero = false;
+        // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11
+        if (!(scale > 0)) {
+            numIndex = 2;
+            number = number / 100;
+            getZero = true;
+        }
+        if ((scale > 0) && (!(scale % 10 > 0))) {
+            numIndex = 1;
+            number = number / 10;
+            getZero = true;
+        }
+        int zeroSize = 0;
+        while (true) {
+            if (number <= 0) {
+                break;
+            }
+            // 每次获取到最后一个数
+            numUnit = (int) (number % 10);
+            if (numUnit > 0) {
+                if ((numIndex == 9) && (zeroSize >= 3)) {
+                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]);
+                }
+                if ((numIndex == 13) && (zeroSize >= 3)) {
+                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]);
+                }
+                sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
+                sb.insert(0, CN_UPPER_NUMBER[numUnit]);
+                getZero = false;
+                zeroSize = 0;
+            } else {
+                ++zeroSize;
+                if (!(getZero)) {
+                    sb.insert(0, CN_UPPER_NUMBER[numUnit]);
+                }
+                if (numIndex == 2) {
+                    if (number > 0) {
+                        sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
+                    }
+                } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) {
+                    sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]);
+                }
+                getZero = true;
+            }
+            // 让number每次都去掉最后一个数
+            number = number / 10;
+            ++numIndex;
+        }
+        // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负
+        if (signum == -1) {
+            sb.insert(0, CN_NEGATIVE);
+        }
+        // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整
+        if (!(scale > 0)) {
+            sb.append(CN_FULL);
+        }
+        return sb.toString();
+    }
+
+//    public static void main(String[] args) {
+//        double money = 3000.66;
+//        BigDecimal numberOfMoney = new BigDecimal(money);
+//        String s = AmountToCNUtil.number2CNMontrayUnit(numberOfMoney);
+//        System.out.println("你输入的金额为:【" + money + "】   #--# [" + s.toString()
+//                + "]");
+//    }
+}