Bläddra i källkod

Merge remote-tracking branch 'origin/dev' into pre

dzx 9 månader sedan
förälder
incheckning
154e921078
31 ändrade filer med 924 tillägg och 313 borttagningar
  1. 5 0
      src/main/java/com/xjrsoft/common/enums/ClaimTypeEnum.java
  2. 0 1
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java
  3. 10 1
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookSubscriptionController.java
  4. 5 6
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordController.java
  5. 19 5
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordDetailController.java
  6. 39 7
      src/main/java/com/xjrsoft/module/textbook/controller/WfTextbookClaimController.java
  7. 4 35
      src/main/java/com/xjrsoft/module/textbook/dto/AddTextbookWarehouseRecordDto.java
  8. 13 13
      src/main/java/com/xjrsoft/module/textbook/dto/ConfirmDistributeDto.java
  9. 31 0
      src/main/java/com/xjrsoft/module/textbook/dto/DistributePageDto.java
  10. 23 0
      src/main/java/com/xjrsoft/module/textbook/dto/InstockroomRecordsPageDto.java
  11. 1 0
      src/main/java/com/xjrsoft/module/textbook/dto/SubscriptionItemListDistributeDto.java
  12. 9 1
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseRecordDetailPageDto.java
  13. 45 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseTextbooksDto.java
  14. 45 16
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookIssueRecord.java
  15. 3 2
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java
  16. 2 0
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookSubscriptionService.java
  17. 3 0
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookWarehouseRecordService.java
  18. 4 0
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookClaimService.java
  19. 66 18
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java
  20. 84 2
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java
  21. 235 86
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  22. 32 0
      src/main/java/com/xjrsoft/module/textbook/vo/DistributePageVo.java
  23. 15 0
      src/main/java/com/xjrsoft/module/textbook/vo/DistributeSemesterVo.java
  24. 101 0
      src/main/java/com/xjrsoft/module/textbook/vo/InstockroomRecordsPageVo.java
  25. 14 13
      src/main/java/com/xjrsoft/module/textbook/vo/SubscriptionItemListDistributeVo.java
  26. 8 36
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailPageVo.java
  27. 21 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordPageVo.java
  28. 9 1
      src/main/resources/sqlScript/20250120_sql.sql
  29. 73 66
      src/main/resources/sqlScript/textbook_sql.sql
  30. 2 1
      src/test/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImplTest.java
  31. 3 3
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 5 - 0
src/main/java/com/xjrsoft/common/enums/ClaimTypeEnum.java

@@ -7,6 +7,11 @@ package com.xjrsoft.common.enums;
  * @Version 1.0
  */
 public enum ClaimTypeEnum {
+    /**
+     * 学生领取
+     * */
+    ClaimClass("claim_class", "班级领取"),
+
     /**
      * 学生领取
      * */

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

@@ -48,7 +48,6 @@ import java.util.List;
 @AllArgsConstructor
 public class TextbookIssueRecordController {
 
-
     private final ITextbookIssueRecordService textbookIssueRecordService;
 
     @GetMapping(value = "/page")

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

@@ -53,6 +53,15 @@ public class TextbookSubscriptionController {
         return RT.ok(pageOutput);
     }
 
+    @GetMapping(value = "/instockroom-records")
+    @ApiOperation(value="征订页面入库记录")
+    @SaCheckPermission("textbooksubscription:detail")
+    public RT<PageOutput<InstockroomRecordsPageVo>> instockroomRecordsPage(@Valid InstockroomRecordsPageDto dto){
+        IPage<InstockroomRecordsPageVo> page = textbookSubscriptionService.instockroomRecordsPage(dto);
+        PageOutput<InstockroomRecordsPageVo> pageOutput = ConventPage.getPageOutput(page, InstockroomRecordsPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
     @GetMapping(value = "/list")
     @ApiOperation(value="教材教辅征订记录表列表(不分页)")
     @SaCheckPermission("textbooksubscription:detail")
@@ -143,7 +152,7 @@ public class TextbookSubscriptionController {
     }
 
     @GetMapping(value = "/item-list-confirm-distribute")
-    @ApiOperation(value="教材确认发放页面使用教材征订明细(不分页)")
+    @ApiOperation(value="教材确认发放页面使用教材征订明细(不分页)")//现在从入库记录中查找
     @SaCheckPermission("textbooksubscription:detail")
     public RT<List<SubscriptionItemListDistributeVo>> itemListConfirmDistribute(@Valid SubscriptionItemListDistributeDto dto){
         List<SubscriptionItemListDistributeVo> list = textbookSubscriptionService.itemListConfirmDistribute(dto);

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

@@ -69,13 +69,12 @@ public class TextbookWarehouseRecordController {
         return RT.ok(BeanUtil.toBean(textbookWarehouseRecord, TextbookWarehouseRecordVo.class));
     }
 
-    @PostMapping
-    @ApiOperation(value = "新增教材入库")
+    @PostMapping("textbook-warehouse")
+    @ApiOperation(value = "教材入库页面教材入库")
     @SaCheckPermission("textbookclasswarehouse:add")
-    public RT<Boolean> add(@Valid @RequestBody AddTextbookWarehouseRecordDto dto){
-        TextbookWarehouseRecord textbookWarehouseRecord = BeanUtil.toBean(dto, TextbookWarehouseRecord.class);
-        boolean isSuccess = textbookClassWarehouseService.save(textbookWarehouseRecord);
-    return RT.ok(isSuccess);
+    public RT<Boolean> textbookWarehouse(@Valid @RequestBody AddTextbookWarehouseRecordDto dto){
+        boolean isSuccess = textbookClassWarehouseService.textbookWarehouse(dto);
+        return RT.ok(isSuccess);
     }
 
     @PutMapping

+ 19 - 5
src/main/java/com/xjrsoft/module/textbook/controller/TextbookWarehouseRecordDetailController.java

@@ -5,13 +5,17 @@ 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.ObjectUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 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.system.entity.DictionaryDetail;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDetailDto;
 import com.xjrsoft.module.textbook.dto.UpdateTextbookWarehouseRecordDetailDto;
 import cn.dev33.satoken.annotation.SaCheckPermission;
@@ -57,12 +61,22 @@ public class TextbookWarehouseRecordDetailController {
     @ApiOperation(value="教材入库记录详细入库记录列表(分页)")
     @SaCheckPermission("textbookwarehouserecorddetail:detail")
     public RT<PageOutput<TextbookWarehouseRecordDetailPageVo>> page(@Valid TextbookWarehouseRecordDetailPageDto dto){
-
-        LambdaQueryWrapper<TextbookWarehouseRecordDetail> queryWrapper = new LambdaQueryWrapper<>();
+        MPJLambdaWrapper<TextbookWarehouseRecordDetail> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
-                    .orderByDesc(TextbookWarehouseRecordDetail::getId)
-                .select(TextbookWarehouseRecordDetail.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordDetailPageVo.class).contains(x.getProperty()));
-        IPage<TextbookWarehouseRecordDetail> page = textbookWarehouseRecordDetailService.page(ConventPage.getPage(dto), queryWrapper);
+                .select(TextbookWarehouseRecordDetail::getId)
+                .select(TextbookWarehouseRecordDetail.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordDetailPageVo.class).contains(x.getProperty()))
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookWarehouseRecordDetail::getCreateUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, TextbookWarehouseRecordDetailPageVo::getCreateUserIdCn)
+                        )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecordDetail::getWarehouseMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, TextbookWarehouseRecordDetailPageVo::getWarehouseModeCn)
+                )
+                .eq(ObjectUtils.isNotEmpty(dto.getTextbookWarehouseRecordId()), TextbookWarehouseRecordDetail::getTextbookWarehouseRecordId, dto.getTextbookWarehouseRecordId())
+                .orderByDesc(TextbookWarehouseRecordDetail::getId)
+        ;
+        IPage<TextbookWarehouseRecordDetailPageVo> page = textbookWarehouseRecordDetailService.selectJoinListPage(ConventPage.getPage(dto), TextbookWarehouseRecordDetailPageVo.class, queryWrapper);
         PageOutput<TextbookWarehouseRecordDetailPageVo> pageOutput = ConventPage.getPageOutput(page, TextbookWarehouseRecordDetailPageVo.class);
         return RT.ok(pageOutput);
     }

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

@@ -4,22 +4,26 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.QrCodeUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
-import com.xjrsoft.module.textbook.dto.AddWfTextbookClaimDto;
-import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
-import com.xjrsoft.module.textbook.dto.UpdateWfTextbookClaimDto;
-import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
+import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.WfTextbookClaim;
 import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
+import com.xjrsoft.module.textbook.vo.DistributePageVo;
+import com.xjrsoft.module.textbook.vo.DistributeSemesterVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.entity.XjrWorkflowOperateRecord;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -32,6 +36,8 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import java.util.List;
 
+import static org.camunda.bpm.engine.impl.cmmn.execution.CaseExecutionState.COMPLETED;
+
 /**
 * @title: 教材申领
 * @Author szs
@@ -49,6 +55,33 @@ public class WfTextbookClaimController {
 
     private final CommonPropertiesConfig commonPropertiesConfig;
 
+    @GetMapping(value = "/distribute-semester-list")
+    @ApiOperation(value="教材发放学期列表(移动端)")
+    @SaCheckPermission("wftextbookclaim:detail")
+    public RT<List<DistributeSemesterVo>> distributeSemesterList(){
+        MPJLambdaWrapper<WfTextbookClaim> wfTextbookClaimMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        wfTextbookClaimMPJLambdaWrapper
+                .distinct()
+                .selectAs(WfTextbookClaim::getBaseSemesterId, DistributeSemesterVo::getBaseSemesterId)
+                .selectAs(BaseSemester::getName, DistributeSemesterVo::getBaseSemesterIdCn)
+                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
+                .leftJoin(BaseSemester.class, BaseSemester::getId, WfTextbookClaim::getBaseSemesterId)
+                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                ;
+
+        List<DistributeSemesterVo> distributeSemesterVoList = wfTextbookClaimService.selectJoinList(DistributeSemesterVo.class, wfTextbookClaimMPJLambdaWrapper);
+        return RT.ok(distributeSemesterVoList);
+    }
+
+    @GetMapping(value = "/distribute-page")
+    @ApiOperation(value="教材发放列表(移动端)")
+    @SaCheckPermission("wftextbookclaim:detail")
+    public RT<PageOutput<DistributePageVo>> distributePage(@Valid DistributePageDto dto){
+        IPage<DistributePageVo> page = wfTextbookClaimService.distributePageVo(dto);;
+        PageOutput<DistributePageVo> pageOutput = ConventPage.getPageOutput(page, DistributePageVo.class);
+        return RT.ok(pageOutput);
+    }
+
     @GetMapping(value = "/page")
     @ApiOperation(value="教材申领列表(分页)")
     @SaCheckPermission("wftextbookclaim:detail")
@@ -71,9 +104,9 @@ public class WfTextbookClaimController {
     }
 
     @GetMapping(value = "/info-distribute")
-    @ApiOperation(value="教材发放页详情")
+    @ApiOperation(value = "教材发放页详情")
     @SaCheckPermission("wftextbookclaim:detail")
-    public RT<WfTextbookClaimVo> infoDistribute(@RequestParam Long id){
+    public RT<WfTextbookClaimVo> infoDistribute(@RequestParam Long id) {
         WfTextbookClaimVo wfTextbookClaimVo = wfTextbookClaimService.infoDistribute(id);
         if (wfTextbookClaimVo == null) {
             return RT.error("没有发放数据!");
@@ -81,7 +114,6 @@ public class WfTextbookClaimController {
         return RT.ok(BeanUtil.toBean(wfTextbookClaimVo, WfTextbookClaimVo.class));
     }
 
-
     @PostMapping
     @ApiOperation(value = "新增教材申领")
     @SaCheckPermission("wftextbookclaim:add")

+ 4 - 35
src/main/java/com/xjrsoft/module/textbook/dto/AddTextbookWarehouseRecordDto.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.List;
 
 
 /**
@@ -18,40 +19,8 @@ public class AddTextbookWarehouseRecordDto implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
-    /**
-    * 教材管理编号
-    */
-    @ApiModelProperty("教材管理编号")
-    private Long textbookId;
-    /**
-    * 入库数量
-    */
-    @ApiModelProperty("入库数量")
-    private Integer warehouseNumber;
-    /**
-    * 来源
-    */
-    @ApiModelProperty("来源")
-    private String source;
-    /**
-    * 定价(元)
-    */
-    @ApiModelProperty("定价(元)")
-    private BigDecimal price;
-    /**
-    * 折扣
-    */
-    @ApiModelProperty("折扣")
-    private Double discount;
-    /**
-    * 小计(元)
-    */
-    @ApiModelProperty("小计(元)")
-    private BigDecimal subtotal;
-    /**
-    * 总价(元)
-    */
-    @ApiModelProperty("总价(元)")
-    private BigDecimal totalPrice;
+    @ApiModelProperty("学期")
+    public Long baseSemesterId;
 
+    List<TextbookWarehouseTextbooksDto> textbookWarehouseTextbooksDtos;
 }

+ 13 - 13
src/main/java/com/xjrsoft/module/textbook/dto/ConfirmDistributeDto.java

@@ -53,7 +53,11 @@ public class ConfirmDistributeDto{
          */
         @ApiModelProperty("教材主键编号")
         private Long textbookId;
-
+        /**
+         * 教材主键编号
+         */
+        @ApiModelProperty("教材主键编号")
+        private String textbookIdCn;
         /**
          * 教材申领项主键编号
          */
@@ -61,12 +65,10 @@ public class ConfirmDistributeDto{
         private Long textbookClaimItemId;
 
         /**
-         * 教材征订项主键编号
+         * 入库记录主键编号
          */
-        @ContentStyle(dataFormat = 49)
-        @ExcelProperty("教材征订项主键编号")
-        @ApiModelProperty("教材征订项主键编号")
-        private List<TextbookSubscriptionItems> textbookSubscriptionItems;
+        @ApiModelProperty("入库记录主键编号")
+        private List<TextbookWarehouseRecords> textbookWarehouseRecords;
 
         /**
          * 发放数量
@@ -76,22 +78,20 @@ public class ConfirmDistributeDto{
     }
 
     @Data
-    public static class TextbookSubscriptionItems implements Serializable {
+    public static class TextbookWarehouseRecords implements Serializable {
 
         private static final long serialVersionUID = 1L;
 
         /**
-         * 教材征订项主键编号
+         * 入库记录主键编号
          */
-        @ContentStyle(dataFormat = 49)
-        @ExcelProperty("教材征订项主键编号")
-        @ApiModelProperty("教材征订项主键编号")
-        private String textbookSubscriptionItemId;
+        @ApiModelProperty("入库记录主键编号")
+        private Long textbookWarehouseRecordId;
 
         /**
          * 发放数量
          */
-        @ApiModelProperty("本次发放本书本征订记录中的数量")
+        @ApiModelProperty("本次发放本书本入库记录中的数量")
         private Integer confirmNumber;
     }
 }

+ 31 - 0
src/main/java/com/xjrsoft/module/textbook/dto/DistributePageDto.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+
+/**
+* @title: 教材管理分页查询入参
+* @Author szs
+* @Date: 2023-12-25
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DistributePageDto extends PageInput {
+    @ApiModelProperty("学期ID")
+    private String baseSemesterId;
+
+    @ApiModelProperty("申领类型(xjr_dictionary_item[claim_type])")
+    private String claimType;
+
+    @ApiModelProperty("是否有过发放(1:未发放,2:部分发放,3:全部发放)")
+    private Integer distributeStatus;
+
+    @ApiModelProperty("姓名")
+    private String name;
+}

+ 23 - 0
src/main/java/com/xjrsoft/module/textbook/dto/InstockroomRecordsPageDto.java

@@ -0,0 +1,23 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.NotBlank;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class InstockroomRecordsPageDto extends PageInput {
+    /**
+     * 教材征订记录主键编号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材征订记录主键编号")
+    @ApiModelProperty("教材征订记录主键编号")
+    @NotBlank(message = "征订记录主键为必要字段")
+    private String id;
+}

+ 1 - 0
src/main/java/com/xjrsoft/module/textbook/dto/SubscriptionItemListDistributeDto.java

@@ -20,4 +20,5 @@ public class SubscriptionItemListDistributeDto {
      */
     @ApiModelProperty("教材管理编号")
     private Long textbookId;
+
 }

+ 9 - 1
src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseRecordDetailPageDto.java

@@ -1,5 +1,7 @@
 package com.xjrsoft.module.textbook.dto;
 
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
 import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -22,5 +24,11 @@ import java.util.Date;
 @EqualsAndHashCode(callSuper = false)
 public class TextbookWarehouseRecordDetailPageDto extends PageInput {
 
-
+    /**
+     * 教材入库记录主键id(textbook_warehouse_record)
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    @ApiModelProperty("教材入库记录主键id(textbook_warehouse_record)")
+    private Long textbookWarehouseRecordId;
 }

+ 45 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookWarehouseTextbooksDto.java

@@ -0,0 +1,45 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+* @title: 教材申领
+* @Author szs
+* @Date: 2023-12-26
+* @Version 1.0
+*/
+@Data
+public class TextbookWarehouseTextbooksDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键编号
+     */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long textbookId;
+    /**
+     * 定价(元)
+     */
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+    /**
+     * 折扣
+     */
+    @ApiModelProperty("折扣")
+    private Double discount;
+    /**
+     * 入库数量
+     */
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+
+}

+ 45 - 16
src/main/java/com/xjrsoft/module/textbook/entity/TextbookIssueRecord.java

@@ -2,21 +2,25 @@ 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-27
+* @Author phoenix
+* @Date: 2025-02-11
 * @Version 1.0
 */
 @Data
@@ -75,10 +79,25 @@ public class TextbookIssueRecord implements Serializable {
     @ApiModelProperty("序号")
     private Integer sortCode;
     /**
-     * 教材管理编号
-     */
-    @ApiModelProperty("教材管理编号")
-    private Long textbookId;
+    * 学期主键id
+    */
+    @ApiModelProperty("学期主键id")
+    private Long baseSemesterId;
+    /**
+    * 出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))
+    */
+    @ApiModelProperty("出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))")
+    private String orderNumber;
+    /**
+    * 关联入库主键
+    */
+    @ApiModelProperty("关联入库主键")
+    private Long textbookWarehouseRecordId;
+    /**
+    * 出库方式(xjr_dictionary_item[issue_mode])
+    */
+    @ApiModelProperty("出库方式(xjr_dictionary_item[issue_mode])")
+    private String issueMode;
     /**
     * 数据编号(根据出库方式,编号来自不同数据表)
     */
@@ -90,15 +109,30 @@ public class TextbookIssueRecord implements Serializable {
     @ApiModelProperty("数据项项编号(根据出库方式,编号来自不同数据表)")
     private Long dataItemId;
     /**
+    * 教材管理编号
+    */
+    @ApiModelProperty("教材管理编号")
+    private Long textbookId;
+    /**
     * 出库数量
     */
     @ApiModelProperty("出库数量")
     private Integer issueNumber;
     /**
-    * 剩余数量
+    * 领取后退书数量
+    */
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
+    /**
+    * 实际出库数量
     */
-    @ApiModelProperty("剩余数量")
-    private Integer remainingNumber;
+    @ApiModelProperty("实际出库数量")
+    private Integer actualIssueNumber;
+    /**
+    * 实际出库总金额
+    */
+    @ApiModelProperty("实际出库总金额")
+    private BigDecimal actualTotalPrice;
     /**
     * 领取用户编号
     */
@@ -110,11 +144,6 @@ public class TextbookIssueRecord implements Serializable {
     @ApiModelProperty("出库用户编号")
     private Long issueUserId;
     /**
-    * 出库方式(xjr_dictionary_item[issue_mode])
-    */
-    @ApiModelProperty("出库方式(xjr_dictionary_item[issue_mode])")
-    private String issueMode;
-    /**
     * 备注
     */
     @ApiModelProperty("备注")

+ 3 - 2
src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java

@@ -78,6 +78,9 @@ public class TextbookWarehouseRecord implements Serializable {
     */
     @ApiModelProperty("序号")
     private Integer sortCode;
+
+    @ApiModelProperty("学期")
+    public Long baseSemesterId;
     /**
     * 入库方式(xjr_dictionary_item[warehouse_mode])
     */
@@ -168,6 +171,4 @@ public class TextbookWarehouseRecord implements Serializable {
     */
     @ApiModelProperty("剩余库存数量")
     private Integer remainNumber;
-
-
 }

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

@@ -25,6 +25,8 @@ public interface ITextbookSubscriptionService extends MPJBaseService<TextbookSub
      */
     IPage<TextbookSubscriptionPageVo> pageRubAndHand(TextbookSubscriptionPageDto dto);
 
+    IPage<InstockroomRecordsPageVo> instockroomRecordsPage(InstockroomRecordsPageDto dto);
+
     /**
      * 入库页面
      * @param dto

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

@@ -2,6 +2,7 @@ package com.xjrsoft.module.textbook.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
 import com.xjrsoft.module.textbook.dto.TextbookWarehouseRecordExportDto;
 import com.xjrsoft.module.textbook.dto.TextbookWarehouseRecordPageDto;
 import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecord;
@@ -20,6 +21,8 @@ public interface ITextbookWarehouseRecordService extends MPJBaseService<Textbook
 
     IPage<TextbookWarehouseRecordPageVo> getPage(TextbookWarehouseRecordPageDto dto);
 
+    Boolean textbookWarehouse(AddTextbookWarehouseRecordDto dto);
+
     List<TextbookWarehouseRecordPageVo> getList(TextbookWarehouseRecordExportDto dto);
 
     List<TextbookWarehouseRecordPageVo> getList();

+ 4 - 0
src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookClaimService.java

@@ -3,8 +3,10 @@ package com.xjrsoft.module.textbook.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
+import com.xjrsoft.module.textbook.dto.DistributePageDto;
 import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
 import com.xjrsoft.module.textbook.entity.WfTextbookClaim;
+import com.xjrsoft.module.textbook.vo.DistributePageVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo;
 import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo;
 
@@ -19,6 +21,8 @@ import java.util.List;
 
 public interface IWfTextbookClaimService extends MPJBaseService<WfTextbookClaim> {
 
+    IPage<DistributePageVo> distributePageVo(DistributePageDto dto);
+
     /**
     * 新增
     *

+ 66 - 18
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java

@@ -86,6 +86,49 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
         return this.selectJoinListPage(ConventPage.getPage(dto), TextbookSubscriptionPageVo.class, queryWrapper);
     }
 
+    @Override
+    public IPage<InstockroomRecordsPageVo> instockroomRecordsPage(InstockroomRecordsPageDto dto) {
+        MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookWarehouseRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(InstockroomRecordsPageVo.class).contains(x.getProperty()))
+                .selectAs(TextbookWarehouseRecord::getDiscount, InstockroomRecordsPageVo::getActualDiscount)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, InstockroomRecordsPageVo::getActualPrice)
+                .selectAs(TextbookWarehouseRecordDetail::getWarehouseNumber, InstockroomRecordsPageVo::getWarehouseNumber)
+                .selectAs(TextbookWarehouseRecordDetail::getCreateDate, InstockroomRecordsPageVo::getCreateDate)
+                .innerJoin(TextbookWarehouseRecordDetail.class, TextbookWarehouseRecordDetail::getTextbookWarehouseRecordId, TextbookWarehouseRecord::getId)
+                .leftJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId)
+                .leftJoin(TextbookSubscriptionItem.class, TextbookSubscriptionItem::getId, TextbookWarehouseRecord::getDataItemId,
+                        wrapper -> wrapper
+                                .selectAs(TextbookSubscriptionItem::getStudentNum, InstockroomRecordsPageVo::getStudentNum)
+                                .selectAs(TextbookSubscriptionItem::getTeacherNum, InstockroomRecordsPageVo::getTeacherNum)
+                                .select("t3.student_num + t3.teacher_num as tatol_num")
+                        )
+                .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
+                        wrapper -> wrapper
+                                .selectAs(BaseCourseSubject::getName, InstockroomRecordsPageVo::getCourseSubjectIdCn)
+                        )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getTextbookTypeCn)
+                )
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecordDetail::getWarehouseMode,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, InstockroomRecordsPageVo::getWarehouseModeCn)
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookWarehouseRecordDetail::getCreateUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, InstockroomRecordsPageVo::getCreateUserIdCn)
+                )
+                .eq(TextbookWarehouseRecord::getDataId, dto.getId())
+                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(TextbookWarehouseRecordDetail::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(Textbook::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
+                ;
+        return textbookWarehouseRecordMapper.selectJoinPage(ConventPage.getPage(dto), InstockroomRecordsPageVo.class, textbookWarehouseRecordMPJLambdaWrapper);
+    }
+
     @Override
     public List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto) {
         MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
@@ -272,16 +315,20 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
 
     @Override
     public List<SubscriptionItemListDistributeVo> itemListConfirmDistribute(SubscriptionItemListDistributeDto dto) {
-        MPJLambdaWrapper<TextbookSubscriptionItem> textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
-        textbookSubscriptionItemMPJLambdaWrapper
-                .select(TextbookSubscriptionItem::getId)
-                .selectAs(TextbookSubscriptionItem::getPrice, SubscriptionItemListDistributeVo::getActulPrice)
-                .select(TextbookSubscriptionItem.class,x -> VoToColumnUtil.fieldsToColumns(SubscriptionItemListDistributeVo.class).contains(x.getProperty()))
-                .eq(TextbookSubscriptionItem::getTextbookId, dto.getTextbookId())
-                .gt(TextbookSubscriptionItem::getInStockNum, TextbookSubscriptionItem::getOutStockNum)
+        MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookWarehouseRecordMPJLambdaWrapper
+                .select(TextbookWarehouseRecord::getId)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, SubscriptionItemListDistributeVo::getActulPrice)
+                .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(SubscriptionItemListDistributeVo.class).contains(x.getProperty()))
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecord::getWarehouseMode,
+                    wrapper -> wrapper
+                            .selectAs(DictionaryDetail::getName, SubscriptionItemListDistributeVo::getWarehouseModeCn)
+                )
+                .eq(TextbookWarehouseRecord::getTextbookId, dto.getTextbookId())
+                .gt(TextbookWarehouseRecord::getRemainNumber, 0)
                 .orderByAsc(TextbookSubscriptionItem::getCreateDate)
         ;
-        return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinList(SubscriptionItemListDistributeVo.class, textbookSubscriptionItemMPJLambdaWrapper);
+        return textbookWarehouseRecordMapper.selectJoinList(SubscriptionItemListDistributeVo.class, textbookWarehouseRecordMPJLambdaWrapper);
     }
 
     @Override
@@ -314,17 +361,17 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 .last("limit 1")
                 ;
         TextbookSubscription maxOrderNumber = textbookSubscriptionTextbookSubscriptionMapper.selectOne(textbookSubscriptionLambdaQueryWrapper);
+        int oldOrderInteger = 1;
         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 = Integer.parseInt(oldOrder);
             oldOrderInteger += 1;
-            String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
-            sb.append(newOrder);
-        }else {
-            sb.append("001");
         }
-        textbookSubscription.setOrderNumber(sb.toString());
+
+        String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+        textbookSubscription.setOrderNumber(sb + newOrder);
+
 
         textbookSubscriptionTextbookSubscriptionMapper.insert(textbookSubscription);
 
@@ -485,6 +532,7 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 //新增入库记录
                 textbookWarehouseRecord = new TextbookWarehouseRecord();
                 textbookWarehouseRecord.setId(textbookWarehouseRecordId);
+                textbookWarehouseRecord.setBaseSemesterId(textbookSubscription.getBaseSemesterId());
                 textbookWarehouseRecord.setTextbookId(old.getTextbookId());
                 textbookWarehouseRecord.setDataId(dto.getTextbookSubscriptionId());
                 textbookWarehouseRecord.setDataItemId(dto.getTextbookSubscriptionItemId());
@@ -495,8 +543,7 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 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.setOrderNumber(sb + newOrder);
                 textbookWarehouseRecord.setReturnBookstoreNumber(0);
                 textbookWarehouseRecord.setActualWarehouseNumber(textbookWarehouseRecord.getWarehouseNumber() - textbookWarehouseRecord.getReturnBookstoreNumber());
                 textbookWarehouseRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(textbookWarehouseRecord.getActualWarehouseNumber())));
@@ -504,8 +551,8 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                 textbookWarehouseRecord.setRecedeNumber(0);
                 textbookWarehouseRecord.setRemainNumber(textbookWarehouseRecord.getActualWarehouseNumber());
                 textbookWarehouseRecord.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
-                updateItem.setCreateDate(new Date());
-                updateItem.setCreateUserId(StpUtil.getLoginIdAsLong());
+                textbookWarehouseRecord.setCreateDate(new Date());
+                textbookWarehouseRecord.setCreateUserId(StpUtil.getLoginIdAsLong());
                 textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
             }else {
                 textbookWarehouseRecordId = oldTextbookWarehouseRecord.getId();
@@ -525,6 +572,7 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
             textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmSubscription.getCode());
             textbookWarehouseRecordDetail.setWarehouseNumber(dto.getInNum());
+            textbookWarehouseRecordDetail.setCreateDate(new Date());
             textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
         }
 

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

@@ -1,11 +1,15 @@
 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.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.DeleteMark;
 import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
@@ -18,8 +22,10 @@ import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.AddTextbookWarehouseRecordDto;
 import com.xjrsoft.module.textbook.dto.TextbookWarehouseRecordExportDto;
 import com.xjrsoft.module.textbook.dto.TextbookWarehouseRecordPageDto;
+import com.xjrsoft.module.textbook.dto.TextbookWarehouseTextbooksDto;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.TextbookMapper;
+import com.xjrsoft.module.textbook.mapper.TextbookWarehouseRecordDetailMapper;
 import com.xjrsoft.module.textbook.mapper.TextbookWarehouseRecordMapper;
 import com.xjrsoft.module.textbook.service.ITextbookWarehouseRecordService;
 import com.xjrsoft.module.textbook.vo.SubscriptionItemListDistributeVo;
@@ -31,6 +37,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 import java.util.Date;
 import java.util.List;
 
@@ -46,6 +55,8 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
 
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
+    private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper;
+
     @Override
     public IPage<TextbookWarehouseRecordPageVo> getPage(TextbookWarehouseRecordPageDto dto) {
         MPJLambdaWrapper<TextbookWarehouseRecord> textbookWarehouseRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
@@ -54,11 +65,13 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
                 .select(TextbookWarehouseRecord::getId)
                 .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
                 .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
+                .selectAs(TextbookWarehouseRecord::getPrice, TextbookWarehouseRecordPageVo::getPrice)
+                .selectAs(TextbookWarehouseRecord::getDiscount, TextbookWarehouseRecordPageVo::getDiscount)
+                .selectAs(TextbookWarehouseRecord::getCreateDate, TextbookWarehouseRecordPageVo::getCreateDate)
                 .innerJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId)
-                .leftJoin(TextbookSubscription.class, TextbookSubscription::getId, TextbookWarehouseRecord::getDataId,
+                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookWarehouseRecord::getBaseSemesterId,
                         wrapper -> wrapper
                                 .selectAs(BaseSemester::getName, TextbookWarehouseRecordPageVo::getBaseSemesterIdCn)
-                                .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookSubscription::getBaseSemesterId)
                         )
                 .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, TextbookWarehouseRecord::getWarehouseMode,
                         wrapper -> wrapper
@@ -89,6 +102,75 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
 //        return textbookWarehouseRecordMapper.getPage(page, dto);
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean textbookWarehouse(AddTextbookWarehouseRecordDto dto) {
+        if(ObjectUtils.isEmpty(dto.getTextbookWarehouseTextbooksDtos())){
+            throw new MyException("添加的教材无效,请重新选择。");
+        }
+
+        // 处理入库单号
+        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 + "%")
+                .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);
+        }
+
+        TextbookWarehouseRecord textbookWarehouseRecord;
+        TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
+        for (TextbookWarehouseTextbooksDto td : dto.getTextbookWarehouseTextbooksDtos()){
+            //新增入库记录
+            long textbookWarehouseRecordId = IdUtil.getSnowflakeNextId();
+            textbookWarehouseRecord = new TextbookWarehouseRecord();
+            textbookWarehouseRecord.setId(textbookWarehouseRecordId);
+            textbookWarehouseRecord.setTextbookId(td.getTextbookId());
+            textbookWarehouseRecord.setBaseSemesterId(dto.getBaseSemesterId());
+            textbookWarehouseRecord.setWarehouseNumber(td.getWarehouseNumber());
+            textbookWarehouseRecord.setPrice(td.getPrice());
+            textbookWarehouseRecord.setDiscount(td.getDiscount());
+            textbookWarehouseRecord.setSubtotal(td.getPrice().multiply(BigDecimal.valueOf(td.getDiscount() / 10)));
+            textbookWarehouseRecord.setTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(td.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.WmManual.getCode());
+            textbookWarehouseRecord.setCreateDate(new Date());
+            textbookWarehouseRecord.setCreateUserId(StpUtil.getLoginIdAsLong());
+            textbookWarehouseRecordMapper.insert(textbookWarehouseRecord);
+
+            // 新增教材入库记录详细入库记录
+            textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
+            textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(textbookWarehouseRecordId);
+            textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmManual.getCode());
+            textbookWarehouseRecordDetail.setWarehouseNumber(td.getWarehouseNumber());
+            textbookWarehouseRecordDetail.setCreateDate(new Date());
+            textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
+        }
+        return true;
+    }
+
     @Override
     public List<TextbookWarehouseRecordPageVo> getList(TextbookWarehouseRecordExportDto dto) {
         return textbookWarehouseRecordMapper.getList(dto);

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

@@ -1,41 +1,43 @@
 package com.xjrsoft.module.textbook.service.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
-import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.xjrsoft.common.enums.ClaimTypeEnum;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.IssueModeEnum;
+import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.SortCodeUtil;
-import com.xjrsoft.module.organization.mapper.RoleMapper;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
 import com.xjrsoft.module.textbook.dto.ConfirmDistributeDto;
+import com.xjrsoft.module.textbook.dto.DistributePageDto;
 import com.xjrsoft.module.textbook.dto.WfTextbookClaimPageDto;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
-import com.xjrsoft.module.textbook.service.ITextbookIssueRecordService;
-import com.xjrsoft.module.textbook.service.ITextbookService;
-import com.xjrsoft.module.textbook.service.ITextbookStudentClaimService;
 import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
-import com.xjrsoft.module.textbook.vo.WfTextbookClaimItemVo;
-import com.xjrsoft.module.textbook.vo.WfTextbookClaimPageVo;
-import com.xjrsoft.module.textbook.vo.WfTextbookClaimVo;
+import com.xjrsoft.module.textbook.vo.*;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
-import org.glassfish.jersey.server.internal.process.MappableException;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.util.ObjectUtils;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -55,8 +57,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
 
     private final TextbookMapper textbookMapper;
 
-    private final TextbookStudentClaimMapper textbookStudentClaimMapper;
-
     private final TextbookSubscriptionItemMapper textbookSubscriptionItemMapper;
 
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
@@ -65,6 +65,79 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
 
     private final ClaimItemSubscriptionItemMapper claimItemSubscriptionItemMapper;
 
+    private final WorkflowFormRelationMapper workflowFormRelationMapper;
+    private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
+
+    @Override
+    public IPage<DistributePageVo> distributePageVo(DistributePageDto dto) {
+        MPJLambdaWrapper<WfTextbookClaim> wfTextbookClaimMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        wfTextbookClaimMPJLambdaWrapper
+                .disableSubLogicDel()
+                .select(WfTextbookClaim::getId)
+                .select(WfTextbookClaim.class,x -> VoToColumnUtil.fieldsToColumns(DistributePageVo.class).contains(x.getProperty()))
+                .innerJoin(WorkflowFormRelation.class, WorkflowFormRelation::getFormKeyValue, WfTextbookClaim::getId)
+                .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, WfTextbookClaim::getClaimType,
+                        wrapper -> wrapper
+                                .selectAs(DictionaryDetail::getName, DistributePageVo::getClaimTypeCn)
+                )
+                .leftJoin(XjrUser.class, XjrUser::getId, WfTextbookClaim::getApplicantUserId,
+                        wrapper -> wrapper
+                                .selectAs(XjrUser::getName, DistributePageVo::getApplicantUserIdCn)
+                )
+                .leftJoin(BaseClass.class, BaseClass::getId, WfTextbookClaim::getClassId,
+                        wrapper -> wrapper
+                                .selectAs(BaseClass::getName, DistributePageVo::getClassIdCn)
+                )
+                .eq(WorkflowFormRelation::getCurrentState, HistoricProcessInstance.STATE_COMPLETED)
+                .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
+                .eq(StringUtils.isNotEmpty(dto.getClaimType()), WfTextbookClaim::getClaimType, dto.getClaimType())
+                .eq(ObjectUtils.isNotEmpty(dto.getDistributeStatus()), WfTextbookClaim::getStatus, dto.getDistributeStatus())
+                .ne(ObjectUtils.isEmpty(dto.getDistributeStatus()), WfTextbookClaim::getStatus, 1)
+                .and(StringUtils.isNotEmpty(dto.getName()),
+                        wrapper -> wrapper
+                                .like(XjrUser::getName, dto.getName())
+                                .or()
+                                .like(BaseClass::getName, dto.getName())
+                        )
+        ;
+        IPage<DistributePageVo> page = this.selectJoinListPage(ConventPage.getPage(dto), DistributePageVo.class, wfTextbookClaimMPJLambdaWrapper);
+
+        List<DistributePageVo> distributePageVos = page.getRecords();
+        // 处理申领总数量和已经发放总数量
+        if(ObjectUtils.isNotEmpty(distributePageVos)){
+            List<Long> textbookClaimIds = distributePageVos.stream()
+                    .map(DistributePageVo::getId)
+                    .collect(Collectors.toList());
+            Map<Long, WfTextbookClaimItem> applicantTatolNumberMap = new HashMap<>();
+            WfTextbookClaimItem wfTextbookClaimItem;
+            if(ObjectUtils.isNotEmpty(distributePageVos)){
+                MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemLambdaQueryWrapper = new MPJLambdaWrapper<>();
+                wfTextbookClaimItemLambdaQueryWrapper
+                        .selectAs(WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaimItem::getWfTextbookClaimId)
+                        .selectSum(WfTextbookClaimItem::getApplicantNumber, WfTextbookClaimItem::getApplicantNumber)
+                        .selectSum(WfTextbookClaimItem::getIssueNumber, WfTextbookClaimItem::getIssueNumber)
+                        .in(WfTextbookClaimItem::getWfTextbookClaimId, textbookClaimIds)
+                        .groupBy(WfTextbookClaimItem::getWfTextbookClaimId)
+                ;
+                List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaimWfTextbookClaimItemMapper.selectJoinList(WfTextbookClaimItem.class, wfTextbookClaimItemLambdaQueryWrapper);
+                if(ObjectUtils.isNotEmpty(wfTextbookClaimItemList)){
+                    applicantTatolNumberMap = wfTextbookClaimItemList.stream()
+                            .collect(Collectors.toMap(WfTextbookClaimItem::getWfTextbookClaimId, w -> w, (w1, w2) -> w1));
+                }
+            }
+            if(ObjectUtils.isNotEmpty(applicantTatolNumberMap)){
+                for(DistributePageVo distributePageVo : page.getRecords()){
+                    wfTextbookClaimItem = applicantTatolNumberMap.get(distributePageVo.getId());
+                    if(ObjectUtils.isNotEmpty(wfTextbookClaimItem)){
+                        distributePageVo.setApplicantTatolNumber(wfTextbookClaimItem.getApplicantNumber());
+                        distributePageVo.setIssueTatolNumber(wfTextbookClaimItem.getIssueNumber());
+                    }
+                }
+            }
+        }
+        return page;
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(WfTextbookClaim wfTextbookClaim) {
@@ -130,7 +203,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         for (WfTextbookClaimPageVo wfTextbookClaimPageVo : page.getRecords()) {
             //拆分代领取人
             String receiveUserIdStr = wfTextbookClaimPageVo.getReceiveUserId();
-            if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.isEmpty()) {
+            if (ObjectUtils.isNotEmpty(receiveUserIdStr) && !receiveUserIdStr.isEmpty()) {
                 String[] receiveUserIdStrs = receiveUserIdStr.split(",");
                 List<Long> receiveUserIdList = new ArrayList<>();
                 for (String str : receiveUserIdStrs) {
@@ -140,7 +213,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 queryWrapper
                         .in(XjrUser::getId, receiveUserIdList);
                 List<XjrUser> xjrUserList = xjrUserMapper.selectList(queryWrapper);
-                if (ObjectUtil.isNotNull(xjrUserList) && !xjrUserList.isEmpty()) {
+                if (ObjectUtils.isNotEmpty(xjrUserList) && !xjrUserList.isEmpty()) {
                     StringBuilder sb = new StringBuilder();
                     for (int i = 0; i < xjrUserList.size(); i++) {
                         if(i == 0){
@@ -155,7 +228,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             //加上申领项
             List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimPageVo.getId()));
 
-            if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && !wfTextbookClaimItemVoList.isEmpty()) {
+            if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVoList) && !wfTextbookClaimItemVoList.isEmpty()) {
                 wfTextbookClaimPageVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
             }
         }
@@ -165,10 +238,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     @Override
     public WfTextbookClaimVo infoDistribute(Long id) {
         WfTextbookClaimVo wfTextbookClaimVo = wfTextbookClaimWfTextbookClaimMapper.infoDistribute(id);
-        if (ObjectUtil.isNotNull(wfTextbookClaimVo)) {
+        if (ObjectUtils.isNotEmpty(wfTextbookClaimVo)) {
             //拆分代领人
             String receiveUserIdStr = wfTextbookClaimVo.getReceiveUserId();
-            if (ObjectUtil.isNotNull(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
+            if (ObjectUtils.isNotEmpty(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
                 String[] receiveUserIdStrs = receiveUserIdStr.split(",");
                 List<Long> receiveUserIdList = new ArrayList<>();
                 for (String str : receiveUserIdStrs) {
@@ -178,7 +251,7 @@ 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 (ObjectUtils.isNotEmpty(xjrUserList) && xjrUserList.size() > 0) {
                     StringBuilder sb = new StringBuilder();
                     for (XjrUser xjrUser : xjrUserList) {
                         sb.append("," + xjrUser.getName());
@@ -189,7 +262,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             //加上申领项
             List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimVo.getId()));
 
-            if (ObjectUtil.isNotNull(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
+            if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
                 wfTextbookClaimVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
             }
         }
@@ -199,83 +272,138 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean confirmDistribute(ConfirmDistributeDto dto) {
-        WfTextbookClaim wfTextbookClaim = this.getById(dto.getTextbookClaimId());
-
-        if (ObjectUtil.isNull(wfTextbookClaim) || ObjectUtil.isNull(dto.getTextbookClaimItemList()) || dto.getTextbookClaimItemList().size() == 0) {
+        WfTextbookClaim wfTextbookClaim = this.getByIdDeep(dto.getTextbookClaimId());
+        List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaim.getWfTextbookClaimItemList();
+
+        // 获取所有入库记录
+        List<TextbookWarehouseRecord> textbookWarehouseRecordList = textbookWarehouseRecordMapper.selectList(
+            Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
+                    .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+
+        Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordMap = textbookWarehouseRecordList.stream()
+                .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1,t2) -> t1));
+
+        if (ObjectUtils.isEmpty(wfTextbookClaim)
+                || ObjectUtils.isEmpty(dto.getTextbookClaimItemList())
+                || dto.getTextbookClaimItemList().isEmpty()
+                || wfTextbookClaimItemList.isEmpty()
+        ) {
             throw new MyException("未找到申领数据");
         }
 
+        Map<Long, WfTextbookClaimItem> wfTextbookClaimItemMap = wfTextbookClaimItemList.stream()
+                .collect(Collectors.toMap(WfTextbookClaimItem::getId, w -> w, (w1, w2) -> w1));
+
+        // 处理出库单号
+        StringBuilder sb = new StringBuilder();
+        sb.append("CK");
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String nowStr = now.format(dateTimeFormatter);
+        sb.append(nowStr);
+        int oldOrderInteger = 0;
+        int oldOrderLastInteger = 0;
+
+
         //操作每一个申领项
         for (ConfirmDistributeDto.TextbookClaimItem textbookClaimItem : dto.getTextbookClaimItemList()) {
+//            WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimWfTextbookClaimItemMapper.selectById(textbookClaimItem.getTextbookClaimItemId());
+            WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimItemMap.get(textbookClaimItem.getTextbookClaimItemId());
 
-            WfTextbookClaimItem wfTextbookClaimItem = wfTextbookClaimWfTextbookClaimItemMapper.selectById(textbookClaimItem.getTextbookClaimItemId());
-
-            if (ObjectUtil.isNull(wfTextbookClaimItem)) {
+            if (ObjectUtils.isEmpty(wfTextbookClaimItem)) {
                 throw new MyException("未找到申领项详细数据");
             }
 
-            Textbook textbook = textbookMapper.selectById(textbookClaimItem.getTextbookId());
-            if (ObjectUtil.isNull(textbook)) {
-                throw new MyException("未找到相关教材数据");
-            }
-
             //判断总发放数量是否超出该申请项的申请数量
-            Integer issueNumber = ObjectUtil.isNull(wfTextbookClaimItem.getIssueNumber()) ? 0 : wfTextbookClaimItem.getIssueNumber();//已发放
-            Integer applicantNumber = ObjectUtil.isNull(wfTextbookClaimItem.getApplicantNumber()) ? 0 : wfTextbookClaimItem.getApplicantNumber();//申领总数量
-            Integer confirmNumber = ObjectUtil.isNull(textbookClaimItem.getConfirmTotalNumber()) ? 0 : textbookClaimItem.getConfirmTotalNumber();//本次发放
+            int issueNumber = ObjectUtils.isEmpty(wfTextbookClaimItem.getIssueNumber()) ? 0 : wfTextbookClaimItem.getIssueNumber();//已发放
+            int applicantNumber = ObjectUtils.isEmpty(wfTextbookClaimItem.getApplicantNumber()) ? 0 : wfTextbookClaimItem.getApplicantNumber();//申领总数量
+            int confirmNumber = ObjectUtils.isEmpty(textbookClaimItem.getConfirmTotalNumber()) ? 0 : textbookClaimItem.getConfirmTotalNumber();//本次发放
             if (issueNumber + confirmNumber > applicantNumber) {
-                throw new MyException(textbook.getBookName() + "发放总数量超出申领数量");
+                throw new MyException(textbookClaimItem.getTextbookIdCn() + "发放总数量超出申领数量");
             }
 
-            for (ConfirmDistributeDto.TextbookSubscriptionItems textbookSubscriptionItems : textbookClaimItem.getTextbookSubscriptionItems()){
-                TextbookSubscriptionItem textbookSubscriptionItem = textbookSubscriptionItemMapper.selectById(textbookSubscriptionItems.getTextbookSubscriptionItemId());
-                if (ObjectUtils.isEmpty(textbookSubscriptionItem)) {
-                    throw new MyException("未找到征订项详细数据");
+            TextbookIssueRecord textbookIssueRecord;
+            for (ConfirmDistributeDto.TextbookWarehouseRecords textbookWarehouseRecords : textbookClaimItem.getTextbookWarehouseRecords()){
+                TextbookWarehouseRecord textbookWarehouseRecord = textbookWarehouseRecordMap.get(textbookWarehouseRecords.getTextbookWarehouseRecordId());
+                if (ObjectUtils.isEmpty(textbookWarehouseRecord)) {
+                    throw new MyException("未找到入库详细数据");
                 }
 
-                //更新教材征订中的的库存数量
-                textbookSubscriptionItemMapper.updateById(new TextbookSubscriptionItem() {{
+                //更新教材入库中的的库存数量
+                textbookWarehouseRecordMapper.updateById(new TextbookWarehouseRecord() {{
                     setModifyUserId(StpUtil.getLoginIdAsLong());
                     setModifyDate(new Date());
-                    setId(textbookSubscriptionItem.getId());
-                    setOutStockNum(ObjectUtil.isNull(textbookSubscriptionItem.getOutStockNum()) ? 0 : textbookSubscriptionItem.getOutStockNum()
+                    setId(textbookWarehouseRecord.getId());
+                    setIssuedNumber(ObjectUtils.isEmpty(textbookWarehouseRecord.getIssuedNumber()) ? 0 : textbookWarehouseRecord.getIssuedNumber()
                              + confirmNumber);
+                    setRemainNumber(ObjectUtils.isEmpty(textbookWarehouseRecord.getRemainNumber()) ? 0 : textbookWarehouseRecord.getRemainNumber()
+                            - confirmNumber
+                    );
                 }});
 
-                claimItemSubscriptionItemMapper.insert(new ClaimItemSubscriptionItem(){{
-                    setWfTextbookClaimItemId(wfTextbookClaimItem.getId());
-                    setTextbookSubscriptionItemId(textbookSubscriptionItem.getId());
-                    setIssueNumber(confirmNumber);
-                }});
-            }
-
-            //增加出库记录
-            textbookIssueRecordMapper.insert(new TextbookIssueRecord() {{
-                setCreateDate(new Date());
-                if (ObjectUtil.isNotNull(wfTextbookClaim.getClaimType()) && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())) {
-                    setIssueMode(IssueModeEnum.Imtudent.getCode());
+                oldOrderInteger += 1;
+                String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+                String oldPrex = sb + newOrder + "-";
+                //增加出库记录
+                textbookIssueRecord = new TextbookIssueRecord();
+                textbookIssueRecord.setBaseSemesterId(wfTextbookClaim.getBaseSemesterId());
+
+                // 处理出库单号
+                // 根据当前申领项主键id和入库主键id查找时候已经有了出库记录
+                LambdaQueryWrapper<TextbookIssueRecord> maxOrderNumberLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                maxOrderNumberLambdaQueryWrapper
+                        .eq(TextbookIssueRecord::getDataItemId, wfTextbookClaimItem.getId())
+                        .eq(TextbookIssueRecord::getTextbookWarehouseRecordId, textbookWarehouseRecord.getId())
+                        .eq(TextbookIssueRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .orderByDesc(TextbookIssueRecord::getOrderNumber)
+                        .last("limit 1")
+                ;
+                TextbookIssueRecord maxOrderNumber = textbookIssueRecordMapper.selectOne(maxOrderNumberLambdaQueryWrapper);
+                if(ObjectUtils.isNotEmpty(maxOrderNumber)
+                        && ObjectUtils.isNotEmpty(maxOrderNumber.getOrderNumber())
+                ){
+                    String oldOrderNumber = maxOrderNumber.getOrderNumber();
+                    oldPrex = oldOrderNumber.substring(0, oldOrderNumber.length() - 3);
+                    oldOrderInteger -= 1;
+                    String oldOrder = oldOrderNumber.substring(oldOrderNumber.length() - 3);
+                    oldOrderLastInteger = Integer.parseInt(oldOrder);
                 }
-                if (ObjectUtil.isNotNull(wfTextbookClaim.getClaimType()) && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimTeacher.getCode())) {
-                    setIssueMode(IssueModeEnum.ImTeacher.getCode());
+                oldOrderLastInteger += 1;
+                String newLastOrder = String.format("%03d", oldOrderLastInteger); // 补零并格式化为三位数
+
+                textbookIssueRecord.setOrderNumber(oldPrex + newLastOrder);
+                if (ObjectUtils.isNotEmpty(wfTextbookClaim.getClaimType())
+                        && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())
+                        && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimClass.getCode())
+                ) {
+                    textbookIssueRecord.setIssueMode(IssueModeEnum.Imtudent.getCode());
                 }
-
-                setDataId(wfTextbookClaim.getId());
-                setDataItemId(wfTextbookClaimItem.getId());
-
-                setTextbookId(wfTextbookClaimItem.getTextbookId());
-                setIssueNumber(confirmNumber);
-
-                setRemainingNumber(applicantNumber - issueNumber - confirmNumber);
-
-                setReceiveUserId(dto.getReceiveUserId());
-                setIssueUserId(StpUtil.getLoginIdAsLong());
-
-                setRemark(dto.getRemark());
-
+                if (ObjectUtils.isNotEmpty(wfTextbookClaim.getClaimType())
+                        && wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimTeacher.getCode())
+                ) {
+                    textbookIssueRecord.setIssueMode(IssueModeEnum.ImTeacher.getCode());
+                }
+                textbookIssueRecord.setDataId(wfTextbookClaim.getId());
+                textbookIssueRecord.setDataItemId(wfTextbookClaimItem.getId());
+                textbookIssueRecord.setTextbookId(wfTextbookClaimItem.getTextbookId());
+                textbookIssueRecord.setIssueNumber(confirmNumber);
+                textbookIssueRecord.setRecedeNumber(0);
+                textbookIssueRecord.setActualIssueNumber(confirmNumber);
+                textbookIssueRecord.setActualTotalPrice(textbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(confirmNumber)));
+                if(ObjectUtils.isNotEmpty(dto.getReceiveUserId())){
+                    textbookIssueRecord.setReceiveUserId(dto.getReceiveUserId());
+                }else {
+                    textbookIssueRecord.setReceiveUserId(StpUtil.getLoginIdAsLong());
+                }
+                textbookIssueRecord.setIssueUserId(StpUtil.getLoginIdAsLong());
+                textbookIssueRecord.setCreateDate(new Date());;
+                textbookIssueRecord.setRemark(dto.getRemark());
                 int sortCode = SortCodeUtil.getMaxSortCode(textbookIssueRecordMapper, TextbookIssueRecord.class, "sort_code");
+                textbookIssueRecord.setSortCode(sortCode + 1);
 
-                setSortCode(sortCode + 1);
-            }});
+                textbookIssueRecordMapper.insert(textbookIssueRecord);
+            }
 
             //更新申领项中的已经发放数量
             wfTextbookClaimWfTextbookClaimItemMapper.updateById(new WfTextbookClaimItem() {{
@@ -321,19 +449,38 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     @Transactional
     public Boolean dataHandleAddClaimUserNode(Long id) {
         WfTextbookClaim wfTextbookClaim = this.getById(id);
-        if (ObjectUtil.isNotNull(wfTextbookClaim)
-                && ObjectUtil.isNotNull(wfTextbookClaim.getClaimType())) {
+
+        // 根据数据id找到所在流程得状态
+        WorkflowFormRelation workflowFormRelation = workflowFormRelationMapper.selectOne(
+                Wrappers.lambdaQuery(WorkflowFormRelation.class)
+                        .eq(WorkflowFormRelation::getFormKeyValue, id)
+        );
+
+        if (ObjectUtils.isNotEmpty(wfTextbookClaim)
+                && ObjectUtils.isNotEmpty(wfTextbookClaim.getClaimType())
+                && ObjectUtils.isNotEmpty(workflowFormRelation)
+                && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
+        ) {
             //所有需要添加的可领取人ID
             List<TextbookClaimUser> textbookClaimUserList = new ArrayList<>();
+
+            List<String> roleList = StpUtil.getRoleList();
+
             //申领人自己可以领取
             textbookClaimUserList.add(new TextbookClaimUser() {{
                 setCreateDate(new Date());
                 setWfTextbookClaimId(wfTextbookClaim.getId());
                 setUserId(wfTextbookClaim.getApplicantUserId());
-                setUserType(2);
+                if(roleList.contains(RoleEnum.TEACHER.getCode().toString())){
+                    setUserType(2);
+                }
+                if(roleList.contains(RoleEnum.STUDENT.getCode().toString())){
+                    setUserType(1);
+                }
             }});
-            //申领类型是学生申领,学生代表可领取
-            if (wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimStudent.getCode())
+
+            //申领类型是班级申领,学生代表可领取
+            if (ClaimTypeEnum.ClaimClass.getCode().equals(wfTextbookClaim.getClaimType())
                     && !Objects.equals(wfTextbookClaim.getApplicantUserId(), wfTextbookClaim.getStudentUserId())
             ) {
                 textbookClaimUserList.add(new TextbookClaimUser() {{
@@ -343,11 +490,13 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     setUserType(1);
                 }});
             }
+
             //申领类型是教师申领,领取人可领取
-            if (wfTextbookClaim.getClaimType().equals(ClaimTypeEnum.ClaimTeacher.getCode())
-                    && ObjectUtil.isNotNull(wfTextbookClaim.getApplicantUserId())
-                    && ObjectUtil.isNotNull(wfTextbookClaim.getClaimUserId())
-                    && !wfTextbookClaim.getApplicantUserId().equals(wfTextbookClaim.getClaimUserId())) {
+            if (ClaimTypeEnum.ClaimTeacher.getCode().equals(wfTextbookClaim.getClaimType())
+                    && ObjectUtils.isNotEmpty(wfTextbookClaim.getApplicantUserId())
+                    && ObjectUtils.isNotEmpty(wfTextbookClaim.getClaimUserId())
+                    && !wfTextbookClaim.getApplicantUserId().equals(wfTextbookClaim.getClaimUserId())
+            ) {
                 textbookClaimUserList.add(new TextbookClaimUser() {{
                     setCreateDate(new Date());
                     setWfTextbookClaimId(wfTextbookClaim.getId());

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

@@ -0,0 +1,32 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DistributePageVo {
+
+    @ApiModelProperty("主键编号")
+    private Long id;
+
+    @ApiModelProperty("申领类型(xjr_dictionary_item[claim_type])")
+    private String claimTypeCn;
+
+    @ApiModelProperty("申请人")
+    private Long applicantUserId;
+
+    @ApiModelProperty("申请人")
+    private String applicantUserIdCn;
+
+    @ApiModelProperty("班级编号")
+    private Long classId;
+
+    @ApiModelProperty("班级编号")
+    private String classIdCn;
+
+    @ApiModelProperty("申请总数量")
+    private Integer applicantTatolNumber;
+
+    @ApiModelProperty("已经发放总数量")
+    private Integer issueTatolNumber;
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/textbook/vo/DistributeSemesterVo.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DistributeSemesterVo {
+
+    @ApiModelProperty("学期ID")
+    private String baseSemesterId;
+
+    @ApiModelProperty("学期ID")
+    private String baseSemesterIdCn;
+}
+

+ 101 - 0
src/main/java/com/xjrsoft/module/textbook/vo/InstockroomRecordsPageVo.java

@@ -0,0 +1,101 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 教材管理表单出参
+* @Author szs
+* @Date: 2023-12-25
+* @Version 1.0
+*/
+@Data
+public class InstockroomRecordsPageVo {
+    /**
+     * 课程
+     */
+    @ApiModelProperty("课程名称")
+    private String courseSubjectIdCn;
+    /**
+     * 书名
+     */
+    @ApiModelProperty("书名")
+    private String bookName;
+    /**
+     * 国际标准刊号
+     */
+    @ApiModelProperty("国际标准刊号")
+    private String issn;
+    /**
+     * 出版社
+     */
+    @ApiModelProperty("出版社")
+    private String publishingHouse;
+    /**
+     * 主编
+     */
+    @ApiModelProperty("主编")
+    private String editorInChief;
+    /**
+     * 教材类型(xjr_dictionary_item[textbook_type])
+     */
+    @ApiModelProperty("教材类型")
+    private String textbookTypeCn;
+    /**
+     * 定价(元)
+     */
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+    /**
+     * 入库折扣
+     */
+    @ApiModelProperty("入库折扣")
+    private Double actualDiscount;
+    /**
+     * 入库单价
+     */
+    @ApiModelProperty("入库单价")
+    private Double actualPrice;
+    /**
+     * 学生用书征订数量
+     */
+    @ApiModelProperty("学生用书征订数量")
+    private Integer studentNum;
+    /**
+     * 教师用书征订数量
+     */
+    @ApiModelProperty("教师用书征订数量")
+    private Integer teacherNum;
+    /**
+     * 教师用书征订数量
+     */
+    @ApiModelProperty("总征订数量")
+    private Integer tatolNum;
+    /**
+     * 入库方式(xjr_dictionary_item[warehouse_mode])
+     */
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseModeCn;
+    /**
+     * 入库数量
+     */
+    @ApiModelProperty("入库数量")
+    private Integer warehouseNumber;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private String createUserIdCn;
+    /**
+     * 创建时间
+     */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+}

+ 14 - 13
src/main/java/com/xjrsoft/module/textbook/vo/SubscriptionItemListDistributeVo.java

@@ -23,6 +23,16 @@ public class SubscriptionItemListDistributeVo {
     @ExcelProperty("主键编号")
     @ApiModelProperty("主键编号")
     private String id;
+    /**
+     * 入库方式(xjr_dictionary_item[warehouse_mode])
+     */
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseModeCn;
+    /**
+     * 入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)
+     */
+    @ApiModelProperty("入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)")
+    private String orderNumber;
     /**
     * 实际折扣
     */
@@ -38,17 +48,8 @@ public class SubscriptionItemListDistributeVo {
     @ApiModelProperty("实际价格(元)")
     private BigDecimal actulPrice;
     /**
-    * 当前征订任务征订项入库数量
-    */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("当前征订任务征订项入库数量")
-    @ApiModelProperty("当前征订任务征订项入库数量")
-    private Integer inStockNum;
-    /**
-    * 当前征订任务征订项出库数量
-    */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("当前征订任务征订项出库数量")
-    @ApiModelProperty("当前征订任务征订项出库数量")
-    private Integer outStockNum;
+     * 剩余库存数量
+     */
+    @ApiModelProperty("剩余库存数量")
+    private Integer remainNumber;
 }

+ 8 - 36
src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordDetailPageVo.java

@@ -36,7 +36,7 @@ public class TextbookWarehouseRecordDetailPageVo {
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("创建人")
     @ApiModelProperty("创建人")
-    private Long createUserId;
+    private String createUserIdCn;
     /**
     * 创建时间
     */
@@ -45,41 +45,6 @@ public class TextbookWarehouseRecordDetailPageVo {
     @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)
@@ -93,6 +58,13 @@ public class TextbookWarehouseRecordDetailPageVo {
     @ExcelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
     @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
     private String warehouseMode;
+    /**
+     * 入库方式(xjr_dictionary_item[warehouse_mode])
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    @ApiModelProperty("入库方式(xjr_dictionary_item[warehouse_mode])")
+    private String warehouseModeCn;
     /**
     * 入库数量
     */

+ 21 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookWarehouseRecordPageVo.java

@@ -23,6 +23,9 @@ public class TextbookWarehouseRecordPageVo {
     @ApiModelProperty("主键编号")
     private String id;
 
+    @ApiModelProperty("入库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号)")
+    private String orderNumber;
+
     @ApiModelProperty("入库方式")
     private String warehouseModeCn;
 
@@ -73,4 +76,22 @@ public class TextbookWarehouseRecordPageVo {
 
     @ApiModelProperty("总价(元)")
     private BigDecimal totalPrice;
+
+    @ApiModelProperty("退还书店数量")
+    private Integer returnBookstoreNumber;
+
+    @ApiModelProperty("实际入库数量(总入库数量 - 退还书店数量)")
+    private Integer actualWarehouseNumber;
+
+    @ApiModelProperty("实际入库金额(实际入库数量 * 实际价格)")
+    private BigDecimal actualTotalPrice;
+
+    @ApiModelProperty("已出库数量")
+    private Integer issuedNumber;
+
+    @ApiModelProperty("领取后退书数量")
+    private Integer recedeNumber;
+
+    @ApiModelProperty("剩余库存数量")
+    private Integer remainNumber;
 }

+ 9 - 1
src/main/resources/sqlScript/20250120_sql.sql

@@ -168,4 +168,12 @@ create table `textbook_warehouse_record_detail`
     remark           varchar(1000)  null comment '备注'
 ) engine = innodb
   default charset = utf8mb4
-  collate = utf8mb4_0900_ai_ci comment ='教材入库记录详细入库记录';
+  collate = utf8mb4_0900_ai_ci comment ='教材入库记录详细入库记录';
+
+alter table textbook_warehouse_record
+    add base_semester_id bigint null comment '学期主键id' after sort_code;
+
+alter table wf_textbook_claim
+    add textbook_scope int null comment '选择教材范围(1:全部,2:本班)' after class_id;
+
+

+ 73 - 66
src/main/resources/sqlScript/textbook_sql.sql

@@ -5,19 +5,19 @@
 drop table if exists base_class_admin_course;
 create table `base_class_admin_course`
 (
-    id                  bigint        not null comment '主键编号'
+    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 '序号',
-    remark              varchar(1000) null comment '备注',
+    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 '序号',
+    remark           varchar(1000) null comment '备注',
 
-    class_id         bigint      null comment '班级id(base_class)',
-    base_semester_id bigint      null comment '学期id'
+    class_id         bigint        null comment '班级id(base_class)',
+    base_semester_id bigint        null comment '学期id'
 ) engine = innodb
   default charset = utf8mb4
   collate = utf8mb4_0900_ai_ci comment ='需要进行课程管理的班级';
@@ -167,21 +167,21 @@ create table `textbook_subscription_item_history`
     textbook_subscription_id      bigint         not null comment '教材教辅征订编号',
     textbook_subscription_item_id bigint         not null comment '教材教辅征订项编号',
 
-    old_textbook_id                   bigint         null comment '教材表主键(textbook)',
-    old_student_num                   int            null default 0 comment '学生用书征订数量',
-    old_teacher_num                   int            null default 0 comment '教师用书征订数量',
-    old_discount                      float          null default 10 comment '实际折扣',
-    old_price                         decimal(10, 2) null default 0 comment '实际价格(元)',
-    old_in_stock_num                  int            null default 0 comment '当前征订任务征订项入库数量',
-    old_out_stock_num                 int            null default 0 comment '当前征订任务征订项出库数量',
-
-    new_textbook_id                   bigint         null comment '教材表主键(textbook)',
-    new_student_num                   int            null default 0 comment '学生用书征订数量',
-    new_teacher_num                   int            null default 0 comment '教师用书征订数量',
-    new_discount                      float          null default 10 comment '实际折扣',
-    new_price                         decimal(10, 2) null default 0 comment '实际价格(元)',
-    new_in_stock_num                  int            null default 0 comment '当前征订任务征订项入库数量',
-    new_out_stock_num                 int            null default 0 comment '当前征订任务征订项出库数量',
+    old_textbook_id               bigint         null comment '教材表主键(textbook)',
+    old_student_num               int            null default 0 comment '学生用书征订数量',
+    old_teacher_num               int            null default 0 comment '教师用书征订数量',
+    old_discount                  float          null default 10 comment '实际折扣',
+    old_price                     decimal(10, 2) null default 0 comment '实际价格(元)',
+    old_in_stock_num              int            null default 0 comment '当前征订任务征订项入库数量',
+    old_out_stock_num             int            null default 0 comment '当前征订任务征订项出库数量',
+
+    new_textbook_id               bigint         null comment '教材表主键(textbook)',
+    new_student_num               int            null default 0 comment '学生用书征订数量',
+    new_teacher_num               int            null default 0 comment '教师用书征订数量',
+    new_discount                  float          null default 10 comment '实际折扣',
+    new_price                     decimal(10, 2) null default 0 comment '实际价格(元)',
+    new_in_stock_num              int            null default 0 comment '当前征订任务征订项入库数量',
+    new_out_stock_num             int            null default 0 comment '当前征订任务征订项出库数量',
 
     history_version               int                 default 0 null comment '当前征订项变更历史记录版本',
     alteration_type               int            null default 0 comment '变更类型(0:未变更,1:学生用书征订数量,2:教师用书征订数量,3:变更课程,4:学生用书征订数量和教师用书征订数量)'
@@ -285,29 +285,29 @@ create table `wf_textbook_claim_item`
   default charset = utf8mb4
   collate = utf8mb4_0900_ai_ci comment ='教材申领项';
 
--- ----------------------------
--- 2024-12-13 14:36
--- 教材申领项与教材征订项关联表
--- ----------------------------
-drop table if exists claim_item_subscription_item;
-create table `claim_item_subscription_item`
-(
-    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 '序号',
-
-    wf_textbook_claim_item_id     bigint        null comment '教材申领编号',
-    textbook_subscription_item_id bigint        null comment '教材征订编号',
-    issue_number                  int default 0 null comment '已发放数量'
-) engine = innodb
-  default charset = utf8mb4
-  collate = utf8mb4_0900_ai_ci comment ='教材申领项与教材征订项关联表';
+# -- ----------------------------
+# -- 2024-12-13 14:36
+# -- 教材申领项与教材征订项关联表
+# -- ----------------------------
+# drop table if exists claim_item_subscription_item;
+# create table `claim_item_subscription_item`
+# (
+#     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 '序号',
+#
+#     wf_textbook_claim_item_id     bigint        null comment '教材申领编号',
+#     textbook_subscription_item_id bigint        null comment '教材征订编号',
+#     issue_number                  int default 0 null comment '已发放数量'
+# ) engine = innodb
+#   default charset = utf8mb4
+#   collate = utf8mb4_0900_ai_ci comment ='教材申领项与教材征订项关联表';
 
 -- ----------------------------
 -- 2024-12-13 14:36
@@ -341,28 +341,35 @@ create table `textbook_claim_user`
 drop table if exists textbook_issue_record;
 create table `textbook_issue_record`
 (
-    id               bigint        not null comment '主键编号'
+    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 '序号',
+    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 '序号',
 
-    issue_mode       varchar(20)   null comment '出库方式(xjr_dictionary_item[issue_mode])',
-    data_id          bigint        null comment '数据编号(根据出库方式,编号来自不同数据表)',
-    data_item_id     bigint        null comment '数据项项编号(根据出库方式,编号来自不同数据表)',
+    base_semester_id             bigint         null comment '学期主键id',
+    order_number                 varchar(256)   not null comment '出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))',
+    textbook_warehouse_record_id bigint         null comment '关联入库主键',
 
-    textbook_id      bigint        null comment '教材管理编号',
-    issue_number     int           null comment '出库数量',
-    remaining_number int           null comment '申领中剩余未出库数量',
+    issue_mode                   varchar(20)    null comment '出库方式(xjr_dictionary_item[issue_mode])',
+    data_id                      bigint         null comment '数据编号(根据出库方式,编号来自不同数据表)',
+    data_item_id                 bigint         null comment '数据项项编号(根据出库方式,编号来自不同数据表)',
 
-    receive_user_id  bigint        null comment '领取用户编号',
-    issue_user_id    bigint        null comment '出库用户编号',
+    textbook_id                  bigint         null comment '教材管理编号',
 
-    remark           varchar(1000) null comment '备注'
+    issue_number                 int            null default 0 comment '出库数量',
+    recede_number                int            null default 0 comment '领取后退书数量',
+    actual_issue_number          int            null default 0 comment '实际出库数量',
+    actual_total_price           decimal(10, 2) null default 0 null comment '实际出库总金额',
+
+    receive_user_id              bigint         null comment '领取用户编号',
+    issue_user_id                bigint         null comment '出库用户编号',
+
+    remark                       varchar(1000)  null comment '备注'
 ) engine = innodb
   default charset = utf8mb4
   collate = utf8mb4_0900_ai_ci comment ='教材出库记录';

+ 2 - 1
src/test/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImplTest.java

@@ -18,6 +18,7 @@ class WfTextbookClaimServiceImplTest {
     private IWfTextbookClaimService wfTextbookClaimService;
     @Test
     void dataHandleAddClaimUserNode() {
-        wfTextbookClaimService.dataHandleAddClaimUserNode(1743210949226065920L);
+        wfTextbookClaimService.dataHandleAddClaimUserNode(1889234925486391296L);
     }
+
 }

+ 3 - 3
src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

@@ -1421,13 +1421,13 @@ public class FreeMarkerGeneratorTest {
         tableConfigs.add(mainTable);
 
         ApiGenerateCodesDto params = new ApiGenerateCodesDto();
-        params.setAuthor("szs");//作者名称
+        params.setAuthor("phoenix");//作者名称
         params.setPackageName("textbook");//包名
         params.setTableConfigs(tableConfigs);
         params.setPage(true);//是否生成分页接口
-        params.setImport(false);//是否生成导入接口
+        params.setImport(true);//是否生成导入接口
         params.setExport(true);//是否生成导出接口
-        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setOutMainDir(false);//是否生成在主目录,前期测试可设置成false
         params.setDs(ds);
 
         IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();