|
@@ -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")
|