浏览代码

Merge branch 'feat-20231009-taskstatuscondition'

lixuesong 1 年之前
父节点
当前提交
062542d445
共有 14 个文件被更改,包括 592 次插入43 次删除
  1. 2 0
      db/v2.0/20231010.sql
  2. 22 22
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDaDrugEntController.java
  3. 149 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java
  4. 12 8
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmReportController.java
  5. 10 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/SysDeptSub.java
  6. 51 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ReportTaskListPageDTO.java
  7. 70 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/model/excel/SettlementProofModel.java
  8. 3 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/DeptPermissionEnum.java
  9. 32 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/policy/SettlementProofTableRenderPolicy.java
  10. 9 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmReportService.java
  11. 40 10
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmReportServiceImpl.java
  12. 129 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/AmountToCNUtil.java
  13. 二进制
      hnqz-upms/hnqz-upms-biz/src/main/resources/excel/settlement_application_form_template.docx
  14. 63 0
      hnqz-upms/hnqz-upms-biz/src/test/java/com/qunzhixinxi/hnqz/admin/testpoitl/PoitlTest.java

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

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

+ 22 - 22
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmDaDrugEntController.java

@@ -238,28 +238,28 @@ public class WmDaDrugEntController {
 		* @Author: ryz
 		* @Date: 2021/4/19
 		*/
-		if(!Arrays.equals(sysDept.getSubjectType(),wmDaDrugEnt.getSubjectType())){
-			sysDeptSubService.update(Wrappers.<SysDeptSub>lambdaUpdate()
-					.eq(SysDeptSub::getDeptId,sysDept.getDeptId())
-					.set(SysDeptSub::getEnableFlag,SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
-
-			for (String subType : wmDaDrugEnt.getSubjectType()) {
-				SysDeptSub condition = new SysDeptSub();
-				condition.setDeptId(sysDept.getDeptId());
-				condition.setSubjectType(subType);
-				SysDeptSub existSub = sysDeptSubService.getOne(Wrappers.query(condition));
-				if(null != existSub){
-					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					sysDeptSubService.updateById(existSub);
-				}else {
-					existSub = new SysDeptSub();
-					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
-					existSub.setDeptId(sysDept.getDeptId());
-					existSub.setSubjectType(subType);
-					sysDeptSubService.save(existSub);
-				}
-			}
-		}
+//		if(!Arrays.equals(sysDept.getSubjectType(),wmDaDrugEnt.getSubjectType())){
+//			sysDeptSubService.update(Wrappers.<SysDeptSub>lambdaUpdate()
+//					.eq(SysDeptSub::getDeptId,sysDept.getDeptId())
+//					.set(SysDeptSub::getEnableFlag,SubjectTypeEnum.ENABLE_FLAG_FALSE.getCode()));
+//
+//			for (String subType : wmDaDrugEnt.getSubjectType()) {
+//				SysDeptSub condition = new SysDeptSub();
+//				condition.setDeptId(sysDept.getDeptId());
+//				condition.setSubjectType(subType);
+//				SysDeptSub existSub = sysDeptSubService.getOne(Wrappers.query(condition));
+//				if(null != existSub){
+//					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//					sysDeptSubService.updateById(existSub);
+//				}else {
+//					existSub = new SysDeptSub();
+//					existSub.setEnableFlag(SubjectTypeEnum.ENABLE_FLAG_TRUE.getCode());
+//					existSub.setDeptId(sysDept.getDeptId());
+//					existSub.setSubjectType(subType);
+//					sysDeptSubService.save(existSub);
+//				}
+//			}
+//		}
 		sysDept.setTaxCode(wmDaDrugEnt.getEntcode());
 		/**
 		* @Modify: end

+ 149 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmPayOffController.java

@@ -2,24 +2,39 @@ 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.ArrayUtil;
 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.policy.HackLoopTableRenderPolicy;
 import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 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;
 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.DeptPermissionEnum;
 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.SysDeptService;
+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;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
@@ -41,7 +56,12 @@ 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.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -67,6 +87,9 @@ public class WmPayOffController {
 
 	private final WmPayOffService wmPayOffService;
 	private final WmScorePackageService wmScorePackageService;
+	private final WmScorePackageSettleNoteService wmScorePackageSettleNoteService;
+	private final SysDeptSubService sysDeptSubService;
+	private final SysDeptService sysDeptService;
 	private final RedisTemplate<String, Object> redisTemplate;
 	private final SysDictItemService dictItemService;
 
@@ -377,6 +400,132 @@ 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) {
+		log.info("导出结算单参数packageIds={}", packageIds);
+
+		Integer deptId = SecurityUtils.getUser().getDeptId();
+		SysDept dept = sysDeptService.getById(deptId);
+		if (!ArrayUtil.contains(dept.getDeptPermissions(), DeptPermissionEnum.SETTLEMENT_PROOF.val())) {
+			throw new RuntimeException("没有权限");
+		}
+
+		// 查询积分包
+		List<WmScorePackage> scorePackageList = wmScorePackageService.listByIds(packageIds);
+		// 查询结算信息
+		List<WmScorePackageSettleNote> settleNoteList =
+				wmScorePackageSettleNoteService.list(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+						.in(WmScorePackageSettleNote::getPackageId, packageIds));
+		if (CollUtil.isEmpty(settleNoteList)) {
+			throw new RuntimeException("结算信息为空");
+		}
+
+		Map<String, List<WmScorePackageSettleNote>> settleNoteMap = settleNoteList.stream()
+				.collect(Collectors.groupingBy(WmScorePackageSettleNote::getPackageId));
+
+		// 查询企业对应渠道的收款单位信息
+//		SysDeptSub queryDeptSub = sysDeptSubService.getOne(Wrappers.<SysDeptSub>lambdaQuery()
+//				.eq(SysDeptSub::getDeptId, deptId)
+//				.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());
+			if (CollUtil.isEmpty(settleNotes)) {
+				continue;
+			}
+			// 实际到账金额
+			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(settleNotes.get(0).getSubjectLocation().getDescription());
+			packageDetail.setSettleAmount(String.valueOf(settleAmount));
+			packageDetail.setActualAmount(String.valueOf(actualAmount));
+			packageDetailList.add(packageDetail);
+		}
+		SettlementProofModel settlementProofModel = new SettlementProofModel();
+		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";
+
+		HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();
+
+		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", 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", String.join("_", packageIds), DateUtil.format(LocalDateTime.now(),
+							DatePattern.PURE_DATETIME_PATTERN)));
+			response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document");
+			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")

+ 12 - 8
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmReportController.java

@@ -28,6 +28,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.qunzhixinxi.hnqz.admin.entity.WmScorePackage;
 import com.qunzhixinxi.hnqz.admin.entity.WmTask;
+import com.qunzhixinxi.hnqz.admin.entity.dto.ReportTaskListPageDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
 import com.qunzhixinxi.hnqz.admin.enums.TaskStatusEnum;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
@@ -45,6 +46,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
@@ -386,22 +388,24 @@ public class WmReportController {
 	}
 
 
-
 	/**
 	 * 结算报告--查看
-	 * @param page 分页对象
-	 * @param wmReport 报告审核表
-	 * @param isApprovalPage 1审批,0查看
-	 * @return
+	 *
+	 * @param page                  分页对象
+	 * @param reportTaskListPageDTO 报告任务列表页面 DTO
+	 * @return {@link R}
 	 */
 	@ApiOperation(value = "分页查询", notes = "分页查询")
 	@GetMapping("/getTaskListPage" )
-	public R getTaskListPage(Page page, WmReport wmReport, Integer isApprovalPage, String taskTypeId, String taskNumber) {
-		WmReport wmReport1=wmReportService.getById(wmReport.getId());
+	public R getTaskListPage(Page page, @Validated ReportTaskListPageDTO reportTaskListPageDTO) {
+		WmReport wmReport1=wmReportService.getById(reportTaskListPageDTO.getId());
 		if(null==wmReport1){
 			return R.failed("未查询到报告信息");
 		}
-		return wmReportService.getTaskListPage(page,wmReport1, isApprovalPage, taskTypeId, taskNumber);
+
+		reportTaskListPageDTO.setWmReport(wmReport1);
+
+		return wmReportService.getTaskListPage(page, reportTaskListPageDTO);
 	}
 
 	/**

+ 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> settlementProofInfo;
+
 }

+ 51 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/entity/dto/ReportTaskListPageDTO.java

@@ -0,0 +1,51 @@
+package com.qunzhixinxi.hnqz.admin.entity.dto;
+
+import com.qunzhixinxi.hnqz.admin.entity.WmReport;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+/**
+ * 结算报告审批-查看的请求参数
+ */
+@Data
+public class ReportTaskListPageDTO implements Serializable {
+    private static final long serialVersionUID = 6529491449451060362L;
+
+    /**
+     * 报告id
+     */
+    @NotNull(message = "报告id必填")
+    private Integer id;
+
+    /**
+     * 报告对象
+     */
+    private WmReport wmReport;
+
+    /**
+     * 1审批,0查看
+     */
+    private Integer isApprovalPage;
+
+    /**
+     * 报告审核状态: 0-未审核,1-通过,2-不通过
+     */
+    private String reportApprovalOpinion;
+
+    /**
+     * 任务状态
+     */
+    private String taskStatus;
+
+    /**
+     * 任务类型 ID
+     */
+    private String taskTypeId;
+
+    /**
+     * 任务编号
+     */
+    private String taskNumber;
+}

+ 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;
+    }
+}

+ 3 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/enums/DeptPermissionEnum.java

@@ -11,7 +11,9 @@ public enum DeptPermissionEnum {
 	/**
 	 * 部门权限类型:0:导出
 	 */
-	DEPT_EXPORT("0");
+	DEPT_EXPORT("0"),
+	SMS("1"),
+	SETTLEMENT_PROOF("2");
 
 	/**
 	 * 权限类型

+ 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);
+//        }
+    }
+}

+ 9 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmReportService.java

@@ -21,6 +21,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qunzhixinxi.hnqz.admin.entity.WmReport;
+import com.qunzhixinxi.hnqz.admin.entity.dto.ReportTaskListPageDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 
@@ -73,7 +74,14 @@ public interface WmReportService extends IService<WmReport> {
 	 */
 	R<?> approvalReportByTaskType(List<String> taskIds, String approvalOpinion, String approvalInfo);
 
-	R getTaskListPage(Page page, WmReport wmReport, Integer isApprovalPage, String taskTypeId, String taskNumber);
+	/**
+	 * 报告管理--查看
+	 *
+	 * @param page                  页
+	 * @param reportTaskListPageDTO 报告任务列表DTO
+	 * @return {@link R}
+	 */
+	R getTaskListPage(Page page, ReportTaskListPageDTO reportTaskListPageDTO);
 
 	/**
 	 * 根据积分包id查询待审核任务详情列表

+ 40 - 10
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmReportServiceImpl.java

@@ -51,6 +51,7 @@ import com.qunzhixinxi.hnqz.admin.entity.WmUserSignDetail;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkAlbum;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkArticle;
 import com.qunzhixinxi.hnqz.admin.entity.WmWkArticleShare;
+import com.qunzhixinxi.hnqz.admin.entity.dto.ReportTaskListPageDTO;
 import com.qunzhixinxi.hnqz.admin.entity.dto.WmDeptTaskTypeConfigJsonDTO;
 import com.qunzhixinxi.hnqz.admin.entity.vo.WmTaskVO;
 import com.qunzhixinxi.hnqz.admin.enums.DelEnum;
@@ -956,17 +957,21 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 	}
 
 	/**
-     * 报告管理--查看
-     *
-     * @param page
-     * @param wmReport
-     * @param isApprovalPage 1审批,0查看
-     * @param taskTypeId 任务类型id
-     * @param taskNumber 任务编号
-     * @return
-     */
+	 * 报告管理--查看
+	 *
+	 * @param page                  页
+	 * @param reportTaskListPageDTO 报告任务列表DTO
+	 * @return {@link R}
+	 */
 	@Override
-	public R getTaskListPage(Page page, WmReport wmReport, Integer isApprovalPage, String taskTypeId, String taskNumber) {
+	public R getTaskListPage(Page page, ReportTaskListPageDTO reportTaskListPageDTO) {
+		Integer isApprovalPage = reportTaskListPageDTO.getIsApprovalPage();
+		String reportApprovalOpinion = reportTaskListPageDTO.getReportApprovalOpinion();
+		String taskStatus = reportTaskListPageDTO.getTaskStatus();
+		String taskNumber = reportTaskListPageDTO.getTaskNumber();
+		String taskTypeId = reportTaskListPageDTO.getTaskTypeId();
+		WmReport wmReport = reportTaskListPageDTO.getWmReport();
+
 		Page pages=null;
 		WmScorePackage scorePackage=wmScorePackageService.getById(wmReport.getScoreId());
 		LambdaQueryWrapper<WmTask> lambdaQueryWrapper= Wrappers.<WmTask>query().lambda();
@@ -982,13 +987,38 @@ public class WmReportServiceImpl extends ServiceImpl<WmReportMapper, WmReport> i
 			} else if ("2".equals(scorePackage.getTypeid())) {//二级代理商类型
 				lambdaQueryWrapper.and(wrapper -> wrapper.isNull(WmTask::getReportOneApprovalOpinion));
 			}
+		} else {
+			// 查看页面, 审核状态筛选条件
+			if (StrUtil.equals("0", reportApprovalOpinion)) {
+				// 未审核的条件
+				if ("0".equals(scorePackage.getTypeid())) {//药企
+					lambdaQueryWrapper.and(wrapper -> wrapper.isNull(WmTask::getReportDrugApprovalOpinion));
+				} else if ("1".equals(scorePackage.getTypeid())) {//一级代理商类型
+					lambdaQueryWrapper.and(wrapper -> wrapper.isNull(WmTask::getReportDrugApprovalOpinion));
+				} else if ("2".equals(scorePackage.getTypeid())) {//二级代理商类型
+					lambdaQueryWrapper.and(wrapper -> wrapper.isNull(WmTask::getReportOneApprovalOpinion));
+				}
+			} else if (StrUtil.equalsAny(reportApprovalOpinion, "1", "2")) {
+				// 审核通过/不通过的条件
+				if ("0".equals(scorePackage.getTypeid())) {//药企
+					lambdaQueryWrapper.eq(WmTask::getReportDrugApprovalOpinion, reportApprovalOpinion);
+				} else if ("1".equals(scorePackage.getTypeid())) {//一级代理商类型
+					lambdaQueryWrapper.eq(WmTask::getReportDrugApprovalOpinion, reportApprovalOpinion);
+				} else if ("2".equals(scorePackage.getTypeid())) {//二级代理商类型
+					lambdaQueryWrapper.eq(WmTask::getReportOneApprovalOpinion, reportApprovalOpinion);
+				}
+			}
 		}
+
 		if (StrUtil.isNotBlank(taskNumber)) {
 			lambdaQueryWrapper.like(WmTask::getTaskNumber, taskNumber);
 		}
 		if (StrUtil.isNotBlank(taskTypeId)) {
 			lambdaQueryWrapper.eq(WmTask::getTaskTypeId, taskTypeId);
 		}
+		if (StrUtil.isNotBlank(taskStatus)) {
+			lambdaQueryWrapper.eq(WmTask::getTaskStatus, taskStatus);
+		}
 		pages=wmTaskService.page(page, lambdaQueryWrapper);
 //		if("0".equals(scorePackage.getTypeid())){//药企
 //			wmTask.setReportDrugId(wmReport.getId());

+ 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()
+//                + "]");
+//    }
+}

二进制
hnqz-upms/hnqz-upms-biz/src/main/resources/excel/settlement_application_form_template.docx


+ 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("导出失败");
+        }
+    }
+}