Ver código fonte

教材征订单号
教材入库重构

大数据与最优化研究所 9 meses atrás
pai
commit
1f2d398101
22 arquivos alterados com 863 adições e 62 exclusões
  1. 6 0
      src/main/java/com/xjrsoft/common/enums/WarehouseModeEnum.java
  2. 1 1
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookSubscriptionController.java
  3. 0 1
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordController.java
  4. 125 0
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordDetailController.java
  5. 53 0
      src/main/java/com/xjrsoft/module/textbook/dto/AddTextbookWarehouseRecordDetailDto.java
  6. 26 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseRecordDetailPageDto.java
  7. 32 0
      src/main/java/com/xjrsoft/module/textbook/dto/UpdateTextbookWarehouseRecordDetailDto.java
  8. 5 1
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookSubscription.java
  9. 67 29
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java
  10. 103 0
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecordDetail.java
  11. 17 0
      src/main/java/com/xjrsoft/module/textbook/mapper/TextbookWarehouseRecordDetailMapper.java
  12. 17 0
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookWarehouseRecordDetailService.java
  13. 0 1
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookSubscriptionService.java
  14. 134 20
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java
  15. 25 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordDetailServiceImpl.java
  16. 1 1
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java
  17. 4 4
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  18. 5 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookSubscriptionPageVo.java
  19. 111 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailPageVo.java
  20. 54 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailVo.java
  21. 52 4
      src/main/resources/sqlScript/20250120_sql.sql
  22. 25 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 6 - 0
src/main/java/com/xjrsoft/common/enums/WarehouseModeEnum.java

@@ -7,6 +7,12 @@ package com.xjrsoft.common.enums;
  * @Version 1.0
  */
 public enum WarehouseModeEnum {
+    /**
+     * 手动
+     * */
+    WmSubscription("wm_subscription", "征订入库"),
+
+
     /**
      * 手动
      * */

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

@@ -184,7 +184,7 @@ public class TextbookSubscriptionController {
     }
 
     @PostMapping(value = "/instockroom")
-    @ApiOperation(value="手动填写入库")
+    @ApiOperation(value="征订页面手动填写入库")
     @SaCheckPermission("textbooksubscription:detail")
     public RT<Boolean> instockroom(@Valid @RequestBody  List<TextbookInstockroomDto> dtos){
         return RT.ok(textbookSubscriptionService.instockroom(dtos));

+ 0 - 1
src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordController.java

@@ -47,7 +47,6 @@ import java.util.List;
 @AllArgsConstructor
 public class TextbookWarehouseRecordController {
 
-
     private final ITextbookWarehouseRecordService textbookClassWarehouseService;
 
     @GetMapping(value = "/page")

+ 125 - 0
src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordDetailController.java

@@ -0,0 +1,125 @@
+package com.xjrsoft.module.textbook.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDetailDto;
+import com.xjrsoft.module.textbook.dto.UpdateTextbookWarehouseRecordDetailDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.EasyExcel;
+import org.springframework.web.multipart.MultipartFile;
+import java.io.IOException;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.springframework.http.ResponseEntity;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import com.xjrsoft.module.textbook.dto.TextbookWarehouseRecordDetailPageDto;
+import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecordDetail;
+import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordDetailService;
+import com.xjrsoft.module.textbook.vo.TextbookWarehouseRecordDetailPageVo;
+
+import com.xjrsoft.module.textbook.vo.TextbookWarehouseRecordDetailVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/textbook" + "/textbookWarehouseRecordDetail")
+@Api(value = "/textbook"  + "/textbookWarehouseRecordDetail",tags = "教材入库记录详细入库记录代码")
+@AllArgsConstructor
+public class TextbookWarehouseRecordDetailController {
+
+
+    private final ITextbookWarehouseRecordDetailService textbookWarehouseRecordDetailService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="教材入库记录详细入库记录列表(分页)")
+    @SaCheckPermission("textbookwarehouserecorddetail:detail")
+    public RT<PageOutput<TextbookWarehouseRecordDetailPageVo>> page(@Valid TextbookWarehouseRecordDetailPageDto dto){
+
+        LambdaQueryWrapper<TextbookWarehouseRecordDetail> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(TextbookWarehouseRecordDetail::getId)
+                .select(TextbookWarehouseRecordDetail.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordDetailPageVo.class).contains(x.getProperty()));
+        IPage<TextbookWarehouseRecordDetail> page = textbookWarehouseRecordDetailService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<TextbookWarehouseRecordDetailPageVo> pageOutput = ConventPage.getPageOutput(page, TextbookWarehouseRecordDetailPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询教材入库记录详细入库记录信息")
+    @SaCheckPermission("textbookwarehouserecorddetail:detail")
+    public RT<TextbookWarehouseRecordDetailVo> info(@RequestParam Long id){
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail = textbookWarehouseRecordDetailService.getById(id);
+        if (textbookWarehouseRecordDetail == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(textbookWarehouseRecordDetail, TextbookWarehouseRecordDetailVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增教材入库记录详细入库记录")
+    @SaCheckPermission("textbookwarehouserecorddetail:add")
+    public RT<Boolean> add(@Valid @RequestBody AddTextbookWarehouseRecordDetailDto dto){
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail = BeanUtil.toBean(dto, TextbookWarehouseRecordDetail.class);
+        boolean isSuccess = textbookWarehouseRecordDetailService.save(textbookWarehouseRecordDetail);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改教材入库记录详细入库记录")
+    @SaCheckPermission("textbookwarehouserecorddetail:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateTextbookWarehouseRecordDetailDto dto){
+
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail = BeanUtil.toBean(dto, TextbookWarehouseRecordDetail.class);
+        return RT.ok(textbookWarehouseRecordDetailService.updateById(textbookWarehouseRecordDetail));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除教材入库记录详细入库记录")
+    @SaCheckPermission("textbookwarehouserecorddetail:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(textbookWarehouseRecordDetailService.removeBatchByIds(ids));
+
+    }
+    @PostMapping("/import")
+    @ApiOperation(value = "导入")
+    public RT<Boolean> importData(@RequestParam MultipartFile file) throws IOException {
+        List<TextbookWarehouseRecordDetailPageVo> savedDataList = EasyExcel.read(file.getInputStream()).head(TextbookWarehouseRecordDetailPageVo.class).sheet().doReadSync();
+        Boolean result = textbookWarehouseRecordDetailService.saveBatch(BeanUtil.copyToList(savedDataList, TextbookWarehouseRecordDetail.class));
+        return RT.ok(result);
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid TextbookWarehouseRecordDetailPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<TextbookWarehouseRecordDetailPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<TextbookWarehouseRecordDetailPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, TextbookWarehouseRecordDetailPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "TextbookWarehouseRecordDetail" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/textbook/dto/AddTextbookWarehouseRecordDetailDto.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+public class AddTextbookWarehouseRecordDetailDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 教材入库记录主键id(textbook_warehouse_record)
+    */
+    @ApiModelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    private Long textbookWarehouseRecordId;
+    /**
+    * 入库方式(xjr_dictionary_item[warehouse_mode])
+    */
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseMode;
+    /**
+    * 入库数量
+    */
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseRecordDetailPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 教材入库记录详细入库记录分页查询入参
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TextbookWarehouseRecordDetailPageDto extends PageInput {
+
+
+}

+ 32 - 0
src/main/java/com/xjrsoft/module/textbook/dto/UpdateTextbookWarehouseRecordDetailDto.java

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.textbook.dto;
+
+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 com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+public class UpdateTextbookWarehouseRecordDetailDto extends AddTextbookWarehouseRecordDetailDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

+ 5 - 1
src/main/java/com/xjrsoft/module/textbook/entity/TextbookSubscription.java

@@ -108,7 +108,11 @@ public class TextbookSubscription implements Serializable {
     */
     @ApiModelProperty("征订状态(0:待发起,1:证订中,2:完成)")
     private Integer status;
-
+    /**
+     * 征订单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)
+     */
+    @ApiModelProperty("征订单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)")
+    private String orderNumber;
     /**
     * textbookSubscriptionItem
     */

+ 67 - 29
src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java

@@ -2,27 +2,30 @@ package com.xjrsoft.module.textbook.entity;
 
 import com.baomidou.mybatisplus.annotation.FieldFill;
 import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableId;
 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 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;
 
 
 /**
-* @title: 教材入库
-* @Author szs
-* @Date: 2023-12-26
+* @title: 教材入库记录
+* @Author phoenix
+* @Date: 2025-02-10
 * @Version 1.0
 */
 @Data
 @TableName("textbook_warehouse_record")
-@ApiModel(value = "textbook_warehouse_record", description = "教材入库")
+@ApiModel(value = "textbook_warehouse_record", description = "教材入库记录")
 public class TextbookWarehouseRecord implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -76,21 +79,31 @@ public class TextbookWarehouseRecord implements Serializable {
     @ApiModelProperty("序号")
     private Integer sortCode;
     /**
-    * 教材管理编号
+    * 入库方式(xjr_dictionary_item[warehouse_mode])
     */
-    @ApiModelProperty("教材管理编号")
-    private Long textbookId;
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseMode;
     /**
-     * 数据编号(根据入库方式,编号来自不同数据表)
-     */
+    * 数据编号(根据入库方式,编号来自不同数据表)
+    */
     @ApiModelProperty("数据编号(根据入库方式,编号来自不同数据表)")
     private Long dataId;
     /**
-     * 数据项项编号(根据入库方式,编号来自不同数据表)
-     */
+    * 数据项项编号(根据入库方式,编号来自不同数据表)
+    */
     @ApiModelProperty("数据项项编号(根据入库方式,编号来自不同数据表)")
     private Long dataItemId;
     /**
+    * 教材管理编号
+    */
+    @ApiModelProperty("教材管理编号")
+    private Long textbookId;
+    /**
+    * 定价(元)
+    */
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+    /**
     * 入库数量
     */
     @ApiModelProperty("入库数量")
@@ -101,19 +114,14 @@ public class TextbookWarehouseRecord implements Serializable {
     @ApiModelProperty("来源")
     private String source;
     /**
-    * 定价(元)
+    * 实际折扣
     */
-    @ApiModelProperty("定价(元)")
-    private BigDecimal price;
-    /**
-    * 折扣
-    */
-    @ApiModelProperty("折扣")
+    @ApiModelProperty("实际折扣")
     private Double discount;
     /**
-    * 小计(元)
+    * 实际价格(元)
     */
-    @ApiModelProperty("小计(元)")
+    @ApiModelProperty("实际价格(元)")
     private BigDecimal subtotal;
     /**
     * 总价(元)
@@ -121,15 +129,45 @@ public class TextbookWarehouseRecord implements Serializable {
     @ApiModelProperty("总价(元)")
     private BigDecimal totalPrice;
     /**
-     * 入库方式
-     */
-    @ApiModelProperty("入库方式")
-    private String warehouseMode;
-    /**
-     * 备注
-     */
+    * 备注
+    */
     @ApiModelProperty("备注")
     private String remark;
+    /**
+    * 入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)
+    */
+    @ApiModelProperty("入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)")
+    private String orderNumber;
+    /**
+    * 退还书店数量
+    */
+    @ApiModelProperty("退还书店数量")
+    private Integer returnBookstoreNumber;
+    /**
+    * 实际入库数量(总入库数量 - 退还书店数量)
+    */
+    @ApiModelProperty("实际入库数量(总入库数量 - 退还书店数量)")
+    private Integer actualWarehouseNumber;
+    /**
+    * 实际入库金额(实际入库数量 * 实际价格)
+    */
+    @ApiModelProperty("实际入库金额(实际入库数量 * 实际价格)")
+    private BigDecimal actualTotalPrice;
+    /**
+    * 已出库数量
+    */
+    @ApiModelProperty("已出库数量")
+    private Integer issuedNumber;
+    /**
+    * 领取后退书数量
+    */
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
+    /**
+    * 剩余库存数量
+    */
+    @ApiModelProperty("剩余库存数量")
+    private Integer remainNumber;
 
 
 }

+ 103 - 0
src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecordDetail.java

@@ -0,0 +1,103 @@
+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 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;
+
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+@TableName("textbook_warehouse_record_detail")
+@ApiModel(value = "textbook_warehouse_record_detail", description = "教材入库记录详细入库记录")
+public class TextbookWarehouseRecordDetail 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(textbook_warehouse_record)
+    */
+    @ApiModelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    private Long textbookWarehouseRecordId;
+    /**
+    * 入库方式(xjr_dictionary_item[warehouse_mode])
+    */
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseMode;
+    /**
+    * 入库数量
+    */
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/textbook/mapper/TextbookWarehouseRecordDetailMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.textbook.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecordDetail;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Mapper
+public interface TextbookWarehouseRecordDetailMapper extends MPJBaseMapper<TextbookWarehouseRecordDetail> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/textbook/service/ITextbookWarehouseRecordDetailService.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.textbook.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecordDetail;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+
+public interface ITextbookWarehouseRecordDetailService extends MPJBaseService<TextbookWarehouseRecordDetail> {
+}

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

@@ -56,6 +56,5 @@ public interface IWfTextbookSubscriptionService extends MPJBaseService<WfTextboo
 
     Boolean instockroom(List<TextbookInstockroomDto> dtos);
 
-
     String excelImport(InputStream inputStream, Long wfTextbookSubscriptionId);
 }

+ 134 - 20
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java

@@ -2,6 +2,7 @@ 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 com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -37,6 +38,8 @@ import org.springframework.transaction.annotation.Transactional;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
@@ -65,6 +68,8 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
 
     private final TextbookSubscriptionItemHistoryMapper textbookSubscriptionItemHistoryMapper;
 
+    private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper;
+
     @Override
     public IPage<TextbookSubscriptionPageVo> pageRubAndHand(TextbookSubscriptionPageDto dto) {
         MPJLambdaWrapper<TextbookSubscription> queryWrapper = new MPJLambdaWrapper<>();
@@ -78,8 +83,7 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 .eq(StringUtils.isNotBlank(dto.getId()), TextbookSubscription::getId, dto.getId())
                 .orderByDesc(TextbookSubscription::getCreateDate)
         ;
-        IPage<TextbookSubscriptionPageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), TextbookSubscriptionPageVo.class, queryWrapper);
-        return page;
+        return this.selectJoinListPage(ConventPage.getPage(dto), TextbookSubscriptionPageVo.class, queryWrapper);
     }
 
     @Override
@@ -293,6 +297,35 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
         }
         textbookSubscription.setSum(sum);
         textbookSubscription.setCreateDate(new Date());
+
+        // 处理征订单号
+        StringBuilder sb = new StringBuilder();
+        sb.append("ZD");
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String nowStr = now.format(dateTimeFormatter);
+        sb.append(nowStr);
+        // 根据当前征订编号前缀去数据库找是否已经存在了
+        LambdaQueryWrapper<TextbookSubscription> textbookSubscriptionLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        textbookSubscriptionLambdaQueryWrapper
+                .like(TextbookSubscription::getOrderNumber, sb.toString() + "%")
+                .eq(TextbookSubscription::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .orderByDesc(TextbookSubscription::getOrderNumber)
+                .last("limit 1")
+                ;
+        TextbookSubscription maxOrderNumber = textbookSubscriptionTextbookSubscriptionMapper.selectOne(textbookSubscriptionLambdaQueryWrapper);
+        if(ObjectUtils.isNotEmpty(maxOrderNumber) && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())){
+            String oldOrderNumber = maxOrderNumber.getOrderNumber();
+            String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
+            int oldOrderInteger = Integer.parseInt(oldOrder);
+            oldOrderInteger += 1;
+            String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+            sb.append(newOrder);
+        }else {
+            sb.append("001");
+        }
+        textbookSubscription.setOrderNumber(sb.toString());
+
         textbookSubscriptionTextbookSubscriptionMapper.insert(textbookSubscription);
 
 //        // 处理征订和班级关联表
@@ -346,6 +379,12 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             return false;
         }
 
+        TextbookSubscription textbookSubscription = this.getById(dtos.get(0).getTextbookSubscriptionId());
+
+        if (ObjectUtils.isEmpty(textbookSubscription)) {
+            throw new MyException("请选择需要入库的征订记录");
+        }
+
         List<Long> textbookSubscriptionItemIds = new ArrayList<>();
         for (TextbookInstockroomDto dto : dtos) {
             if(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())){
@@ -367,11 +406,9 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
         ;
         List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(TextbookSubscriptionItem.class, queryWrapper);
-
         if (textbookSubscriptionItemList.isEmpty()) {
-            throw new MyException("证订信息已经修改,请刷新重试");
+            throw new MyException("证订项已经变更,请刷新重试");
         }
-
         Map<Long, TextbookSubscriptionItem> itemByIdMap = new HashMap<>();
         for (TextbookSubscriptionItem el : textbookSubscriptionItemList) {
             if(ObjectUtils.isNotEmpty(el.getId()) && !itemByIdMap.containsKey(el.getId())){
@@ -379,17 +416,60 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             }
         }
 
+        // 获取当前征订已经产生的入库记录
+        LambdaQueryWrapper<TextbookWarehouseRecord> textbookWarehouseRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        textbookWarehouseRecordLambdaQueryWrapper
+                .in(TextbookWarehouseRecord::getDataId, textbookSubscription.getId())
+                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                ;
+        List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(textbookWarehouseRecordLambdaQueryWrapper);
+        Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordByItemIdMap = new HashMap<>();
+        for (TextbookWarehouseRecord twr : textbookWarehouseRecords) {
+            if(ObjectUtils.isNotEmpty(twr.getDataItemId()) && !textbookWarehouseRecordByItemIdMap.containsKey(twr.getDataItemId())){
+                textbookWarehouseRecordByItemIdMap.put(twr.getDataItemId(), twr);
+            }
+        }
+
+        // 处理入库单号
+        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);
+        }
+
+        // 处理入库细节
         TextbookSubscriptionItem old = null;
+        TextbookSubscriptionItem updateItem;
+        TextbookWarehouseRecord textbookWarehouseRecord;
+        TextbookWarehouseRecord oldTextbookWarehouseRecord = null;
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
         for (TextbookInstockroomDto dto : dtos) {
             if (ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId())) {
                 old = itemByIdMap.get(dto.getTextbookSubscriptionItemId());
+                oldTextbookWarehouseRecord = textbookWarehouseRecordByItemIdMap.get(dto.getTextbookSubscriptionItemId());
             }
 
             if (ObjectUtils.isEmpty(old)) {
                 continue;
             }
 
-            TextbookSubscriptionItem updateItem = new TextbookSubscriptionItem();
+            updateItem = new TextbookSubscriptionItem();
             updateItem.setId(old.getId());
             updateItem.setDiscount(dto.getDiscount());
             updateItem.setPrice(old.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
@@ -398,20 +478,54 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             updateItem.setModifyUserId(StpUtil.getLoginIdAsLong());
             textbookSubscriptionTextbookSubscriptionItemMapper.updateById(updateItem);
 
-            //新增入库记录
-            TextbookWarehouseRecord textbookWarehouseRecord = new TextbookWarehouseRecord();
-            textbookWarehouseRecord.setTextbookId(old.getTextbookId());
-            textbookWarehouseRecord.setDataId(dto.getTextbookSubscriptionId());
-            textbookWarehouseRecord.setDataItemId(dto.getTextbookSubscriptionItemId());
-            textbookWarehouseRecord.setWarehouseNumber(dto.getInNum());
-            textbookWarehouseRecord.setPrice(old.getPrice());
-            textbookWarehouseRecord.setDiscount(dto.getDiscount());
-            textbookWarehouseRecord.setSubtotal(old.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
-            textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(dto.getInNum())));
-            textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmManual.getCode());
-            updateItem.setCreateDate(new Date());
-            updateItem.setCreateUserId(StpUtil.getLoginIdAsLong());
-            textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
+            // 判断当前征订中的当前教材是否已经有了入库记录
+            // 当前征订项第一次入库
+            long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId();
+            if (ObjectUtils.isEmpty(oldTextbookWarehouseRecord)) {
+                //新增入库记录
+                textbookWarehouseRecord = new TextbookWarehouseRecord();
+                textbookWarehouseRecord.setId(textbookWarehouseRecordId);
+                textbookWarehouseRecord.setTextbookId(old.getTextbookId());
+                textbookWarehouseRecord.setDataId(dto.getTextbookSubscriptionId());
+                textbookWarehouseRecord.setDataItemId(dto.getTextbookSubscriptionItemId());
+                textbookWarehouseRecord.setWarehouseNumber(dto.getInNum());
+                textbookWarehouseRecord.setPrice(old.getPrice());
+                textbookWarehouseRecord.setDiscount(dto.getDiscount());
+                textbookWarehouseRecord.setSubtotal(old.getPrice().multiply(BigDecimal.valueOf(dto.getDiscount() / 10)));
+                textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(dto.getInNum())));
+                oldOrderInteger += 1;
+                String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+                sb.append(newOrder);
+                textbookWarehouseRecord.setOrderNumber(sb.toString());
+                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());
+                updateItem.setCreateDate(new Date());
+                updateItem.setCreateUserId(StpUtil.getLoginIdAsLong());
+                textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
+            }else {
+                textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId();
+                textbookWarehouseRecord = BeanUtil.toBean(oldTextbookWarehouseRecord, TextbookWarehouseRecord.class);
+                textbookWarehouseRecord.setWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() + dto.getInNum());
+                textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getWarehouseNumber())));
+                textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getActualWarehouseNumber() + dto.getInNum());
+                textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
+                textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getRemainNumber() + dto.getInNum());
+                textbookWarehouseRecord.setModifyDate(new Date());
+                textbookWarehouseRecord.setModifyUserId(StpUtil.getLoginIdAsLong());
+                textbookWarehouseRecordMapper.updateById(textbookWarehouseRecord);
+            }
+
+            // 新增教材入库记录详细入库记录
+            textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
+            textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
+            textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
+            textbookWarehouseRecordDetail.setWarehouseNumber(dto.getInNum());
+            textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
         }
 
         return true;

+ 25 - 0
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordDetailServiceImpl.java

@@ -0,0 +1,25 @@
+package com.xjrsoft.module.textbook.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecordDetail;
+import com.xjrsoft.module.textbook.mapper.TextbookWarehouseRecordDetailMapper;
+import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordDetailService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 教材入库记录详细入库记录
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class TextbookWarehouseRecordDetailServiceImpl extends MPJBaseServiceImpl<TextbookWarehouseRecordDetailMapper, TextbookWarehouseRecordDetail> implements ITextbookWarehouseRecordDetailService {
+}

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

@@ -74,7 +74,7 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
                 )
                 .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
                         wrapper -> wrapper
-                                .selectAs(BaseCourseSubject::getName, TextbookWarehouseRecordPageVo::getGroupName)
+                                .selectAs(BaseCourseSubject::getName, TextbookWarehouseRecordPageVo::getCourseName)
                 )
                 .leftJoin(XjrUser.class, XjrUser::getId, TextbookWarehouseRecord::getCreateUserId,
                         wrapper -> wrapper

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

@@ -130,7 +130,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         for (WfTextbookClaimPageVo wfTextbookClaimPageVo : page.getRecords()) {
             //拆分代领取人
             String receiveUserIdStr = wfTextbookClaimPageVo.getReceiveUserId();
-            if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
+            if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.isEmpty()) {
                 String[] receiveUserIdStrs = receiveUserIdStr.split(",");
                 List<Long> receiveUserIdList = new ArrayList<>();
                 for (String str : receiveUserIdStrs) {
@@ -140,13 +140,13 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 queryWrapper
                         .in(XjrUser::getId, receiveUserIdList);
                 List<XjrUser> xjrUserList = xjrUserMapper.selectList(queryWrapper);
-                if (ObjectUtil.isNotNull(xjrUserList) && xjrUserList.size() > 0) {
+                if (ObjectUtil.isNotNull(xjrUserList) && !xjrUserList.isEmpty()) {
                     StringBuilder sb = new StringBuilder();
                     for (int i = 0; i < xjrUserList.size(); i++) {
                         if(i == 0){
                             sb.append(xjrUserList.get(i).getName());
                         }else{
-                            sb.append("," + xjrUserList.get(i).getName());
+                            sb.append(",").append(xjrUserList.get(i).getName());
                         }
                     }
                     wfTextbookClaimPageVo.setReceiveUserIdCN(sb.toString());
@@ -155,7 +155,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             //加上申领项
             List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimPageVo.getId()));
 
-            if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
+            if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && !wfTextbookClaimItemVoList.isEmpty()) {
                 wfTextbookClaimPageVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
             }
         }

+ 5 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookSubscriptionPageVo.java

@@ -63,4 +63,9 @@ public class TextbookSubscriptionPageVo {
     @ExcelProperty("状态(1:待发起 2:征订中 3:待入库 4:已入库)")
     @ApiModelProperty("状态(1:待发起 2:征订中 3:待入库 4:已入库)")
     private Integer status;
+    /**
+     * 征订单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)
+     */
+    @ApiModelProperty("征订单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)")
+    private String orderNumber;
 }

+ 111 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailPageVo.java

@@ -0,0 +1,111 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 教材入库记录详细入库记录分页列表出参
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+public class TextbookWarehouseRecordDetailPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号")
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建人")
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("修改人")
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("修改时间")
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("删除标记")
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("有效标志")
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("序号")
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 教材入库记录主键id(textbook_warehouse_record)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    @ApiModelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    private Long textbookWarehouseRecordId;
+    /**
+    * 入库方式(xjr_dictionary_item[warehouse_mode])
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseMode;
+    /**
+    * 入库数量
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库数量")
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+    /**
+    * 备注
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("备注")
+    @ApiModelProperty("备注")
+    private String remark;
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailVo.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 教材入库记录详细入库记录表单出参
+* @Author phoenix
+* @Date: 2025-02-10
+* @Version 1.0
+*/
+@Data
+public class TextbookWarehouseRecordDetailVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 教材入库记录主键id(textbook_warehouse_record)
+    */
+    @ApiModelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    private Long textbookWarehouseRecordId;
+    /**
+    * 入库方式(xjr_dictionary_item[warehouse_mode])
+    */
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseMode;
+    /**
+    * 入库数量
+    */
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+
+
+
+}

+ 52 - 4
src/main/resources/sqlScript/20250120_sql.sql

@@ -52,8 +52,6 @@ create table `textbook_subscription_item_class`
   default charset = utf8mb4
   collate = utf8mb4_0900_ai_ci comment ='教材征订记录详情与班级关联表';
 
-
-
 DROP TABLE IF EXISTS student_change_record;
 CREATE TABLE `student_change_record`  (
   `id` BIGINT NOT NULL COMMENT '主键',
@@ -95,8 +93,6 @@ CREATE TABLE `student_report_plan`  (
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = INNODB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = '学生报到计划';
 
-
-
 -- ---------------------------------------------------------------
 -- 学生报到计划-班级
 -- ---------------------------------------------------------------
@@ -114,3 +110,55 @@ ALTER TABLE `student_report_record`
 alter table textbook_subscription_item
     add class_ids varchar(1024) null comment '按班级征订当前征订项的的教材使用的班级的主键';
 
+alter table textbook_subscription
+    add order_number varchar(256) not null comment '征订单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)';
+
+alter table textbook_warehouse_record
+    add order_number varchar(256) not null comment '入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)';
+
+alter table textbook_warehouse_record
+    alter column warehouse_number set default 0;
+
+alter table textbook_warehouse_record
+    add actual_warehouse_number int default 0 null comment '实际入库数量(总入库数量 - 退还书店数量)';
+
+alter table textbook_warehouse_record
+    add actual_total_price decimal(10, 2) null comment '实际入库金额(实际入库数量 * 实际价格)';
+
+alter table textbook_warehouse_record
+    add return_bookstore_number int default 0 null comment '退还书店数量' after order_number;
+
+alter table textbook_warehouse_record
+    add issued_number int default 0 null comment '已出库数量';
+
+alter table textbook_warehouse_record
+    add recede_number int default 0 null comment '领取后退书数量';
+
+alter table textbook_warehouse_record
+    add remain_number int default 0 null comment '剩余库存数量';
+
+-- ----------------------------
+-- 2025-02-10 14:36
+-- 教材入库记录详细入库记录
+-- ----------------------------
+drop table if exists textbook_warehouse_record_detail;
+create table `textbook_warehouse_record_detail`
+(
+    id               bigint         not null comment '主键编号'
+        primary key,
+    create_user_id   bigint         null comment '创建人',
+    create_date      datetime       null comment '创建时间',
+    modify_user_id   bigint         null comment '修改人',
+    modify_date      datetime       null comment '修改时间',
+    delete_mark      int            not null comment '删除标记',
+    enabled_mark     int            not null comment '有效标志',
+    sort_code        int            null comment '序号',
+
+    textbook_warehouse_record_id bigint         null comment '教材入库记录主键id(textbook_warehouse_record)',
+
+    warehouse_mode   varchar(20)    null comment '入库方式(xjr_dictionary_item[warehouse_mode])',
+    warehouse_number int            null comment '入库数量',
+    remark           varchar(1000)  null comment '备注'
+) engine = innodb
+  default charset = utf8mb4
+  collate = utf8mb4_0900_ai_ci comment ='教材入库记录详细入库记录';

+ 25 - 0
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -4360,4 +4360,29 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcTextbookWarehouseRecordDetail() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("textbook_warehouse_record_detail");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("phoenix");//作者名称
+        params.setPackageName("textbook");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(true);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }