ソースを参照

Merge branch 'pre'

dzx 10 ヶ月 前
コミット
0dc8343f32
31 ファイル変更539 行追加188 行削除
  1. 4 4
      src/main/java/com/xjrsoft/common/enums/RecedeTypeEnum.java
  2. 34 1
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java
  3. 6 6
      src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java
  4. 51 8
      src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java
  5. 3 0
      src/main/java/com/xjrsoft/module/databoard/dto/StatisticsDetailDto.java
  6. 4 0
      src/main/java/com/xjrsoft/module/databoard/vo/StudnetStatisticsDetailVo.java
  7. 14 5
      src/main/java/com/xjrsoft/module/oa/controller/NewsController.java
  8. 1 1
      src/main/java/com/xjrsoft/module/oa/vo/NewsCountTypeVo.java
  9. 4 4
      src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java
  10. 8 4
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  11. 2 0
      src/main/java/com/xjrsoft/module/system/controller/SystemUpdateMessageController.java
  12. 12 9
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java
  13. 5 7
      src/main/java/com/xjrsoft/module/textbook/dto/CanReturnTextbookListDto.java
  14. 13 0
      src/main/java/com/xjrsoft/module/textbook/dto/DistributeRecordPageDto.java
  15. 10 0
      src/main/java/com/xjrsoft/module/textbook/dto/TextbookPageDto.java
  16. 5 1
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookIssueRecord.java
  17. 5 1
      src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookClaim.java
  18. 5 0
      src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookRecedeItem.java
  19. 4 0
      src/main/java/com/xjrsoft/module/textbook/service/ITextbookIssueRecordService.java
  20. 94 3
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookIssueRecordServiceImpl.java
  21. 2 0
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookServiceImpl.java
  22. 8 2
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java
  23. 16 15
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  24. 90 82
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java
  25. 15 0
      src/main/java/com/xjrsoft/module/textbook/vo/CanReturnTextbookListVo.java
  26. 38 0
      src/main/java/com/xjrsoft/module/textbook/vo/DistributeRecordPageVo.java
  27. 31 0
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordDistributeRecordVo.java
  28. 20 20
      src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordPageVo.java
  29. 15 14
      src/main/resources/mapper/textbook/TextbookIssueRecordMapper.xml
  30. 19 0
      src/main/resources/sqlScript/20250120_sql.sql
  31. 1 1
      src/test/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImplTest.java

+ 4 - 4
src/main/java/com/xjrsoft/common/enums/RecedeTypeEnum.java

@@ -8,14 +8,14 @@ package com.xjrsoft.common.enums;
  */
 public enum RecedeTypeEnum {
     /**
-     * 退到教务处
+     *
      * */
-    RecedeDeansOffice("recede_deans_office", "退到教务处"),
+    PersonalRecede("recede_deans_office", "退到教务处"),
 
     /**
-     * 退到书店
+     *
      * */
-    RecedeBookstore("recede_bookstore", "退到书店");
+    ClassRecede("recede_bookstore", "退到书店");
 
     final String code;
     final String value;

+ 34 - 1
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassCourseServiceImpl.java

@@ -132,7 +132,40 @@ public class BaseClassCourseServiceImpl extends MPJBaseServiceImpl<BaseClassCour
     @Override
     @Transactional
     public Boolean oneUpdateClassCoursesAndTextbooks(ClassCourseTextbook dto) {
-        return updateAddCourseBook(dto);
+        if (dto.getBaseClassAdminCourseIds() == null || dto.getBaseClassAdminCourseIds().isEmpty() || dto.getBaseSemesterId() == null || dto.getBaseSemesterId() == 0) {
+            return false;
+        }
+
+        BaseClassAdminCourse baseClassAdminCourse = baseClassAdminCourseMapper.selectById(dto.getBaseClassAdminCourseIds().get(0));
+
+        if(ObjectUtils.isEmpty(baseClassAdminCourse)){
+            throw new MyException("当前班级错误");
+        }
+
+        //删除班级的这学期的所有课程教材
+        LambdaUpdateWrapper<BaseClassCourse> baseClassCourseLambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        baseClassCourseLambdaUpdateWrapper
+                .in(BaseClassCourse::getClassId, baseClassAdminCourse.getId())
+        ;
+        this.remove(baseClassCourseLambdaUpdateWrapper);
+
+
+        List<BaseClassCourse> baseClassCourseList = new ArrayList<>();
+        for (String id : dto.getIds()) {
+            String[] idArr = id.split("_");
+            if (idArr[0].isEmpty() || idArr[1].isEmpty()) {
+                continue;
+            }
+            Long courseId = Long.parseLong(idArr[0]);
+            Long textbookId = Long.parseLong(idArr[1]);
+            baseClassCourseList.add(new BaseClassCourse() {{
+                setClassId(baseClassAdminCourse.getId());
+                setCourseId(courseId);
+                setTextbookId(textbookId);
+            }});
+        }
+
+        return this.saveBatch(baseClassCourseList);
     }
 
     @Override

+ 6 - 6
src/main/java/com/xjrsoft/module/courseTable/service/impl/CourseTableServiceImpl.java

@@ -231,8 +231,8 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
             tableVo.setSemesterName(baseSemester.getName());
             LocalDateTime now = LocalDateTime.now();
             //计算本周是第几周
-            LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getStartDate().toInstant(), ZoneId.systemDefault());
-            LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getEndDate().toInstant(), ZoneId.systemDefault());
+            LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
+            LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
             Duration between = Duration.between(startDateTime, endDateTime);
             long days = between.toDays();
             int weeks = (int) Math.ceil((double) days / 7);
@@ -1064,18 +1064,18 @@ public class CourseTableServiceImpl extends ServiceImpl<CourseTableMapper, Cours
                             content += courseDetailVo.getCourseName() + "\r\n";
                             content += courseDetailVo.getClassroomName() + "\r\n";
                             if("teacher".equals(dto.getCourseType())){
-                                content += courseDetailVo.getTeacherName();
+                                content += courseDetailVo.getClassName();
                             }else if("class".equals(dto.getCourseType())){
-                                content += courseDetailVo.getClassName() ;
+                                content += courseDetailVo.getTeacherName() ;
                             }
                         }else{
                             CourseDetailVo courseDetailVo = list.get(0);
                             content += courseDetailVo.getCourseName() + "\r\n";
                             content += courseDetailVo.getClassroomName() + "\r\n";
                             if("teacher".equals(dto.getCourseType())){
-                                content += courseDetailVo.getTeacherName();
+                                content += courseDetailVo.getClassName();
                             }else if("class".equals(dto.getCourseType())){
-                                Set<String> classNames = list.stream().map(CourseDetailVo::getClassName).collect(Collectors.toSet());
+                                Set<String> classNames = list.stream().map(CourseDetailVo::getTeacherName).collect(Collectors.toSet());
                                 content += classNames.toString().replace("]", "").replace("[", "").replace(" ","") ;
                             }
                         }

+ 51 - 8
src/main/java/com/xjrsoft/module/databoard/controller/DatadetailController.java

@@ -31,6 +31,7 @@ import com.xjrsoft.module.oa.service.IWfSubscriptionService;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
+import com.xjrsoft.module.student.vo.StudentReportRecordItemVo;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import com.xjrsoft.module.teacher.entity.XjrUser;
@@ -464,13 +465,17 @@ public class DatadetailController {
     @GetMapping(value = "/student-statistics")
     @ApiOperation(value="学生详情数据统计")
     @SaCheckPermission("datadetail:detail")
-    public RT<StudnetStatisticsDetailVo> studentStatistics(@Valid StatisticsDetailDto dto) throws ParseException {
+    public RT<StudnetStatisticsDetailVo> studentStatistics(@Valid StatisticsDetailDto dto){
         StudnetStatisticsDetailVo result = new StudnetStatisticsDetailVo();
 
         String sql = "SELECT IFNULL(t3.name,'未填写') AS item ,COUNT(*) AS a_count FROM xjr_user t1" +
             " INNER JOIN base_student t2 ON t1.id = t2.user_id" +
-            " LEFT JOIN xjr_dictionary_detail t3 ON t1.gender  = t3.code AND t3.item_id = 2023000000000000004" +
-            " WHERE t1.delete_mark = 0 GROUP BY t3.name";
+            " INNER JOIN base_student_school_roll t4 ON t1.id = t4.user_id" +
+            " LEFT JOIN xjr_dictionary_detail t3 ON t1.gender  = t3.code" +
+            " AND t3.item_id = 2023000000000000004 and t3.delete_mark = 0" +
+            " WHERE t1.delete_mark = 0" +
+            " and t4.archives_status = 'FB2901'" +
+            " GROUP BY t3.name";
         List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql);
         List<ItemCountVo> genderList = new ArrayList<>();
         for (Map<String, Object> objectMap : list) {
@@ -485,8 +490,11 @@ public class DatadetailController {
 
         sql = "SELECT IFNULL(t3.name,'未填写') AS item ,COUNT(*) AS a_count FROM xjr_user t1" +
             " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
-            " LEFT JOIN xjr_dictionary_detail t3 ON t2.student_type = t3.code AND t3.item_id = 2023000000000000028" +
-            " WHERE t1.delete_mark = 0 GROUP BY t3.name";
+            " LEFT JOIN xjr_dictionary_detail t3 ON t2.student_type = t3.code" +
+            " AND t3.item_id = 2023000000000000028 and t3.delete_mark = 0" +
+            " WHERE t1.delete_mark = 0" +
+            " and t2.archives_status = 'FB2901'" +
+            " GROUP BY t3.name";
         list = SqlRunnerAdapter.db().selectList(sql);
         List<ItemCountVo> studentTypeList = new ArrayList<>();
         for (Map<String, Object> objectMap : list) {
@@ -545,20 +553,55 @@ public class DatadetailController {
             " SELECT COUNT(*) FROM xjr_user t1" +
             " INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id" +
             " WHERE t1.delete_mark = 0 AND t2.grade_id = base_grade.id" +
-            " ) AS a_count FROM base_grade" +
-            " WHERE delete_mark = 0 AND status = 1 ORDER BY name DESC LIMIT 3";
+            " and t2.archives_status = 'FB2901') AS a_count FROM base_grade" +
+            " WHERE delete_mark = 0 AND status = 1";
+        if(dto.getGradeId() != null){
+            sql += " id = " + dto.getGradeId();
+        }
+        sql += " ORDER BY name DESC LIMIT 4";
         list = SqlRunnerAdapter.db().selectList(sql);
         Collections.reverse(list);
         List<ItemCountVo> gradeList = new ArrayList<>();
         for (Map<String, Object> objectMap : list) {
+            int aCount = Integer.parseInt(objectMap.get("a_count").toString());
+            if(aCount == 0){
+                continue;
+            }
             gradeList.add(
                     new ItemCountVo(){{
                         setItem(objectMap.get("item").toString());
-                        setCount(Integer.parseInt(objectMap.get("a_count").toString()));
+                        setCount(aCount);
                     }}
             );
         }
         result.setGradeList(gradeList);
+
+        sql = "SELECT NAME AS item,(\n" +
+            "SELECT COUNT(*) FROM xjr_user t1\n" +
+            "INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id\n" +
+            "INNER JOIN base_class t3 ON t2.class_id = t3.id\n" +
+            "WHERE t1.delete_mark = 0 AND t3.org_id = xjr_department.id\n" +
+            "AND t2.archives_status = 'FB2901' AND t1.gender = 'SB10001') AS a_count,\n" +
+            "(\n" +
+            "SELECT COUNT(*) FROM xjr_user t1\n" +
+            "INNER JOIN base_student_school_roll t2 ON t1.id = t2.user_id\n" +
+            "INNER JOIN base_class t3 ON t2.class_id = t3.id\n" +
+            "WHERE t1.delete_mark = 0 AND t3.org_id = xjr_department.id\n" +
+            "AND t2.archives_status = 'FB2901' AND t1.gender = 'SB10002') AS b_count FROM xjr_department\n" +
+            "WHERE delete_mark = 0 AND is_major = 1 ORDER BY NAME DESC";
+        list = SqlRunnerAdapter.db().selectList(sql);
+        Collections.reverse(list);
+        List<StudentReportRecordItemVo> deptList = new ArrayList<>();
+        for (Map<String, Object> objectMap : list) {
+            deptList.add(
+                    new StudentReportRecordItemVo(){{
+                        setItem(objectMap.get("item").toString());
+                        setCount(Integer.parseInt(objectMap.get("a_count").toString()));
+                        setCount2(Integer.parseInt(objectMap.get("b_count").toString()));
+                    }}
+            );
+        }
+        result.setDeptList(deptList);
         return RT.ok(result);
     }
 

+ 3 - 0
src/main/java/com/xjrsoft/module/databoard/dto/StatisticsDetailDto.java

@@ -27,4 +27,7 @@ public class StatisticsDetailDto {
     @ApiModelProperty("查询结束日期")
     private LocalDate endDate;
 
+    @ApiModelProperty("年级id")
+    private Long gradeId;
+
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/databoard/vo/StudnetStatisticsDetailVo.java

@@ -1,5 +1,6 @@
 package com.xjrsoft.module.databoard.vo;
 
+import com.xjrsoft.module.student.vo.StudentReportRecordItemVo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
@@ -36,4 +37,7 @@ public class StudnetStatisticsDetailVo {
     @ApiModelProperty("走读女学生总人数")
     private Integer studentNotStayFemaleCount;
 
+    @ApiModelProperty("专业部占比数据")
+    private List<StudentReportRecordItemVo> deptList;
+
 }

+ 14 - 5
src/main/java/com/xjrsoft/module/oa/controller/NewsController.java

@@ -343,7 +343,7 @@ public class NewsController {
     @ApiOperation(value = "未读类型统计")
     public RT<List<NewsCountTypeVo>> countType() {
         List<NewsCountTypeVo> newsCountTypeVoList = new ArrayList<>();
-        Integer typeIds[] = {1, 2, 3, 4};
+        Integer typeIds[] = {1, 2, 3};
         for (Integer typeId : typeIds) {
             NewsCountTypeVo newsCountTypeVo = new NewsCountTypeVo();
             News news = new News();
@@ -435,17 +435,26 @@ public class NewsController {
                 newsCountTypeVo.setTime(news.getReleaseTime());
                 newsCountTypeVo.setTitle(news.getFullHead());
             }
-            if(typeId == 4){
-                long count = systemUpdateMessageService.count(
+            if(typeId == 3){
+                List<SystemUpdateMessage> list = systemUpdateMessageService.list(
                         MPJWrappers.<SystemUpdateMessage>lambdaJoin()
+                                .select(SystemUpdateMessage::getId)
+                                .select(SystemUpdateMessage.class, x -> VoToColumnUtil.fieldsToColumns(SystemUpdateMessage.class).contains(x.getProperty()))
                                 .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
                                 .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
                                 .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
                                 .eq(SystemUpdateMessage::getStatus, 1)
                                 .eq(SystemUpdateMessageNotice::getStatus, 0)
+                                .orderByDesc(SystemUpdateMessage::getReleaseDate)
                 );
-                newsCountTypeVo.setTypeId(typeId);
-                newsCountTypeVo.setTotal(count);
+                if(!list.isEmpty()){
+                    newsCountTypeVo.setTypeId(typeId);
+                    newsCountTypeVo.setTotal(list.stream().count());
+                    SystemUpdateMessage message = list.get(0);
+                    newsCountTypeVo.setTitle(message.getTitle());
+                    newsCountTypeVo.setTime(message.getReleaseDate());
+                }
+
             }
             newsCountTypeVoList.add(newsCountTypeVo);
         }

+ 1 - 1
src/main/java/com/xjrsoft/module/oa/vo/NewsCountTypeVo.java

@@ -8,7 +8,7 @@ import java.time.LocalDateTime;
 @Data
 public class NewsCountTypeVo {
 
-    @ApiModelProperty("类型(1-新闻2-公告4-系统更新消息)")
+    @ApiModelProperty("类型(1-新闻2-公告3-系统更新消息)")
     private Integer typeId;
 
     @ApiModelProperty("最后一条标题")

+ 4 - 4
src/main/java/com/xjrsoft/module/schedule/controller/ScheduleController.java

@@ -168,8 +168,8 @@ public class ScheduleController {
             now = dto.getScheduleDate();
         }
         //计算本周是第几周
-        LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getStartDate().toInstant(), ZoneId.systemDefault());
-        LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getEndDate().toInstant(), ZoneId.systemDefault());
+        LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
+        LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
         Duration between = Duration.between(startDateTime, endDateTime);
         long days = between.toDays();
         int weeks = (int) Math.ceil((double) days / 7);
@@ -377,8 +377,8 @@ public class ScheduleController {
                 return RT.ok(new ArrayList<>());
             }
         }
-        LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getStartDate().toInstant(), ZoneId.systemDefault());
-        LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getEndDate().toInstant(), ZoneId.systemDefault());
+        LocalDateTime startDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingStart().toInstant(), ZoneId.systemDefault());
+        LocalDateTime endDateTime = LocalDateTime.ofInstant(baseSemester.getTeachingEnd().toInstant(), ZoneId.systemDefault());
         Duration between = Duration.between(startDateTime, endDateTime);
         long days = between.toDays();
         int weeks = (int) Math.ceil((double) days / 7);

+ 8 - 4
src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java

@@ -333,6 +333,9 @@ public class DataUtil {
                 continue;
             }
             JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();
+            if(StrUtil.isEmpty(resultJson.get("data").getAsString())){
+                continue;
+            }
             idMap.put(courseSubject.getId().toString(), resultJson.get("data").getAsString());
         }
         //插入记录表
@@ -344,7 +347,8 @@ public class DataUtil {
     /**
      * 新增学期
      */
-    public Map<String, String> insertSemester(String tableName, Map<String, String> ids) throws Exception {
+    public Map<String, String>
+    insertSemester(String tableName, Map<String, String> ids) throws Exception {
         String sql = "select * from " + tableName + " where delete_mark = 0 order by start_date desc limit 3";
         List<Map<String, Object>> list = SqlRunnerAdapter.db().selectList(sql, BaseSemester.class);
 
@@ -359,12 +363,12 @@ public class DataUtil {
             BaseSemester semester = SqlRunnerAdapterUtil.convertMapToEntity(semesterMap, BaseSemester.class);
             String url  = ScheduleUtil.apiUrl + "semester/Create";
             JsonObject paramJson = new JsonObject();
-            paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())));
+            paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())) - 1);
             Integer period = null;
             if(semester.getName().contains(spring)){
-                period = 1;
-            }else if(semester.getName().contains(autumn)){
                 period = 2;
+            }else if(semester.getName().contains(autumn)){
+                period = 1;
             }
             //获取时间戳
             long timestamp = System.currentTimeMillis();

+ 2 - 0
src/main/java/com/xjrsoft/module/system/controller/SystemUpdateMessageController.java

@@ -161,6 +161,7 @@ public class SystemUpdateMessageController {
             .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
             .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())
             .eq(SystemUpdateMessage::getStatus, 1)
+            .orderByDesc(SystemUpdateMessage::getReleaseDate)
         );
         PageOutput<SystemUpdateMessagePageVo> pageOutput = ConventPage.getPageOutput(page, SystemUpdateMessagePageVo.class);
         return RT.ok(pageOutput);
@@ -172,6 +173,7 @@ public class SystemUpdateMessageController {
     public RT<List<SystemUpdateMessagePageVo>> personalList(@Valid SystemUpdateMessagePageDto dto){
         List<SystemUpdateMessagePageVo> systemUpdateMessagePageVos = systemUpdateMessageService.selectJoinList(SystemUpdateMessagePageVo.class,
                 MPJWrappers.<SystemUpdateMessage>lambdaJoin()
+                        .select(SystemUpdateMessage::getId)
                         .leftJoin(SystemUpdateMessageNotice.class, SystemUpdateMessageNotice::getSystemUpdateMessageId, SystemUpdateMessage::getId)
                         .eq(SystemUpdateMessageNotice::getUserId, StpUtil.getLoginIdAsLong())
                         .eq(SystemUpdateMessage::getDeleteMark, DeleteMark.NODELETE.getCode())

+ 12 - 9
src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java

@@ -11,10 +11,7 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.module.textbook.dto.*;
 import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
 import com.xjrsoft.module.textbook.service.ITextbookIssueRecordService;
-import com.xjrsoft.module.textbook.vo.CanReturnTextbookListVo;
-import com.xjrsoft.module.textbook.vo.TextbookIssueRecordExcelVo;
-import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
-import com.xjrsoft.module.textbook.vo.TextbookIssueRecordVo;
+import com.xjrsoft.module.textbook.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -52,19 +49,25 @@ public class TextbookIssueRecordController {
     @ApiOperation(value="教材出库记录列表(分页)")
     @SaCheckPermission("textbookissuerecord:detail")
     public RT<PageOutput<TextbookIssueRecordPageVo>> page(@Valid TextbookIssueRecordPageDto dto){
-
         Page<TextbookIssueRecordPageVo> page = textbookIssueRecordService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<TextbookIssueRecordPageVo> pageOutput = ConventPage.getPageOutput(page, TextbookIssueRecordPageVo.class);
         return RT.ok(pageOutput);
     }
 
-    @GetMapping(value = "/can-return-textbook-list")
-    @ApiOperation(value="根据教材出库记录查询可以退书的书籍列表(不分页)")
+    @GetMapping(value = "/distribute-record-page")
+    @ApiOperation(value="教材发放页面已发放申领的出库记录列表")
     @SaCheckPermission("textbookissuerecord:detail")
-    public RT<List<CanReturnTextbookListVo>> canReturnTextbookList(@Valid CanReturnTextbookListDto dto){
-        return RT.ok(textbookIssueRecordService.canReturnTextbookList(dto));
+    public RT<List<DistributeRecordPageVo>> distributeRecordPage(@Valid DistributeRecordPageDto dto){
+        return RT.ok(textbookIssueRecordService.distributeRecordPage(dto));
     }
 
+//    @GetMapping(value = "/can-return-textbook-list")
+//    @ApiOperation(value="根据教材出库记录查询可以退书的书籍列表(不分页)")
+//    @SaCheckPermission("textbookissuerecord:detail")
+//    public RT<List<CanReturnTextbookListVo>> canReturnTextbookList(@Valid CanReturnTextbookListDto dto){
+//        return RT.ok(textbookIssueRecordService.canReturnTextbookList(dto));
+//    }
+
     @GetMapping(value = "/info")
     @ApiOperation(value="根据id查询教材出库记录信息")
     @SaCheckPermission("textbookissuerecord:detail")

+ 5 - 7
src/main/java/com/xjrsoft/module/textbook/dto/CanReturnTextbookListDto.java

@@ -3,18 +3,16 @@ package com.xjrsoft.module.textbook.dto;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
-import java.util.List;
-
 @Data
 public class CanReturnTextbookListDto {
 
     private static final long serialVersionUID = 1L;
-    @ApiModelProperty("当前登录用户主键编号")
-    private Long userId;
+    @ApiModelProperty("申请人用户主键编号")
+    private String applicantUserId;
 
-    @ApiModelProperty("退还类型")
-    private String recordType;
+    @ApiModelProperty("退还类型(0:个人,1:班级)")
+    private Integer recordType;
 
     @ApiModelProperty("学期主键编号")
-    private Long baseSemesterId;
+    private String baseSemesterId;
 }

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

@@ -0,0 +1,13 @@
+package com.xjrsoft.module.textbook.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class DistributeRecordPageDto {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("申领主键编号")
+    private Long wfTextbookClaimId;
+}

+ 10 - 0
src/main/java/com/xjrsoft/module/textbook/dto/TextbookPageDto.java

@@ -30,6 +30,16 @@ public class TextbookPageDto extends PageInput {
      */
     @ApiModelProperty("课程")
     private String courseName;
+    /**
+     * 学科组管理编号(subject_group)
+     */
+    @ApiModelProperty("学科组管理编号(subject_group)")
+    private Long subjectGroupId;
+    /**
+     * 课程编号(base_course_subject)
+     */
+    @ApiModelProperty("课程编号(base_course_subject)")
+    private Long courseSubjectId;
     /**
      * 使用类型(单位:学期)
      */

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

@@ -148,6 +148,10 @@ public class TextbookIssueRecord implements Serializable {
     */
     @ApiModelProperty("备注")
     private String remark;
-
+    /**
+     * 当前申领项发放次数
+     */
+    @ApiModelProperty("当前申领项发放次数")
+    private Integer issueTimes;
 
 }

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

@@ -121,7 +121,11 @@ public class WfTextbookClaim implements Serializable {
     */
     @ApiModelProperty("状态(1:结束 0:未结束)")
     private Integer status;
-
+    /**
+     * 当前申领项发放次数
+     */
+    @ApiModelProperty("当前申领项发放次数")
+    private Integer issueTimes;
     /**
     * wfTextbookClaimItem
     */

+ 5 - 0
src/main/java/com/xjrsoft/module/textbook/entity/WfTextbookRecedeItem.java

@@ -79,6 +79,11 @@ public class WfTextbookRecedeItem implements Serializable {
     */
     @ApiModelProperty("退书申请编号")
     private Long wfTextbookRecedeId;
+    /**
+     * 出库主键id
+     */
+    @ApiModelProperty("出库主键id")
+    private Long textbookIssueRecordId;
     /**
     * 教材管理编号
     */

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

@@ -3,10 +3,12 @@ package com.xjrsoft.module.textbook.service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.textbook.dto.CanReturnTextbookListDto;
+import com.xjrsoft.module.textbook.dto.DistributeRecordPageDto;
 import com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto;
 import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
 import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
 import com.xjrsoft.module.textbook.vo.CanReturnTextbookListVo;
+import com.xjrsoft.module.textbook.vo.DistributeRecordPageVo;
 import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
 
 import java.util.List;
@@ -22,6 +24,8 @@ public interface ITextbookIssueRecordService extends MPJBaseService<TextbookIssu
 
     Page<TextbookIssueRecordPageVo> getPage(Page<TextbookIssueRecordPageDto> page, TextbookIssueRecordPageDto dto);
 
+    List<DistributeRecordPageVo> distributeRecordPage(DistributeRecordPageDto dto);
+
     List<CanReturnTextbookListVo> canReturnTextbookList(CanReturnTextbookListDto dto);
 
     List<TextbookIssueRecordPageVo> getList(TextbookIssueRecordExportDto dto);

+ 94 - 3
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookIssueRecordServiceImpl.java

@@ -1,19 +1,35 @@
 package com.xjrsoft.module.textbook.service.impl;
 
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.ClaimTypeEnum;
+import com.xjrsoft.common.enums.RecedeTypeEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.textbook.dto.CanReturnTextbookListDto;
+import com.xjrsoft.module.textbook.dto.DistributeRecordPageDto;
 import com.xjrsoft.module.textbook.dto.TextbookIssueRecordExportDto;
 import com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto;
+import com.xjrsoft.module.textbook.entity.Textbook;
 import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
+import com.xjrsoft.module.textbook.entity.WfTextbookClaim;
 import com.xjrsoft.module.textbook.mapper.TextbookIssueRecordMapper;
 import com.xjrsoft.module.textbook.service.ITextbookIssueRecordService;
-import com.xjrsoft.module.textbook.vo.CanReturnTextbookListVo;
-import com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo;
+import com.xjrsoft.module.textbook.vo.*;
+import io.swagger.models.auth.In;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
 * @title: 教材出库记录
@@ -30,10 +46,85 @@ public class TextbookIssueRecordServiceImpl extends MPJBaseServiceImpl<TextbookI
         return textbookIssueRecordMapper.getPage(page, dto);
     }
 
+    @Override
+    public List<DistributeRecordPageVo> distributeRecordPage(DistributeRecordPageDto dto) {
+        List<DistributeRecordPageVo> result = new ArrayList<>();
+        MPJLambdaWrapper<TextbookIssueRecord> textbookIssueRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookIssueRecordMPJLambdaWrapper
+                .disableSubLogicDel()
+                .selectAs(Textbook::getBookName, TextbookIssueRecordDistributeRecordVo::getBookName)
+                .selectAs(XjrUser::getName, TextbookIssueRecordDistributeRecordVo::getCreateUserIdCn)
+                .select(TextbookIssueRecord.class, x -> VoToColumnUtil.fieldsToColumns(TextbookIssueRecordDistributeRecordVo.class).contains(x.getProperty()))
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId)
+                .leftJoin(XjrUser.class, XjrUser::getId, TextbookIssueRecord::getCreateUserId)
+                .eq(TextbookIssueRecord::getDataId, dto.getWfTextbookClaimId())
+                ;
+        List<TextbookIssueRecordDistributeRecordVo> tvs = this.selectJoinList(TextbookIssueRecordDistributeRecordVo.class, textbookIssueRecordMPJLambdaWrapper);
+        if(ObjectUtils.isEmpty(tvs)){
+            return result;
+        }
+
+        Map<Integer, List<TextbookIssueRecordDistributeRecordVo>> tvMap = tvs.stream()
+                .collect(Collectors.groupingBy(TextbookIssueRecordDistributeRecordVo::getIssueTimes));
+
+        DistributeRecordPageVo distributeRecordPageVo;
+        for (Map.Entry<Integer, List<TextbookIssueRecordDistributeRecordVo>> entry : tvMap.entrySet()){
+            Integer key = entry.getKey();
+            List<TextbookIssueRecordDistributeRecordVo> value = entry.getValue();
+            if(ObjectUtils.isEmpty(value)){
+                continue;
+            }
+            TextbookIssueRecordDistributeRecordVo first = value.get(0);
+            distributeRecordPageVo = new DistributeRecordPageVo();
+            distributeRecordPageVo.setIssueTimes(first.getIssueTimes());
+            distributeRecordPageVo.setCreateDate(first.getCreateDate());
+            distributeRecordPageVo.setCreateUserIdCn(first.getCreateUserIdCn());
+
+            List<DistributeRecordPageVo.DistributeRecordDetail> distributeRecordDetails = BeanUtil.copyToList(value, DistributeRecordPageVo.DistributeRecordDetail.class);
+            distributeRecordPageVo.setDistributeRecordDetails(distributeRecordDetails);
+            result.add(distributeRecordPageVo);
+        }
+
+        return result;
+    }
+
     @Override
     public List<CanReturnTextbookListVo> canReturnTextbookList(CanReturnTextbookListDto dto) {
+        if(ObjectUtils.isEmpty(dto.getRecordType())){
+            throw new MyException("请选择退还类型");
+        }
+
+        MPJLambdaWrapper<TextbookIssueRecord> textbookIssueRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
+        textbookIssueRecordMPJLambdaWrapper
+                .select(TextbookIssueRecord::getId)
+                .selectAs(TextbookIssueRecord::getOrderNumber, CanReturnTextbookListVo::getOrderNumber)
+                .selectAs(TextbookIssueRecord::getTextbookId, CanReturnTextbookListVo::getTextbookId)
+                .selectAs(Textbook::getBookName, CanReturnTextbookListVo::getTextbookIdCn)
+                .selectAs(TextbookIssueRecord::getActualIssueNumber, CanReturnTextbookListVo::getActualIssueNumber)
+                .leftJoin(Textbook.class, Textbook::getId, TextbookIssueRecord::getTextbookId)
+                .eq(StringUtils.isNotEmpty(dto.getBaseSemesterId()), TextbookIssueRecord::getBaseSemesterId, dto.getBaseSemesterId())
+                ;
+
+        // 个人退书
+        if(dto.getRecordType() == 0){
+            textbookIssueRecordMPJLambdaWrapper
+                    .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId)
+                    .ne(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
+                    .eq(WfTextbookClaim::getApplicantUserId, dto.getApplicantUserId())
+                    ;
+        }
+
+        // 班级退书
+        if(dto.getRecordType() == 1){
+            textbookIssueRecordMPJLambdaWrapper
+                    .leftJoin(WfTextbookClaim.class, WfTextbookClaim::getId, TextbookIssueRecord::getDataId)
+                    .leftJoin(BaseClass.class, BaseClass::getId, WfTextbookClaim::getClassId)
+                    .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
+                    .eq(BaseClass::getTeacherId, dto.getApplicantUserId())
+            ;
+        }
 
-        return List.of();
+        return this.selectJoinList(CanReturnTextbookListVo.class, textbookIssueRecordMPJLambdaWrapper);
     }
 
     @Override

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

@@ -221,6 +221,8 @@ public class TextbookServiceImpl extends MPJBaseServiceImpl<TextbookMapper, Text
                 .like(StringUtils.isNotBlank(dto.getPublishingHouse()), Textbook::getPublishingHouse, dto.getPublishingHouse())
                 .like(StringUtils.isNotBlank(dto.getEditorInChief()), Textbook::getEditorInChief, dto.getEditorInChief())
                 .eq(StringUtils.isNotBlank(dto.getVersion()), Textbook::getVersion, dto.getVersion())
+                .eq(ObjectUtils.isNotEmpty(dto.getCourseSubjectId()), Textbook::getCourseSubjectId, dto.getCourseSubjectId())
+                .eq(ObjectUtils.isNotEmpty(dto.getSubjectGroupId()), Textbook::getCourseSubjectId, dto.getCourseSubjectId())
                 .eq(ObjectUtils.isNotEmpty(dto.getIsTextbookPlan()), Textbook::getIsTextbookPlan, dto.getIsTextbookPlan())
                 .eq(StringUtils.isNotBlank(dto.getTextbookType()), Textbook::getTextbookType, dto.getTextbookType())
                 .eq(StringUtils.isNotBlank(dto.getSpecificationsModels()), Textbook::getSpecificationsModels, dto.getSpecificationsModels())

+ 8 - 2
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java

@@ -133,15 +133,21 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
     public List<TextbookInstockroomListVo> instockroomList(TextbookInstockroomListDto dto) {
         MPJLambdaWrapper<TextbookSubscriptionItem> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
+                .disableSubLogicDel()
                 .selectAs(TextbookSubscriptionItem::getId, TextbookInstockroomListVo::getTextbookSubscriptionItemId)
                 .select(Textbook.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
                 .select(TextbookSubscriptionItem.class, x -> VoToColumnUtil.fieldsToColumns(TextbookInstockroomListVo.class).contains(x.getProperty()))
                 .selectAs(TextbookSubscriptionItem::getStudentNum, TextbookInstockroomListVo::getStudentSubscriptionNumber)
                 .selectAs(TextbookSubscriptionItem::getTeacherNum, TextbookInstockroomListVo::getTeacherSubscriptionNumber)
-                .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice)
-                .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount)
+//                .selectAs(TextbookSubscriptionItem::getPrice, TextbookInstockroomListVo::getActualPrice)
+//                .selectAs(TextbookSubscriptionItem::getDiscount, TextbookInstockroomListVo::getDiscount)
+                .selectAs(Textbook::getPrice, TextbookInstockroomListVo::getPrice)
+                .select("ifnull(t2.discount, t.discount) as discount")
+                .select("ifnull(t2.price, t.price) as actual_price")
                 .leftJoin(Textbook.class, Textbook::getId, TextbookSubscriptionItem::getTextbookId)
 
+                .leftJoin(TextbookWarehouseRecord.class, TextbookWarehouseRecord::getDataItemId, TextbookSubscriptionItem::getId)
+
                 .leftJoin(BaseCourseSubject.class, BaseCourseSubject::getId, Textbook::getCourseSubjectId,
                         wrapper -> wrapper
                                 .selectAs(BaseCourseSubject::getName, TextbookInstockroomListVo::getCourseName)

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

@@ -55,16 +55,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
 
     private final XjrUserMapper xjrUserMapper;
 
-    private final TextbookMapper textbookMapper;
-
-    private final TextbookSubscriptionItemMapper textbookSubscriptionItemMapper;
-
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
 
     private final TextbookClaimUserMapper textbookClaimUserMapper;
 
-    private final ClaimItemSubscriptionItemMapper claimItemSubscriptionItemMapper;
-
     private final WorkflowFormRelationMapper workflowFormRelationMapper;
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
@@ -241,7 +235,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         if (ObjectUtils.isNotEmpty(wfTextbookClaimVo)) {
             //拆分代领人
             String receiveUserIdStr = wfTextbookClaimVo.getReceiveUserId();
-            if (ObjectUtils.isNotEmpty(receiveUserIdStr) && !receiveUserIdStr.equals("")) {
+            if (ObjectUtils.isNotEmpty(receiveUserIdStr) && !receiveUserIdStr.isEmpty()) {
                 String[] receiveUserIdStrs = receiveUserIdStr.split(",");
                 List<Long> receiveUserIdList = new ArrayList<>();
                 for (String str : receiveUserIdStrs) {
@@ -262,7 +256,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             //加上申领项
             List<WfTextbookClaimItemVo> wfTextbookClaimItemVoList = wfTextbookClaimWfTextbookClaimItemMapper.getListByWfTextbookClaimId(Long.parseLong(wfTextbookClaimVo.getId()));
 
-            if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVoList) && wfTextbookClaimItemVoList.size() > 0) {
+            if (ObjectUtils.isNotEmpty(wfTextbookClaimItemVoList) && !wfTextbookClaimItemVoList.isEmpty()) {
                 wfTextbookClaimVo.setWfTextbookClaimItemList(wfTextbookClaimItemVoList);
             }
         }
@@ -274,6 +268,8 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     public Boolean confirmDistribute(ConfirmDistributeDto dto) {
         WfTextbookClaim wfTextbookClaim = this.getByIdDeep(dto.getTextbookClaimId());
         List<WfTextbookClaimItem> wfTextbookClaimItemList = wfTextbookClaim.getWfTextbookClaimItemList();
+        int issueTimes = wfTextbookClaim.getIssueTimes() + 1;
+        Date nowDate = new Date();
 
         int claimTotalNum = 0;
         int issueTotalNum = 0;
@@ -333,6 +329,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             }
 
             TextbookIssueRecord textbookIssueRecord;
+            // 出库单号前缀
+            oldOrderInteger += 1;
+            String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
+            String oldPrex = sb + newOrder + "-";
             for (ConfirmDistributeDto.TextbookWarehouseRecords textbookWarehouseRecords : textbookClaimItem.getTextbookWarehouseRecords()){
                 TextbookWarehouseRecord textbookWarehouseRecord = textbookWarehouseRecordMap.get(textbookWarehouseRecords.getTextbookWarehouseRecordId());
                 if (ObjectUtils.isEmpty(textbookWarehouseRecord)) {
@@ -342,7 +342,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 //更新教材入库中的的库存数量
                 textbookWarehouseRecordMapper.updateById(new TextbookWarehouseRecord() {{
                     setModifyUserId(StpUtil.getLoginIdAsLong());
-                    setModifyDate(new Date());
+                    setModifyDate(nowDate);
                     setId(textbookWarehouseRecord.getId());
                     setIssuedNumber(ObjectUtils.isEmpty(textbookWarehouseRecord.getIssuedNumber()) ? 0 : textbookWarehouseRecord.getIssuedNumber()
                              + confirmNumber);
@@ -351,9 +351,6 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     );
                 }});
 
-                oldOrderInteger += 1;
-                String newOrder = String.format("%03d", oldOrderInteger); // 补零并格式化为三位数
-                String oldPrex = sb + newOrder + "-";
                 //增加出库记录
                 textbookIssueRecord = new TextbookIssueRecord();
                 textbookIssueRecord.setBaseSemesterId(wfTextbookClaim.getBaseSemesterId());
@@ -395,6 +392,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                 }
                 textbookIssueRecord.setDataId(wfTextbookClaim.getId());
                 textbookIssueRecord.setDataItemId(wfTextbookClaimItem.getId());
+                textbookIssueRecord.setTextbookWarehouseRecordId(textbookWarehouseRecords.getTextbookWarehouseRecordId());
                 textbookIssueRecord.setTextbookId(wfTextbookClaimItem.getTextbookId());
                 textbookIssueRecord.setIssueNumber(confirmNumber);
                 textbookIssueRecord.setRecedeNumber(0);
@@ -406,8 +404,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
                     textbookIssueRecord.setReceiveUserId(StpUtil.getLoginIdAsLong());
                 }
                 textbookIssueRecord.setIssueUserId(StpUtil.getLoginIdAsLong());
-                textbookIssueRecord.setCreateDate(new Date());;
+                textbookIssueRecord.setCreateDate(nowDate);;
                 textbookIssueRecord.setRemark(dto.getRemark());
+                textbookIssueRecord.setIssueTimes(issueTimes);
+
                 int sortCode = SortCodeUtil.getMaxSortCode(textbookIssueRecordMapper, TextbookIssueRecord.class, "sort_code");
                 textbookIssueRecord.setSortCode(sortCode + 1);
 
@@ -417,7 +417,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
 
         WfTextbookClaim updateWfTextbookClaim = new WfTextbookClaim();
         updateWfTextbookClaim.setModifyUserId(StpUtil.getLoginIdAsLong());
-        updateWfTextbookClaim.setModifyDate(new Date());
+        updateWfTextbookClaim.setModifyDate(nowDate);
         updateWfTextbookClaim.setId(wfTextbookClaim.getId());
         if(claimTotalNum > issueTotalNum){
             updateWfTextbookClaim.setStatus(2);
@@ -425,9 +425,10 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         if(claimTotalNum > issueTotalNum){
             updateWfTextbookClaim.setStatus(3);
         }
-
+        updateWfTextbookClaim.setIssueTimes(issueTimes);
         //更新申领项中的已经发放数量
         wfTextbookClaimWfTextbookClaimMapper.updateById(updateWfTextbookClaim);
+
         return true;
     }
 

+ 90 - 82
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java

@@ -1,33 +1,20 @@
 package com.xjrsoft.module.textbook.service.impl;
 
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
-import com.xjrsoft.common.enums.IssueModeEnum;
-import com.xjrsoft.common.enums.RecedeTypeEnum;
-import com.xjrsoft.common.enums.WarehouseModeEnum;
-import com.xjrsoft.module.base.entity.BaseClass;
-import com.xjrsoft.module.base.mapper.BaseClassMapper;
-import com.xjrsoft.module.textbook.entity.Textbook;
-import com.xjrsoft.module.textbook.entity.TextbookIssueRecord;
-import com.xjrsoft.module.textbook.entity.TextbookWarehouseRecord;
-import com.xjrsoft.module.textbook.entity.WfTextbookRecede;
-import com.xjrsoft.module.textbook.entity.WfTextbookRecedeItem;
-import com.xjrsoft.module.textbook.mapper.TextbookIssueRecordMapper;
-import com.xjrsoft.module.textbook.mapper.TextbookMapper;
-import com.xjrsoft.module.textbook.mapper.TextbookWarehouseRecordMapper;
-import com.xjrsoft.module.textbook.mapper.WfTextbookRecedeItemMapper;
-import com.xjrsoft.module.textbook.mapper.WfTextbookRecedeMapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.module.textbook.entity.*;
+import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
@@ -46,8 +33,6 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
 
     private final TextbookMapper textbookTextbookMapper;
 
-    private final BaseClassMapper baseClassMapper;
-
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
@@ -112,70 +97,93 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
     @Override
     @Transactional
     public Boolean dataHandle(Long formId) {
-        WfTextbookRecede wfTextbookRecede = this.getById(formId);
-        if(ObjectUtil.isNotNull(wfTextbookRecede)){
-            LambdaQueryWrapper<WfTextbookRecedeItem> queryWrapperItem = new LambdaQueryWrapper<>();
-            queryWrapperItem
-                    .eq(WfTextbookRecedeItem::getWfTextbookRecedeId, wfTextbookRecede.getId());
-            List<WfTextbookRecedeItem> wfTextbookRecedeItemList = wfTextbookRecedeWfTextbookRecedeItemMapper.selectList(queryWrapperItem);
-            if(ObjectUtil.isNotNull(wfTextbookRecedeItemList)){
+        WfTextbookRecede wfTextbookRecede = this.getByIdDeep(formId);
+
+        if(ObjectUtils.isNotEmpty(wfTextbookRecede)){
+            List<WfTextbookRecedeItem> wfTextbookRecedeItemList = wfTextbookRecede.getWfTextbookRecedeItemList();
+            if(ObjectUtils.isNotEmpty(wfTextbookRecedeItemList)){
+                // 获取本学期所有的入库记录
+                List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(
+                        Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
+                                .eq(TextbookWarehouseRecord::getBaseSemesterId, wfTextbookRecede.getBaseSemesterId())
+                                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+
+                Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordMap = textbookWarehouseRecords.stream()
+                        .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1, t2) -> t1))
+                        ;
+
+                // 获取本学期所有的入库记录
+                List<TextbookIssueRecord> textbookIssueRecords = textbookIssueRecordMapper.selectList(
+                        Wrappers.lambdaQuery(TextbookIssueRecord.class)
+                                .eq(TextbookIssueRecord::getBaseSemesterId, wfTextbookRecede.getBaseSemesterId())
+                                .eq(TextbookIssueRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+
+                Map<Long, TextbookIssueRecord> textbookIssueRecordMap = textbookIssueRecords.stream()
+                        .collect(Collectors.toMap(TextbookIssueRecord::getId, t -> t, (t1, t2) -> t1))
+                        ;
+
                 //遍历每一个退书申请项
+                TextbookWarehouseRecord textbookWarehouseRecord;
+                TextbookIssueRecord textbookIssueRecord;
                 for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecedeItemList) {
-                    //获取所退书籍的信息
-                    Textbook textbook = textbookTextbookMapper.selectById(wfTextbookRecedeItem.getTextbookId());
-                    //退书类型是到教务处
-                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeDeansOffice.getCode())){
-                        //修改库存
-                        textbookTextbookMapper.updateById(new Textbook(){{
-                            setModifyUserId(StpUtil.getLoginIdAsLong());
-                            setModifyDate(new Date());
-                            setId(wfTextbookRecedeItem.getTextbookId());
-//                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) + (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()));
-                        }});
-                        //增加入库记录
-                        textbookWarehouseRecordMapper.insert(new TextbookWarehouseRecord(){{
-                            setCreateUserId(StpUtil.getLoginIdAsLong());
-                            setCreateDate(new Date());
-                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
-                            setDataId(wfTextbookRecede.getId());
-                            setDataItemId(wfTextbookRecedeItem.getId());
-                            setWarehouseMode(WarehouseModeEnum.WmRecede.getCode());
-                            setWarehouseNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
-                            if(wfTextbookRecede.getClassId() != null && wfTextbookRecede.getClassId() > 0){
-                                BaseClass c = baseClassMapper.selectById(wfTextbookRecede.getClassId());
-                                setSource(c.getName());
-                            }
-                            QueryWrapper<TextbookWarehouseRecord> queryWrapperSortcode = new QueryWrapper<>();
-                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
-                            TextbookWarehouseRecord t = textbookWarehouseRecordMapper.selectOne(queryWrapperSortcode);
-                            setSortCode(t.getSortCode()+1);
-                        }});
-                    }
-
-                    //退书类型是到书店
-                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeBookstore.getCode())){
-                        //修改库存
-                        textbookTextbookMapper.updateById(new Textbook(){{
-                            setModifyUserId(StpUtil.getLoginIdAsLong());
-                            setModifyDate(new Date());
-                            setId(wfTextbookRecedeItem.getTextbookId());
-//                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) - (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()) );
-                        }});
-                        //增加出库记录
-                        textbookIssueRecordMapper.insert(new TextbookIssueRecord(){{
-                            setCreateUserId(StpUtil.getLoginIdAsLong());
-                            setCreateDate(new Date());
-                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
-                            setDataId(wfTextbookRecede.getId());
-                            setDataItemId(wfTextbookRecedeItem.getId());
-                            setIssueMode(IssueModeEnum.ImRecede.getCode());
-                            setIssueNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
-                            QueryWrapper<TextbookIssueRecord> queryWrapperSortcode = new QueryWrapper<>();
-                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
-                            TextbookIssueRecord t = textbookIssueRecordMapper.selectOne(queryWrapperSortcode);
-                            setSortCode(t.getSortCode()+1);
-                        }});
-                    }
+                    textbookIssueRecord = textbookIssueRecordMap.get(wfTextbookRecedeItem.getTextbookIssueRecordId());
+
+
+//                    //退书类型是到教务处
+//                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeDeansOffice.getCode())){
+//                        //修改库存
+//                        textbookTextbookMapper.updateById(new Textbook(){{
+//                            setModifyUserId(StpUtil.getLoginIdAsLong());
+//                            setModifyDate(new Date());
+//                            setId(wfTextbookRecedeItem.getTextbookId());
+////                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) + (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()));
+//                        }});
+//                        //增加入库记录
+//                        textbookWarehouseRecordMapper.insert(new TextbookWarehouseRecord(){{
+//                            setCreateUserId(StpUtil.getLoginIdAsLong());
+//                            setCreateDate(new Date());
+//                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
+//                            setDataId(wfTextbookRecede.getId());
+//                            setDataItemId(wfTextbookRecedeItem.getId());
+//                            setWarehouseMode(WarehouseModeEnum.WmRecede.getCode());
+//                            setWarehouseNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
+//                            if(wfTextbookRecede.getClassId() != null && wfTextbookRecede.getClassId() > 0){
+//                                BaseClass c = baseClassMapper.selectById(wfTextbookRecede.getClassId());
+//                                setSource(c.getName());
+//                            }
+//                            QueryWrapper<TextbookWarehouseRecord> queryWrapperSortcode = new QueryWrapper<>();
+//                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
+//                            TextbookWarehouseRecord t = textbookWarehouseRecordMapper.selectOne(queryWrapperSortcode);
+//                            setSortCode(t.getSortCode()+1);
+//                        }});
+//                    }
+//
+//                    //退书类型是到书店
+//                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeBookstore.getCode())){
+//                        //修改库存
+//                        textbookTextbookMapper.updateById(new Textbook(){{
+//                            setModifyUserId(StpUtil.getLoginIdAsLong());
+//                            setModifyDate(new Date());
+//                            setId(wfTextbookRecedeItem.getTextbookId());
+////                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) - (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()) );
+//                        }});
+//                        //增加出库记录
+//                        textbookIssueRecordMapper.insert(new TextbookIssueRecord(){{
+//                            setCreateUserId(StpUtil.getLoginIdAsLong());
+//                            setCreateDate(new Date());
+//                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
+//                            setDataId(wfTextbookRecede.getId());
+//                            setDataItemId(wfTextbookRecedeItem.getId());
+//                            setIssueMode(IssueModeEnum.ImRecede.getCode());
+//                            setIssueNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
+//                            QueryWrapper<TextbookIssueRecord> queryWrapperSortcode = new QueryWrapper<>();
+//                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
+//                            TextbookIssueRecord t = textbookIssueRecordMapper.selectOne(queryWrapperSortcode);
+//                            setSortCode(t.getSortCode()+1);
+//                        }});
+//                    }
                 }
             }
         }

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

@@ -1,8 +1,23 @@
 package com.xjrsoft.module.textbook.vo;
 
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
 public class CanReturnTextbookListVo {
 
+    @ApiModelProperty("出库主键编号")
+    private String id;
+
+    @ApiModelProperty("出库单号")
+    public String orderNumber;
+
+    @ApiModelProperty("教材主键id")
+    private String textbookId;
+
+    @ApiModelProperty("教材主键id")
+    private String textbookIdCn;
+
+    @ApiModelProperty("实际出库数量")
+    private Integer actualIssueNumber;
 }

+ 38 - 0
src/main/java/com/xjrsoft/module/textbook/vo/DistributeRecordPageVo.java

@@ -0,0 +1,38 @@
+package com.xjrsoft.module.textbook.vo;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class DistributeRecordPageVo {
+
+    @ApiModelProperty("当前申领项发放次数")
+    private Integer issueTimes;
+
+    @ApiModelProperty("发放时间")
+    private Date createDate;
+
+    @ApiModelProperty("发放人")
+    private String createUserIdCn;
+
+    @ApiModelProperty("发放人")
+    private List<DistributeRecordDetail> distributeRecordDetails;
+
+    @Data
+    public static class DistributeRecordDetail implements Serializable {
+
+        private static final long serialVersionUID = 1L;
+
+        private String bookName;
+
+        private String orderNumber;
+
+        private Integer issueNumber;
+    }
+}

+ 31 - 0
src/main/java/com/xjrsoft/module/textbook/vo/TextbookIssueRecordDistributeRecordVo.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.textbook.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class TextbookIssueRecordDistributeRecordVo {
+
+    @ApiModelProperty("主键编号")
+    private Long id;
+
+    @ApiModelProperty("创建人")
+    private String createUserIdCn;
+
+    @ApiModelProperty("创建时间")
+    private Date createDate;
+
+    @ApiModelProperty("出库单号(标识+当前时间(YYYYMMDDHHmmss)+三位序号+当前申领项出库次数(-n))")
+    private String orderNumber;
+
+    @ApiModelProperty("教材管理编号")
+    private String bookName;
+
+    @ApiModelProperty("出库数量")
+    private Integer issueNumber;
+
+    @ApiModelProperty("当前申领项发放次数")
+    private Integer issueTimes;
+}

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

@@ -6,6 +6,7 @@ import com.alibaba.excel.annotation.write.style.ContentStyle;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
 import java.util.Date;
 
 /**
@@ -26,10 +27,15 @@ public class TextbookIssueRecordPageVo {
     private String id;
 
     @ContentStyle(dataFormat = 49)
-    @ExcelProperty("序号")
-    @ApiModelProperty("序号")
-    private Integer sortCode;
+    @ExcelProperty("学期")
+    @ApiModelProperty("学期")
+    public String baseSemesterIdCn;
+
+    @ApiModelProperty("出库单号")
+    public String orderNumber;
 
+    @ApiModelProperty("入库单号")
+    public String warehouseOrderNumber;
 
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("书号")
@@ -56,23 +62,6 @@ public class TextbookIssueRecordPageVo {
     @ApiModelProperty("学科组")
     private String groupName;
 
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用年级")
-    @ApiModelProperty("使用年级")
-    private String gradeName;
-    /**
-     * 使用年级
-     */
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("学期")
-    @ApiModelProperty("学期")
-    public String baseSemesterIdCn;
-
-    @ContentStyle(dataFormat = 49)
-    @ExcelProperty("使用班级")
-    @ApiModelProperty("使用班级")
-    private String className;
-
     @ContentStyle(dataFormat = 49)
     @ExcelProperty("对应课程")
     @ApiModelProperty("对应课程")
@@ -113,4 +102,15 @@ public class TextbookIssueRecordPageVo {
     @ApiModelProperty("出库数量")
     private Integer issueNumber;
 
+    @ApiModelProperty("定价(元)")
+    private BigDecimal price;
+
+    @ApiModelProperty("实际价格(元)")
+    private BigDecimal subtotal;
+
+    @ApiModelProperty("班级主键")
+    private String classIdCn;
+
+    @ApiModelProperty("年级主键")
+    private String gradeIdCn;
 }

+ 15 - 14
src/main/resources/mapper/textbook/TextbookIssueRecordMapper.xml

@@ -5,14 +5,13 @@
 <mapper namespace="com.xjrsoft.module.textbook.mapper.TextbookIssueRecordMapper">
     <select id="getPage" parameterType="com.xjrsoft.module.textbook.dto.TextbookIssueRecordPageDto" resultType="com.xjrsoft.module.textbook.vo.TextbookIssueRecordPageVo">
         SELECT t1.id,
-        t1.sort_code,
+        t1.order_number,
+        t15.name as base_semester_id_cn,
         t3.issn,
         t3.book_name,
         t3.publishing_house,
         t3.editor_in_chief,
         t7.group_name,
-        t5.name  AS grade_name,
-        ifnull(t6.name, t14.name)  AS class_name,
         t8.name  AS course_name,
         t10.name AS textbook_type_cn,
         t3.specifications_models,
@@ -20,22 +19,24 @@
         t1.create_date,
         t9.name  AS claim_user,
         t1.issue_number,
-        t15.name as baseSemesterIdCn
+        t15.name as baseSemesterIdCn,
+        t16.order_number as warehouse_order_number,
+        t16.price,
+        t16.subtotal,
+        t6.name as classIdCn,
+        t5.name as gradeIdCn
         FROM textbook_issue_record t1
-        LEFT JOIN wf_textbook_claim_item t2 ON t1.data_item_id = t2.id
-        LEFT JOIN wf_textbook_claim t4 ON t1.data_id = t4.id
-        LEFT JOIN wf_textbook_recede_item t12 ON t12.id = t1.data_item_id
-        LEFT JOIN wf_textbook_recede t13 ON t13.id = t1.data_id
+        LEFT JOIN wf_textbook_claim t4 ON t4.id = t1.data_id
+        LEFT JOIN base_class t6 ON t6.id = t4.class_id
+        LEFT JOIN base_grade t5 ON t5.id = t6.grade_id
         LEFT JOIN textbook t3 ON t3.id = t1.textbook_id
-        LEFT JOIN base_grade t5 ON t3.grade_id = t5.id
-        LEFT JOIN base_class t6 ON t4.class_id = t6.id
-        LEFT JOIN base_class t14 ON t13.class_id = t14.id
         LEFT JOIN subject_group t7 ON t3.subject_group_id = t7.id
         LEFT JOIN base_course_subject t8 ON t3.course_subject_id = t8.id
         LEFT JOIN xjr_user t9 ON t1.receive_user_id = t9.id
-        LEFT JOIN xjr_dictionary_detail t10 ON t3.textbook_type = t10.code AND t10.item_id = 1739209191193636865
-        LEFT JOIN xjr_dictionary_detail t11 ON t1.issue_mode = t11.code AND t11.item_id = 1739821685805215745
-        LEFT JOIN base_semester t15 ON t15.id = t3.base_semester_id
+        LEFT JOIN xjr_dictionary_detail t10 ON t3.textbook_type = t10.code
+        LEFT JOIN xjr_dictionary_detail t11 ON t1.issue_mode = t11.code
+        LEFT JOIN base_semester t15 ON t15.id = t1.base_semester_id
+        LEFT JOIN textbook_warehouse_record t16 ON t16.id = t1.textbook_warehouse_record_id
         WHERE t1.delete_mark = 0
         <if test="dto.textbookType != null and dto.textbookType != ''">
             and t3.textbook_type = #{dto.textbookType}

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

@@ -176,4 +176,23 @@ alter table textbook_warehouse_record
 alter table wf_textbook_claim
     add textbook_scope int null comment '选择教材范围(1:全部,2:本班)' after class_id;
 
+alter table wf_textbook_claim
+    add issue_times int default 0 null comment '当前申领项发放次数';
+
+alter table textbook_issue_record
+    add issue_times int default 0 null comment '当前出库对应的申领项的发放次数' after issue_user_id;
+
+alter table wf_textbook_recede_item
+    add textbook_issue_record_id bigint null comment '出库主键id(textbook_issue_record)' after wf_textbook_recede_id;
+
+alter table wf_textbook_recede
+    add is_stu_flag int null comment '是否是学生' after applicant_user_id;
+
+alter table wf_textbook_recede
+    add is_head_tea_flag int null comment '是否是班主任' after is_stu_flag;
+
+alter table wf_textbook_recede
+    add is_class_recede_flag int null comment '是否是班主任为班级退书' after is_head_tea_flag;
 
+alter table wf_textbook_recede_item
+    add textbook_name varchar(256) null comment '教材名字' after textbook_id;

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

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