Browse Source

1.班级教材确认
2.申领详情记录列表+导出表
4.教材征订入库修改

大数据与最优化研究所 5 months ago
parent
commit
5969b30b95

+ 2 - 0
src/main/java/com/xjrsoft/common/enums/RoleEnum.java

@@ -23,6 +23,8 @@ public enum RoleEnum {
     PARENT(4L, "家长"),
     VISITOR(5L, "访客"),
 
+    BOOKADMIN(1747874695055732738L, "教材管理员"),
+
     CLASSTE(1745630294430511106L, "班主任");
 
     final Long code;

+ 4 - 2
src/main/java/com/xjrsoft/module/textbook/controller/TextbookStudentClaimController.java

@@ -44,8 +44,10 @@ public class TextbookStudentClaimController {
     @ApiOperation(value = "班主任查看班级教材学期页面")
     @SaCheckPermission("textbookstudentclaim:detail")
     @XjrLog(value = "班主任查看班级教材学期页面")
-    public RT<List<HeadTeaLookClassBookSemesterVo>> headTeaLookClassBookSemester() {
-        return RT.ok(textbookStudentClaimService.headTeaLookClassBookSemester());
+    public RT<PageOutput<HeadTeaLookClassBookSemesterVo>> headTeaLookClassBookSemester(@Valid HeadTeaLookClassBookSemesterDto dto) {
+        IPage<HeadTeaLookClassBookSemesterVo> page = textbookStudentClaimService.headTeaLookClassBookSemester(dto);
+        PageOutput<HeadTeaLookClassBookSemesterVo> pageOutput = ConventPage.getPageOutput(page, HeadTeaLookClassBookSemesterVo.class);
+        return RT.ok(pageOutput);
     }
 
     @GetMapping(value = "/head-tea-look-class-book")

+ 29 - 0
src/main/java/com/xjrsoft/module/textbook/dto/HeadTeaLookClassBookSemesterDto.java

@@ -0,0 +1,29 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+ * @title: 班主任查看班级教材学期页面入参
+ * @Author szs
+ * @Date: 2025-06-11
+ * @Version 1.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class HeadTeaLookClassBookSemesterDto extends PageInput {
+    @ApiModelProperty("学期主键编号")
+    private String baseSemesterId;
+
+    @ApiModelProperty("学期主键编号")
+    private String baseSemesterIdCn;
+
+    @ApiModelProperty("班级主键编号")
+    private String baseClassId;
+
+    @ApiModelProperty("班级主键编号")
+    private String baseClassIdCn;
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/textbook/dto/UpdateDiscountDto.java

@@ -18,4 +18,7 @@ public class UpdateDiscountDto {
 
     @ApiModelProperty("新的折扣")
     private Double discount;
+
+    @ApiModelProperty("新的入库数量")
+    private int warehouseNumber;
 }

+ 10 - 2
src/main/java/com/xjrsoft/module/textbook/entity/TextbookDiscountAlterRecord.java

@@ -96,6 +96,14 @@ public class TextbookDiscountAlterRecord implements Serializable {
      */
     @ApiModelProperty("新的折扣")
     private Double newDiscount;
-
-
+    /**
+     * 旧的入库数量
+     */
+    @ApiModelProperty("旧的入库数量")
+    private Integer oldWarehouseNum;
+    /**
+     * 新的入库数量
+     */
+    @ApiModelProperty("新的入库数量")
+    private Integer newWarehouseNum;
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/textbook/service/ITextbookStudentClaimService.java

@@ -30,7 +30,7 @@ public interface ITextbookStudentClaimService extends MPJBaseService<TextbookStu
      * @param
      * @return
      */
-    List<HeadTeaLookClassBookSemesterVo> headTeaLookClassBookSemester();
+    IPage<HeadTeaLookClassBookSemesterVo> headTeaLookClassBookSemester(HeadTeaLookClassBookSemesterDto dto);
 
     /**
      * 获取页面

+ 2 - 1
src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookClaimService.java

@@ -10,6 +10,7 @@ import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -77,5 +78,5 @@ public interface IWfTextbookClaimService extends MPJBaseService<WfTextbookClaim>
 
     Boolean dataHandleAddClaimUserNode(Long id);
 
-    ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto);
+    ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto) throws IOException;
 }

+ 15 - 3
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookStudentClaimServiceImpl.java

@@ -10,6 +10,7 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
 import com.xjrsoft.common.enums.ClaimTypeEnum;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
@@ -172,7 +173,7 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
     }
 
     @Override
-    public List<HeadTeaLookClassBookSemesterVo> headTeaLookClassBookSemester() {
+    public IPage<HeadTeaLookClassBookSemesterVo> headTeaLookClassBookSemester(HeadTeaLookClassBookSemesterDto dto) {
         Long loginId = StpUtil.getLoginIdAsLong();
 
         MPJLambdaWrapper<BaseClassAdminCourse> baseClassAdminCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
@@ -184,10 +185,21 @@ public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<Textbook
                 .selectAs(BaseClass::getName, HeadTeaLookClassBookSemesterVo::getBaseClassIdCn)
                 .innerJoin(BaseClass.class, BaseClass::getId, BaseClassAdminCourse::getClassId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, BaseClassAdminCourse::getBaseSemesterId)
-                .eq(BaseClass::getTeacherId, loginId)
+                .eq(StringUtils.isNotEmpty(dto.getBaseSemesterId()), BaseClassAdminCourse::getBaseSemesterId, dto.getBaseSemesterId())
+                .eq(StringUtils.isNotEmpty(dto.getBaseClassId()), BaseClassAdminCourse::getClassId, dto.getBaseClassId())
+                .like(StringUtils.isNotEmpty(dto.getBaseSemesterIdCn()), BaseSemester::getName, dto.getBaseSemesterIdCn())
+                .like(StringUtils.isNotEmpty(dto.getBaseClassIdCn()), BaseClass::getName, dto.getBaseClassIdCn())
                 .orderByDesc(BaseSemester::getName)
+                .orderByDesc(BaseClass::getName)
         ;
-        return baseClassAdminCourseMapper.selectJoinList(HeadTeaLookClassBookSemesterVo.class, baseClassAdminCourseMPJLambdaWrapper);
+
+        // 权限控制,教材管理员可以看到所有班级所有学期的数据
+        // 班主任只能看到自己班上的
+        if(!StpUtil.hasRole("BOOKAdmin")) {
+            baseClassAdminCourseMPJLambdaWrapper
+                    .eq(BaseClass::getTeacherId, loginId);
+        }
+        return baseClassAdminCourseMapper.selectJoinPage(ConventPage.getPage(dto), HeadTeaLookClassBookSemesterVo.class, baseClassAdminCourseMPJLambdaWrapper);
     }
 
     @Override

+ 11 - 0
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java

@@ -218,6 +218,10 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
             throw new MyException("当前入库记录已经被修改,请重新选择");
         }
 
+        if(textbookWarehouseRecord.getIssuedNumber() > dto.getWarehouseNumber()){
+            throw new MyException("入库数量不能少于已经发放数量");
+        }
+
         // 如果是征订入库
         // 根据入库记录找到对应的征订
 //        MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
@@ -240,6 +244,11 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
 
         TextbookWarehouseRecord updateTextbookWarehouseRecord = new TextbookWarehouseRecord();
         updateTextbookWarehouseRecord.setId(textbookWarehouseRecord.getId());
+        updateTextbookWarehouseRecord.setActualWarehouseNumber(dto.getWarehouseNumber() - (textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getActualWarehouseNumber()));
+        if(updateTextbookWarehouseRecord.getActualWarehouseNumber() < 0){
+            throw new MyException("该教材存在退书等操作,修改的入库数量不能少于已发放数量和退书等操作数量的总和。");
+        }
+        updateTextbookWarehouseRecord.setWarehouseNumber(dto.getWarehouseNumber());
         updateTextbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(dto.getPrice()) ? dto.getPrice() : BigDecimal.ZERO);
         updateTextbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(dto.getDiscount()) ? dto.getDiscount() : 10);
         updateTextbookWarehouseRecord.setSubtotal(updateTextbookWarehouseRecord.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
@@ -278,6 +287,8 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
         textbookDiscountAlterRecord.setNewPrice(dto.getPrice());
         textbookDiscountAlterRecord.setOldDiscount(textbookWarehouseRecord.getDiscount());
         textbookDiscountAlterRecord.setNewDiscount(dto.getDiscount());
+        textbookDiscountAlterRecord.setOldWarehouseNum(textbookWarehouseRecord.getWarehouseNumber());
+        textbookDiscountAlterRecord.setNewWarehouseNum(dto.getWarehouseNumber());
         textbookDiscountAlterRecord.setCreateDate(new Date());
         textbookDiscountAlterRecordMapper.insert(textbookDiscountAlterRecord);
 

+ 180 - 7
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java

@@ -1,8 +1,6 @@
 package com.xjrsoft.module.textbook.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
-import com.alibaba.excel.EasyExcel;
-import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -13,12 +11,11 @@ import com.xjrsoft.common.enums.ClaimTypeEnum;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.IssueModeEnum;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseSemester;
-import com.xjrsoft.module.oa.entity.WfMeetingApply;
+import com.xjrsoft.module.generator.entity.ImportConfig;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
@@ -27,17 +24,23 @@ import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
 import com.xjrsoft.module.textbook.vo.*;
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
 import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.ss.util.CellRangeAddress;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -141,8 +144,31 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     .map(DistributePageVo::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)
+                        )
+                        .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
+                ;
+                List<WfTextbookClaimItemVo> wfTextbookClaimItemVos = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItemVo.class, wfTextbookClaimItemVoLambdaQueryWrapper);
+                if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVos)) {
+                    wfTextbookClaimItemVoMap = wfTextbookClaimItemVos.stream()
+                            .collect(Collectors.groupingBy(WfTextbookClaimItemVo::getWfTextbookClaimId))
+                    ;
+                }
+
                 MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
                 wfTextbookClaimItemLambdaQueryWrapper
                         .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
@@ -166,6 +192,14 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     }
                 }
             }
+            if (MapUtils.isNotEmpty(wfTextbookClaimItemVoMap)) {
+                for (DistributePageVo distributePageVo : page.getRecords()) {
+                    wfTextbookClaimItemVoList = wfTextbookClaimItemVoMap.get(distributePageVo.getId());
+                    if(CollectionUtils.isNotEmpty(wfTextbookClaimItemVoList)){
+                        distributePageVo.setWfTextbookClaimItemVoList(wfTextbookClaimItemVoList);
+                    }
+                }
+            }
         }
         return page;
     }
@@ -697,7 +731,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     }
 
     @Override
-    public ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto) {
+    public ByteArrayOutputStream claimRecordsExportQuery(ClaimRecordsExportQueryDto dto) throws IOException {
         MPJLambdaWrapper<WfTextbookClaim> wfTextbookClaimMPJLambdaWrapper = new MPJLambdaWrapper<>();
         wfTextbookClaimMPJLambdaWrapper
                 .disableSubLogicDel()
@@ -730,8 +764,32 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     .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))
+                    ;
+                }
+
                 MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
                 wfTextbookClaimItemLambdaQueryWrapper
                         .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
@@ -755,6 +813,14 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     }
                 }
             }
+            if (MapUtils.isNotEmpty(wfTextbookClaimItemVoMap)) {
+                for (ClaimRecordsExportQueryVo vo : dataList) {
+                    wfTextbookClaimItemVoList = wfTextbookClaimItemVoMap.get(vo.getId());
+                    if(CollectionUtils.isNotEmpty(wfTextbookClaimItemVoList)){
+                        vo.setWfTextbookClaimItemVoList(wfTextbookClaimItemVoList);
+                    }
+                }
+            }
         }
 
         for (ClaimRecordsExportQueryVo vo : dataList) {
@@ -774,9 +840,116 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             }
         }
 
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, ClaimRecordsExportQueryVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+        // 开始写入
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "sheet1";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        // 出参vo字段数量
+        ClaimRecordsExportQueryVo obj = new ClaimRecordsExportQueryVo();
+        List<ImportConfig> importConfigs = ImportExcelUtil.allFields(obj);
+
+        // 写大标题
+        int rowNumber = 0;
+        ImportExcelUtil.createBigHead(workbook, sheet, "教材申领情况", rowNumber++, importConfigs.size() - 1);
+
+        // 表头
+        ImportExcelUtil.createHead(workbook, sheet, importConfigs, IndexedColors.YELLOW.getIndex(), IndexedColors.RED.getIndex(), rowNumber++);
+
+        // 字体内容格式
+        Font font = workbook.createFont();
+        font.setBold(false);// 设置为粗体
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short) 12);
+
+        // 单元格样式
+        CellStyle cellStyle = workbook.createCellStyle();
+        cellStyle.setFont(font); // 将字体应用到样式
+        cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        cellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        // 设置边框样式为细线
+        cellStyle.setBorderTop(BorderStyle.THIN);
+        cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); // 设置顶部边框颜色
+
+        cellStyle.setBorderBottom(BorderStyle.THIN);
+        cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); // 设置底部边框颜色
+
+        cellStyle.setBorderLeft(BorderStyle.THIN);
+        cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); // 设置左边框颜色
+
+        cellStyle.setBorderRight(BorderStyle.THIN);
+        cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); // 设置右边框颜色
+
+        // 构建数据
+        List<List<String>> result;
+        List<String> oneResult;
+        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());
+                    }else {
+                        oneResult.add("无");
+                    }
+                    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);
+                    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));
+                }
+            }
+        }
+
+        // 自动列宽
+        for (int i = 0; i < importConfigs.size(); i++) {
+            sheet.autoSizeColumn(i);
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
         return bot;
     }
 }

+ 39 - 2
src/main/java/com/xjrsoft/module/textbook/vo/ClaimRecordsExportQueryVo.java

@@ -6,8 +6,11 @@ import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.util.List;
+
 @Data
 public class ClaimRecordsExportQueryVo {
+    @ContentStyle(dataFormat = 49)
     @ExcelIgnore
     @ApiModelProperty("主键编号")
     private Long id;
@@ -38,8 +41,8 @@ public class ClaimRecordsExportQueryVo {
     private String applicantUserIdCn;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelIgnore
-    @ApiModelProperty("班级编号")
+    @ExcelProperty("班级名称")
+    @ApiModelProperty("班级名称")
     private String classIdCn;
 
     @ContentStyle(dataFormat = 49)
@@ -61,4 +64,38 @@ public class ClaimRecordsExportQueryVo {
     @ExcelProperty("发放数量")
     @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;
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/textbook/vo/DistributePageVo.java

@@ -7,6 +7,7 @@ import lombok.Data;
 
 import java.time.LocalDateTime;
 import java.util.Date;
+import java.util.List;
 
 @Data
 public class DistributePageVo {
@@ -61,4 +62,7 @@ public class DistributePageVo {
 
     @ApiModelProperty("创建时间")
     private LocalDateTime createDate;
+
+    @ApiModelProperty("申领子项集合")
+    List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList;
 }

+ 7 - 1
src/main/java/com/xjrsoft/module/textbook/vo/WfTextbookClaimItemVo.java

@@ -1,5 +1,7 @@
 package com.xjrsoft.module.textbook.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -37,6 +39,11 @@ public class WfTextbookClaimItemVo {
      */
     @ApiModelProperty("教材管理编号")
     private String textbookIdCN;
+    /**
+     * 国际标准刊号
+     */
+    @ApiModelProperty("国际标准刊号")
+    private String issn;
     /**
      * 申请数量
      */
@@ -47,5 +54,4 @@ public class WfTextbookClaimItemVo {
      */
     @ApiModelProperty("已发放数量")
     private Integer issueNumber;
-
 }

File diff suppressed because it is too large
+ 5 - 1
src/main/resources/sqlScript/20250603sql.sql


+ 5 - 0
src/main/resources/sqlScript/20250612sql.sql

@@ -0,0 +1,5 @@
+alter table textbook_discount_alter_record
+    add old_warehouse_num int null comment '旧的入库数量' after new_price;
+
+alter table textbook_discount_alter_record
+    add new_warehouse_num int null comment '新的入库数量' after old_warehouse_num;

Some files were not shown because too many files changed in this diff