Browse Source

教材相关的导出导入

大数据与最优化研究所 1 month ago
parent
commit
a7122389b6
19 changed files with 1299 additions and 444 deletions
  1. 43 38
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java
  2. 15 13
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookSubscriptionController.java
  3. 13 9
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordController.java
  4. 27 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookClaimRecordExportDto.java
  5. 41 21
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookIssueRecordPageDto.java
  6. 51 61
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookIssueRecord.java
  7. 9 5
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookIssueRecordService.java
  8. 4 2
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookSubscriptionService.java
  9. 3 0
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookWarehouseRecordService.java
  10. 244 9
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookIssueRecordServiceImpl.java
  11. 247 95
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java
  12. 63 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java
  13. 48 60
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java
  14. 155 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookClaimRecordExportVo.java
  15. 83 21
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordExcelVo.java
  16. 67 25
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordPageVo.java
  17. 43 58
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookSubscriptionExportQueryListVo.java
  18. 95 27
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordExcelVo.java
  19. 48 0
      src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

+ 43 - 38
src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java

@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
 import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -27,6 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
@@ -49,7 +52,7 @@ public class TextbookIssueRecordController {
     @ApiOperation(value="教材出库记录列表(分页)")
     @SaCheckPermission("textbookissuerecord:detail")
     public RT<PageOutput<TextbookIssueRecordPageVo>> page(@Valid TextbookIssueRecordPageDto dto){
-        Page<TextbookIssueRecordPageVo> page = textbookIssueRecordService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        IPage<TextbookIssueRecordPageVo> page = textbookIssueRecordService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<TextbookIssueRecordPageVo> pageOutput = ConventPage.getPageOutput(page, TextbookIssueRecordPageVo.class);
         return RT.ok(pageOutput);
     }
@@ -99,46 +102,48 @@ public class TextbookIssueRecordController {
 
     }
 
-    @GetMapping("/export")
-    @ApiOperation(value = "导出")
-    public ResponseEntity<byte[]> exportData() {
-        List<TextbookIssueRecordPageVo> customerList = textbookIssueRecordService.getList();
-        List<TextbookIssueRecordExcelVo> dataList = new ArrayList<>();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
-        for (TextbookIssueRecordPageVo textbookIssueRecordPageVo : customerList) {
-            if(textbookIssueRecordPageVo.getCreateDate() == null){
-                continue;
-            }
-            textbookIssueRecordPageVo.setCreateDateStr(sdf.format(textbookIssueRecordPageVo.getCreateDate()));
-            dataList.add(BeanUtil.toBean(textbookIssueRecordPageVo, TextbookIssueRecordExcelVo.class));
-        }
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, TextbookIssueRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
-
-        return RT.fileStream(bot.toByteArray(), "TextbookIssueRecord" + ExcelTypeEnum.XLSX.getValue());
-    }
+//    @GetMapping("/export")
+//    @ApiOperation(value = "导出")
+//    public ResponseEntity<byte[]> exportData() {
+//        List<TextbookIssueRecordPageVo> customerList = textbookIssueRecordService.getList();
+//        List<TextbookIssueRecordExcelVo> dataList = new ArrayList<>();
+//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
+//        for (TextbookIssueRecordPageVo textbookIssueRecordPageVo : customerList) {
+//            if(textbookIssueRecordPageVo.getCreateDate() == null){
+//                continue;
+//            }
+//            textbookIssueRecordPageVo.setCreateDateStr(sdf.format(textbookIssueRecordPageVo.getCreateDate()));
+//            dataList.add(BeanUtil.toBean(textbookIssueRecordPageVo, TextbookIssueRecordExcelVo.class));
+//        }
+//        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+//        EasyExcel.write(bot, TextbookIssueRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+//
+//        return RT.fileStream(bot.toByteArray(), "TextbookIssueRecord" + ExcelTypeEnum.XLSX.getValue());
+//    }
 
     @PostMapping("/export-query")
-    @ApiOperation(value = "指定导出")
+    @ApiOperation(value = "教材出库记录条件导出")
     public ResponseEntity<byte[]> exportDataQuery(@Valid @RequestBody TextbookIssueRecordExportDto dto) {
-        List<TextbookIssueRecordPageVo> customerList = textbookIssueRecordService.getList(dto);
-        List<TextbookIssueRecordExcelVo> dataList = new ArrayList<>();
-        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
-        for (TextbookIssueRecordPageVo textbookIssueRecordPageVo : customerList) {
-            if(textbookIssueRecordPageVo.getCreateDate() == null){
-                continue;
-            }
-            textbookIssueRecordPageVo.setCreateDateStr(sdf.format(textbookIssueRecordPageVo.getCreateDate()));
-            dataList.add(BeanUtil.toBean(textbookIssueRecordPageVo, TextbookIssueRecordExcelVo.class));
-        }
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-
-//        String projectRoot = servletContext.getRealPath("/");
-//        String fileName = projectRoot + "test" + System.currentTimeMillis() + ".xlsx";
-//        EasyExcel.write(fileName, TextbookIssueRecordExcelVo.class).sheet("用户表").doWrite(dataList);
-
-        EasyExcel.write(bot, TextbookIssueRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+//    @GetMapping("/export-query")
+//    @ApiOperation(value = "教材出库记录条件导出")
+//    public ResponseEntity<byte[]> exportDataQuery(@Valid TextbookIssueRecordExportDto dto) {
+        ByteArrayOutputStream bot = textbookIssueRecordService.exportDataQuery(dto);
+
+        String fileName = "教材出库记录";
+        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
+        return RT.fileStream(bot.toByteArray(), fileName + ExcelTypeEnum.XLSX.getValue());
+    }
 
-        return RT.fileStream(bot.toByteArray(), "TextbookIssueRecord" + ExcelTypeEnum.XLSX.getValue());
+    @PostMapping("/claim-record-export-query")
+    @ApiOperation(value = "教材发放记录条件导出")
+    public ResponseEntity<byte[]> claimRecordExportDataQuery(@Valid @RequestBody TextbookClaimRecordExportDto dto) {
+//    @GetMapping("/claim-record-export-query")
+//    @ApiOperation(value = "教材发放记录条件导出")
+//    public ResponseEntity<byte[]> claimRecordExportDataQuery(@Valid TextbookClaimRecordExportDto dto) {
+        ByteArrayOutputStream bot = textbookIssueRecordService.claimRecordExportDataQuery(dto);
+
+        String fileName = "教材发放记录";
+        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
+        return RT.fileStream(bot.toByteArray(), fileName + ExcelTypeEnum.XLSX.getValue());
     }
 }

+ 15 - 13
src/main/java/com/xjrsoft/module/textbook/controller/TextbookSubscriptionController.java

@@ -27,6 +27,8 @@ import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -200,10 +202,10 @@ public class TextbookSubscriptionController {
     }
 
     @PostMapping("/instockroom-excel-import")
-    @ApiOperation(value = "导入入库")
-    public RT<String> instockroomExcelImport(@RequestParam("file") MultipartFile file,  @RequestParam(value = "textbookSubscriptionId") Long textbookSubscriptionId) throws IOException {
+    @ApiOperation(value = "征订页面教材入库导入入库")
+    public RT<String> instockroomExcelImport(@RequestParam("file") MultipartFile file) throws IOException {
         InputStream inputStream = file.getInputStream();
-        return RT.ok(textbookSubscriptionService.instockroomExcelImport(inputStream, textbookSubscriptionId));
+        return RT.ok(textbookSubscriptionService.instockroomExcelImport(inputStream));
     }
 
     @DeleteMapping
@@ -231,16 +233,16 @@ public class TextbookSubscriptionController {
         return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
     }
 
-    @PostMapping("/textbook-subscription-export-query")
-    @ApiOperation(value = "教材征订条件导出")
-    public ResponseEntity<byte[]> textbookSubscriptionExportQuery(@Valid @RequestBody TextbookSubscriptionExportQueryListDto dto) {
-//    @GetMapping("/textbook-subscription-export-query")
-//    @ApiOperation(value = "教材征订条件导出")
-//    public ResponseEntity<byte[]> textbookSubscriptionExportQuery(@Valid TextbookSubscriptionExportQueryListDto dto) {
-        List<TextbookSubscriptionExportQueryListVo> customerList = textbookSubscriptionService.textbookSubscriptionExportQuery(dto);
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, TextbookSubscriptionExportQueryListVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+    @PostMapping("/subscription-instockroom-export-query")
+    @ApiOperation(value = "教材征订教材入库模板条件导出")
+    public ResponseEntity<byte[]> subscriptionInstockroomExportQuery(@Valid @RequestBody TextbookSubscriptionExportQueryListDto dto) throws IOException {
+//    @GetMapping("/subscription-instockroom-export-query")
+//    @ApiOperation(value = "教材征订教材入库模板条件导出")
+//    public ResponseEntity<byte[]> textbookSubscriptionExportQuery(@Valid TextbookSubscriptionExportQueryListDto dto) throws IOException {
+        ByteArrayOutputStream bot = textbookSubscriptionService.textbookSubscriptionExportQuery(dto);
 
-        return RT.fileStream(bot.toByteArray(), "TextbookSubscription" + ExcelTypeEnum.XLSX.getValue());
+        String fileName = "征订页面教材入库模板";
+        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
+        return RT.fileStream(bot.toByteArray(), fileName + ExcelTypeEnum.XLSX.getValue());
     }
 }

+ 13 - 9
src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordController.java

@@ -30,6 +30,8 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.io.ByteArrayOutputStream;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -109,14 +111,16 @@ public class TextbookWarehouseRecordController {
         return RT.fileStream(bot.toByteArray(), "TextbookClassWarehouse" + ExcelTypeEnum.XLSX.getValue());
     }
 
-    @PostMapping("/export-query")
-    @ApiOperation(value = "指定导出")
-    public ResponseEntity<byte[]> exportDataQuery(@Valid @RequestBody TextbookWarehouseRecordExportDto dto) {
-        List<TextbookWarehouseRecordPageVo> customerList = textbookClassWarehouseService.getList(dto);
-        List<TextbookWarehouseRecordExcelVo> dataList = BeanUtil.copyToList(customerList, TextbookWarehouseRecordExcelVo.class);
-        ByteArrayOutputStream bot = new ByteArrayOutputStream();
-        EasyExcel.write(bot, TextbookWarehouseRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
-
-        return RT.fileStream(bot.toByteArray(), "TextbookClassWarehouse" + ExcelTypeEnum.XLSX.getValue());
+//    @PostMapping("/export-query")
+//    @ApiOperation(value = "教材入库记录条件导出")
+//    public ResponseEntity<byte[]> exportDataQuery(@Valid @RequestBody TextbookWarehouseRecordExportDto dto) {
+    @GetMapping("/export-query")
+    @ApiOperation(value = "教材入库记录条件导出")
+    public ResponseEntity<byte[]> exportDataQuery(@Valid TextbookWarehouseRecordExportDto dto) {
+        ByteArrayOutputStream bot = textbookClassWarehouseService.exportDataQuery(dto);
+
+        String fileName = "教材入库记录";
+        fileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8);
+        return RT.fileStream(bot.toByteArray(), fileName + ExcelTypeEnum.XLSX.getValue());
     }
 }

+ 27 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookClaimRecordExportDto.java

@@ -0,0 +1,27 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+
+/**
+* @title: 教材出库记录导出入参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TextbookClaimRecordExportDto {
+
+    @ApiModelProperty("学期")
+    private Long baseSemesterId;
+
+    @ApiModelProperty("班级")
+    private Long classId;
+}

+ 41 - 21
src/main/java/com/xjrsoft/module/textbook/dto/TextbookIssueRecordPageDto.java

@@ -5,6 +5,8 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
+import java.util.Date;
+
 
 /**
 * @title: 教材出库记录分页查询入参
@@ -16,36 +18,54 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class TextbookIssueRecordPageDto extends PageInput {
 
-    @ApiModelProperty("教材类型")
-    public String textbookType;
-
     @ApiModelProperty("学期id")
     public Long baseSemesterId;
 
-    @ApiModelProperty("学科组id")
-    public Long subjectGroupId;
+    @ApiModelProperty("出库单号")
+    public String orderNumber;
 
-    @ApiModelProperty("课程id")
-    public Long courseSubjectId;
-
-    @ApiModelProperty("班级id")
-    public Long classId;
+    @ApiModelProperty("出库方式")
+    private String issueMode;
 
     @ApiModelProperty("书名")
-    public String bookName;
+    private String bookName;
 
     @ApiModelProperty("书号")
-    public String issn;
+    private String issn;
+
+    @ApiModelProperty("教材类型")
+    public String textbookType;
+
+    @ApiModelProperty("学科组")
+    private String groupName;
+
+    @ApiModelProperty("年级主键")
+    private Long gradeId;
+
+    @ApiModelProperty("班级主键")
+    private Long classId;
+
+    @ApiModelProperty("发放时间")
+    private Date startCreateDate;
+
+    @ApiModelProperty("发放时间")
+    private Date endCreateDate;
+
+    @ApiModelProperty("领取类型")
+    private String warehouseMode;
+
+    @ApiModelProperty("领取用户")
+    private String claimUser;
+
+    @ApiModelProperty("发放用户")
+    private String issueName;
 
-    @ApiModelProperty("规格型号")
-    public String specificationsModels;
+    @ApiModelProperty("退书状态")
+    private Integer returnState;
 
-    @ApiModelProperty("规划教材")
-    public String isTextbookPlan;
+    @ApiModelProperty("使用学期")
+    private Integer useType;
 
-    /**
-     * 出版社
-     */
-    @ApiModelProperty("出版社")
-    private String publishingHouse;
+    @ApiModelProperty("入库单号")
+    private String warehouseOrderNumber;
 }

+ 51 - 61
src/main/java/com/xjrsoft/module/textbook/entity/TextbookIssueRecord.java

@@ -1,19 +1,12 @@
 package com.xjrsoft.module.textbook.entity;
 
-import com.baomidou.mybatisplus.annotation.FieldFill;
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.github.yulichang.annotation.EntityMapping;
+import com.baomidou.mybatisplus.annotation.*;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+
 import java.io.Serializable;
-import java.time.LocalTime;
-import java.time.LocalDateTime;
 import java.math.BigDecimal;
-import java.util.List;
 import java.util.Date;
 
 
@@ -28,130 +21,127 @@ import java.util.Date;
 @ApiModel(value = "textbook_issue_record", description = "教材出库记录")
 public class TextbookIssueRecord implements Serializable {
 
-    private static final long serialVersionUID = 1L;
-
     /**
-    * 主键编号
-    */
+     * 主键编号
+     */
     @ApiModelProperty("主键编号")
     @TableId
     private Long id;
     /**
-    * 创建人
-    */
+     * 创建人
+     */
     @ApiModelProperty("创建人")
     @TableField(fill = FieldFill.INSERT)
     private Long createUserId;
     /**
-    * 创建时间
-    */
+     * 创建时间
+     */
     @ApiModelProperty("创建时间")
     @TableField(fill = FieldFill.INSERT)
     private Date createDate;
     /**
-    * 修改人
-    */
+     * 修改人
+     */
     @ApiModelProperty("修改人")
     @TableField(fill = FieldFill.UPDATE)
     private Long modifyUserId;
     /**
-    * 修改时间
-    */
+     * 修改时间
+     */
     @ApiModelProperty("修改时间")
     @TableField(fill = FieldFill.UPDATE)
     private Date modifyDate;
     /**
-    * 删除标记
-    */
+     * 删除标记
+     */
     @ApiModelProperty("删除标记")
     @TableField(fill = FieldFill.INSERT)
     @TableLogic
     private Integer deleteMark;
     /**
-    * 有效标志
-    */
+     * 有效标志
+     */
     @ApiModelProperty("有效标志")
     @TableField(fill = FieldFill.INSERT)
     private Integer enabledMark;
     /**
-    * 序号
-    */
+     * 序号
+     */
     @ApiModelProperty("序号")
     private Integer sortCode;
     /**
-    * 学期主键id
-    */
+     * 学期主键id
+     */
     @ApiModelProperty("学期主键id")
     private Long baseSemesterId;
     /**
-    * 出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))
-    */
+     * 出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))
+     */
     @ApiModelProperty("出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))")
     private String orderNumber;
     /**
-    * 关联入库主键
-    */
+     * 关联入库主键
+     */
     @ApiModelProperty("关联入库主键")
     private Long textbookWarehouseRecordId;
     /**
-    * 出库方式(xjr_dictionary_item[issue_mode])
-    */
+     * 出库方式(xjr_dictionary_item[issue_mode])
+     */
     @ApiModelProperty("出库方式(xjr_dictionary_item[issue_mode])")
     private String issueMode;
     /**
-    * 数据编号(根据出库方式,编号来自不同数据表)
-    */
+     * 数据编号(根据出库方式,编号来自不同数据表)
+     */
     @ApiModelProperty("数据编号(根据出库方式,编号来自不同数据表)")
     private Long dataId;
     /**
-    * 数据项项编号(根据出库方式,编号来自不同数据表)
-    */
+     * 数据项项编号(根据出库方式,编号来自不同数据表)
+     */
     @ApiModelProperty("数据项项编号(根据出库方式,编号来自不同数据表)")
     private Long dataItemId;
     /**
-    * 教材管理编号
-    */
+     * 教材管理编号
+     */
     @ApiModelProperty("教材管理编号")
     private Long textbookId;
     /**
-    * 出库数量
-    */
+     * 出库数量
+     */
     @ApiModelProperty("出库数量")
     private Integer issueNumber;
     /**
-    * 领取后退书数量
-    */
+     * 领取后退书数量
+     */
     @ApiModelProperty("领取后退书数量")
     private Integer recedeNumber;
     /**
-    * 实际出库数量
-    */
+     * 实际出库数量
+     */
     @ApiModelProperty("实际出库数量")
     private Integer actualIssueNumber;
     /**
-    * 实际出库总金额
-    */
+     * 实际出库总金额
+     */
     @ApiModelProperty("实际出库总金额")
     private BigDecimal actualTotalPrice;
     /**
-    * 领取用户编号
-    */
+     * 领取用户编号
+     */
     @ApiModelProperty("领取用户编号")
     private Long receiveUserId;
     /**
-    * 出库用户编号
-    */
+     * 出库用户编号
+     */
     @ApiModelProperty("出库用户编号")
     private Long issueUserId;
     /**
-    * 备注
-    */
-    @ApiModelProperty("备注")
-    private String remark;
-    /**
-     * 当前申领项发放次数
+     * 当前出库对应的申领项的发放次数
      */
-    @ApiModelProperty("当前申领项发放次数")
+    @ApiModelProperty("当前出库对应的申领项的发放次数")
     private Integer issueTimes;
-
+    /**
+     * 备注
+     */
+    @ApiModelProperty("备注")
+    private String remark;
 }

+ 9 - 5
src/main/java/com/xjrsoft/module/textbook/service/ITextbookIssueRecordService.java

@@ -1,16 +1,16 @@
 package com.xjrsoft.module.textbook.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
-import com.xjrsoft.module.textbook.dto.CanReturnTextbookListDto;
-import com.xjrsoft.module.textbook.dto.DistributeRecordPageDto;
-import com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto;
-import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
 import com.xjrsoft.module.textbook.vo.CanReturnTextbookListVo;
 import com.xjrsoft.module.textbook.vo.DistributeRecordPageVo;
+import com.xjrsoft.module.textbook.vo.TextbookIssueRecordExcelVo;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 
+import java.io.ByteArrayOutputStream;
 import java.util.List;
 
 /**
@@ -22,7 +22,7 @@ import java.util.List;
 
 public interface ITextbookIssueRecordService extends MPJBaseService<TextbookIssueRecord> {
 
-    Page<TextbookIssueRecordPageVo> getPage(Page<TextbookIssueRecordPageDto> page, TextbookIssueRecordPageDto dto);
+    IPage<TextbookIssueRecordPageVo> getPage(Page<TextbookIssueRecordPageDto> page, TextbookIssueRecordPageDto dto);
 
     List<DistributeRecordPageVo> distributeRecordPage(DistributeRecordPageDto dto);
 
@@ -31,4 +31,8 @@ public interface ITextbookIssueRecordService extends MPJBaseService<TextbookIssu
     List<TextbookIssueRecordPageVo> getList(TextbookIssueRecordExportDto dto);
 
     List<TextbookIssueRecordPageVo> getList();
+
+    ByteArrayOutputStream exportDataQuery(TextbookIssueRecordExportDto dto);
+
+    ByteArrayOutputStream claimRecordExportDataQuery(TextbookClaimRecordExportDto dto);
 }

+ 4 - 2
src/main/java/com/xjrsoft/module/textbook/service/ITextbookSubscriptionService.java

@@ -6,6 +6,8 @@ import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.TextbookSubscription;
 import com.xjrsoft.module.textbook.vo.*;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.List;
 
@@ -61,7 +63,7 @@ public interface ITextbookSubscriptionService extends MPJBaseService<TextbookSub
      */
     Boolean instockroom(List<TextbookInstockroomDto> dtos);
 
-    String instockroomExcelImport(InputStream inputStream, Long textbookSubscriptionId);
+    String instockroomExcelImport(InputStream inputStream);
 
     /**
     * 更新
@@ -87,5 +89,5 @@ public interface ITextbookSubscriptionService extends MPJBaseService<TextbookSub
     */
     Boolean delete(List<Long> ids);
 
-    List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto);
+    ByteArrayOutputStream textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) throws IOException;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/textbook/service/ITextbookWarehouseRecordService.java

@@ -9,6 +9,7 @@ import com.xjrsoft.module.textbook.dto.UpdateDiscountDto;
 import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecord;
 import com.xjrsoft.module.textbook.vo.TextbookWarehouseRecordPageVo;
 
+import java.io.ByteArrayOutputStream;
 import java.util.List;
 
 /**
@@ -29,4 +30,6 @@ public interface ITextbookWarehouseRecordService extends MPJBaseService<Textbook
     List<TextbookWarehouseRecordPageVo> getList();
 
     Boolean updateDiscount(UpdateDiscountDto dto);
+
+    ByteArrayOutputStream exportDataQuery(TextbookWarehouseRecordExportDto dto);
 }

+ 244 - 9
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookIssueRecordServiceImpl.java

@@ -1,22 +1,25 @@
 package com.xjrsoft.module.textbook.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.ClaimTypeEnum;
 import com.xjrsoft.common.enums.RecedeTypeEnum;
 import com.xjrsoft.common.exception.MyException;
+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.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseGrade;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.XjrUser;
-import com.xjrsoft.module.textbook.dto.CanReturnTextbookListDto;
-import com.xjrsoft.module.textbook.dto.DistributeRecordPageDto;
-import com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto;
-import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
-import com.xjrsoft.module.textbook.entity.Textbook;
-import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
-import com.xjrsoft.module.textbook.entity.WfTextbookClaim;
+import com.xjrsoft.module.textbook.dto.*;
+import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.TextbookIssueRecordMapper;
 import com.xjrsoft.module.textbook.service.ITextbookIssueRecordService;
 import com.xjrsoft.module.textbook.vo.*;
@@ -26,6 +29,8 @@ import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.io.ByteArrayOutputStream;
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -42,8 +47,87 @@ import java.util.stream.Collectors;
 public class TextbookIssueRecordServiceImpl extends MPJBaseServiceImpl<TextbookIssueRecordMapper, TextbookIssueRecord> implements ITextbookIssueRecordService {
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
     @Override
-    public Page<TextbookIssueRecordPageVo> getPage(Page<TextbookIssueRecordPageDto> page, TextbookIssueRecordPageDto dto) {
-        return textbookIssueRecordMapper.getPage(page, dto);
+    public IPage<TextbookIssueRecordPageVo> getPage(Page<TextbookIssueRecordPageDto> page, TextbookIssueRecordPageDto dto) {
+        MPJLambdaWrapper<TextbookIssueRecord> textbookIssueRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookIssueRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(TextbookIssueRecord::getId)
+                .selectAs(TextbookWarehouseRecord::getPrice, TextbookIssueRecordPageVo::getPrice)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, TextbookIssueRecordPageVo::getSubtotal)
+                .select(TextbookIssueRecord.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordPageVo.class).contains(x.getProperty()))
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordPageVo.class).contains(x.getProperty()))
+                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookIssueRecord::getBaseSemesterId,
+                        wrapper -> wrapper
+                                .selectAs(BaseSemester::getName, TextbookIssueRecordPageVo::getBaseSemesterIdCn)
+                        )
+                .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId,
+                        wrapper -> wrapper
+                                .selectAs(TextbookWarehouseRecord::getOrderNumber, TextbookIssueRecordPageVo::getWarehouseOrderNumber)
+                                .eq(StringUtils.isNotEmpty(dto.getWarehouseMode()), TextbookWarehouseRecord::getWarehouseMode, dto.getWarehouseMode())
+                                .like(StringUtils.isNotEmpty(dto.getWarehouseOrderNumber()), TextbookWarehouseRecord::getOrderNumber, dto.getWarehouseOrderNumber())
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookIssueRecord::getIssueMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordPageVo::getIssueModeCn)
+                )
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
+                        wrapper -> wrapper
+                                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                                        wra -> wra
+                                                .selectAs(BaseCourseSubject::getName, TextbookIssueRecordPageVo::getCourseName)
+                                )
+                                .leftJoin(SubjectGroup.class, SubjectGroup::getId, Textbook::getSubjectGroupId,
+                                        wra -> wra
+                                                .selectAs(SubjectGroup::getGroupName, TextbookIssueRecordPageVo::getGroupName)
+                                                .like(StringUtils.isNotEmpty(dto.getGroupName()), SubjectGroup::getGroupName, dto.getGroupName())
+                                )
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordPageVo::getTextbookTypeCn)
+                                )
+                                .like(StringUtils.isNotEmpty(dto.getBookName()), Textbook::getBookName, dto.getBookName())
+                                .eq(StringUtils.isNotEmpty(dto.getIssn()), Textbook::getIssn, dto.getIssn())
+                                .eq(StringUtils.isNotEmpty(dto.getTextbookType()), Textbook::getTextbookType, dto.getTextbookType())
+                                .eq(ObjectUtils.isNotEmpty(dto.getUseType()), Textbook::getUseType, dto.getUseType())
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getReceiveUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordPageVo::getReceiveUserIdCn)
+                                .like(StringUtils.isNotEmpty(dto.getClaimUser()), XjrUser::getName, dto.getClaimUser())
+                )
+                .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId,
+                        wrapper -> wrapper
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordPageVo::getClaimTypeCn)
+                                )
+                                .leftJoin(BaseClass.class, BaseClass::getId, WfTextbookClaim::getClassId,
+                                        wra -> wra
+                                                .selectAs(BaseClass::getName, TextbookIssueRecordPageVo::getClassIdCn)
+                                                .eq(ObjectUtils.isNotEmpty(dto.getGradeId()), BaseClass::getGradeId, dto.getGradeId())
+                                )
+                                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId,
+                                        wra -> wra
+                                                .selectAs(BaseGrade::getName, TextbookIssueRecordPageVo::getGradeIdCn)
+                                )
+                                .eq(ObjectUtils.isNotEmpty(dto.getClassId()), WfTextbookClaim::getClassId, dto.getClassId())
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordPageVo::getIssueUserIdCn)
+                                .like(StringUtils.isNotEmpty(dto.getIssueName()), XjrUser::getName, dto.getIssueName())
+                )
+                .eq(ObjectUtils.isNotEmpty(dto.getBaseSemesterId()), TextbookIssueRecord::getBaseSemesterId, dto.getBaseSemesterId())
+                .eq(StringUtils.isNotEmpty(dto.getOrderNumber()), TextbookIssueRecord::getOrderNumber, dto.getOrderNumber())
+                .eq(StringUtils.isNotEmpty(dto.getIssueMode()), TextbookIssueRecord::getIssueMode, dto.getIssueMode())
+                .ge(ObjectUtils.isNotEmpty(dto.getStartCreateDate()), TextbookIssueRecord::getCreateDate, dto.getStartCreateDate())
+                .le(ObjectUtils.isNotEmpty(dto.getEndCreateDate()), TextbookIssueRecord::getCreateDate, dto.getEndCreateDate())
+                .gt(ObjectUtils.isNotEmpty(dto.getReturnState()) && dto.getReturnState() == 1, TextbookIssueRecord::getRecedeNumber, 0)
+                .eq(ObjectUtils.isNotEmpty(dto.getReturnState()) && dto.getReturnState() == 0, TextbookIssueRecord::getRecedeNumber, 0)
+                ;
+
+        return textbookIssueRecordMapper.selectJoinPage(ConventPage.getPage(dto), TextbookIssueRecordPageVo.class, textbookIssueRecordMPJLambdaWrapper);
+//        return textbookIssueRecordMapper.getPage(page, dto);
     }
 
     @Override
@@ -136,4 +220,155 @@ public class TextbookIssueRecordServiceImpl extends MPJBaseServiceImpl<TextbookI
     public List<TextbookIssueRecordPageVo> getList() {
         return getList(new TextbookIssueRecordExportDto());
     }
+
+    @Override
+    public ByteArrayOutputStream exportDataQuery(TextbookIssueRecordExportDto dto) {
+        MPJLambdaWrapper<TextbookIssueRecord> textbookIssueRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookIssueRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(TextbookIssueRecord::getId)
+                .selectAs(TextbookWarehouseRecord::getPrice, TextbookIssueRecordExcelVo::getPrice)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, TextbookIssueRecordExcelVo::getSubtotal)
+                .select(TextbookIssueRecord.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordExcelVo.class).contains(x.getProperty()))
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordExcelVo.class).contains(x.getProperty()))
+                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookIssueRecord::getBaseSemesterId,
+                        wrapper -> wrapper
+                                .selectAs(BaseSemester::getName, TextbookIssueRecordExcelVo::getBaseSemesterIdCn)
+                )
+                .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId,
+                        wrapper -> wrapper
+                                .selectAs(TextbookWarehouseRecord::getOrderNumber, TextbookIssueRecordExcelVo::getWarehouseOrderNumber)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookIssueRecord::getIssueMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getIssueModeCn)
+                )
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
+                        wrapper -> wrapper
+                                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                                        wra -> wra
+                                                .selectAs(BaseCourseSubject::getName, TextbookIssueRecordExcelVo::getCourseName)
+                                )
+                                .leftJoin(SubjectGroup.class, SubjectGroup::getId, Textbook::getSubjectGroupId,
+                                        wra -> wra
+                                                .selectAs(SubjectGroup::getGroupName, TextbookIssueRecordExcelVo::getGroupName)
+                                )
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getTextbookTypeCn)
+                                )
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getReceiveUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordExcelVo::getClaimUser)
+                )
+                .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId,
+                        wrapper -> wrapper
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getClaimTypeCn)
+                                )
+                                .leftJoin(BaseClass.class, BaseClass::getId, WfTextbookClaim::getClassId,
+                                        wra -> wra
+                                                .selectAs(BaseClass::getName, TextbookIssueRecordExcelVo::getClassIdCn)
+                                )
+                                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId,
+                                        wra -> wra
+                                                .selectAs(BaseGrade::getName, TextbookIssueRecordExcelVo::getGradeIdCn)
+                                )
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordExcelVo::getIssueUserIdCn)
+                )
+        ;
+
+        List<TextbookIssueRecordExcelVo> dataList = textbookIssueRecordMapper.selectJoinList(TextbookIssueRecordExcelVo.class, textbookIssueRecordMPJLambdaWrapper);
+
+        // 定义日期格式
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        for (TextbookIssueRecordExcelVo vo : dataList){
+            if(ObjectUtils.isNotEmpty(vo.getIsTextbookPlan()) && vo.getIsTextbookPlan() == 1){
+                vo.setIsTextbookPlanCn("是");
+            }else {
+                vo.setIsTextbookPlanCn("否");
+            }
+
+            if(ObjectUtils.isNotEmpty(vo.getCreateDate())){
+                vo.setCreateDateCn(sdf.format(vo.getCreateDate()));
+            }
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, TextbookIssueRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+        return bot;
+    }
+
+    @Override
+    public ByteArrayOutputStream claimRecordExportDataQuery(TextbookClaimRecordExportDto dto) {
+        MPJLambdaWrapper<TextbookIssueRecord> textbookIssueRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookIssueRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(TextbookIssueRecord::getId)
+                .selectAs(TextbookWarehouseRecord::getPrice, TextbookIssueRecordExcelVo::getPrice)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, TextbookIssueRecordExcelVo::getSubtotal)
+                .select(TextbookIssueRecord.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordExcelVo.class).contains(x.getProperty()))
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordExcelVo.class).contains(x.getProperty()))
+                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookIssueRecord::getBaseSemesterId,
+                        wrapper -> wrapper
+                                .selectAs(BaseSemester::getName, TextbookIssueRecordExcelVo::getBaseSemesterIdCn)
+                )
+                .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getId, TextbookIssueRecord::getTextbookWarehouseRecordId,
+                        wrapper -> wrapper
+                                .selectAs(TextbookWarehouseRecord::getOrderNumber, TextbookIssueRecordExcelVo::getWarehouseOrderNumber)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookIssueRecord::getIssueMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getIssueModeCn)
+                )
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId,
+                        wrapper -> wrapper
+                                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                                        wra -> wra
+                                                .selectAs(BaseCourseSubject::getName, TextbookIssueRecordExcelVo::getCourseName)
+                                )
+                                .leftJoin(SubjectGroup.class, SubjectGroup::getId, Textbook::getSubjectGroupId,
+                                        wra -> wra
+                                                .selectAs(SubjectGroup::getGroupName, TextbookIssueRecordExcelVo::getGroupName)
+                                )
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getTextbookTypeCn)
+                                )
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getReceiveUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordExcelVo::getClaimUser)
+                )
+                .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId,
+                        wrapper -> wrapper
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookIssueRecordExcelVo::getClaimTypeCn)
+                                )
+                                .leftJoin(BaseClass.class, BaseClass::getId, WfTextbookClaim::getClassId,
+                                        wra -> wra
+                                                .selectAs(BaseClass::getName, TextbookIssueRecordExcelVo::getClassIdCn)
+                                )
+                                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId,
+                                        wra -> wra
+                                                .selectAs(BaseGrade::getName, TextbookIssueRecordExcelVo::getGradeIdCn)
+                                )
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getIssueUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookIssueRecordExcelVo::getIssueUserIdCn)
+                )
+        ;
+
+        List<TextbookIssueRecordExcelVo> dataList = textbookIssueRecordMapper.selectJoinList(TextbookIssueRecordExcelVo.class, textbookIssueRecordMPJLambdaWrapper);
+
+        return null;
+    }
 }

+ 247 - 95
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java

@@ -3,7 +3,8 @@ package com.xjrsoft.module.textbook.service.impl;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.Entity;
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -11,16 +12,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.utils.LocalDateTimeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.attendance.vo.AttendanceStatisticsRecordVo;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseSemester;
-import com.xjrsoft.module.student.entity.BaseClassMajorSet;
+import com.xjrsoft.module.generator.constant.ComponentTypeConstant;
+import com.xjrsoft.module.generator.entity.ColumnConfig;
+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.textbook.dto.*;
@@ -28,17 +37,27 @@ import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.ITextbookSubscriptionService;
 import com.xjrsoft.module.textbook.vo.*;
+import com.xjrsoft.module.veb.util.ImportExcelUtil;
+import com.xjrsoft.module.veb.vo.InternshipPlanImportVo;
 import lombok.AllArgsConstructor;
+import oracle.sql.INTERVALDS;
 import org.apache.commons.lang3.ObjectUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.*;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
 import java.io.InputStream;
 import java.math.BigDecimal;
-import java.math.RoundingMode;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.ZoneId;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
@@ -469,7 +488,7 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
         // 获取当前征订已经产生的入库记录
         LambdaQueryWrapper<TextbookWarehouseRecord> textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
         textbookWarehouseRecordLambdaQueryWrapper
-                .in(TextbookWarehouseRecord::getDataId, textbookSubscription.getId())
+                .eq(TextbookWarehouseRecord::getDataId, textbookSubscription.getId())
                 .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
                 ;
         List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper);
@@ -584,73 +603,163 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public String instockroomExcelImport(InputStream inputStream, Long textbookSubscriptionId) {
-        AtomicReference<Map<String, Object>> atomicMap = new AtomicReference<>(new HashMap<>());
-        List<Map<Integer, Object>> excalDataList = EasyExcel.read(inputStream).sheet().headRowNumber(1).doReadSync();
-        String regex = "\\d+";
-        Pattern pattern = Pattern.compile(regex);
-        List<TextbookInstockroomImportDto> dataList = new ArrayList<>();
-        for (Map<Integer, Object> integerObjectMap : excalDataList) {
-            Matcher matcher = pattern.matcher(integerObjectMap.get(11).toString());
-            int inNum = 0;
-            if (matcher.find()) {
-                inNum = Integer.parseInt(integerObjectMap.get(11).toString());
-            }
-            TextbookInstockroomImportDto importDto = new TextbookInstockroomImportDto();
-            importDto.setInNum(inNum);
-            importDto.setIssn(integerObjectMap.get(2).toString());
-            dataList.add(importDto);
-        }
+    public String instockroomExcelImport(InputStream inputStream) {
+        List<TextbookSubscriptionExportQueryListVo> excelDataList = EasyExcel.read(inputStream).headRowNumber(3).head(TextbookSubscriptionExportQueryListVo.class).sheet().doReadSync();
+
+        List<Long> idList = excelDataList.stream()
+                .map(t -> Long.parseLong(t.getTextbookSubscriptionItemId()))
+                .collect(Collectors.toList());
 
         //获取需要修改的list
-        MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
+        LambdaQueryWrapper<TextbookSubscriptionItem> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper
-                .select(TextbookSubscriptionItem::getId)
-                .selectAs(Textbook::getIssn, TextbookSubscriptionItemVo::getIssn)
-                .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionItemVo.class).contains(x.getProperty()))
-                .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
-                .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, textbookSubscriptionId)
+                .in(TextbookSubscriptionItem::getId, idList)
                 .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
         ;
-        List<TextbookSubscriptionItemVo> textbookSubscriptionItemVos = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionItemVo.class, queryWrapper);
+        List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(queryWrapper);
+        if (ObjectUtils.isEmpty(textbookSubscriptionItemList)) {
+            throw new MyException("征订数据被修改,请刷新重试");
+        }
+        Map<Long, TextbookSubscriptionItem> byIdMap = textbookSubscriptionItemList.stream()
+                .collect(Collectors.toMap(TextbookSubscriptionItem::getId, t -> t, (t1, t2) -> t1));
 
-        if (textbookSubscriptionItemVos.isEmpty()) {
-            return null;
+        TextbookSubscription textbookSubscription = this.getById(textbookSubscriptionItemList.get(0).getTextbookSubscriptionId());
+        if (ObjectUtils.isEmpty(textbookSubscription)) {
+            throw new MyException("需要入库对应的征订记录失效");
         }
 
-        Map<String, TextbookSubscriptionItemVo> itemByIssnMap = new HashMap<>();
-        for (TextbookSubscriptionItemVo el : textbookSubscriptionItemVos) {
-            itemByIssnMap.put(el.getIssn(), el);
+        // 获取当前征订已经产生的入库记录
+        LambdaQueryWrapper<TextbookWarehouseRecord> textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        textbookWarehouseRecordLambdaQueryWrapper
+                .in(TextbookWarehouseRecord::getDataItemId, idList)
+                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ;
+        List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper);
+
+        Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordByItemIdMap = textbookWarehouseRecords.stream()
+                .collect(Collectors.toMap(TextbookWarehouseRecord::getDataItemId, t -> t, (t1, t2) -> t2));
+
+        // 处理入库单号
+        StringBuilder sb = new StringBuilder();
+        sb.append("RK");
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String nowStr = now.format(dateTimeFormatter);
+        sb.append(nowStr);
+        // 根据当前征订编号前缀去数据库找是否已经存在了
+        LambdaQueryWrapper<TextbookWarehouseRecord> maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        maxOrderNumberLambdaQueryWrapper
+                .like(TextbookWarehouseRecord::getOrderNumber, sb.toString() + "%")
+                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .orderByDesc(TextbookWarehouseRecord::getOrderNumber)
+                .last("limit 1")
+        ;
+        TextbookWarehouseRecord maxOrderNumber = textbookWarehouseRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper);
+        int oldOrderInteger = 0;
+        if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){
+            String oldOrderNumber = maxOrderNumber.getOrderNumber();
+            String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
+            oldOrderInteger = Integer.parseInt(oldOrder);
         }
 
         int successNum = 0;
         int instockroomNum = 0;
-        for (TextbookInstockroomImportDto item : dataList) {
-            if (StringUtils.isBlank(item.getIssn())) {
-                continue;
+
+        // 处理入库细节
+        TextbookSubscriptionItem oldItem;
+        TextbookSubscriptionItem updateItem;
+        TextbookWarehouseRecord oldTextbookWarehouseRecord;
+        TextbookWarehouseRecord textbookWarehouseRecord;
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
+        Date nowDate = new Date();
+        Long loginId = StpUtil.getLoginIdAsLong();
+        for (int i = 0; i < excelDataList.size(); i++){
+            TextbookSubscriptionExportQueryListVo vo = excelDataList.get(i);
+            if(ObjectUtils.isEmpty(vo)){
+                throw new MyException("第" + (i + 4) + "行数据写入失败,请刷新重试");
             }
-            TextbookSubscriptionItemVo old = itemByIssnMap.get(item.getIssn());
-            if (old == null) {
+
+            if(ObjectUtils.isEmpty(vo.getInNum()) || vo.getInNum() <= 0){
                 continue;
             }
 
-            TextbookSubscriptionItem updateItem = new TextbookSubscriptionItem();
-            updateItem.setId(old.getId());
-            updateItem.setInStockNum(old.getInStockNum() + item.getInNum());
+            if(StringUtils.isEmpty(vo.getTextbookSubscriptionItemId())){
+                throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板");
+            }
+
+            oldItem = byIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId()));
+
+            if(ObjectUtils.isEmpty(oldItem)){
+                throw new MyException("第" + (i + 4) + "行数据主键被修改,请重新下载模板");
+            }
+
+            oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(Long.parseLong(vo.getTextbookSubscriptionItemId()));
+
+            updateItem = new TextbookSubscriptionItem();
+            updateItem.setId(oldItem.getId());
+            if(ObjectUtils.isEmpty(oldItem.getInStockNum()) || oldItem.getInStockNum() <= 0){
+                updateItem.setDiscount(vo.getDiscount());
+                updateItem.setPrice(vo.getPrice().multiply(BigDecimal.valueOf(vo.getDiscount() / 10)));
+            }
+            updateItem.setInStockNum(oldItem.getInStockNum() + vo.getInNum());
+            updateItem.setModifyDate(nowDate);
+            updateItem.setModifyUserId(loginId);
             textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem);
 
-            //新增入库记录
-            TextbookWarehouseRecord textbookWarehouseRecord = new TextbookWarehouseRecord();
-            textbookWarehouseRecord.setTextbookId(old.getTextbookId());
-            textbookWarehouseRecord.setDataId(textbookSubscriptionId);
-            textbookWarehouseRecord.setDataItemId(old.getId());
-            textbookWarehouseRecord.setWarehouseNumber(item.getInNum());
-            textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmManual.getCode());
-            textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
-            successNum++;
-            successNum += item.getInNum();
+            // 判断当前征订中的当前教材是否已经有了入库记录
+            // 当前征订项第一次入库
+            long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId();
+            if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) {
+                //新增入库记录
+                textbookWarehouseRecord = new TextbookWarehouseRecord();
+                textbookWarehouseRecord.setId(textbookWarehouseRecordId);
+                textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId());
+                textbookWarehouseRecord.setTextbookId(oldItem.getTextbookId());
+                textbookWarehouseRecord.setDataId(oldItem.getTextbookSubscriptionId());
+                textbookWarehouseRecord.setDataItemId(oldItem.getId());
+                textbookWarehouseRecord.setWarehouseNumber(ObjectUtils.isNotEmpty(vo.getInNum()) ? vo.getInNum() : 0);
+                textbookWarehouseRecord.setPrice(ObjectUtils.isNotEmpty(oldItem.getPrice()) ? oldItem.getPrice() : BigDecimal.ZERO);
+                textbookWarehouseRecord.setDiscount(ObjectUtils.isNotEmpty(updateItem.getDiscount()) ? updateItem.getDiscount() : oldItem.getDiscount());
+                textbookWarehouseRecord.setSubtotal(textbookWarehouseRecord.getPrice().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getDiscount() / 10)));
+                textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
+                oldOrderInteger += 1;
+                String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+                textbookWarehouseRecord.setOrderNumber(sb + newOrder);
+                textbookWarehouseRecord.setReturnBookstoreNumber(0);
+                textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber());
+                textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
+                textbookWarehouseRecord.setIssuedNumber(0);
+                textbookWarehouseRecord.setRecedeNumber(0);
+                textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber());
+                textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
+                textbookWarehouseRecord.setCreateDate(nowDate);
+                textbookWarehouseRecord.setCreateUserId(loginId);
+                textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
+            }else {
+                textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId();
+                textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class);
+                textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + vo.getInNum());
+                textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
+                textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + vo.getInNum());
+                textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
+                textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + vo.getInNum());
+                textbookWarehouseRecord.setModifyDate(nowDate);
+                textbookWarehouseRecord.setModifyUserId(loginId);
+                textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord);
+            }
+
+            // 新增教材入库记录详细入库记录
+            textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
+            textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
+            textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
+            textbookWarehouseRecordDetail.setWarehouseNumber(vo.getInNum());
+            textbookWarehouseRecordDetail.setCreateDate(nowDate);
+            textbookWarehouseRecordDetail.setCreateUserId(loginId);
+            textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
+            successNum += 1;
+            instockroomNum += vo.getInNum();
         }
-        return "成功入库" + successNum + "样,成功入库" + successNum + "本";
+        return "成功入库" + successNum + "样,成功入库" + instockroomNum + "本";
     }
 
     @Override
@@ -887,59 +996,102 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
     }
 
     @Override
-    public List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) {
-        TextbookSubscription textbookSubscription = this.getById(dto.getTextbookSubscriptionId());
-        if (textbookSubscription == null) {
-            return null;
-        }
-
-        MPJLambdaWrapper<TextbookSubscriptionItem> textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
-        textbookSubscriptionItemMPJLambdaWrapper
-                .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
+    public ByteArrayOutputStream textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) throws IOException {
+        MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .disableSubLogicDel()
+                .selectAs(TextbookSubscriptionItem::getId, TextbookSubscriptionExportQueryListVo::getTextbookSubscriptionItemId)
+                .selectAs(Textbook::getPrice, TextbookSubscriptionExportQueryListVo::getPrice)
+                .selectAs(TextbookSubscriptionItem::getDiscount, TextbookSubscriptionExportQueryListVo::getDiscount)
                 .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookSubscriptionExportQueryListVo::getStudentSubscriptionNumber)
                 .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookSubscriptionExportQueryListVo::getTeacherSubscriptionNumber)
-                .selectAs(TextbookSubscriptionItem::getInStockNum, TextbookSubscriptionExportQueryListVo::getInStockroomNum)
-                .selectAs(TextbookSubscription::getBaseClassIds, TextbookSubscriptionExportQueryListVo::getClassIds)
-                .select("t.student_num + t.teacher_num as subscription_sum")
-                .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
                 .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
-                .leftJoin(TextbookSubscription.class, TextbookSubscription::getId, TextbookSubscriptionItem::getTextbookSubscriptionId)
+                .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
                 .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                        wrapper -> wrapper
+                                .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
+                )
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
-                        ext -> ext.selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn))
-                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
-                .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, textbookSubscription.getId())
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn)
+                )
+                .eq(TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getTextbookSubscriptionId())
+                .orderByAsc(TextbookSubscriptionItem::getInStockNum)
         ;
-        List<TextbookSubscriptionExportQueryListVo> itemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, textbookSubscriptionItemMPJLambdaWrapper);
 
-        //处理班级
-        String classIds = "";
-        List<String> classIdList = new ArrayList<>();
-        StringBuilder sb = new StringBuilder();
-        if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
-            classIds = itemList.get(0).getClassIds();
-            String[] classIdArr = classIds.split(",");
-            classIdList = Arrays.asList(classIdArr);
-            /*if(!classIdList.isEmpty()){
-                List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
-                Map<Long, BaseClass> baseClassMap = baseClassList.stream()
-                        .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
-
-                for (String classId : classIdList){
-                    BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
-                    if(baseClass != null){
-                        sb.append(baseClass.getName());
-                        sb.append(",");
-                    }
-                }
-                sb.deleteCharAt(sb.length() - 1);
-            }*/
+        List<TextbookSubscriptionExportQueryListVo> vos = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, queryWrapper);
+
+
+        List<List<String>> dataList = new ArrayList<>();
+        for (TextbookSubscriptionExportQueryListVo vo : vos) {
+            List<String> data = new ArrayList<>();
+            data.add(vo.getTextbookSubscriptionItemId());
+            data.add(vo.getCourseName());
+            data.add(vo.getBookName());
+            data.add(vo.getIssn());
+            data.add(vo.getEditorInChief());
+            data.add(vo.getPublishingHouse());
+            data.add(vo.getTextbookTypeCn());
+            data.add(vo.getVersion());
+            data.add(vo.getUseType() + "");
+            data.add(vo.getStudentSubscriptionNumber() + "");
+            data.add(vo.getTeacherSubscriptionNumber() + "");
+            data.add(vo.getInStockNum() + "");
+            data.add(vo.getPrice() + "");
+            data.add(vo.getDiscount() + "");
+            dataList.add(data);
+        }
+
+        // 开始写入
+        Workbook workbook = new XSSFWorkbook();
+        // 创建一个工作表(sheet)
+        String sheetName = "sheet1";
+        Sheet sheet = workbook.createSheet(sheetName);
+
+        List<ImportConfig> importConfigs = ImportExcelUtil.allFields(new TextbookSubscriptionExportQueryListVo());
+
+        // 写大标题
+        ImportExcelUtil.createBigHead(workbook, sheet, "教材入库导入模板", 0, importConfigs.size() - 1);
+
+        // 提示必填
+        String cautionHead = "说明:教材的基础信息不能修改,请输入实际折扣和入库数量,然后直接导入当前excel";
+        ImportExcelUtil.createCautionHead(workbook, sheet, 1, cautionHead, importConfigs.size() - 1, 12);
+
+        // 表头
+        ImportExcelUtil.createHead(workbook, sheet, importConfigs, 2);
+
+        //生成数据
+        int dataRowNumber = 3;
+
+        // 字体内容格式
+        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.LEFT);
+
+        for (List<String> rowData : dataList) {
+            Row dataRow = sheet.createRow(dataRowNumber);
+            for (int i = 0; i < rowData.size(); i ++){
+                String content = rowData.get(i);
+
+                Cell cell = dataRow.createCell(i);
+                cell.setCellValue(content);
+                cell.setCellStyle(cellStyle);
+            }
+            dataRowNumber ++;
         }
 
-        for (TextbookSubscriptionExportQueryListVo w : itemList) {
-            w.setClassNum(classIdList.size());
+        for (int i = 0; i < importConfigs.size(); i++){
+            sheet.autoSizeColumn(i);
         }
 
-        return itemList;
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        workbook.write(bot);
+        return bot;
     }
 }

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

@@ -3,6 +3,8 @@ package com.xjrsoft.module.textbook.service.impl;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
+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.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -25,6 +27,7 @@ import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordService;
 import com.xjrsoft.module.textbook.vo.SubscriptionItemListDistributeVo;
 import com.xjrsoft.module.textbook.vo.TextbookSubscriptionPageVo;
+import com.xjrsoft.module.textbook.vo.TextbookWarehouseRecordExcelVo;
 import com.xjrsoft.module.textbook.vo.TextbookWarehouseRecordPageVo;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
@@ -32,7 +35,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.io.ByteArrayOutputStream;
 import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
@@ -236,4 +241,62 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
 
         return true;
     }
+
+    @Override
+    public ByteArrayOutputStream exportDataQuery(TextbookWarehouseRecordExportDto dto) {
+        MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookWarehouseRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(TextbookWarehouseRecord.class, x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordExcelVo.class).contains(x.getProperty()))
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordExcelVo.class).contains(x.getProperty()))
+                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookWarehouseRecord::getBaseSemesterId,
+                        wrapper -> wrapper
+                                .selectAs(BaseSemester::getName, TextbookWarehouseRecordExcelVo::getBaseSemesterIdCn)
+                        )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecord::getWarehouseMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookWarehouseRecordExcelVo::getWarehouseModeCn)
+                )
+                .leftJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId,
+                        wrapper -> wrapper
+                                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                                        wra -> wra
+                                                .selectAs(DictionaryDetail::getName, TextbookWarehouseRecordExcelVo::getTextbookTypeCn)
+                                )
+                                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                                        wra -> wra
+                                                .selectAs(BaseCourseSubject::getName, TextbookWarehouseRecordExcelVo::getCourseName)
+                                )
+                                .leftJoin(SubjectGroup.class, SubjectGroup::getId, Textbook::getSubjectGroupId,
+                                        wra -> wra
+                                                .selectAs(SubjectGroup::getGroupName, TextbookWarehouseRecordExcelVo::getGroupName)
+                                )
+                )
+                .leftJoin(XjrUser.class, XjrUser::getCode, TextbookWarehouseRecord::getCreateUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookWarehouseRecordExcelVo::getWarehouseUser)
+                )
+                .in(ObjectUtils.isNotEmpty(dto.getIds()), TextbookWarehouseRecord::getId, dto.getIds())
+                ;
+
+        List<TextbookWarehouseRecordExcelVo> dataList = textbookWarehouseRecordMapper.selectJoinList(TextbookWarehouseRecordExcelVo.class, textbookWarehouseRecordMPJLambdaWrapper);
+        // 定义日期格式
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+        for (TextbookWarehouseRecordExcelVo vo : dataList){
+            if(ObjectUtils.isNotEmpty(vo.getIsTextbookPlan()) && vo.getIsTextbookPlan() == 1){
+                vo.setIsTextbookPlanCn("是");
+            }else {
+                vo.setIsTextbookPlanCn("否");
+            }
+
+            if(ObjectUtils.isNotEmpty(vo.getCreateDate())){
+                vo.setCreateDateCn(sdf.format(vo.getCreateDate()));
+            }
+        }
+
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, TextbookWarehouseRecordExcelVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(dataList);
+        return bot;
+    }
 }

+ 48 - 60
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookSubscriptionServiceImpl.java

@@ -13,14 +13,7 @@ import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
-import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
-import com.xjrsoft.module.textbook.dto.TextbookInstockroomDto;
-import com.xjrsoft.module.textbook.dto.TextbookInstockroomImportDto;
-import com.xjrsoft.module.textbook.dto.TextbookInstockroomListDto;
-import com.xjrsoft.module.textbook.dto.TextbookSubscriptionExportQueryListDto;
-import com.xjrsoft.module.textbook.dto.UpdateWfTextbookSubscriptionDto;
-import com.xjrsoft.module.textbook.dto.UpdateWfTextbookSubscriptionItemDto;
-import com.xjrsoft.module.textbook.dto.WfTextbookSubscriptionDto;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.ITextbookService;
@@ -36,13 +29,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -284,51 +271,52 @@ public class WfTextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<WfText
 
     @Override
     public List<TextbookSubscriptionExportQueryListVo> textbookSubscriptionExportQuery(TextbookSubscriptionExportQueryListDto dto) {
-        WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getTextbookSubscriptionId());
-        if (wfTextbookSubscription == null) {
-            return null;
-        }
-
-        MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
-        mpjLambdaWrapper
-                .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
-                .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
-                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
-                .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
-                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
-                        ext -> ext.selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn))
-                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
-                .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId())
-        ;
-        List<TextbookSubscriptionExportQueryListVo> itemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, mpjLambdaWrapper);
-
-        //处理班级
-        String classIds = "";
-        List<String> classIdList = new ArrayList<>();
-        StringBuilder sb = new StringBuilder();
-        if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
-            classIds = itemList.get(0).getClassIds();
-            String[] classIdArr = classIds.split(",");
-            classIdList = Arrays.asList(classIdArr);
-            /*if(!classIdList.isEmpty()){
-                List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
-                Map<Long, BaseClass> baseClassMap = baseClassList.stream()
-                        .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
-
-                for (String classId : classIdList){
-                    BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
-                    if(baseClass != null){
-                        sb.append(baseClass.getName());
-                        sb.append(",");
-                    }
-                }
-                sb.deleteCharAt(sb.length() - 1);
-            }*/
-        }
-
-        for (TextbookSubscriptionExportQueryListVo w : itemList) {
-            w.setClassNum(classIdList.size());
-        }
+        List<TextbookSubscriptionExportQueryListVo> itemList = new ArrayList<>();
+//        WfTextbookSubscription wfTextbookSubscription = this.getById(dto.getTextbookSubscriptionId());
+//        if (wfTextbookSubscription == null) {
+//            return null;
+//        }
+//
+//        MPJLambdaWrapper<WfTextbookSubscriptionItem> mpjLambdaWrapper = new MPJLambdaWrapper<>();
+//        mpjLambdaWrapper
+//                .selectAs(BaseCourseSubject::getName, TextbookSubscriptionExportQueryListVo::getCourseName)
+//                .select(WfTextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
+//                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionExportQueryListVo.class).contains(x.getProperty()))
+//                .leftJoin(Textbook.class, Textbook::getId, WfTextbookSubscriptionItem::getTextbookId)
+//                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+//                        ext -> ext.selectAs(DictionaryDetail::getName, TextbookSubscriptionExportQueryListVo::getTextbookTypeCn))
+//                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId)
+//                .eq(WfTextbookSubscriptionItem::getWfTextbookSubscriptionId, wfTextbookSubscription.getId())
+//        ;
+//        List<TextbookSubscriptionExportQueryListVo> itemList = wfTextbookSubscriptionWfTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionExportQueryListVo.class, mpjLambdaWrapper);
+//
+//        //处理班级
+//        String classIds = "";
+//        List<String> classIdList = new ArrayList<>();
+//        StringBuilder sb = new StringBuilder();
+//        if (!itemList.isEmpty() && itemList.get(0).getClassIds() != null && !itemList.get(0).getClassIds().equals("")) {
+//            classIds = itemList.get(0).getClassIds();
+//            String[] classIdArr = classIds.split(",");
+//            classIdList = Arrays.asList(classIdArr);
+//            /*if(!classIdList.isEmpty()){
+//                List<BaseClass> baseClassList = baseClassMapper.selectList(Wrappers.<BaseClass>query().lambda().in(BaseClass::getId, classIdList));
+//                Map<Long, BaseClass> baseClassMap = baseClassList.stream()
+//                        .collect(Collectors.toMap(BaseClass::getId, baseClass -> baseClass));
+//
+//                for (String classId : classIdList){
+//                    BaseClass baseClass = baseClassMap.get(Long.parseLong(classId));
+//                    if(baseClass != null){
+//                        sb.append(baseClass.getName());
+//                        sb.append(",");
+//                    }
+//                }
+//                sb.deleteCharAt(sb.length() - 1);
+//            }*/
+//        }
+//
+//        for (TextbookSubscriptionExportQueryListVo w : itemList) {
+//            w.setClassNum(classIdList.size());
+//        }
 
         return itemList;
     }

+ 155 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookClaimRecordExportVo.java

@@ -0,0 +1,155 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 教材出库记录分页列表出参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class TextbookClaimRecordExportVo {
+
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("学期")
+//    @ApiModelProperty("学期")
+//    public String baseSemesterIdCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出库单号")
+//    @ApiModelProperty("出库单号")
+//    public String orderNumber;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("入库单号")
+//    @ApiModelProperty("入库单号")
+//    public String warehouseOrderNumber;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出库方式")
+//    @ApiModelProperty("出库方式")
+//    private String issueModeCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("书号")
+//    @ApiModelProperty("书号")
+//    private String issn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("书名")
+//    @ApiModelProperty("书名")
+//    private String bookName;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出版社")
+//    @ApiModelProperty("出版社")
+//    private String publishingHouse;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("作者(主编)")
+//    @ApiModelProperty("作者(主编)")
+//    private String editorInChief;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("学科组")
+//    @ApiModelProperty("学科组")
+//    private String groupName;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("对应课程")
+//    @ApiModelProperty("对应课程")
+//    private String courseName;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("教材类型")
+//    @ApiModelProperty("类型")
+//    private String textbookTypeCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelIgnore
+//    @ApiModelProperty("是否为规划教材")
+//    private Integer isTextbookPlan;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("规划教材")
+//    @ApiModelProperty("是否为规划教材")
+//    private String isTextbookPlanCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("使用时长(单位:学期)")
+//    @ApiModelProperty("使用类型(单位:学期)")
+//    private Integer useType;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("定价(元)")
+//    @ApiModelProperty("定价(元)")
+//    private BigDecimal price;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("实际价格(元)")
+//    @ApiModelProperty("实际价格(元)")
+//    private BigDecimal subtotal;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelIgnore
+//    @ApiModelProperty("出库时间")
+//    private Date createDate;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出库时间")
+//    @ApiModelProperty("出库时间")
+//    private String createDateCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("领取类型")
+//    @ApiModelProperty("领取类型")
+//    private String claimTypeCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("领取人员")
+//    @ApiModelProperty("领取人员")
+//    private String claimUser;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("年级主键")
+//    @ApiModelProperty("年级主键")
+//    private String gradeIdCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("班级主键")
+//    @ApiModelProperty("班级主键")
+//    private String classIdCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出库用户编号")
+//    @ApiModelProperty("出库用户编号")
+//    private String issueUserIdCn;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("出库数量")
+//    @ApiModelProperty("出库数量")
+//    private Integer issueNumber;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("领取后退书数量")
+//    @ApiModelProperty("领取后退书数量")
+//    private Integer recedeNumber;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("实际出库数量")
+//    @ApiModelProperty("实际出库数量")
+//    private Integer actualIssueNumber;
+//
+//    @ContentStyle(dataFormat = 49)
+//    @ExcelProperty("实际出库总金额")
+//    @ApiModelProperty("实际出库总金额")
+//    private BigDecimal actualTotalPrice;
+}

+ 83 - 21
src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordExcelVo.java

@@ -1,10 +1,14 @@
 package com.xjrsoft.module.textbook.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
 * @title: 教材出库记录分页列表出参
 * @Author szs
@@ -15,10 +19,24 @@ import lombok.Data;
 public class TextbookIssueRecordExcelVo {
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("序号")
-    @ApiModelProperty("序号")
-    private Integer sortCode;
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    public String baseSemesterIdCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库单号")
+    @ApiModelProperty("出库单号")
+    public String orderNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库单号")
+    @ApiModelProperty("入库单号")
+    public String warehouseOrderNumber;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库方式")
+    @ApiModelProperty("出库方式")
+    private String issueModeCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("书号")
@@ -45,49 +63,93 @@ public class TextbookIssueRecordExcelVo {
     @ApiModelProperty("学科组")
     private String groupName;
 
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用年级")
-    @ApiModelProperty("使用年级")
-    private String gradeName;
-
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用班级")
-    @ApiModelProperty("使用班级")
-    private String className;
-
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("对应课程")
     @ApiModelProperty("对应课程")
     private String courseName;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("类型")
+    @ExcelProperty("教材类型")
     @ApiModelProperty("类型")
     private String textbookTypeCn;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("规格型号")
-    @ApiModelProperty("规格型号")
-    private String specificationsModels;
+    @ExcelIgnore
+    @ApiModelProperty("是否为规划教材")
+    private Integer isTextbookPlan;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("出库方式")
-    @ApiModelProperty("出库方式")
-    private String issueModeCn;
+    @ExcelProperty("规划教材")
+    @ApiModelProperty("是否为规划教材")
+    private String isTextbookPlanCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("使用时长(单位:学期)")
+    @ApiModelProperty("使用类型(单位:学期)")
+    private Integer useType;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("定价(元)")
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际价格(元)")
+    @ApiModelProperty("实际价格(元)")
+    private BigDecimal subtotal;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelIgnore
+    @ApiModelProperty("出库时间")
+    private Date createDate;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("出库时间")
     @ApiModelProperty("出库时间")
-    private String createDateStr;
+    private String createDateCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("领取类型")
+    @ApiModelProperty("领取类型")
+    private String claimTypeCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("领取人员")
     @ApiModelProperty("领取人员")
     private String claimUser;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("年级主键")
+    @ApiModelProperty("年级主键")
+    private String gradeIdCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级主键")
+    @ApiModelProperty("班级主键")
+    private String classIdCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库用户编号")
+    @ApiModelProperty("出库用户编号")
+    private String issueUserIdCn;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("出库数量")
     @ApiModelProperty("出库数量")
     private Integer issueNumber;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("领取后退书数量")
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际出库数量")
+    @ApiModelProperty("实际出库数量")
+    private Integer actualIssueNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际出库总金额")
+    @ApiModelProperty("实际出库总金额")
+    private BigDecimal actualTotalPrice;
 }

+ 67 - 25
src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordPageVo.java

@@ -18,25 +18,36 @@ import java.util.Date;
 @Data
 public class TextbookIssueRecordPageVo {
 
-    /**
-    * 主键编号
-    */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("主键编号")
-    @ApiModelProperty("主键编号")
-    private String id;
+    @ExcelProperty("主键")
+    @ApiModelProperty("主键")
+    public Long id;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    public Long baseSemesterId;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("学期")
     @ApiModelProperty("学期")
     public String baseSemesterIdCn;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库单号")
     @ApiModelProperty("出库单号")
     public String orderNumber;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库单号")
     @ApiModelProperty("入库单号")
     public String warehouseOrderNumber;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库方式")
+    @ApiModelProperty("出库方式")
+    private String issueModeCn;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("书号")
     @ApiModelProperty("书号")
@@ -68,19 +79,32 @@ public class TextbookIssueRecordPageVo {
     private String courseName;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("类型")
+    @ExcelProperty("教材类型")
     @ApiModelProperty("类型")
     private String textbookTypeCn;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("规格型号")
-    @ApiModelProperty("规格型号")
-    private String specificationsModels;
+    @ExcelIgnore
+    @ApiModelProperty("是否为规划教材")
+    private Integer isTextbookPlan;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("使用时长(单位:学期)")
+    @ApiModelProperty("使用类型(单位:学期)")
+    private Integer useType;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("出库方式")
-    @ApiModelProperty("出库方式")
-    private String issueModeCn;
+    @ExcelProperty("定价(元)")
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际价格(元)")
+    @ApiModelProperty("实际价格(元)")
+    private BigDecimal subtotal;
+
+    @ApiModelProperty("领取用户编号")
+    private String receiveUserIdCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelIgnore
@@ -88,29 +112,47 @@ public class TextbookIssueRecordPageVo {
     private Date createDate;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("出库时间")
-    @ApiModelProperty("出库时间")
-    private String createDateStr;
+    @ExcelProperty("领取类型")
+    @ApiModelProperty("领取类型")
+    private String claimTypeCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("领取人员")
     @ApiModelProperty("领取人员")
     private String claimUser;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("年级主键")
+    @ApiModelProperty("年级主键")
+    private String gradeIdCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级主键")
+    @ApiModelProperty("班级主键")
+    private String classIdCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("出库用户编号")
+    @ApiModelProperty("出库用户编号")
+    private String issueUserIdCn;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("出库数量")
     @ApiModelProperty("出库数量")
     private Integer issueNumber;
 
-    @ApiModelProperty("定价(元)")
-    private BigDecimal price;
-
-    @ApiModelProperty("实际价格(元)")
-    private BigDecimal subtotal;
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("领取后退书数量")
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
 
-    @ApiModelProperty("班级主键")
-    private String classIdCn;
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际出库数量")
+    @ApiModelProperty("实际出库数量")
+    private Integer actualIssueNumber;
 
-    @ApiModelProperty("年级主键")
-    private String gradeIdCn;
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际出库总金额")
+    @ApiModelProperty("实际出库总金额")
+    private BigDecimal actualTotalPrice;
 }

+ 43 - 58
src/main/java/com/xjrsoft/module/textbook/vo/TextbookSubscriptionExportQueryListVo.java

@@ -1,11 +1,13 @@
 package com.xjrsoft.module.textbook.vo;
 
-import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.annotation.Required;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 /**
 * @title: 教材教辅征订项表单出参
 * @Author szs
@@ -14,97 +16,80 @@ import lombok.Data;
 */
 @Data
 public class TextbookSubscriptionExportQueryListVo {
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键")
+    @ApiModelProperty("征订项编号")
+    private String textbookSubscriptionItemId;
 
-    /**
-     * 课程
-     */
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("课程名称")
     @ApiModelProperty("课程")
     private String courseName;
-    /**
-     * 书名
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("教材书名")
     @ApiModelProperty("书名")
     private String bookName;
-    /**
-     * 国际标准刊号
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("书号(ISSN)")
     @ApiModelProperty("国际标准刊号")
     private String issn;
-    /**
-     * 出版社
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("出版社")
-    @ApiModelProperty("出版社")
-    private String publishingHouse;
-    /**
-     * 主编
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("作者(主编)")
     @ApiModelProperty("主编")
     private String editorInChief;
-    /**
-     * 教材类型(xjr_dictionary_item[textbook_type])
-     */
+
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("类型")
+    @ExcelProperty("出版社")
+    @ApiModelProperty("出版社")
+    private String publishingHouse;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材类型")
     @ApiModelProperty("教材类型")
     private String textbookTypeCn;
 
-    /**
-     * 学生用书征订数量
-     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("版次")
+    @ApiModelProperty("版次")
+    private String version;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("使用学期(单位:学期)")
+    @ApiModelProperty("使用学期(单位:学期)")
+    private Integer useType;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("学生用书征订数量")
     @ApiModelProperty("学生用书征订数量")
     private Integer studentSubscriptionNumber;
-    /**
-     * 教师教材征订数量
-     */
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("教师教材征订数量")
     @ApiModelProperty("教师教材征订数量")
     private Integer teacherSubscriptionNumber;
-    /**
-     * 使用班级数
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelIgnore
-    @ApiModelProperty("使用班级")
-    private String classIds;
-    /**
-     * 使用班级数
-     */
+
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用班级数量")
-    @ApiModelProperty("使用班级数")
-    private Integer classNum;
-    /**
-     * 教师教材征订数量
-     */
+    @ExcelProperty("已经入库数量")
+    @ApiModelProperty("已经入库数量")
+    private Integer inStockNum;
+
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("征订总数量")
-    @ApiModelProperty("征订总数量")
-    private Integer subscriptionSum;
-    /**
-     * 已入库数量
-     */
+    @ExcelProperty("定价(元)")
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("已入库数量")
-    @ApiModelProperty("已入库数量")
-    private Integer inStockroomNum;
-    /**
-     * 本次入库数量
-     */
+    @ExcelProperty("实际折扣")
+    @ApiModelProperty("实际折扣")
+    @Required
+    private Double discount;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("本次入库数量")
     @ApiModelProperty("本次入库数量")
+    @Required
     private Integer inNum;
 }

+ 95 - 27
src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordExcelVo.java

@@ -1,10 +1,14 @@
 package com.xjrsoft.module.textbook.vo;
 
+import com.alibaba.excel.annotation.ExcelIgnore;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.Date;
+
 /**
 * @title: 教材入库分页列表出参
 * @Author szs
@@ -14,31 +18,31 @@ import lombok.Data;
 @Data
 public class TextbookWarehouseRecordExcelVo {
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    private String baseSemesterIdCn;
 
-    /**
-    * 序号
-    */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("号")
-    @ApiModelProperty("号")
-    private Integer sortCode;
+    @ExcelProperty("入库单号")
+    @ApiModelProperty("入库单号")
+    private String orderNumber;
 
-    /**
-     * 来源
-     */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("书号")
-    @ApiModelProperty("书号")
-    private String issn;
+    @ExcelProperty("入库类型")
+    @ApiModelProperty("入库方式")
+    private String warehouseModeCn;
 
-    /**
-    * 书名
-    */
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("书名")
     @ApiModelProperty("书名")
     private String bookName;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("书号")
+    @ApiModelProperty("书号")
+    private String issn;
+
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("出版社")
     @ApiModelProperty("出版社")
@@ -50,9 +54,19 @@ public class TextbookWarehouseRecordExcelVo {
     private String editorInChief;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("学科组")
-    @ApiModelProperty("学科组")
-    private String groupName;
+    @ExcelIgnore
+    @ApiModelProperty("是否为规划教材")
+    private Integer isTextbookPlan;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("规划教材")
+    @ApiModelProperty("是否为规划教材")
+    private String isTextbookPlanCn;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材分类")
+    @ApiModelProperty("教材分类")
+    private String textbookTypeCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("对应课程")
@@ -60,28 +74,82 @@ public class TextbookWarehouseRecordExcelVo {
     private String courseName;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("类型")
-    @ApiModelProperty("类型")
-    private String textbookTypeCn;
+    @ExcelProperty("学科组")
+    @ApiModelProperty("学科组")
+    private String groupName;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("规格型号")
-    @ApiModelProperty("规格型号")
-    private String specificationsModels;
+    @ExcelProperty("使用类型(单位:学期)")
+    @ApiModelProperty("使用类型(单位:学期)")
+    private Integer useType;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("单价(元)")
+    @ApiModelProperty("单价(元)")
+    private BigDecimal Price;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("折扣")
+    @ApiModelProperty("折扣")
+    private Double discount;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("小计(元)")
+    @ApiModelProperty("小计(元)")
+    private BigDecimal subtotal;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelIgnore
+    @ApiModelProperty("入库时间")
+    private Date createDate;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库时间")
+    @ApiModelProperty("入库时间")
+    private String createDateCn;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("入库人员")
     @ApiModelProperty("入库人员")
     private String warehouseUser;
 
-    /**
-    * 入库数量
-    */
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("入库数量")
     @ApiModelProperty("入库数量")
     private Integer warehouseNumber;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("总价(元)")
+    @ApiModelProperty("总价(元)")
+    private BigDecimal totalPrice;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("退还书店数量")
+    @ApiModelProperty("退还书店数量")
+    private Integer returnBookstoreNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际入库数量")
+    @ApiModelProperty("实际入库数量(总入库数量 - 退还书店数量)")
+    private Integer actualWarehouseNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("实际入库金额")
+    @ApiModelProperty("实际入库金额(实际入库数量 * 实际价格)")
+    private BigDecimal actualTotalPrice;
 
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("已出库数量")
+    @ApiModelProperty("已出库数量")
+    private Integer issuedNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("领取后退书数量")
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
+
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("剩余库存数量")
+    @ApiModelProperty("剩余库存数量")
+    private Integer remainNumber;
 }

+ 48 - 0
src/main/java/com/xjrsoft/module/veb/util/ImportExcelUtil.java

@@ -26,6 +26,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Supplier;
 
 /**
@@ -106,6 +107,34 @@ public class ImportExcelUtil {
         return importConfigs;
     }
 
+    /**
+     * 写大标题行
+     * @param workbook
+     * @param sheet
+     * @param bigHead
+     * @param rowNumber
+     * @param lastCol
+     */
+    public static void createBigHead(Workbook workbook, Sheet sheet, String bigHead, int rowNumber, int lastCol) {
+        Font font = workbook.createFont();
+        font.setFontName("宋体");
+        font.setFontHeightInPoints((short)18);
+
+        // 正常样式
+        CellStyle normalCellStyle = workbook.createCellStyle();
+        normalCellStyle.setFont(font); // 将字体应用到样式
+        normalCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
+        normalCellStyle.setAlignment(HorizontalAlignment.CENTER);
+
+        // 所在行
+        Row row = sheet.createRow(rowNumber);
+
+        Cell cell = row.createCell(0);
+        cell.setCellValue(bigHead);
+        cell.setCellStyle(normalCellStyle);
+        sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, lastCol));
+    }
+
     /**
      * 写标题行
      * @param workbook
@@ -373,6 +402,25 @@ public class ImportExcelUtil {
         return false; // 所有必需字段都不为空
     }
 
+    /**
+     * 将对象列表转换为二维字符串列表
+     * @param dataList 数据对象列表
+     * @param mappers  字段提取函数数组
+     * @param <T>      数据对象类型
+     * @return 二维字符串列表
+     */
+    @SafeVarargs
+    public static <T> List<List<String>> convertToDataList(List<T> dataList, Function<T, String>... mappers) {
+        List<List<String>> result = new ArrayList<>();
+        for (T data : dataList) {
+            List<String> row = new ArrayList<>();
+            for (Function<T, String> mapper : mappers) {
+                row.add(mapper.apply(data));
+            }
+            result.add(row);
+        }
+        return result;
+    }
 
     public static List<ImportConfig> getAllFieldCN(Class<?> clazz) {
         List<ImportConfig> importConfigs = new ArrayList<>();