Browse Source

/textbook/wfTextbookClaim//confirm-istribute 作业本征订规则

phoenix 1 year ago
parent
commit
836b30500a
26 changed files with 1329 additions and 53 deletions
  1. 35 0
      src/main/java/com/xjrsoft/common/enums/ExerciseBookeTypeEnum.java
  2. 35 0
      src/main/java/com/xjrsoft/common/enums/SubscriptionTypeEnum.java
  3. 40 0
      src/main/java/com/xjrsoft/common/enums/TextbookTypeEnum.java
  4. 30 0
      src/main/java/com/xjrsoft/module/liteflow/node/AddExerciseBookNode.java
  5. 1 1
      src/main/java/com/xjrsoft/module/liteflow/node/AddTextbookNode.java
  6. 116 0
      src/main/java/com/xjrsoft/module/textbook/controller/WfExerciseBookController.java
  7. 64 0
      src/main/java/com/xjrsoft/module/textbook/dto/AddWfExerciseBookDto.java
  8. 58 0
      src/main/java/com/xjrsoft/module/textbook/dto/AddWfExerciseBookItemDto.java
  9. 33 0
      src/main/java/com/xjrsoft/module/textbook/dto/UpdateWfExerciseBookDto.java
  10. 26 0
      src/main/java/com/xjrsoft/module/textbook/dto/WfExerciseBookPageDto.java
  11. 115 0
      src/main/java/com/xjrsoft/module/textbook/entity/WfExerciseBook.java
  12. 108 0
      src/main/java/com/xjrsoft/module/textbook/entity/WfExerciseBookItem.java
  13. 17 0
      src/main/java/com/xjrsoft/module/textbook/mapper/WfExerciseBookItemMapper.java
  14. 17 0
      src/main/java/com/xjrsoft/module/textbook/mapper/WfExerciseBookMapper.java
  15. 14 8
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookService.java
  16. 47 0
      src/main/java/com/xjrsoft/module/textbook/service/IWfExerciseBookService.java
  17. 1 1
      src/main/java/com/xjrsoft/module/textbook/service/IWfTextbookSubscriptionService.java
  18. 150 38
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java
  19. 100 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfExerciseBookServiceImpl.java
  20. 2 1
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  21. 59 0
      src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookItemVo.java
  22. 118 0
      src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookPageVo.java
  23. 65 0
      src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookVo.java
  24. 4 2
      src/main/resources/mapper/textbook/WfTextbookClaimMapper.xml
  25. 7 2
      src/test/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImplTest.java
  26. 67 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 35 - 0
src/main/java/com/xjrsoft/common/enums/ExerciseBookeTypeEnum.java

@@ -0,0 +1,35 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 作业本征订类型exercise_book_type
+ * @author: phoenix
+ * @create: 2023/12/21 11:27
+ * @Version 1.0
+ */
+public enum ExerciseBookeTypeEnum {
+    /**
+     * 笔记本
+     * */
+    ExerciseBook1("exercise_book1", "笔记本"),
+
+    /**
+     * 作业本
+     * */
+    ExerciseBook2("exercise_book2", "作业本");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    ExerciseBookeTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 35 - 0
src/main/java/com/xjrsoft/common/enums/SubscriptionTypeEnum.java

@@ -0,0 +1,35 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 教材征订类型subscription_type
+ * @author: phoenix
+ * @create: 2023/12/21 11:27
+ * @Version 1.0
+ */
+public enum SubscriptionTypeEnum {
+    /**
+     * 教材
+     * */
+    STextbook("s_textbook", "教材"),
+
+    /**
+     * 辅材
+     * */
+    SMaterials("s_materials", "辅材");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    SubscriptionTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 40 - 0
src/main/java/com/xjrsoft/common/enums/TextbookTypeEnum.java

@@ -0,0 +1,40 @@
+package com.xjrsoft.common.enums;
+
+/**
+ * @description: 教材类型textbook_type
+ * @author: phoenix
+ * @create: 2023/12/21 11:27
+ * @Version 1.0
+ */
+public enum TextbookTypeEnum {
+    /**
+     * 教材
+     * */
+    TTextbook("t_textbook", "教材"),
+
+    /**
+     * 辅材
+     * */
+    TMaterials("t_materials", "辅材"),
+
+    /**
+     * 作业本
+     * */
+    TExerciseBook("t_exercise_book", "作业本");
+
+    final String code;
+    final String value;
+
+    public String getCode() {
+        return this.code;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    TextbookTypeEnum(final String code, final String message) {
+        this.code = code;
+        this.value = message;
+    }
+}

+ 30 - 0
src/main/java/com/xjrsoft/module/liteflow/node/AddExerciseBookNode.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.liteflow.node;
+
+import cn.hutool.core.convert.Convert;
+import com.xjrsoft.module.textbook.service.ITextbookService;
+import com.yomahub.liteflow.core.NodeComponent;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * 添加新出现的作业本数据到教材管理
+ */
+@Component("add_exercise_book_node")
+public class AddExerciseBookNode extends NodeComponent {
+    @Autowired
+    private ITextbookService textbookService;
+
+    @Override
+    public void process() throws Exception {
+        // 获取表单中数据编号
+        Map<String, Object> params = this.getFirstContextBean();
+        Object value = util.getFormDatKey(params,"id");
+        Long formId = Convert.toLong(value);
+        if (formId != null) {
+            // 数据处理
+            textbookService.dataHandleAddExerciseBookNode(formId);
+        }
+    }
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/liteflow/node/AddTextbookNode.java

@@ -24,7 +24,7 @@ public class AddTextbookNode extends NodeComponent {
         Long formId = Convert.toLong(value);
         if (formId != null) {
             // 数据处理
-            textbookService.dataHandle(formId);
+            textbookService.dataHandleAddTextbookNode(formId);
         }
     }
 }

+ 116 - 0
src/main/java/com/xjrsoft/module/textbook/controller/WfExerciseBookController.java

@@ -0,0 +1,116 @@
+package com.xjrsoft.module.textbook.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.textbook.dto.AddWfExerciseBookDto;
+import com.xjrsoft.module.textbook.dto.UpdateWfExerciseBookDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.support.ExcelTypeEnum;
+import org.springframework.http.ResponseEntity;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+
+import com.xjrsoft.module.textbook.dto.WfExerciseBookPageDto;
+import com.xjrsoft.module.textbook.entity.WfExerciseBook;
+import com.xjrsoft.module.textbook.service.IWfExerciseBookService;
+import com.xjrsoft.module.textbook.vo.WfExerciseBookPageVo;
+
+import com.xjrsoft.module.textbook.vo.WfExerciseBookVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/textbook" + "/wfExerciseBook")
+@Api(value = "/textbook"  + "/wfExerciseBook",tags = "作业本征订代码")
+@AllArgsConstructor
+public class WfExerciseBookController {
+
+
+    private final IWfExerciseBookService wfExerciseBookService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="作业本征订列表(分页)")
+    @SaCheckPermission("wfexercisebook:detail")
+    public RT<PageOutput<WfExerciseBookPageVo>> page(@Valid WfExerciseBookPageDto dto){
+
+        LambdaQueryWrapper<WfExerciseBook> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(WfExerciseBook::getId)
+                .select(WfExerciseBook.class,x -> VoToColumnUtil.fieldsToColumns(WfExerciseBookPageVo.class).contains(x.getProperty()));
+        IPage<WfExerciseBook> page = wfExerciseBookService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<WfExerciseBookPageVo> pageOutput = ConventPage.getPageOutput(page, WfExerciseBookPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询作业本征订信息")
+    @SaCheckPermission("wfexercisebook:detail")
+    public RT<WfExerciseBookVo> info(@RequestParam Long id){
+        WfExerciseBook wfExerciseBook = wfExerciseBookService.getByIdDeep(id);
+        if (wfExerciseBook == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(wfExerciseBook, WfExerciseBookVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增作业本征订")
+    @SaCheckPermission("wfexercisebook:add")
+    public RT<Boolean> add(@Valid @RequestBody AddWfExerciseBookDto dto){
+        WfExerciseBook wfExerciseBook = BeanUtil.toBean(dto, WfExerciseBook.class);
+        boolean isSuccess = wfExerciseBookService.add(wfExerciseBook);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改作业本征订")
+    @SaCheckPermission("wfexercisebook:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateWfExerciseBookDto dto){
+
+        WfExerciseBook wfExerciseBook = BeanUtil.toBean(dto, WfExerciseBook.class);
+        return RT.ok(wfExerciseBookService.update(wfExerciseBook));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除作业本征订")
+    @SaCheckPermission("wfexercisebook:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(wfExerciseBookService.delete(ids));
+
+    }
+
+    @GetMapping("/export")
+    @ApiOperation(value = "导出")
+    public ResponseEntity<byte[]> exportData(@Valid WfExerciseBookPageDto dto, @RequestParam(defaultValue = "false") Boolean isTemplate) {
+        List<WfExerciseBookPageVo> customerList = isTemplate != null && isTemplate ? new ArrayList<>() : ((PageOutput<WfExerciseBookPageVo>) page(dto).getData()).getList();
+        ByteArrayOutputStream bot = new ByteArrayOutputStream();
+        EasyExcel.write(bot, WfExerciseBookPageVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(customerList);
+
+        return RT.fileStream(bot.toByteArray(), "WfExerciseBook" + ExcelTypeEnum.XLSX.getValue());
+    }
+}

+ 64 - 0
src/main/java/com/xjrsoft/module/textbook/dto/AddWfExerciseBookDto.java

@@ -0,0 +1,64 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.textbook.entity.WfExerciseBookItem;
+
+
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class AddWfExerciseBookDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 申请人
+    */
+    @ApiModelProperty("申请人")
+    private Long applicantUserId;
+    /**
+    * 班级编号
+    */
+    @ApiModelProperty("班级编号")
+    private Long classId;
+    /**
+    * 学期ID(base_semester)
+    */
+    @ApiModelProperty("学期ID(base_semester)")
+    private Long baseSemesterId;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 状态(1:结束 0:未结束)
+    */
+    @ApiModelProperty("状态(1:结束 0:未结束)")
+    private Integer status;
+
+    /**
+    * wfExerciseBookItem
+    */
+    @ApiModelProperty("wfExerciseBookItem子表")
+    private List<AddWfExerciseBookItemDto> wfExerciseBookItemList;
+}

+ 58 - 0
src/main/java/com/xjrsoft/module/textbook/dto/AddWfExerciseBookItemDto.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 作业本征订项
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class AddWfExerciseBookItemDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 作业本征订编号
+    */
+    @ApiModelProperty("作业本征订编号")
+    private Long wfExerciseBookId;
+    /**
+    * 作业本征订类型(xjr_dictionary_item[exercise_book_type])
+    */
+    @ApiModelProperty("作业本征订类型(xjr_dictionary_item[exercise_book_type])")
+    private String subscriptionType;
+    /**
+    * 规格型号
+    */
+    @ApiModelProperty("规格型号")
+    private String specificationsModels;
+    /**
+    * 估价(元)
+    */
+    @ApiModelProperty("估价(元)")
+    private BigDecimal appraisalPrice;
+    /**
+    * 征订数量
+    */
+    @ApiModelProperty("征订数量")
+    private Integer subscriptionNumber;
+
+}

+ 33 - 0
src/main/java/com/xjrsoft/module/textbook/dto/UpdateWfExerciseBookDto.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.textbook.entity.WfExerciseBookItem;
+
+
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class UpdateWfExerciseBookDto extends AddWfExerciseBookDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+}

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

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.textbook.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 作业本征订分页查询入参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WfExerciseBookPageDto extends PageInput {
+
+
+}

+ 115 - 0
src/main/java/com/xjrsoft/module/textbook/entity/WfExerciseBook.java

@@ -0,0 +1,115 @@
+package com.xjrsoft.module.textbook.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+@TableName("wf_exercise_book")
+@ApiModel(value = "wf_exercise_book", description = "作业本征订")
+public class WfExerciseBook implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 申请人
+    */
+    @ApiModelProperty("申请人")
+    private Long applicantUserId;
+    /**
+    * 班级编号
+    */
+    @ApiModelProperty("班级编号")
+    private Long classId;
+    /**
+    * 学期ID(base_semester)
+    */
+    @ApiModelProperty("学期ID(base_semester)")
+    private Long baseSemesterId;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 状态(1:结束 0:未结束)
+    */
+    @ApiModelProperty("状态(1:结束 0:未结束)")
+    private Integer status;
+
+    /**
+    * wfExerciseBookItem
+    */
+    @ApiModelProperty("wfExerciseBookItem子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "wfExerciseBookId")
+    private List<WfExerciseBookItem> wfExerciseBookItemList;
+
+}

+ 108 - 0
src/main/java/com/xjrsoft/module/textbook/entity/WfExerciseBookItem.java

@@ -0,0 +1,108 @@
+package com.xjrsoft.module.textbook.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 作业本征订项
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+@TableName("wf_exercise_book_item")
+@ApiModel(value = "wf_exercise_book_item", description = "作业本征订项")
+public class WfExerciseBookItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    @TableId
+    private Long id;
+    /**
+    * 创建人
+    */
+    @ApiModelProperty("创建人")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ApiModelProperty("创建时间")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ApiModelProperty("修改人")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ApiModelProperty("修改时间")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ApiModelProperty("删除标记")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ApiModelProperty("有效标志")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 作业本征订编号
+    */
+    @ApiModelProperty("作业本征订编号")
+    private Long wfExerciseBookId;
+    /**
+    * 作业本征订类型(xjr_dictionary_item[exercise_book_type])
+    */
+    @ApiModelProperty("作业本征订类型(xjr_dictionary_item[exercise_book_type])")
+    private String subscriptionType;
+    /**
+    * 规格型号
+    */
+    @ApiModelProperty("规格型号")
+    private String specificationsModels;
+    /**
+    * 估价(元)
+    */
+    @ApiModelProperty("估价(元)")
+    private BigDecimal appraisalPrice;
+    /**
+    * 征订数量
+    */
+    @ApiModelProperty("征订数量")
+    private Integer subscriptionNumber;
+
+
+}

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

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.textbook.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.textbook.entity.WfExerciseBookItem;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 作业本征订项
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Mapper
+public interface WfExerciseBookItemMapper extends MPJBaseMapper<WfExerciseBookItem> {
+
+}

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

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.textbook.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.textbook.entity.WfExerciseBook;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Mapper
+public interface WfExerciseBookMapper extends MPJBaseMapper<WfExerciseBook> {
+
+}

+ 14 - 8
src/main/java/com/xjrsoft/module/textbook/service/ITextbookService.java

@@ -6,13 +6,7 @@ import com.xjrsoft.module.textbook.dto.AddTextbookClassWarehouseDto;
 import com.xjrsoft.module.textbook.dto.TextbookPageDto;
 import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.entity.TextbookClassRelation;
-import com.xjrsoft.module.textbook.vo.TextbookClassWarehouseListVo;
-import com.xjrsoft.module.textbook.vo.TextbookClassWarehouseVo;
-import com.xjrsoft.module.textbook.vo.TextbookIssueRecordListVo;
-import com.xjrsoft.module.textbook.vo.TextbookPageVo;
-import com.xjrsoft.module.textbook.vo.TextbookSubscriptionClassVo;
-import com.xjrsoft.module.textbook.vo.TextbookSubscriptionRecordVo;
-import com.xjrsoft.module.textbook.vo.TextbookVo;
+import com.xjrsoft.module.textbook.vo.*;
 
 import java.util.List;
 
@@ -56,7 +50,19 @@ public interface ITextbookService extends MPJBaseService<Textbook> {
      */
     Page<TextbookPageVo> getPage(Page<TextbookPageDto> page, TextbookPageDto dto);
 
-    Boolean dataHandle(Long dataId);
+    /**
+     * 添加教材教辅规则
+     * @param dataId
+     * @return
+     */
+    Boolean dataHandleAddTextbookNode(Long dataId);
+
+    /**
+     * 添加作业本规则
+     * @param dataId
+     * @return
+     */
+    Boolean dataHandleAddExerciseBookNode(Long dataId);
 
     /**
      *

+ 47 - 0
src/main/java/com/xjrsoft/module/textbook/service/IWfExerciseBookService.java

@@ -0,0 +1,47 @@
+package com.xjrsoft.module.textbook.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.textbook.entity.WfExerciseBook;
+
+import java.util.List;
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+
+public interface IWfExerciseBookService extends MPJBaseService<WfExerciseBook> {
+    /**
+    * 新增
+    *
+    * @param wfExerciseBook
+    * @return
+    */
+    Boolean add(WfExerciseBook wfExerciseBook);
+
+    /**
+    * 更新
+    *
+    * @param wfExerciseBook
+    * @return
+    */
+    Boolean update(WfExerciseBook wfExerciseBook);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+
+    /**
+     * 根据Id查询征订项
+     *
+     * @param id
+     * @return
+     */
+    WfExerciseBook selectById(Long id);
+}

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

@@ -38,7 +38,7 @@ public interface IWfTextbookSubscriptionService extends MPJBaseService<WfTextboo
     Boolean delete(List<Long> ids);
 
     /**
-     * 根据Id
+     * 根据Id查询征订项
      *
      * @param id
      * @return

+ 150 - 38
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java

@@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.common.enums.SubscriptionTypeEnum;
+import com.xjrsoft.common.enums.TextbookTypeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -18,6 +20,7 @@ import com.xjrsoft.module.textbook.mapper.TextbookMapper;
 import com.xjrsoft.module.textbook.mapper.TextbookSubscriptionRecordMapper;
 import com.xjrsoft.module.textbook.service.ITextbookClassWarehouseService;
 import com.xjrsoft.module.textbook.service.ITextbookService;
+import com.xjrsoft.module.textbook.service.IWfExerciseBookService;
 import com.xjrsoft.module.textbook.service.IWfTextbookSubscriptionService;
 import com.xjrsoft.module.textbook.vo.*;
 import lombok.AllArgsConstructor;
@@ -45,6 +48,8 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
 
     private final IWfTextbookSubscriptionService iWfTextbookSubscriptionService;
 
+    private final IWfExerciseBookService wfExerciseBookService;
+
     private final IBaseClassService baseClassService;
 
     private final ITextbookClassWarehouseService textbookClassWarehouseService;
@@ -170,47 +175,51 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     }
 
     @Override
-    public Boolean dataHandle(Long dataId) {
+    @Transactional
+    public Boolean dataHandleAddTextbookNode(Long dataId) {
         WfTextbookSubscription wfTextbookSubscription = iWfTextbookSubscriptionService.selectById(dataId);
         if (ObjectUtil.isNotNull(wfTextbookSubscription) && ObjectUtil.isNotNull(wfTextbookSubscription.getWfTextbookSubscriptionItemList()) && wfTextbookSubscription.getWfTextbookSubscriptionItemList().size() > 0) {
             for (WfTextbookSubscriptionItem wfTextbookSubscriptionItem : wfTextbookSubscription.getWfTextbookSubscriptionItemList()) {
-                String issn = wfTextbookSubscriptionItem.getIssn();
                 Long semesterId = wfTextbookSubscription.getBaseSemesterId();
-                Long subjectGroupId = wfTextbookSubscription.getSubjectGroupId();
+                String issn = wfTextbookSubscriptionItem.getIssn();
                 LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper
                         .eq(Textbook::getIssn, issn)
-                        .eq(Textbook::getBaseSemesterId, semesterId)
-                        .eq(Textbook::getSubjectGroupId, subjectGroupId);
-                Long count = this.count(queryWrapper);
-                if (count <= 0) {//该书不存在教材管理
-                    Textbook textbook = new Textbook();
-                    textbook.setIssn(wfTextbookSubscriptionItem.getIssn());
-                    textbook.setIsbn(wfTextbookSubscriptionItem.getIsbn());
-                    textbook.setBookName(wfTextbookSubscriptionItem.getBookName());
-                    textbook.setPublishingHouse(wfTextbookSubscriptionItem.getPublishingHouse());
-                    textbook.setEditorInChief(wfTextbookSubscriptionItem.getEditorInChief());
-                    textbook.setSubjectGroupId(wfTextbookSubscription.getSubjectGroupId());
-                    textbook.setBaseSemesterId(wfTextbookSubscription.getBaseSemesterId());
-                    textbook.setCourseSubjectId(wfTextbookSubscriptionItem.getCourseSubjectId());
-                    textbook.setVersion(wfTextbookSubscriptionItem.getVersion());
-                    textbook.setIsTextbookPlan(wfTextbookSubscriptionItem.getIsTextbookPlan());
-                    textbook.setTextbookType(wfTextbookSubscriptionItem.getSubscriptionType());
-                    textbook.setAppraisalPrice(wfTextbookSubscriptionItem.getAppraisalPrice());
-                    textbookTextbookMapper.insert(textbook);
+                        .eq(Textbook::getBaseSemesterId, semesterId);
+                List<Textbook> textbookList = this.list(queryWrapper);
+                //征订的教材没有在教材管理
+                if (ObjectUtil.isNull(textbookList) || textbookList.size() <= 0) {//该书不存在于教材管理
+                    Textbook textbook = new Textbook() {{
+                        setIssn(wfTextbookSubscriptionItem.getIssn());
+                        setIsbn(wfTextbookSubscriptionItem.getIsbn());
+                        setBookName(wfTextbookSubscriptionItem.getBookName());
+                        setPublishingHouse(wfTextbookSubscriptionItem.getPublishingHouse());
+                        setEditorInChief(wfTextbookSubscriptionItem.getEditorInChief());
+                        setSubjectGroupId(wfTextbookSubscription.getSubjectGroupId());
+                        setBaseSemesterId(wfTextbookSubscription.getBaseSemesterId());
+                        setCourseSubjectId(wfTextbookSubscriptionItem.getCourseSubjectId());
+                        setVersion(wfTextbookSubscriptionItem.getVersion());
+                        setIsTextbookPlan(wfTextbookSubscriptionItem.getIsTextbookPlan());
+                        if (wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.STextbook.getCode())) {
+                            setTextbookType(TextbookTypeEnum.TTextbook.getCode());
+                        }
+                        if (wfTextbookSubscriptionItem.getSubscriptionType().equals(SubscriptionTypeEnum.SMaterials.getCode())) {
+                            setTextbookType(TextbookTypeEnum.TMaterials.getCode());
+                        }
+                        setAppraisalPrice(wfTextbookSubscriptionItem.getAppraisalPrice());
+                    }};
+
+                    //班级不为空
                     if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
+                        //将班级ids转换为List
                         String classIds = wfTextbookSubscriptionItem.getClassIds();
                         String[] classIdStrs = classIds.split(",");
                         List<Long> classIdList = new ArrayList<>();
                         for (String classIdStr : classIdStrs) {
-                            Long classId = Long.parseLong(classIdStr);
-                            classIdList.add(classId);
-                            TextbookClassRelation textbookClassRelation = new TextbookClassRelation();
-                            textbookClassRelation.setTextbookId(textbook.getId());
-                            textbookClassRelation.setClassId(classId);
-                            textbookTextbookClassRelationMapper.insert(textbookClassRelation);
+                            classIdList.add(Long.parseLong(classIdStr));
                         }
-                        //查询年级
+
+                        //查询年级,如果添加的班级只存在一个年级,添加年级字段值
                         LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
                         queryWrapper1
                                 .in(BaseClass::getId, classIdList)
@@ -219,12 +228,115 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                         if (ObjectUtil.isNotNull(baseClassList) && baseClassList.size() == 1) {
                             textbook.setGradeId(baseClassList.get(0).getGradeId());
                         }
+
+                        //插入教材数据
+                        textbookTextbookMapper.insert(textbook);
+
+                        //插入班级和教材关系
+                        for (Long classId : classIdList) {
+                            textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
+                                setTextbookId(textbook.getId());
+                                setClassId(classId);
+                            }});
+                        }
+                    }
+                    //添加教材征订记录
+                    textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
+                        setWfTextbookSubscriptionId(textbook.getId());
+                        setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
+                    }});
+                }
+
+                //征订的教材在教材管理,进行班级的和记录的管理
+                Textbook textbook = textbookList.get(0);
+
+                //班级不为空
+                if (ObjectUtil.isNotNull(wfTextbookSubscriptionItem.getClassIds()) && !wfTextbookSubscriptionItem.getClassIds().equals("")) {
+                    //将班级ids转换为List
+                    String classIds = wfTextbookSubscriptionItem.getClassIds();
+                    String[] classIdStrs = classIds.split(",");
+                    for (String classIdStr : classIdStrs) {
+                        textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
+                            setTextbookId(textbook.getId());
+                            setClassId(Long.parseLong(classIdStr));
+                        }});
                     }
-                    TextbookSubscriptionRecord textbookSubscriptionRecord = new TextbookSubscriptionRecord();
-                    textbookSubscriptionRecord.setWfTextbookSubscriptionId(textbook.getId());
-                    textbookSubscriptionRecord.setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
-                    textbookTextbookSubscriptionRecordMapper.insert(textbookSubscriptionRecord);
                 }
+                //添加教材征订记录
+                textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
+                    setWfTextbookSubscriptionId(textbook.getId());
+                    setWfTextbookSubscriptionId(wfTextbookSubscription.getId());
+                }});
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 添加作业本规则
+     *
+     * @param dataId
+     * @return
+     */
+    @Override
+    public Boolean dataHandleAddExerciseBookNode(Long dataId) {
+        WfExerciseBook wfExerciseBook = wfExerciseBookService.selectById(dataId);
+        if (ObjectUtil.isNotNull(wfExerciseBook) && ObjectUtil.isNotNull(wfExerciseBook.getWfExerciseBookItemList()) && wfExerciseBook.getWfExerciseBookItemList().size() > 0) {
+            for (WfExerciseBookItem wfExerciseBookItem : wfExerciseBook.getWfExerciseBookItemList()) {
+                Long semesterId = wfExerciseBook.getBaseSemesterId();
+                String bookName = wfExerciseBookItem.getSubscriptionType();//作业本的选择类型对应教材管理的书名
+                LambdaQueryWrapper<Textbook> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper
+                        .eq(Textbook::getBookName, bookName)
+                        .eq(Textbook::getBaseSemesterId, semesterId);
+                List<Textbook> textbookList = this.list(queryWrapper);
+                //征订的作业本没有在教材管理
+                if (ObjectUtil.isNull(textbookList) || textbookList.size() <= 0) {
+                    Textbook textbook = new Textbook() {{
+                        setBaseSemesterId(wfExerciseBook.getBaseSemesterId());
+                        setBookName(wfExerciseBookItem.getSubscriptionType());
+                        setTextbookType(TextbookTypeEnum.TExerciseBook.getCode());
+                        //年级id
+                        LambdaQueryWrapper<BaseClass> queryWrapper1 = new LambdaQueryWrapper<>();
+                        queryWrapper1
+                                .eq(BaseClass::getId, wfExerciseBook.getClassId());
+                        BaseClass baseClass = baseClassService.getOne(queryWrapper1);
+                        setGradeId(baseClass.getGradeId());
+                        setAppraisalPrice(wfExerciseBookItem.getAppraisalPrice());
+                    }};
+
+                    //插入教材数据
+                    textbookTextbookMapper.insert(textbook);
+
+                    //插入班级和教材关系
+                    textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
+                        setTextbookId(textbook.getId());
+                        setClassId(wfExerciseBook.getClassId());
+                    }});
+
+                    //添加教材征订记录
+                    textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
+                        setWfTextbookSubscriptionId(textbook.getId());
+                        setWfTextbookSubscriptionId(wfExerciseBook.getId());
+                    }});
+                }
+
+                //征订的教材在教材管理,进行班级的和记录的管理
+                Textbook textbook = textbookList.get(0);
+
+                //班级不为空
+                if (ObjectUtil.isNotNull(wfExerciseBook.getClassId()) && !wfExerciseBook.getClassId().equals("")) {
+                    textbookTextbookClassRelationMapper.insert(new TextbookClassRelation() {{
+                        setTextbookId(textbook.getId());
+                        setClassId(wfExerciseBook.getClassId());
+                    }});
+
+                }
+                //添加教材征订记录
+                textbookTextbookSubscriptionRecordMapper.insert(new TextbookSubscriptionRecord() {{
+                    setWfTextbookSubscriptionId(textbook.getId());
+                    setWfTextbookSubscriptionId(wfExerciseBook.getId());
+                }});
             }
         }
         return true;
@@ -234,7 +346,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     public List<TextbookSubscriptionRecordVo> subscriptionList(Long id) {
         List<TextbookSubscriptionRecordVo> recordVos = textbookTextbookMapper.subscriptionList(id);
         for (TextbookSubscriptionRecordVo recordVo : recordVos) {
-            if(ObjectUtil.isNull(recordVo) || StrUtil.isEmpty(recordVo.getClassIds())){
+            if (ObjectUtil.isNull(recordVo) || StrUtil.isEmpty(recordVo.getClassIds())) {
                 continue;
             }
             String[] split = recordVo.getClassIds().split(",");
@@ -244,8 +356,8 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
             }
             List<TextbookSubscriptionClassVo> classInfo = textbookTextbookMapper.getClassInfo(ids);
             String useClass = "";
-            for (int i = 0; i < classInfo.size(); i ++){
-                if(i >= 1){
+            for (int i = 0; i < classInfo.size(); i++) {
+                if (i >= 1) {
                     useClass += ",";
                 }
                 TextbookSubscriptionClassVo classVo = classInfo.get(i);
@@ -264,7 +376,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     @Override
     public List<TextbookClassWarehouseListVo> warehouseList(Long id) {
         List<TextbookClassWarehouseListVo> result = textbookTextbookMapper.warehouseList(id);
-        if(!result.isEmpty()){
+        if (!result.isEmpty()) {
             return result;
         }
         return new ArrayList<>();
@@ -273,7 +385,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     @Override
     public List<TextbookClassRelation> getClassRelation(Long id) {
         List<TextbookClassRelation> classRelation = textbookTextbookMapper.getClassRelation(id);
-        if(!classRelation.isEmpty()){
+        if (!classRelation.isEmpty()) {
             return classRelation;
         }
         return new ArrayList<>();
@@ -282,7 +394,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
     @Override
     public List<TextbookIssueRecordListVo> issueList(Long id) {
         List<TextbookIssueRecordListVo> result = textbookTextbookMapper.issueList(id);
-        if(!result.isEmpty()){
+        if (!result.isEmpty()) {
             return result;
         }
         return new ArrayList<>();

+ 100 - 0
src/main/java/com/xjrsoft/module/textbook/service/impl/WfExerciseBookServiceImpl.java

@@ -0,0 +1,100 @@
+package com.xjrsoft.module.textbook.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.textbook.entity.WfExerciseBook;
+import com.xjrsoft.module.textbook.entity.WfExerciseBookItem;
+import com.xjrsoft.module.textbook.mapper.WfExerciseBookItemMapper;
+import com.xjrsoft.module.textbook.mapper.WfExerciseBookMapper;
+import com.xjrsoft.module.textbook.service.IWfExerciseBookService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+* @title: 作业本征订
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class WfExerciseBookServiceImpl extends MPJBaseServiceImpl<WfExerciseBookMapper, WfExerciseBook> implements IWfExerciseBookService {
+    private final WfExerciseBookMapper wfExerciseBookWfExerciseBookMapper;
+
+    private final WfExerciseBookItemMapper wfExerciseBookWfExerciseBookItemMapper;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(WfExerciseBook wfExerciseBook) {
+        wfExerciseBookWfExerciseBookMapper.insert(wfExerciseBook);
+        for (WfExerciseBookItem wfExerciseBookItem : wfExerciseBook.getWfExerciseBookItemList()) {
+            wfExerciseBookItem.setWfExerciseBookId(wfExerciseBook.getId());
+            wfExerciseBookWfExerciseBookItemMapper.insert(wfExerciseBookItem);
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(WfExerciseBook wfExerciseBook) {
+        wfExerciseBookWfExerciseBookMapper.updateById(wfExerciseBook);
+        //********************************* WfExerciseBookItem  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<WfExerciseBookItem> wfExerciseBookItemList = wfExerciseBookWfExerciseBookItemMapper.selectList(Wrappers.lambdaQuery(WfExerciseBookItem.class).eq(WfExerciseBookItem::getWfExerciseBookId, wfExerciseBook.getId()).select(WfExerciseBookItem::getId));
+            List<Long> wfExerciseBookItemIds = wfExerciseBookItemList.stream().map(WfExerciseBookItem::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> wfExerciseBookItemOldIds = wfExerciseBook.getWfExerciseBookItemList().stream().map(WfExerciseBookItem::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> wfExerciseBookItemRemoveIds = wfExerciseBookItemIds.stream().filter(item -> !wfExerciseBookItemOldIds.contains(item)).collect(Collectors.toList());
+
+            for (WfExerciseBookItem wfExerciseBookItem : wfExerciseBook.getWfExerciseBookItemList()) {
+                //如果不等于空则修改
+                if (wfExerciseBookItem.getId() != null) {
+                    wfExerciseBookWfExerciseBookItemMapper.updateById(wfExerciseBookItem);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    wfExerciseBookItem.setWfExerciseBookId(wfExerciseBook.getId());
+                    wfExerciseBookWfExerciseBookItemMapper.insert(wfExerciseBookItem);
+                }
+            }
+            //已经不存在的id 删除
+            if(wfExerciseBookItemRemoveIds.size() > 0){
+                wfExerciseBookWfExerciseBookItemMapper.deleteBatchIds(wfExerciseBookItemRemoveIds);
+            }
+        }
+        //********************************* WfExerciseBookItem  增删改  结束 *******************************************/
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> ids) {
+        wfExerciseBookWfExerciseBookMapper.deleteBatchIds(ids);
+        wfExerciseBookWfExerciseBookItemMapper.delete(Wrappers.lambdaQuery(WfExerciseBookItem.class).in(WfExerciseBookItem::getWfExerciseBookId, ids));
+
+        return true;
+    }
+
+    @Override
+    public WfExerciseBook selectById(Long id) {
+        WfExerciseBook wfExerciseBook = this.getById(id);
+        LambdaQueryWrapper<WfExerciseBookItem> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                .eq(WfExerciseBookItem::getWfExerciseBookId,id);
+        List<WfExerciseBookItem> wfExerciseBookItemList = wfExerciseBookWfExerciseBookItemMapper.selectList(queryWrapper);
+        wfExerciseBook.setWfExerciseBookItemList(wfExerciseBookItemList);
+        return wfExerciseBook;
+    }
+}

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

@@ -203,7 +203,8 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             }
 
             //判断总发放数量是否超出该申请项的申请数量
-            if (wfTextbookClaimItem.getIssueNumber() + textbookClaimItem.getConfirmNumber() > wfTextbookClaimItem.getApplicantNumber()) {
+            Integer issueNumber = ObjectUtil.isNull(wfTextbookClaimItem.getIssueNumber())? 0 : wfTextbookClaimItem.getIssueNumber();
+            if (issueNumber + textbookClaimItem.getConfirmNumber() > wfTextbookClaimItem.getApplicantNumber()) {
                 throw new MyException(textbook.getBookName() + "发放总数量超出申领数量");
             }
 

+ 59 - 0
src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookItemVo.java

@@ -0,0 +1,59 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 作业本征订项表单出参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class WfExerciseBookItemVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 作业本征订编号
+    */
+    @ApiModelProperty("作业本征订编号")
+    private Long wfExerciseBookId;
+    /**
+    * 作业本征订类型(xjr_dictionary_item[exercise_book_type])
+    */
+    @ApiModelProperty("作业本征订类型(xjr_dictionary_item[exercise_book_type])")
+    private String subscriptionType;
+    /**
+    * 规格型号
+    */
+    @ApiModelProperty("规格型号")
+    private String specificationsModels;
+    /**
+    * 估价(元)
+    */
+    @ApiModelProperty("估价(元)")
+    private BigDecimal appraisalPrice;
+    /**
+    * 征订数量
+    */
+    @ApiModelProperty("征订数量")
+    private Integer subscriptionNumber;
+
+
+
+}

+ 118 - 0
src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookPageVo.java

@@ -0,0 +1,118 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.ExcelIgnore;
+import com.alibaba.excel.annotation.write.style.ContentStyle;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 作业本征订分页列表出参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class WfExerciseBookPageVo {
+
+    /**
+    * 主键编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("主键编号")
+    @ApiModelProperty("主键编号")
+    private String id;
+    /**
+    * 创建人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建人")
+    @ApiModelProperty("创建人")
+    private Long createUserId;
+    /**
+    * 创建时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("创建时间")
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+    /**
+    * 修改人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("修改人")
+    @ApiModelProperty("修改人")
+    private Long modifyUserId;
+    /**
+    * 修改时间
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("修改时间")
+    @ApiModelProperty("修改时间")
+    private Date modifyDate;
+    /**
+    * 删除标记
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("删除标记")
+    @ApiModelProperty("删除标记")
+    private Integer deleteMark;
+    /**
+    * 有效标志
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("有效标志")
+    @ApiModelProperty("有效标志")
+    private Integer enabledMark;
+    /**
+    * 序号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("序号")
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 申请人
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("申请人")
+    @ApiModelProperty("申请人")
+    private Long applicantUserId;
+    /**
+    * 班级编号
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("班级编号")
+    @ApiModelProperty("班级编号")
+    private Long classId;
+    /**
+    * 学期ID(base_semester)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("学期ID(base_semester)")
+    @ApiModelProperty("学期ID(base_semester)")
+    private Long baseSemesterId;
+    /**
+    * 备注
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("备注")
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 状态(1:结束 0:未结束)
+    */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("状态(1:结束 0:未结束)")
+    @ApiModelProperty("状态(1:结束 0:未结束)")
+    private Integer status;
+
+}

+ 65 - 0
src/main/java/com/xjrsoft/module/textbook/vo/WfExerciseBookVo.java

@@ -0,0 +1,65 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.textbook.entity.WfExerciseBookItem;
+
+/**
+* @title: 作业本征订表单出参
+* @Author szs
+* @Date: 2023-12-27
+* @Version 1.0
+*/
+@Data
+public class WfExerciseBookVo {
+
+    /**
+    * 主键编号
+    */
+    @ApiModelProperty("主键编号")
+    private Long id;
+    /**
+    * 序号
+    */
+    @ApiModelProperty("序号")
+    private Integer sortCode;
+    /**
+    * 申请人
+    */
+    @ApiModelProperty("申请人")
+    private Long applicantUserId;
+    /**
+    * 班级编号
+    */
+    @ApiModelProperty("班级编号")
+    private Long classId;
+    /**
+    * 学期ID(base_semester)
+    */
+    @ApiModelProperty("学期ID(base_semester)")
+    private Long baseSemesterId;
+    /**
+    * 备注
+    */
+    @ApiModelProperty("备注")
+    private String remark;
+    /**
+    * 状态(1:结束 0:未结束)
+    */
+    @ApiModelProperty("状态(1:结束 0:未结束)")
+    private Integer status;
+
+
+    /**
+    * wfExerciseBookItem
+    */
+    @ApiModelProperty("wfExerciseBookItem子表")
+    private List<WfExerciseBookItemVo> wfExerciseBookItemList;
+
+}

+ 4 - 2
src/main/resources/mapper/textbook/WfTextbookClaimMapper.xml

@@ -12,7 +12,7 @@
             t3.name as baseSemesterIdCN,
             t4.name as studentUserIdCN,
             t5.name as claimTypeCN,
-            t6.name as claimUserIdCN
+            t7.name as claimUserIdCN
         FROM wf_textbook_claim t
              LEFT JOIN xjr_user t1 ON (t1.id = t.applicant_user_id)
              LEFT JOIN base_class t2 ON (t2.id = t.class_id)
@@ -20,6 +20,7 @@
              LEFT JOIN xjr_user t4 ON (t4.id = t.student_user_id)
              LEFT JOIN xjr_dictionary_detail t5 ON (t5.code = t.claim_type)
              LEFT JOIN textbook_claim_user t6 ON (t6.id = t.claim_user_id)
+             LEFT JOIN xjr_user t7 ON (t7.id = t6.user_id)
         WHERE t.delete_mark = 0
         order by t.id;
     </select>
@@ -33,7 +34,7 @@
             t3.name as baseSemesterIdCN,
             t4.name as studentUserIdCN,
             t5.name as claimTypeCN,
-            t6.name as claimUserIdCN
+            t7.name as claimUserIdCN
         FROM wf_textbook_claim t
                  LEFT JOIN xjr_user t1 ON (t1.id = t.applicant_user_id)
                  LEFT JOIN base_class t2 ON (t2.id = t.class_id)
@@ -41,6 +42,7 @@
                  LEFT JOIN xjr_user t4 ON (t4.id = t.student_user_id)
                  LEFT JOIN xjr_dictionary_detail t5 ON (t5.code = t.claim_type)
                  LEFT JOIN textbook_claim_user t6 ON (t6.id = t.claim_user_id)
+                 LEFT JOIN xjr_user t7 ON (t7.id = t6.user_id)
         WHERE t.delete_mark = 0 and t.id = #{id}
         order by t.id;
     </select>

+ 7 - 2
src/test/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImplTest.java

@@ -17,7 +17,12 @@ class TextbookServiceImplTest {
     private ITextbookService textbookService;
 
     @Test
-    void dataHandle() {
-        textbookService.dataHandle(1739238143509458944L);
+    void dataHandleAddTextbookNode() {
+        textbookService.dataHandleAddTextbookNode(1739238143509458944L);
+    }
+
+    @Test
+    void dataHandleAddExerciseBookNode() {
+        textbookService.dataHandleAddExerciseBookNode(1739576230844362752L);
     }
 }

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

@@ -1404,4 +1404,71 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    /**
+     * 教材出库记录
+     *
+     */
+    @Test
+    public void gcTextbookIssueRecord() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("textbook_issue_record");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("szs");//作者名称
+        params.setPackageName("textbook");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
+
+    /**
+     * 作业本征订
+     *
+     */
+    @Test
+    public void gcWfExerciseBook() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("wf_exercise_book");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("wf_exercise_book_item");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("wf_exercise_book_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("szs");//作者名称
+        params.setPackageName("textbook");//包名
+        params.setTableConfigs(tableConfigs);
+        params.setPage(true);//是否生成分页接口
+        params.setImport(false);//是否生成导入接口
+        params.setExport(true);//是否生成导出接口
+        params.setOutMainDir(true);//是否生成在主目录,前期测试可设置成false
+        params.setDs(ds);
+
+        IApiGeneratorService apiGeneratorService = new ApiGeneratorServiceImpl();
+
+        apiGeneratorService.generateCodes(params);
+    }
 }