Browse Source

教材征订

大数据与最优化研究所 1 month ago
parent
commit
0e181e3c3d

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

@@ -7,11 +7,14 @@ import com.alibaba.excel.support.ExcelTypeEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.entity.BaseClassAdminCourse;
+import com.xjrsoft.module.base.entity.BaseClassCourse;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.student.entity.BaseClassMajorSet;
@@ -23,6 +26,7 @@ import com.xjrsoft.module.textbook.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -48,8 +52,6 @@ public class TextbookSubscriptionController {
 
     private final ITextbookSubscriptionService textbookSubscriptionService;
 
-    private final IBaseClassService baseClassService;
-
     @GetMapping(value = "/page")
     @ApiOperation(value="教材教辅征订记录列表(分页)")
     @SaCheckPermission("textbooksubscription:detail")
@@ -68,27 +70,23 @@ public class TextbookSubscriptionController {
         queryWrapper
                     .orderByDesc(TextbookSubscription::getId)
                     .select(TextbookSubscription.class,x -> VoToColumnUtil.fieldsToColumns(TextbookSubscriptionListVo.class).contains(x.getProperty()));
-
         List<TextbookSubscription> list = textbookSubscriptionService.list(queryWrapper);
         List<TextbookSubscriptionListVo> listVos = BeanUtil.copyToList(list, TextbookSubscriptionListVo.class);
         return RT.ok(listVos);
     }
 
     @GetMapping(value = "/history-list")
-    @ApiOperation(value="教材教辅征订历史列表(分页)")
+    @ApiOperation(value="教材教辅征订历史列表(分页)")
     @SaCheckPermission("wftextbooksubscription:detail")
     public RT<List<TextbookSubscriptionHistoryListVo>> historyList(@Valid TextbookSubscriptionHistoryListDto dto){
-
         MPJLambdaWrapper<TextbookSubscription> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
-                .selectSum(TextbookSubscriptionItem::getStudentNum, TextbookSubscriptionHistoryListVo::getStudentSubscriptionNumber)
-                .selectSum(TextbookSubscriptionItem::getTeacherNum, TextbookSubscriptionHistoryListVo::getTeacherSubscriptionNumber)
+                .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookSubscriptionHistoryListVo::getStudentSubscriptionNumber)
+                .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookSubscriptionHistoryListVo::getTeacherSubscriptionNumber)
                 .selectAs(TextbookSubscription::getCreateDate, TextbookSubscriptionHistoryListVo::getCreateDate)
                 .rightJoin(TextbookSubscriptionItem.class, TextbookSubscriptionItem::getTextbookSubscriptionId, TextbookSubscription::getId)
                 .eq(TextbookSubscriptionItem::getTextbookId, dto.getTextbookId())
                 .eq(TextbookSubscription::getBaseSemesterId, dto.getBaseSemesterId())
-                .groupBy(TextbookSubscription::getId)
-                .groupBy(TextbookSubscriptionItem::getTextbookId)
         ;
         List<TextbookSubscriptionHistoryListVo> list = textbookSubscriptionService.selectJoinList(TextbookSubscriptionHistoryListVo.class, queryWrapper);
         return RT.ok(list);
@@ -115,20 +113,9 @@ public class TextbookSubscriptionController {
     @ApiOperation(value="征订班级列表(分页)")
     @SaCheckPermission("textbooksubscription:detail")
     public RT<PageOutput<BaseclassPageVo>> baseclassPage(@Valid BaseclassPageDto dto){
-        MPJLambdaWrapper<BaseClass> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
-        baseClassMPJLambdaWrapper
-                .selectAs(BaseGrade::getName, BaseclassPageVo::getGradeIdCn)
-                .selectAs(XjrUser::getName, BaseclassPageVo::getTeacherIdCn)
-                .selectAs(BaseClassMajorSet::getTotalStudent, BaseclassPageVo::getTotalStudent)
-                .select(BaseClass.class,x -> VoToColumnUtil.fieldsToColumns(BaseclassPageVo.class).contains(x.getProperty()))
-                .innerJoin(TextbookSubscriptionClass.class, TextbookSubscriptionClass::getBaseClassId, BaseClass::getId)
-                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId)
-                .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
-                .leftJoin(BaseClassMajorSet.class, BaseClassMajorSet::getClassId, BaseClass::getId)
-                .eq(TextbookSubscriptionClass::getTextbookSubscriptionId, dto.getId())
-        ;
-        IPage<BaseclassPageVo> baseclassPageVos = baseClassService.selectJoinListPage(ConventPage.getPage(dto), BaseclassPageVo.class, baseClassMPJLambdaWrapper);
-        PageOutput<BaseclassPageVo> pageOutput = ConventPage.getPageOutput(baseclassPageVos, BaseclassPageVo.class);
+
+        IPage<BaseclassPageVo> page = textbookSubscriptionService.baseclassPage(dto);
+        PageOutput<BaseclassPageVo> pageOutput = ConventPage.getPageOutput(page, BaseclassPageVo.class);
         return RT.ok(pageOutput);
     }
 

+ 5 - 1
src/main/java/com/xjrsoft/module/textbook/dto/AddTextbookSubscriptionItemDto.java

@@ -74,5 +74,9 @@ public class AddTextbookSubscriptionItemDto implements Serializable {
     */
     @ApiModelProperty("变更类型(0:未变更,1:学生用书征订数量,2:教师用书征订数量,3:变更课程,)")
     private Integer alterationType;
-
+    /**
+     * 按班级征订征订的班级主键(base_class)
+     */
+    @ApiModelProperty("按班级征订征订的班级主键(base_class)")
+    private String baseClassIds;
 }

+ 14 - 3
src/main/java/com/xjrsoft/module/textbook/dto/BaseclassPageDto.java

@@ -6,6 +6,9 @@ import com.xjrsoft.common.page.PageInput;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 
 /**
 * @title: 教材管理分页查询入参
@@ -16,11 +19,19 @@ import lombok.Data;
 @Data
 public class BaseclassPageDto extends PageInput {
     /**
-     * 主键编号
+     * 教材征订记录主键编号
      */
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("主键编号")
-    @ApiModelProperty("主键编号")
+    @ExcelProperty("教材征订记录主键编号")
+    @ApiModelProperty("教材征订记录主键编号")
+    @NotBlank(message = "征订记录主键为必要字段")
     private String id;
+    /**
+     * 教材征订项主键编号
+     */
+    @ContentStyle(dataFormat = 49)
+    @ExcelProperty("教材征订项主键编号")
+    @ApiModelProperty("教材征订项主键编号")
+    private String textbookSubscriptionItemId;
 
 }

+ 10 - 1
src/main/java/com/xjrsoft/module/textbook/entity/TextbookSubscriptionItem.java

@@ -98,6 +98,11 @@ public class TextbookSubscriptionItem implements Serializable {
     */
     @ApiModelProperty("教师用书征订数量")
     private Integer teacherNum;
+    /**
+     * 在本次征订中本征订项的教材使用的班级数量
+     */
+    @ApiModelProperty("在本次征订中本征订项的教材使用的班级数量")
+    private Integer useClassNum;
     /**
     * 实际折扣
     */
@@ -123,6 +128,10 @@ public class TextbookSubscriptionItem implements Serializable {
     */
     @ApiModelProperty("变更类型(0:未变更,1:变更征订数量,2:变更课程)")
     private Integer alterationType;
-
+    /**
+     * 按班级征订征订的班级主键(base_class)
+     */
+    @ApiModelProperty("按班级征订征订的班级主键(base_class)")
+    private String baseClassIds;
 
 }

+ 98 - 0
src/main/java/com/xjrsoft/module/textbook/entity/TextbookSubscriptionItemClass.java

@@ -0,0 +1,98 @@
+package com.xjrsoft.module.textbook.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 教材征订记录详情与班级关联表
+* @Author phoenix
+* @Date: 2025-01-22
+* @Version 1.0
+*/
+@Data
+@TableName("textbook_subscription_item_class")
+@ApiModel(value = "textbook_subscription_item_class", description = "教材征订记录详情与班级关联表")
+public class TextbookSubscriptionItemClass 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 String remark;
+    /**
+    * 教材征订记录详情表id(textbook_subscription)
+    */
+    @ApiModelProperty("教材征订记录详情表id(textbook_subscription)")
+    private Long textbookSubscriptionItemId;
+    /**
+    * 按班级征订中征订的班级主键(base_class)
+    */
+    @ApiModelProperty("按班级征订中征订的班级主键(base_class)")
+    private Long baseClassId;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/textbook/mapper/TextbookSubscriptionItemClassMapper.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.TextbookSubscriptionItemClass;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教材征订记录详情与班级关联表
+* @Author phoenix
+* @Date: 2025-01-22
+* @Version 1.0
+*/
+@Mapper
+public interface TextbookSubscriptionItemClassMapper extends MPJBaseMapper<TextbookSubscriptionItemClass> {
+
+}

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

@@ -40,6 +40,8 @@ public interface ITextbookSubscriptionService extends MPJBaseService<TextbookSub
 
     IPage<TextbookSubscriptionItemPageVo> itemPage(TextbookSubscriptionItemPageDto dto);
 
+    IPage<BaseclassPageVo> baseclassPage(BaseclassPageDto dto);
+
     List<SubscriptionItemListDistributeVo> itemListConfirmDistribute(SubscriptionItemListDistributeDto dto);
 
     /**

+ 27 - 10
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java

@@ -1070,6 +1070,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                 .map(BaseClassCourse::getId)
                 .collect(Collectors.toList());
 
+        // 需要征订的教材
         MPJLambdaWrapper<BaseClassCourse> baseClassCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
         baseClassCourseMPJLambdaWrapper
                 .disableSubLogicDel()
@@ -1107,6 +1108,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
             MPJLambdaWrapper<BaseClassCourse> countNum = new MPJLambdaWrapper<>();
             countNum
                     .selectAs(BaseClassCourse::getTextbookId, TextbookSubscriptionListVo::getTextbookId)
+                    .selectAs(BaseClassAdminCourse::getClassId, TextbookSubscriptionListVo::getClassIds)
                     .selectCount(BaseStudentSchoolRoll::getId, TextbookSubscriptionListVo::getStudentSubscriptionNumber)
 
                     .innerJoin(BaseClassAdminCourse.class, BaseClassAdminCourse::getId, BaseClassCourse::getClassId)
@@ -1120,25 +1122,40 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                     .notIn(!baseClassCourseIds.isEmpty(), BaseClassCourse::getId, baseClassCourseIds)
                     .eq(BaseClassCourse::getDeleteMark, DeleteMark.NODELETE.getCode())
                     .groupBy(BaseClassCourse::getTextbookId)
+                    .groupBy(BaseClassAdminCourse::getClassId)
             ;
 
             List<TextbookSubscriptionListVo> countStuNumList = baseClassCourseMapper.selectJoinList(TextbookSubscriptionListVo.class, countNum);
 
-            Map<String, Integer> countStuNumMap = countStuNumList.stream()
-                    .collect(Collectors.toMap(TextbookSubscriptionListVo::getTextbookId, TextbookSubscriptionListVo::getStudentSubscriptionNumber, (t1, t2) -> t1));
+            Map<String, List<TextbookSubscriptionListVo>> countStuNumMap = countStuNumList.stream()
+                    .collect(Collectors.groupingBy(TextbookSubscriptionListVo::getTextbookId));
 
             if(ObjectUtils.isNotEmpty(countStuNumMap)){
+                StringBuilder classIds;
+                int sum;
                 for(TextbookSubscriptionListVo t : textbookSubscriptionListVoList){
-                    Integer num = countStuNumMap.get(t.getTextbookId());
-                    if(ObjectUtils.isNotEmpty(num)){
-                        t.setStudentSubscriptionNumber(num);
-                    }else {
-                        t.setStudentSubscriptionNumber(0);
+                    List<TextbookSubscriptionListVo> textbookSubscriptionListVos = countStuNumMap.get(t.getTextbookId());
+                    if(ObjectUtils.isNotEmpty(textbookSubscriptionListVos)){
+                        sum = 0;
+                        classIds = new StringBuilder();
+                        for (TextbookSubscriptionListVo textbookSubscriptionListVo : textbookSubscriptionListVos){
+                            sum += ObjectUtils.isNotEmpty(textbookSubscriptionListVo.getStudentSubscriptionNumber()) ? textbookSubscriptionListVo.getStudentSubscriptionNumber() : 0;
+                            if(ObjectUtils.isNotEmpty(textbookSubscriptionListVo.getClassIds())){
+                                classIds.append(textbookSubscriptionListVo.getClassIds());
+                                classIds.append(",");
+                            }
+                        }
+
+                        if (classIds.length() > 0) { // 确保 StringBuilder 不为空,以避免 StringIndexOutOfBoundsException
+                            classIds.deleteCharAt(classIds.length() - 1);
+                        }
+
+                        t.setStudentSubscriptionNumber(sum);
+                        t.setUseClassNum(textbookSubscriptionListVos.size());
+                        t.setClassIds(classIds.toString());
                     }
-                    t.setClassIds(dto.getClassIds());
                 }
             }
-
 //        for(TextbookSubscriptionListVo t : textbookSubscriptionListVoList){
 //            MPJLambdaWrapper<BaseClassAdminCourse> countNum = new MPJLambdaWrapper<>();
 //            countNum
@@ -1157,7 +1174,7 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
 //            t.setStudentSubscriptionNumber(num.intValue());
 //
 //            t.setClassIds(dto.getClassIds());
-//        }
+//
         }
 
         return textbookSubscriptionListVoList;

+ 148 - 43
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java

@@ -14,15 +14,16 @@ import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.common.exception.MyException;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseCourseSubject;
+import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.entity.BaseSemester;
+import com.xjrsoft.module.student.entity.BaseClassMajorSet;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.*;
-import com.xjrsoft.module.textbook.mapper.TextbookSubscriptionClassMapper;
-import com.xjrsoft.module.textbook.mapper.TextbookSubscriptionItemMapper;
-import com.xjrsoft.module.textbook.mapper.TextbookSubscriptionMapper;
-import com.xjrsoft.module.textbook.mapper.TextbookWarehouseRecordMapper;
+import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.ITextbookSubscriptionService;
 import com.xjrsoft.module.textbook.vo.*;
 import lombok.AllArgsConstructor;
@@ -33,6 +34,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.io.InputStream;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.regex.Matcher;
@@ -55,6 +57,8 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
 
     private final TextbookSubscriptionClassMapper textbookSubscriptionClassMapper;
 
+    private final TextbookSubscriptionItemClassMapper textbookSubscriptionItemClassMapper;
+
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
     @Override
@@ -180,15 +184,16 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
         int stuNum = 0;
         int teaNum = 0;
         BigDecimal totalPrice = BigDecimal.valueOf(0);
+        BigDecimal currentPrice;
         for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscriptionItemList) {
             stuNum += textbookSubscriptionItem.getStudentNum();
             teaNum += textbookSubscriptionItem.getTeacherNum();
 
-            totalPrice.add(textbookSubscriptionItem.getPrice()
-                            .multiply(BigDecimal.valueOf(textbookSubscriptionItem.getDiscount()))
-                            .divide(BigDecimal.valueOf(10))
-                            .multiply(BigDecimal.valueOf(textbookSubscriptionItem.getTeacherNum() + textbookSubscriptionItem.getStudentNum())));
+            currentPrice = textbookSubscriptionItem.getPrice().multiply(BigDecimal.valueOf(textbookSubscriptionItem.getDiscount()).divide(BigDecimal.valueOf(10), RoundingMode.UNNECESSARY))
+                    .multiply(BigDecimal.valueOf(textbookSubscriptionItem.getTeacherNum() + textbookSubscriptionItem.getStudentNum()))
+            ;
 
+            totalPrice = totalPrice.add(currentPrice);
         }
         TextbookSubscriptionDetailVo textbookSubscriptionDetailVo = new TextbookSubscriptionDetailVo();
         textbookSubscriptionDetailVo.setId(String.valueOf(id));
@@ -226,6 +231,39 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
         return page;
     }
 
+    @Override
+    public IPage<BaseclassPageVo> baseclassPage(BaseclassPageDto dto) {
+        // 查询征订记录总的征订班级
+        MPJLambdaWrapper<TextbookSubscriptionItem> baseClassMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        baseClassMPJLambdaWrapper
+                .disableSubLogicDel()
+                .distinct()
+                .selectAs(BaseGrade::getName, BaseclassPageVo::getGradeIdCn)
+                .selectAs(XjrUser::getName, BaseclassPageVo::getTeacherIdCn)
+                .select(" (select" +
+                        "         count(a.id)" +
+                        "     from base_student_school_roll a" +
+                        "         where a.class_id = t1.base_class_id" +
+                        "         and a.archives_status = 'FB2901'" +
+                        "         and a.delete_mark = 0" +
+                        "    ) as total_student")
+                .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseclassPageVo.class).contains(x.getProperty()))
+
+                .innerJoin(TextbookSubscriptionItemClass.class, TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, TextbookSubscriptionItem::getId)
+
+                .leftJoin(BaseClass.class, BaseClass::getId, TextbookSubscriptionItemClass::getBaseClassId)
+                .leftJoin(BaseGrade.class, BaseGrade::getId, BaseClass::getGradeId)
+                .leftJoin(XjrUser.class, XjrUser::getId, BaseClass::getTeacherId)
+
+                .eq(ObjectUtils.isNotEmpty(dto.getId()), TextbookSubscriptionItem::getTextbookSubscriptionId, dto.getId())
+                .eq(ObjectUtils.isNotEmpty(dto.getTextbookSubscriptionItemId()), TextbookSubscriptionItem::getId, dto.getId())
+                .eq(TextbookSubscriptionItem::getDeleteMark, DeleteMark.NODELETE.getCode())
+                .eq(TextbookSubscriptionClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+        ;
+
+        return textbookSubscriptionTextbookSubscriptionItemMapper.selectJoinPage(ConventPage.getPage(dto), BaseclassPageVo.class, baseClassMPJLambdaWrapper);
+    }
+
     @Override
     public List<SubscriptionItemListDistributeVo> itemListConfirmDistribute(SubscriptionItemListDistributeDto dto) {
         MPJLambdaWrapper<TextbookSubscriptionItem> textbookSubscriptionItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
@@ -253,27 +291,49 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             sum += textbookSubscriptionItem.getStudentNum() + textbookSubscriptionItem.getTeacherNum();
         }
         textbookSubscription.setSum(sum);
+        textbookSubscription.setCreateDate(new Date());
         textbookSubscriptionTextbookSubscriptionMapper.insert(textbookSubscription);
 
-        // 处理征订和班级关联表
-        if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
-                && textbookSubscription.getSubscriptionMethod() == 1
-                && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
-        ) {
-            String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
-            TextbookSubscriptionClass textbookSubscriptionClass;
-            for (String str : classIdArr) {
-                textbookSubscriptionClass = new TextbookSubscriptionClass();
-                textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
-                textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
-                textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
-            }
-        }
+//        // 处理征订和班级关联表
+//        if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
+//                && textbookSubscription.getSubscriptionMethod() == 1
+//                && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
+//        ) {
+//            String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
+//            TextbookSubscriptionClass textbookSubscriptionClass;
+//            for (String str : classIdArr) {
+//                textbookSubscriptionClass = new TextbookSubscriptionClass();
+//                textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
+//                textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
+//                textbookSubscriptionClass.setCreateDate(new Date());
+//                textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
+//            }
+//        }
 
         // 处理征订表子表
+        TextbookSubscriptionItemClass textbookSubscriptionItemClass;
         for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) {
+            String[] classIdArr = new String[0];
+            if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
+                    && textbookSubscription.getSubscriptionMethod() == 1
+                    && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getBaseClassIds())
+            ) {
+                classIdArr = textbookSubscriptionItem.getBaseClassIds().split(",");
+            }
+
+            textbookSubscriptionItem.setUseClassNum(classIdArr.length);
             textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId());
+            textbookSubscriptionItem.setCreateDate(new Date());
             textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem);
+
+            // 处理征订项和班级关联表
+            for (String str : classIdArr) {
+                textbookSubscriptionItemClass = new TextbookSubscriptionItemClass();
+                textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId());
+                textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str));
+                textbookSubscriptionItemClass.setCreateDate(new Date());
+                textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass);
+            }
         }
         return true;
     }
@@ -438,14 +498,35 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
                     .filter(item -> !textbookSubscriptionItemOldIds.contains(item))
                     .collect(Collectors.toList());
 
+            TextbookSubscriptionItemClass textbookSubscriptionItemClass;
             for (TextbookSubscriptionItem textbookSubscriptionItem : textbookSubscription.getTextbookSubscriptionItemList()) {
                 // 如果不等于空则修改
                 if (textbookSubscriptionItem.getId() != null) {
                     textbookSubscriptionTextbookSubscriptionItemMapper.updateById(textbookSubscriptionItem);
                 } else {
                     // 如果等于空 则新增
+                    // 新增的时候应该处理班级关联
+                    String[] classIdArr = new String[0];
+                    if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
+                            && textbookSubscription.getSubscriptionMethod() == 1
+                            && ObjectUtils.isNotEmpty(textbookSubscriptionItem.getBaseClassIds())
+                    ) {
+                        classIdArr = textbookSubscriptionItem.getBaseClassIds().split(",");
+                    }
+
+                    textbookSubscriptionItem.setUseClassNum(classIdArr.length);
                     textbookSubscriptionItem.setTextbookSubscriptionId(textbookSubscription.getId());
+                    textbookSubscriptionItem.setCreateDate(new Date());
                     textbookSubscriptionTextbookSubscriptionItemMapper.insert(textbookSubscriptionItem);
+
+                    // 处理征订项和班级关联表
+                    for (String str : classIdArr) {
+                        textbookSubscriptionItemClass = new TextbookSubscriptionItemClass();
+                        textbookSubscriptionItemClass.setTextbookSubscriptionItemId(textbookSubscriptionItem.getId());
+                        textbookSubscriptionItemClass.setBaseClassId(Long.parseLong(str));
+                        textbookSubscriptionItemClass.setCreateDate(new Date());
+                        textbookSubscriptionItemClassMapper.insert(textbookSubscriptionItemClass);
+                    }
                 }
                 textbookSubscriptionItem.setStudentNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getStudentNum()) ? 0 : textbookSubscriptionItem.getStudentNum());
                 textbookSubscriptionItem.setTeacherNum(ObjectUtils.isEmpty(textbookSubscriptionItem.getTeacherNum()) ? 0 : textbookSubscriptionItem.getTeacherNum());
@@ -454,32 +535,40 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             }
             // 已经不存在的id 删除
             if (ObjectUtils.isNotEmpty(textbookSubscriptionItemRemoveIds.isEmpty())) {
+                LambdaUpdateWrapper<TextbookSubscriptionItemClass> textbookSubscriptionItemClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+                textbookSubscriptionItemClassLambdaUpdateWrapper
+                        .in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemRemoveIds)
+                        .eq(TextbookSubscriptionItemClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        ;
+                textbookSubscriptionItemClassMapper.delete(textbookSubscriptionItemClassLambdaUpdateWrapper);
                 textbookSubscriptionTextbookSubscriptionItemMapper.deleteBatchIds(textbookSubscriptionItemRemoveIds);
             }
         }
         //********************************* TextbookSubscriptionItem  增删改  结束 *******************************************/
 
         //********************************* TextbookSubscriptionClass  增删改  开始 *******************************************/
-        LambdaUpdateWrapper<TextbookSubscriptionClass> textbookSubscriptionClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
-        textbookSubscriptionClassLambdaUpdateWrapper
-                .eq(TextbookSubscriptionClass::getTextbookSubscriptionId, textbookSubscription.getId())
-        ;
-        textbookSubscriptionClassMapper.delete(textbookSubscriptionClassLambdaUpdateWrapper);
-
-        if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
-                && textbookSubscription.getSubscriptionMethod() == 1
-                && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
-        ) {
-            String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
-            for (String str : classIdArr) {
-                TextbookSubscriptionClass textbookSubscriptionClass = new TextbookSubscriptionClass();
-                textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
-                textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
-                textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
-            }
-        }
+//        LambdaUpdateWrapper<TextbookSubscriptionClass> textbookSubscriptionClassLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+//        textbookSubscriptionClassLambdaUpdateWrapper
+//                .eq(TextbookSubscriptionClass::getTextbookSubscriptionId, textbookSubscription.getId())
+//        ;
+//        textbookSubscriptionClassMapper.delete(textbookSubscriptionClassLambdaUpdateWrapper);
+//
+//        if (ObjectUtils.isNotEmpty(textbookSubscription.getSubscriptionMethod())
+//                && textbookSubscription.getSubscriptionMethod() == 1
+//                && StringUtils.isNotBlank(textbookSubscription.getBaseClassIds())
+//        ) {
+//            String[] classIdArr = textbookSubscription.getBaseClassIds().split(",");
+//            for (String str : classIdArr) {
+//                TextbookSubscriptionClass textbookSubscriptionClass = new TextbookSubscriptionClass();
+//                textbookSubscriptionClass.setTextbookSubscriptionId(textbookSubscription.getId());
+//                textbookSubscriptionClass.setBaseClassId(Long.parseLong(str));
+//                textbookSubscriptionClass.setCreateDate(new Date());
+//                textbookSubscriptionClassMapper.insert(textbookSubscriptionClass);
+//            }
+//        }
         //********************************* TextbookSubscriptionClass  增删改  结束 *******************************************/
 
+        textbookSubscription.setSum(sum);
         textbookSubscriptionTextbookSubscriptionMapper.updateById(textbookSubscription);
         return true;
     }
@@ -502,9 +591,25 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean delete(List<Long> ids) {
-        textbookSubscriptionTextbookSubscriptionMapper.deleteBatchIds(ids);
-        textbookSubscriptionTextbookSubscriptionItemMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItem.class).in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids));
-        textbookSubscriptionClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionClass.class).in(TextbookSubscriptionClass::getTextbookSubscriptionId, ids));
+        LambdaQueryWrapper<TextbookSubscriptionItem> textbookSubscriptionItemLambdaQueryWrapper = new LambdaQueryWrapper<>();
+        textbookSubscriptionItemLambdaQueryWrapper
+                .in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids)
+                ;
+        List<TextbookSubscriptionItem> textbookSubscriptionItemList = textbookSubscriptionTextbookSubscriptionItemMapper.selectList(textbookSubscriptionItemLambdaQueryWrapper);
+
+        List<Long> textbookSubscriptionItemIds = textbookSubscriptionItemList.stream()
+                                .map(TextbookSubscriptionItem::getId)
+                                .collect(Collectors.toList());
+
+        if(ObjectUtils.isNotEmpty(textbookSubscriptionItemIds)){
+            textbookSubscriptionItemClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItemClass.class).in(TextbookSubscriptionItemClass::getTextbookSubscriptionItemId, textbookSubscriptionItemIds));
+        }
+
+        if(ObjectUtils.isNotEmpty(ids)) {
+            textbookSubscriptionTextbookSubscriptionItemMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionItem.class).in(TextbookSubscriptionItem::getTextbookSubscriptionId, ids));
+            textbookSubscriptionClassMapper.delete(Wrappers.lambdaQuery(TextbookSubscriptionClass.class).in(TextbookSubscriptionClass::getTextbookSubscriptionId, ids));
+            textbookSubscriptionTextbookSubscriptionMapper.deleteBatchIds(ids);
+        }
         return true;
     }
 

+ 7 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookSubscriptionItemPageVo.java

@@ -113,6 +113,13 @@ public class TextbookSubscriptionItemPageVo {
     @ExcelProperty("教师用书征订数量")
     @ApiModelProperty("教师用书征订数量")
     private Integer teacherNum;
+
+    /**
+     * 在本次征订中本征订项的教材使用的班级数量
+     */
+    @ApiModelProperty("在本次征订中本征订项的教材使用的班级数量")
+    private Integer useClassNum;
+
     /**
     * 实际折扣
     */

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

@@ -91,6 +91,11 @@ public class TextbookSubscriptionListVo {
      */
     @ApiModelProperty("学生用书征订数量")
     private Integer studentSubscriptionNumber;
+    /**
+     * 在本次征订中本征订项的教材使用的班级数量
+     */
+    @ApiModelProperty("在本次征订中本征订项的教材使用的班级数量")
+    private Integer useClassNum;
 
     /**
      * 使用班级

+ 25 - 0
src/main/resources/sqlScript/20250120_sql.sql

@@ -25,7 +25,32 @@ create table `base_class_admin_course`
 alter table base_class_course
     modify class_id bigint null comment '需要进行课程管理的班级id(base_class_admin_course)(原有班级主键id字段)';
 
+alter table textbook_subscription_item
+    add use_class_num int default 0 null comment '在本次征订中本征订项的教材使用的班级数量';
 
+-- ----------------------------
+-- 2025-01-22 14:36
+-- 教材征订记录详情与班级关联表
+-- ----------------------------
+drop table if exists textbook_subscription_item_class;
+create table `textbook_subscription_item_class`
+(
+    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 '备注',
+
+    textbook_subscription_item_id bigint        not null comment '教材征订记录详情表id(textbook_subscription)',
+    base_class_id            bigint        not null comment '按班级征订中征订的班级主键(base_class)'
+) engine = innodb
+  default charset = utf8mb4
+  collate = utf8mb4_0900_ai_ci comment ='教材征订记录详情与班级关联表';
 
 
 

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

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