Переглянути джерело

feat: 结算单下载demo

lixuesong 1 рік тому
батько
коміт
bd3b415080

+ 2 - 0
db/v2.0/20231010.sql

@@ -0,0 +1,2 @@
+alter table sys_dept_sub
+    add settlement_proof_info json null comment '结算单信息';

+ 81 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java

@@ -2,24 +2,32 @@ package com.qunzhixinxi.hnqz.admin.controller;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
 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.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackageSettleNote;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleInput;
 import com.qunzhixinxi.hnqz.admin.entity.input.WmScorePackageSettleOutput;
+import com.qunzhixinxi.hnqz.admin.entity.model.excel.SettlementProofModel;
 import com.qunzhixinxi.hnqz.admin.entity.model.excel.WmScorePackageSettleExcelModel;
 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.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.OsEnvUtils;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.ding.enums.DingEnum;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
@@ -41,9 +49,16 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletResponse;
 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.time.LocalDateTime;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -67,6 +82,7 @@ public class WmPayOffController {
 
 	private final WmPayOffService wmPayOffService;
 	private final WmScorePackageService wmScorePackageService;
+	private final WmScorePackageSettleNoteService wmScorePackageSettleNoteService;
 	private final RedisTemplate<String, Object> redisTemplate;
 	private final SysDictItemService dictItemService;
 
@@ -377,6 +393,70 @@ public class WmPayOffController {
 		return exportList;
 	}
 
+	/**
+	 * 导出结算单
+	 *
+	 * @param packageIds 积分包ID
+	 * @return {@link R}<{@link ?}> 结果
+	 */
+	@SysLog("导出结算单")
+	@GetMapping("/exportSettlementProof")
+	public void exportSettlementProof(@RequestParam("packageIds") List<String> packageIds, HttpServletResponse response) {
+		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");
+		SettlementProofModel settlementProofModel = new SettlementProofModel();
+		settlementProofModel.setPackageList(Collections.singletonList(packageDetail));
+
+		// 服务器模板文件路径
+		String resourcePath = OsEnvUtils.getEachEnvPaths().get("EXCEL_FILE_PATH") + "settlement_application_form_template.docx";
+
+		HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
+
+		Configure config = Configure.newBuilder().bind("package_list", policy).build();
+
+		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");
+				}}
+		);
+
+		try {
+
+			//清空response
+			response.reset();
+			//设置response的Header
+			response.addHeader("Content-Disposition",
+					String.format("attachment;filename=请款申请单(%s)-%s.docx", 123123, DateUtil.format(LocalDateTime.now(),
+							DatePattern.PURE_DATETIME_PATTERN)));
+			response.setContentType("application/msword");
+			OutputStream os = new BufferedOutputStream(response.getOutputStream());
+
+			template.write(os);
+
+			os.flush();
+			os.close();
+		} catch (IOException e) {
+			log.error("导出失败", e);
+			throw new RuntimeException("导出失败");
+		}
+	}
+
 	@ApiOperation(value = "结算", notes = "结算")
 	@SysLog("结算")
 	@PostMapping("/saveSettleInfo")

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

@@ -1,8 +1,10 @@
 package com.qunzhixinxi.hnqz.admin.entity;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
 import com.qunzhixinxi.hnqz.admin.enums.SubjectLocation;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -11,6 +13,7 @@ import lombok.EqualsAndHashCode;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.util.Map;
 
 /**
  * 部门管理
@@ -19,7 +22,7 @@ import java.time.LocalDateTime;
  * @date 2021-04-19 16:02:30
  */
 @Data
-@TableName("sys_dept_sub")
+@TableName(value = "sys_dept_sub", autoResultMap = true)
 @EqualsAndHashCode(callSuper = true)
 @ApiModel(value = "部门管理")
 public class SysDeptSub extends Model<SysDeptSub> {
@@ -97,4 +100,10 @@ public class SysDeptSub extends Model<SysDeptSub> {
 	 */
 	private Boolean eidEnable;
 
+	/**
+	 * 结算申请信息
+	 */
+	@TableField(typeHandler = FastjsonTypeHandler.class)
+	private Map<String, String> settlementApplicationInfo;
+
 }

+ 70 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/excel/SettlementProofModel.java

@@ -0,0 +1,70 @@
+package com.qunzhixinxi.hnqz.admin.entity.model.excel;
+
+import com.deepoove.poi.el.Name;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 导出结算单model
+ *
+ * @author lixuesong
+ * @date 2023/10/10
+ */
+@Data
+public class SettlementProofModel implements Serializable {
+    private static final long serialVersionUID = -718362253014027670L;
+
+    /**
+     * 积分包列表
+     */
+    @Name("package_list")
+    private List<PackageDetail> packageList;
+
+    /**
+     * 申请金额小计
+     */
+    private String totalSettleAmount;
+
+    /**
+     * 金额大写
+     */
+    private String totalSettleAmountCn;
+
+    /**
+     * 导出结算单详情
+     *
+     * @author lixuesong
+     * @date 2023/10/10
+     */
+    @Data
+    public static class PackageDetail implements Serializable {
+        private static final long serialVersionUID = 5376038876472348072L;
+
+        /**
+         * 序号
+         */
+        private String number;
+
+        /**
+         * 积分包名称
+         */
+        private String scorePackageName;
+
+        /**
+         * 结算渠道
+         */
+        private String subjectLocation;
+
+        /**
+         * 实际到账金额
+         */
+        private String settleAmount;
+
+        /**
+         * 实际结算金额
+         */
+        private String actualAmount;
+    }
+}

+ 32 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/policy/SettlementProofTableRenderPolicy.java

@@ -0,0 +1,32 @@
+package com.qunzhixinxi.hnqz.admin.policy;
+
+import com.deepoove.poi.data.RowRenderData;
+import com.deepoove.poi.policy.DynamicTableRenderPolicy;
+import com.deepoove.poi.policy.MiniTableRenderPolicy;
+import com.qunzhixinxi.hnqz.admin.entity.model.excel.SettlementProofModel;
+import org.apache.poi.xwpf.usermodel.XWPFTable;
+import org.apache.poi.xwpf.usermodel.XWPFTableRow;
+
+import java.util.List;
+
+public class SettlementProofTableRenderPolicy extends DynamicTableRenderPolicy {
+    // 积分包填充数据所在行数
+    final int packageStartRow = 0;
+
+    @Override
+    public void render(XWPFTable table, Object data) {
+//        if (null == data) return;
+//
+//        SettlementProofModel.PackageDetail settlementProofModel = (SettlementProofModel.PackageDetail) data;
+//        List<RowRenderData> packageList = settlementProofModel.getPackageList();
+//
+//        table.removeRow(packageStartRow);
+//        for (RowRenderData rowRenderData : packageList) {
+//            // 创建一行
+//            XWPFTableRow insertNewTableRow = table.insertNewTableRow(packageStartRow);
+//            // 创建每行的单元格
+//            for (int j = 0; j < 5; j++) insertNewTableRow.createCell();
+//            MiniTableRenderPolicy.Helper.renderRow(table, packageStartRow, rowRenderData);
+//        }
+    }
+}

+ 63 - 0
hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/testpoitl/PoitlTest.java

@@ -0,0 +1,63 @@
+package com.qunzhixinxi.hnqz.admin.testpoitl;
+
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.policy.HackLoopTableRenderPolicy;
+import com.qunzhixinxi.hnqz.admin.entity.model.excel.SettlementProofModel;
+import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
+
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.HashMap;
+
+public class PoitlTest {
+
+    public static void main(String[] args) {
+        // 导出模板渲染
+        // 拼装数据
+        SettlementProofModel.PackageDetail packageDetail = new SettlementProofModel.PackageDetail();
+        packageDetail.setScorePackageName("111");
+        packageDetail.setSubjectLocation("12312");
+        packageDetail.setActualAmount("11");
+        packageDetail.setSettleAmount("123");
+        packageDetail.setNumber("1");
+        SettlementProofModel settlementProofModel = new SettlementProofModel();
+        settlementProofModel.setPackageList(Collections.singletonList(packageDetail));
+
+        // 服务器模板文件路径
+        String resourcePath = OsEnvUtils.getEachEnvPaths().get("EXCEL_FILE_PATH") + "settlement_application_form_template.docx";
+        // 缓存路径
+        String targetPath = OsEnvUtils.getEachEnvPaths().get("EXCEL_FILE_PATH")
+                + String.format("out\\settlement_application_form_%s.docx", System.currentTimeMillis());
+
+        HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
+
+        Configure config = Configure.newBuilder().bind("package_list", policy).build();
+
+        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");
+                }}
+        );
+
+        try {
+            template.writeToFile(targetPath);
+
+        } catch (IOException e) {
+            throw new RuntimeException("导出失败");
+        }
+    }
+}