Prechádzať zdrojové kódy

2.申领详情记录列表,发放记录导出

大数据与最优化研究所 5 mesiacov pred
rodič
commit
5330d54bb8

+ 6 - 6
src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookClaimController.java

@@ -181,13 +181,13 @@ public class WfTextbookClaimController {
         return RT.ok(base64);
     }
 
-    @PostMapping("/claim-records-export-query")
-    @ApiOperation(value = "申领记录条件导出")
-    @XjrLog(value = "申领记录条件导出")
-    public ResponseEntity<byte[]> claimRecordsExportQuery(@Valid @RequestBody ClaimRecordsExportQueryDto dto) throws IOException {
-//    @GetMapping("/claim-records-export-query")
+//    @PostMapping("/claim-records-export-query")
 //    @ApiOperation(value = "申领记录条件导出")
-//    public ResponseEntity<byte[]> claimRecordsExportQuery(@Valid ClaimRecordsExportQueryDto dto) throws IOException {
+//    @XjrLog(value = "申领记录条件导出")
+//    public ResponseEntity<byte[]> claimRecordsExportQuery(@Valid @RequestBody ClaimRecordsExportQueryDto dto) throws IOException {
+    @GetMapping("/claim-records-export-query")
+    @ApiOperation(value = "申领记录条件导出")
+    public ResponseEntity<byte[]> claimRecordsExportQuery(@Valid ClaimRecordsExportQueryDto dto) throws IOException {
         ByteArrayOutputStream bot = wfTextbookClaimService.claimRecordsExportQuery(dto);
         String fileName = "申领记录";
         fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);

+ 156 - 127
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java

@@ -43,6 +43,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.function.Function;
@@ -785,87 +786,64 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         ;
         List<ClaimRecordsExportQueryVo> dataList = this.selectJoinList(ClaimRecordsExportQueryVo.class, wfTextbookClaimMPJLambdaWrapper);
 
-        // 处理申领总数量和已经发放总数量
-        if (ObjectUtils.isNotEmpty(dataList)) {
-            List<Long> textbookClaimIds = dataList.stream()
-                    .map(ClaimRecordsExportQueryVo::getId)
-                    .collect(Collectors.toList());
-            Map<Long, WfTextbookClaimItem> applicantTatolNumberMap = new HashMap<>();
-
-            // 处理所有的子项
-            Map<Long, List<WfTextbookClaimItemVo>> wfTextbookClaimItemVoMap = new HashMap<>();
-
-            WfTextbookClaimItem wfTextbookClaimItem;
-            List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList;
-            if (ObjectUtils.isNotEmpty(textbookClaimIds)) {
-                MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemVoLambdaQueryWrapper = new MPJLambdaWrapper<>();
-                wfTextbookClaimItemVoLambdaQueryWrapper
-                        .disableSubLogicDel()
-                        .select(WfTextbookClaimItem::getId)
-                        .select(WfTextbookClaimItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookClaimItemVo.class).contains(x.getProperty()))
-                        .leftJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId,
-                                wrapper -> wrapper
-                                        .selectAs(Textbook::getBookName, WfTextbookClaimItemVo::getTextbookIdCN)
-                                        .selectAs(Textbook::getIssn, WfTextbookClaimItemVo::getIssn)
-                        )
-                        .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
-                ;
-                List<WfTextbookClaimItemVo> wfTextbookClaimItemVos = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItemVo.class, wfTextbookClaimItemVoLambdaQueryWrapper);
-                if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVos)) {
-                    wfTextbookClaimItemVoMap = wfTextbookClaimItemVos.stream()
-                            .collect(Collectors.groupingBy(WfTextbookClaimItemVo::getWfTextbookClaimId))
-                    ;
-                }
+        List<Long> claimIds = dataList.stream()
+                .map(ClaimRecordsExportQueryVo::getId)
+                .collect(Collectors.toList());
 
-                MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
-                wfTextbookClaimItemLambdaQueryWrapper
-                        .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
-                        .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
-                        .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
-                        .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
-                        .groupBy(WfTextbookClaimItem::getWfTextbookClaimId)
-                ;
-                List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, wfTextbookClaimItemLambdaQueryWrapper);
-                if (ObjectUtils.isNotEmpty(wfTextbookClaimItemList)) {
-                    applicantTatolNumberMap = wfTextbookClaimItemList.stream()
-                            .collect(Collectors.toMap(WfTextbookClaimItem::getWfTextbookClaimId, w -> w, (w1, w2) -> w1));
-                }
-            }
-            if (ObjectUtils.isNotEmpty(applicantTatolNumberMap)) {
-                for (ClaimRecordsExportQueryVo vo : dataList) {
-                    wfTextbookClaimItem = applicantTatolNumberMap.get(vo.getId());
-                    if (ObjectUtils.isNotEmpty(wfTextbookClaimItem)) {
-                        vo.setApplicantTatolNumber(wfTextbookClaimItem.getApplicantNumber());
-                        vo.setIssueTatolNumber(wfTextbookClaimItem.getIssueNumber());
-                    }
-                }
-            }
-            if (MapUtils.isNotEmpty(wfTextbookClaimItemVoMap)) {
-                for (ClaimRecordsExportQueryVo vo : dataList) {
-                    wfTextbookClaimItemVoList = wfTextbookClaimItemVoMap.get(vo.getId());
-                    if (CollectionUtils.isNotEmpty(wfTextbookClaimItemVoList)) {
-                        vo.setWfTextbookClaimItemVoList(wfTextbookClaimItemVoList);
-                    }
-                }
-            }
-        }
+        // 查询统计数据
+        MPJLambdaWrapper<WfTextbookClaimItem> statsWrapper = new MPJLambdaWrapper<>();
+        statsWrapper
+                .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
+                .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
+                .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
+                .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds)
+                .groupBy(WfTextbookClaimItem::getWfTextbookClaimId);
 
-        for (ClaimRecordsExportQueryVo vo : dataList) {
-            if (ObjectUtils.isNotEmpty(vo.getClaimType()) && ClaimTypeEnum.ClaimClass.getCode().equals(vo.getClaimType())) {
-                vo.setReceiver(vo.getClassIdCn());
-            } else {
-                vo.setReceiver(vo.getApplicantUserIdCn());
-            }
+        List<WfTextbookClaimItem> statsList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, statsWrapper);
+        Map<Long, WfTextbookClaimItem> statsMap = statsList.stream()
+                .collect(Collectors.toMap(
+                        WfTextbookClaimItem::getWfTextbookClaimId,
+                        Function.identity(),
+                        (w1, w2) -> w1)); // 可视情况记录冲突日志
 
-            // 1:未发放,2:部分发放,3:全部发放)
-            if (vo.getStatus() == 2) {
-                vo.setStatusStr("部分发放");
-            } else if (vo.getStatus() == 3) {
-                vo.setStatusStr("全部发放");
-            } else {
-                vo.setStatusStr("未发放");
-            }
-        }
+        // 查询子项数据
+        MPJLambdaWrapper<WfTextbookClaimItem> itemWrapper = new MPJLambdaWrapper<>();
+        itemWrapper.disableSubLogicDel()
+                .select(WfTextbookClaimItem::getId)
+                .selectAs(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItemVo::getApplicantNumber)
+                .selectAs(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItemVo::getIssueNumber)
+                .select(WfTextbookClaimItem.class, x -> VoToColumnUtil.fieldsToColumns(WfTextbookClaimItemVo.class).contains(x.getProperty()))
+                .leftJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId,
+                        w -> w
+                                .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
+                                .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
+                .in(WfTextbookClaimItem::getWfTextbookClaimId, claimIds);
+
+        List<WfTextbookClaimItemVo> itemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItemVo.class, itemWrapper);
+        Map<Long, List<WfTextbookClaimItemVo>> itemMap = itemList.stream()
+                .collect(Collectors.groupingBy(WfTextbookClaimItemVo::getWfTextbookClaimId));
+
+        // 查询发放记录
+        MPJLambdaWrapper<TextbookIssueRecord> recordWrapper = new MPJLambdaWrapper<>();
+        recordWrapper.disableSubLogicDel()
+                .selectAs(TextbookIssueRecord::getDataId, DistributeRecordVo::getWfTextbookClaimId)
+                .selectAs(TextbookIssueRecord::getDataItemId, DistributeRecordVo::getWfTextbookClaimItemId)
+                .selectAs(TextbookIssueRecord::getCreateDate, DistributeRecordVo::getIssueDate)
+                .selectAs(TextbookIssueRecord::getIssueNumber, DistributeRecordVo::getIssueNumber)
+                .selectAs(TextbookIssueRecord::getOrderNumber, DistributeRecordVo::getOrderNumber)
+                .selectAs(TextbookIssueRecord::getRemark, DistributeRecordVo::getRemark)
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
+                        w -> w
+                                .selectAs(Textbook::getBookName, DistributeRecordVo::getTextbookIdCn)
+                                .selectAs(Textbook::getIssn, DistributeRecordVo::getIssn))
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
+                        w -> w
+                                .selectAs(XjrUser::getName, DistributeRecordVo::getIssueUser))
+                .in(TextbookIssueRecord::getDataId, claimIds);
+
+        List<DistributeRecordVo> recordList = textbookIssueRecordMapper.selectJoinList(DistributeRecordVo.class, recordWrapper);
+        Map<Long, List<DistributeRecordVo>> recordMap = recordList.stream()
+                .collect(Collectors.groupingBy(DistributeRecordVo::getWfTextbookClaimItemId));
 
         // 开始写入
         Workbook workbook = new XSSFWorkbook();
@@ -909,64 +887,115 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         cellStyle.setBorderRight(BorderStyle.THIN);
         cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 设置右边框颜色
 
-        // 构建数据
-        List<List<String>> result;
-        List<String> oneResult;
+        // 记录写入
+        List<String> claimVo;
+        List<String> claimItemVo;
+        List<String> claimItemIssueVo;
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         for (ClaimRecordsExportQueryVo vo : dataList) {
-            result = new ArrayList<>();
-            if (CollectionUtils.isNotEmpty(vo.getWfTextbookClaimItemVoList())) {
-                for (WfTextbookClaimItemVo item : vo.getWfTextbookClaimItemVoList()) {
-                    oneResult = new ArrayList<>();
-                    oneResult.add(vo.getBaseSemesterIdCn());
-                    oneResult.add(vo.getClaimTypeCn());
-                    oneResult.add(vo.getReceiver());
-                    if (StringUtils.isNotEmpty(vo.getClassIdCn())) {
-                        oneResult.add(vo.getClassIdCn());
+            if (ObjectUtils.isNotEmpty(vo.getClaimType()) && ClaimTypeEnum.ClaimClass.getCode().equals(vo.getClaimType())) {
+                vo.setReceiver(vo.getClassIdCn());
+            } else {
+                vo.setReceiver(vo.getApplicantUserIdCn());
+            }
+
+            // 1:未发放,2:部分发放,3:全部发放)
+            if (vo.getStatus() == 2) {
+                vo.setStatusStr("部分发放");
+            } else if (vo.getStatus() == 3) {
+                vo.setStatusStr("全部发放");
+            } else {
+                vo.setStatusStr("未发放");
+            }
+
+            Long claimId = vo.getId();
+
+            // 填充统计信息
+            if (MapUtils.isNotEmpty(statsMap) && statsMap.containsKey(claimId)) {
+                WfTextbookClaimItem stat = statsMap.get(claimId);
+                vo.setApplicantTatolNumber(stat.getApplicantNumber());
+                vo.setIssueTatolNumber(stat.getIssueNumber());
+            }
+
+            // 申领总记录
+            claimVo = new ArrayList<>();
+            claimVo.add(vo.getBaseSemesterIdCn());
+            claimVo.add(vo.getClaimTypeCn());
+            claimVo.add(vo.getReceiver());
+            if (StringUtils.isNotEmpty(vo.getClassIdCn())) {
+                claimVo.add(vo.getClassIdCn());
+            } else {
+                claimVo.add("无");
+            }
+            claimVo.add(vo.getApplicantTatolNumber() + "");
+            claimVo.add(vo.getStatusStr());
+            claimVo.add(vo.getIssueTatolNumber() + "");
+
+            // 填充子项及发放记录
+            int mergeClaim = 0;
+            if (MapUtils.isNotEmpty(itemMap) && CollectionUtils.isNotEmpty(itemMap.get(claimId))) {
+                List<WfTextbookClaimItemVo> items = itemMap.get(claimId);
+                for (WfTextbookClaimItemVo item : items) {
+                    mergeClaim++;
+                    claimItemVo = new ArrayList<>(claimVo);
+                    claimItemVo.add(item.getTextbookIdCN());
+                    claimItemVo.add(item.getIssn());
+                    claimItemVo.add(item.getApplicantNumber() + "");
+                    claimItemVo.add(item.getIssueNumber() + "");
+
+                    int mergeClaimItem = 0;
+                    if (recordMap.containsKey(item.getId())) {
+                        List<DistributeRecordVo> issues = recordMap.get(item.getId());
+                        for (DistributeRecordVo issue : issues) {
+                            mergeClaimItem++;
+                            claimItemIssueVo = new ArrayList<>(claimItemVo);
+                            LocalDateTime localDateTime = issue.getIssueDate().toInstant()
+                                    .atZone(ZoneId.systemDefault())
+                                    .toLocalDateTime();
+                            claimItemIssueVo.add(localDateTime.format(formatter));
+                            claimItemIssueVo.add(issue.getIssueUser());
+                            claimItemIssueVo.add(issue.getOrderNumber());
+                            claimItemIssueVo.add(issue.getIssueNumber() + "");
+
+                            Row dataRow = sheet.createRow(rowNumber++);
+                            for (int j = 0; j < claimItemIssueVo.size(); j++) {
+                                String content = claimItemIssueVo.get(j);
+                                Cell cell = dataRow.createCell(j);
+                                cell.setCellValue(content);
+                                cell.setCellStyle(cellStyle);
+                            }
+                        }
+                        // 合并申领项
+                        if (mergeClaimItem > 1) {
+                            for (int k = 7; k < 11; k++) {
+                                sheet.addMergedRegion(new CellRangeAddress(rowNumber - mergeClaimItem, rowNumber - 1, k, k));
+                            }
+                        }
                     } else {
-                        oneResult.add("无");
+                        Row dataRow = sheet.createRow(rowNumber++);
+                        for (int j = 0; j < claimItemVo.size(); j++) {
+                            String content = claimItemVo.get(j);
+                            Cell cell = dataRow.createCell(j);
+                            cell.setCellValue(content);
+                            cell.setCellStyle(cellStyle);
+                        }
                     }
-                    oneResult.add(vo.getApplicantTatolNumber() + "");
-                    oneResult.add(vo.getStatusStr());
-                    oneResult.add(vo.getIssueTatolNumber() + "");
-                    oneResult.add(item.getTextbookIdCN());
-                    oneResult.add(item.getIssn());
-                    oneResult.add(item.getApplicantNumber() + "");
-                    oneResult.add(item.getIssueNumber() + "");
-                    result.add(oneResult);
-                }
-            } else {
-                oneResult = new ArrayList<>();
-                oneResult.add(vo.getBaseSemesterIdCn());
-                oneResult.add(vo.getClaimTypeCn());
-                oneResult.add(vo.getReceiver());
-                if (StringUtils.isNotEmpty(vo.getClassIdCn())) {
-                    oneResult.add(vo.getClassIdCn());
-                } else {
-                    oneResult.add("无");
                 }
-                oneResult.add(vo.getApplicantTatolNumber() + "");
-                oneResult.add(vo.getStatusStr());
-                oneResult.add(vo.getIssueTatolNumber() + "");
-                result.add(oneResult);
-            }
 
-            // 写入单次申领
-            int startRowNumber = rowNumber;
-            for (List<String> rowData : result) {
-                Row dataRow = sheet.createRow(rowNumber);
-                for (int j = 0; j < rowData.size(); j++) {
-                    String content = rowData.get(j);
+                // 合并申领
+                if (mergeClaim > 1) {
+                    for (int k = 0; k < 7; k++) {
+                        sheet.addMergedRegion(new CellRangeAddress(rowNumber - mergeClaim, rowNumber - 1, k, k));
+                    }
+                }
+            } else {
+                Row dataRow = sheet.createRow(rowNumber++);
+                for (int j = 0; j < claimVo.size(); j++) {
+                    String content = claimVo.get(j);
                     Cell cell = dataRow.createCell(j);
                     cell.setCellValue(content);
                     cell.setCellStyle(cellStyle);
                 }
-                rowNumber++;
-            }
-
-            if (rowNumber - startRowNumber > 1) {
-                for (int k = 0; k < 7; k++) {
-                    sheet.addMergedRegion(new CellRangeAddress(startRowNumber, rowNumber - 1, k, k));
-                }
             }
         }
 

+ 24 - 17
src/main/java/com/xjrsoft/module/textbook/vo/ClaimRecordsExportQueryVo.java

@@ -6,6 +6,7 @@ import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.Date;
 import java.util.List;
 
 @Data
@@ -65,37 +66,43 @@ public class ClaimRecordsExportQueryVo {
     @ApiModelProperty("已经发放总数量")
     private Integer issueTatolNumber;
 
-    @ContentStyle(dataFormat = 49)
-    @ExcelIgnore
-    @ApiModelProperty("申领子项集合")
-    List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList;
-
-    /**
-     * 教材管理编号
-     */
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("教材名称")
     @ApiModelProperty("教材名称")
     private String textbookIdCN;
-    /**
-     * 国际标准刊号
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("国际标准刊号")
     @ApiModelProperty("国际标准刊号")
     private String issn;
-    /**
-     * 申请数量
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("申请数量")
     @ApiModelProperty("申请数量")
     private Integer applicantNumber;
-    /**
-     * 已发放数量
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("已发放数量")
     @ApiModelProperty("已发放数量")
     private Integer issueNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库时间")
+    @ApiModelProperty("出库时间")
+    private String issueDate;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库人员")
+    @ApiModelProperty("出库人员")
+    private String issueUser;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库单号")
+    @ApiModelProperty("出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))")
+    private String orderNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("单次出库数量")
+    @ApiModelProperty("单次出库数量")
+    private Integer onceIssueNumber;
 }