Bladeren bron

Merge branch 'pre'

dzx 10 maanden geleden
bovenliggende
commit
b9634cc1c4
25 gewijzigde bestanden met toevoegingen van 434 en 277 verwijderingen
  1. 2 2
      src/main/java/com/xjrsoft/common/enums/RecedeTypeEnum.java
  2. 4 1
      src/main/java/com/xjrsoft/common/enums/RoleEnum.java
  3. 2 40
      src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java
  4. 6 0
      src/main/java/com/xjrsoft/module/base/service/IBaseClassService.java
  5. 152 1
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java
  6. 1 1
      src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java
  7. 11 1
      src/main/java/com/xjrsoft/module/liteflow/node/AddClaimUserNode.java
  8. 11 1
      src/main/java/com/xjrsoft/module/liteflow/node/WfTextbookRecedeNode.java
  9. 4 0
      src/main/java/com/xjrsoft/module/organization/entity/Role.java
  10. 4 4
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  11. 2 3
      src/main/java/com/xjrsoft/module/student/controller/StudentReportRecordController.java
  12. 5 5
      src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java
  13. 2 2
      src/main/java/com/xjrsoft/module/student/vo/StudentReportRecordExcelVo.java
  14. 2 2
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  15. 0 7
      src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java
  16. 2 2
      src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java
  17. 1 5
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookSubscriptionServiceImpl.java
  18. 4 2
      src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java
  19. 9 6
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java
  20. 130 74
      src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java
  21. 8 4
      src/main/resources/sqlScript/init_data.sql
  22. 0 89
      src/main/resources/sqlScript/question[2024年4月28日].sql
  23. 2 18
      src/test/java/com/xjrsoft/module/job/JianyuekbBaseDataTaskTest.java
  24. 69 6
      src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java
  25. 1 1
      src/test/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImplTest.java

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

@@ -10,12 +10,12 @@ public enum RecedeTypeEnum {
     /**
      *
      * */
-    PersonalRecede("recede_deans_office", "退到教务处"),
+    RecedeeDansOffice("recede_deans_office", "退到教务处"),
 
     /**
      *
      * */
-    ClassRecede("recede_bookstore", "退到书店");
+    RecedeBookstore("recede_bookstore", "退到书店");
 
     final String code;
     final String value;

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

@@ -20,7 +20,10 @@ public enum RoleEnum {
     /**
      * 家长
      */
-    PARENT(4L, "家长");
+    PARENT(4L, "家长"),
+    VISITOR(5L, "访客"),
+
+    CLASSTE(1745630294430511106L, "班主任");
 
     final Long code;
     final String value;

+ 2 - 40
src/main/java/com/xjrsoft/module/base/controller/BaseClassController.java

@@ -1,12 +1,8 @@
 package com.xjrsoft.module.base.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.xjrsoft.common.enums.DeleteMark;
-import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -17,8 +13,6 @@ import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
 import com.xjrsoft.module.base.vo.BaseClassVo;
-import com.xjrsoft.module.student.entity.BaseClassMajorSet;
-import com.xjrsoft.module.student.service.IBaseClassMajorSetService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -32,7 +26,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.util.Date;
 import java.util.List;
 
 /**
@@ -47,7 +40,6 @@ import java.util.List;
 @AllArgsConstructor
 public class BaseClassController {
     private final IBaseClassService baseClassService;
-    private final IBaseClassMajorSetService majorSetService;
 
     @GetMapping(value = "/page")
     @ApiOperation(value="班级列表(分页)")
@@ -81,21 +73,7 @@ public class BaseClassController {
     @ApiOperation(value = "新增班级")
     @SaCheckPermission("baseclass:add")
     public RT<Boolean> add(@Valid @RequestBody AddBaseClassPageDto dto){
-        BaseClass baseClass = BeanUtil.toBean(dto, BaseClass.class);
-        baseClass.setDeleteMark(DeleteMark.NODELETE.getCode());
-        baseClass.setCreateDate(new Date());
-        baseClass.setEnabledMark(EnabledMark.ENABLED.getCode());
-        baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
-        boolean isSuccess = baseClassService.save(baseClass);
-
-        if(isSuccess){
-            BaseClassMajorSet majorSet = new BaseClassMajorSet();
-            majorSet.setClassId(baseClass.getId());
-            majorSet.setMajorSetId(dto.getMajorSetId());
-            majorSet.setCreateDate(new Date());
-            majorSetService.save(majorSet);
-        }
-        return RT.ok(isSuccess);
+        return RT.ok(baseClassService.addClass(dto));
     }
 
 
@@ -103,23 +81,7 @@ public class BaseClassController {
     @ApiOperation(value = "修改班级")
     @SaCheckPermission("baseclass:edit")
     public RT<Boolean> update(@Valid @RequestBody UpdateBaseClassPageDto dto){
-        BaseClass baseClass = BeanUtil.toBean(dto, BaseClass.class);
-        baseClass.setModifyDate(new Date());
-        baseClass.setModifyUserId(StpUtil.getLoginIdAsLong());
-        boolean update = baseClassService.updateById(baseClass);
-        if(update){
-            BaseClassMajorSet majorSet = majorSetService.getOne(
-                    new QueryWrapper<BaseClassMajorSet>().lambda()
-                            .eq(BaseClassMajorSet::getClassId, baseClass.getId())
-            );
-            if(majorSet != null){
-                majorSet.setClassId(baseClass.getId());
-                majorSet.setMajorSetId(dto.getMajorSetId());
-                majorSet.setModifyDate(new Date());
-                majorSetService.updateById(majorSet);
-            }
-        }
 
-        return RT.ok(update);
+        return RT.ok(baseClassService.updateClass(dto));
     }
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseClassService.java

@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.vo.ClassStatisticsVo;
+import com.xjrsoft.module.base.dto.AddBaseClassPageDto;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
+import com.xjrsoft.module.base.dto.UpdateBaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
 import com.xjrsoft.module.base.vo.StudentClassVo;
@@ -24,4 +26,8 @@ public interface IBaseClassService extends MPJBaseService<BaseClass> {
 
 
     Long getIdByTeacherId(Long teacherId);
+
+    Boolean addClass(AddBaseClassPageDto dto);
+
+    Boolean updateClass(UpdateBaseClassPageDto dto);
 }

+ 152 - 1
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java

@@ -1,31 +1,47 @@
 package com.xjrsoft.module.base.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.bean.BeanUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.EnabledMark;
+import com.xjrsoft.common.enums.RoleEnum;
+import com.xjrsoft.common.exception.MyException;
+import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.module.attendance.dto.AttendanceStatisticDto;
 import com.xjrsoft.module.attendance.vo.ClassStatisticsVo;
+import com.xjrsoft.module.base.dto.AddBaseClassPageDto;
 import com.xjrsoft.module.base.dto.BaseClassPageDto;
+import com.xjrsoft.module.base.dto.UpdateBaseClassPageDto;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.base.vo.BaseClassPageVo;
 import com.xjrsoft.module.base.vo.StudentClassVo;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.entity.UserDeptRelation;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
 import com.xjrsoft.module.organization.entity.UserStudent;
+import com.xjrsoft.module.organization.service.IUserRoleRelationService;
 import com.xjrsoft.module.organization.service.IUserStudentService;
 import com.xjrsoft.module.organization.vo.UserStudentVo;
+import com.xjrsoft.module.student.entity.BaseClassMajorSet;
 import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
+import com.xjrsoft.module.student.service.IBaseClassMajorSetService;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 @Service
@@ -36,6 +52,12 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
 
     private final BaseClassMapper baseClassMapper;
 
+    private final IBaseClassMajorSetService majorSetService;
+
+    private final IUserRoleRelationService roleRelationService;
+
+    private final RedisUtil redisUtil;
+
     /**
      * 获取家长关联的学生 id 是家长的ID
      * @param id
@@ -126,5 +148,134 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
             return null;
         }
         return list.get(0).getId();
-    };
+    }
+
+    @Override
+    public Boolean addClass(AddBaseClassPageDto dto) {
+        BaseClass baseClass = BeanUtil.toBean(dto, BaseClass.class);
+        baseClass.setDeleteMark(DeleteMark.NODELETE.getCode());
+        baseClass.setCreateDate(new Date());
+        baseClass.setEnabledMark(EnabledMark.ENABLED.getCode());
+        baseClass.setCreateUserId(StpUtil.getLoginIdAsLong());
+        if(baseClass.getTeacherId() != null){
+            //查询该班主任是否是其他在读班级
+            long count = this.count(
+                    new QueryWrapper<BaseClass>().lambda()
+                            .eq(BaseClass::getIsGraduate, 1)
+                            .eq(BaseClass::getTeacherId, baseClass.getTeacherId())
+                            .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(BaseClass::getEnabledMark, EnabledMark.ENABLED.getCode())
+            );
+            if(count > 0){
+                throw new MyException("该老师已是其他在读班级班主任,无法添加");
+            }
+        }
+
+        boolean isSuccess = this.save(baseClass);
+
+        if(isSuccess){
+            BaseClassMajorSet majorSet = new BaseClassMajorSet();
+            majorSet.setClassId(baseClass.getId());
+            majorSet.setMajorSetId(dto.getMajorSetId());
+            majorSet.setCreateDate(new Date());
+            majorSetService.save(majorSet);
+            //给该老师添加班主任角色
+            if(baseClass.getTeacherId() != null){
+                long count = roleRelationService.count(
+                        new QueryWrapper<UserRoleRelation>().lambda()
+                                .eq(UserRoleRelation::getUserId, dto.getTeacherId())
+                                .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
+                );
+                if(count == 0){
+                    roleRelationService.save(
+                            new UserRoleRelation(){{
+                                setRoleId(RoleEnum.CLASSTE.getCode());
+                                setUserId(dto.getTeacherId());
+                            }}
+                    );
+
+                    CompletableFuture.runAsync(() -> {
+                        List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
+                        redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+                    });
+                }
+            }
+        }
+        return isSuccess;
+    }
+
+    @Override
+    public Boolean updateClass(UpdateBaseClassPageDto dto) {
+        BaseClass aClass = this.getById(dto.getId());
+        //设置了班主任,需要判断新设置的班主任是否已经是其它在读班级的
+        if(dto.getTeacherId() != null && !dto.getTeacherId().equals(aClass.getTeacherId())){
+            long count = this.count(
+                    new QueryWrapper<BaseClass>().lambda()
+                            .eq(BaseClass::getIsGraduate, 1)
+                            .eq(BaseClass::getTeacherId, dto.getTeacherId())
+                            .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                            .eq(BaseClass::getEnabledMark, EnabledMark.ENABLED.getCode())
+                            .ne(BaseClass::getId, dto.getId())
+            );
+            if(count > 0){
+                throw new MyException("该老师已是其他在读班级班主任,无法添加");
+            }
+        }
+
+        BaseClass baseClass = BeanUtil.toBean(dto, BaseClass.class);
+        baseClass.setModifyDate(new Date());
+        baseClass.setModifyUserId(StpUtil.getLoginIdAsLong());
+        boolean update = this.updateById(baseClass);
+        if(update){
+            BaseClassMajorSet majorSet = majorSetService.getOne(
+                    new QueryWrapper<BaseClassMajorSet>().lambda()
+                            .eq(BaseClassMajorSet::getClassId, baseClass.getId())
+            );
+            if(majorSet != null){
+                majorSet.setClassId(baseClass.getId());
+                majorSet.setMajorSetId(dto.getMajorSetId());
+                majorSet.setModifyDate(new Date());
+                majorSetService.updateById(majorSet);
+            }
+            if(baseClass.getTeacherId() != null){
+                long count = roleRelationService.count(
+                        new QueryWrapper<UserRoleRelation>().lambda()
+                                .eq(UserRoleRelation::getUserId, dto.getTeacherId())
+                                .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
+                );
+                if(count == 0){
+                    roleRelationService.save(
+                            new UserRoleRelation(){{
+                                setRoleId(RoleEnum.CLASSTE.getCode());
+                                setUserId(dto.getTeacherId());
+                            }}
+                    );
+                }
+            }
+
+            if(baseClass.getTeacherId() == null && aClass.getTeacherId() != null){
+                long count = this.count(
+                        new QueryWrapper<BaseClass>().lambda()
+                                .eq(BaseClass::getIsGraduate, 1)
+                                .eq(BaseClass::getTeacherId, aClass.getTeacherId())
+                                .eq(BaseClass::getDeleteMark, DeleteMark.NODELETE.getCode())
+                                .eq(BaseClass::getEnabledMark, EnabledMark.ENABLED.getCode())
+                                .ne(BaseClass::getId, dto.getId())
+                );
+                if(count == 0){
+                    roleRelationService.remove(
+                            new QueryWrapper<UserRoleRelation>().lambda()
+                                    .eq(UserRoleRelation::getUserId, aClass.getTeacherId())
+                                    .eq(UserRoleRelation::getRoleId, RoleEnum.CLASSTE.getCode())
+                    );
+                }
+            }
+            CompletableFuture.runAsync(() -> {
+                List<UserRoleRelation> userRoleRelationList = roleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
+                redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
+            });
+        }
+        return update;
+    }
+
 }

+ 1 - 1
src/main/java/com/xjrsoft/module/job/JianyuekbScheduleTask.java

@@ -293,7 +293,7 @@ public class JianyuekbScheduleTask {
             CourseReceiveMsg receiveMsg = receiveMsgService.getById(courseReceiveMsgId);
             JianyueData jianyueData = jianyueDataService.getOne(
                     new QueryWrapper<JianyueData>().lambda()
-                            .eq(JianyueData::getSourceId, receiveMsg.getEduYearSerialNo())
+                            .eq(JianyueData::getJianyueId, receiveMsg.getEduYearSerialNo())
             );
             String[] sourceId = jianyueData.getSourceId().split("_");
             Department department = departmentService.getById(sourceId[0]);

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

@@ -5,8 +5,11 @@ import com.xjrsoft.module.textbook.service.IWfTextbookClaimService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 教材申领审核通过后进行领取人记录添加规则
@@ -24,7 +27,14 @@ public class AddClaimUserNode extends NodeComponent {
         Long formId = Convert.toLong(value);
         if (formId != null) {
             // 数据处理
-            wfTextbookClaimService.dataHandleAddClaimUserNode(formId);
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        wfTextbookClaimService.dataHandleAddClaimUserNode(formId);
+                    });
+                }
+            });
         }
     }
 }

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

@@ -5,8 +5,11 @@ import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 退书申请
@@ -24,7 +27,14 @@ public class WfTextbookRecedeNode extends NodeComponent {
         Long formId = Convert.toLong(value);
         if (formId != null) {
             // 数据处理
-            wfTextbookRecedeService.dataHandle(formId);
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        wfTextbookRecedeService.dataHandle(formId);
+                    });
+                }
+            });
         }
     }
 }

+ 4 - 0
src/main/java/com/xjrsoft/module/organization/entity/Role.java

@@ -43,5 +43,9 @@ public class Role extends AuditEntity implements Serializable {
     private String remark;
 
 
+    @ApiModelProperty("是否系统角色(1:是 0:否)")
+    private Integer isSystem;
+
+
 
 }

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

@@ -375,13 +375,13 @@ public class DataUtil {
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
             paramJson.addProperty("period", period);
-            paramJson.addProperty("startDate", sdf.format(semester.getStartDate()));
-            paramJson.addProperty("endDate", sdf.format(semester.getEndDate()));
+            paramJson.addProperty("startDate", sdf.format(semester.getTeachingStart()));
+            paramJson.addProperty("endDate", sdf.format(semester.getTeachingEnd()));
             paramJson.addProperty("extendId", semester.getId().toString());
 
-            if(semester.getStartDate() != null && semester.getEndDate() != null && semester.getEndDate().getTime() > timestamp && semester.getStartDate().getTime() < timestamp){
+            if(semester.getStartDate() != null && semester.getTeachingStart() != null && semester.getTeachingEnd().getTime() > timestamp && semester.getTeachingStart().getTime() < timestamp){
                 paramJson.addProperty("isCurrent", Boolean.TRUE);
-            }else if(semester.getStartDate() != null && semester.getEndDate() != null && semester.getEndDate().getTime() > timestamp && semester.getStartDate().getTime() > timestamp){
+            }else if(semester.getStartDate() != null && semester.getTeachingStart() != null && semester.getTeachingEnd().getTime() > timestamp && semester.getTeachingStart().getTime() > timestamp){
                 paramJson.addProperty("isCurrent", Boolean.TRUE);
             }else{
                 paramJson.addProperty("isCurrent", Boolean.FALSE);

+ 2 - 3
src/main/java/com/xjrsoft/module/student/controller/StudentReportRecordController.java

@@ -85,7 +85,6 @@ public class StudentReportRecordController {
     private final IStudentReportRecordService studentReportRecordService;
     private final IBaseSemesterService semesterService;
     private final IBaseGradeService gradeService;
-    private final IStudentReportPlanService studentReportPlanService;
     private final IStudentReportPlanService planService;
     private final IBaseClassService classService;
 
@@ -424,7 +423,7 @@ public class StudentReportRecordController {
     @SaCheckPermission("studentreportrecord:detail")
     public RT<Boolean> sign(@Valid @RequestBody StudentReportSignDto dto){
         StudentReportRecord record = studentReportRecordService.getById(dto.getId());
-        StudentReportPlan reportPlan = studentReportPlanService.getById(record.getStudentReportPlanId());
+        StudentReportPlan reportPlan = planService.getById(record.getStudentReportPlanId());
         LocalDateTime now = LocalDateTime.now();
         if(reportPlan.getStatus() != 1 || !(now.isAfter(reportPlan.getStartTime()) && now.isBefore(reportPlan.getEndTime()))){
             return RT.error("不在报到时间内,无法报到");
@@ -439,7 +438,7 @@ public class StudentReportRecordController {
     @SaCheckPermission("studentreportrecord:detail")
     public RT<Boolean> allSign(@Valid @RequestBody List<StudentReportSignDto> dtoList){
         StudentReportRecord record = studentReportRecordService.getById(dtoList.get(0).getId());
-        StudentReportPlan reportPlan = studentReportPlanService.getById(record.getStudentReportPlanId());
+        StudentReportPlan reportPlan = planService.getById(record.getStudentReportPlanId());
         LocalDateTime now = LocalDateTime.now();
         if(reportPlan.getStatus() == 0 || now.isBefore(reportPlan.getStartTime()) ){
             return RT.error("暂未开始,无法报到");

+ 5 - 5
src/main/java/com/xjrsoft/module/student/service/impl/StudentReportPlanServiceImpl.java

@@ -162,12 +162,12 @@ public class StudentReportPlanServiceImpl extends MPJBaseServiceImpl<StudentRepo
                 );
             }
 
-            if(!insertList.isEmpty()){
-                reportRecordService.remove(
-                        new QueryWrapper<StudentReportRecord>().lambda()
-                                .eq(StudentReportRecord::getStudentReportPlanId, studentReportPlan.getId())
-                );
+            long count = reportRecordService.count(
+                    new QueryWrapper<StudentReportRecord>().lambda()
+                            .eq(StudentReportRecord::getStudentReportPlanId, studentReportPlan.getId())
+            );
 
+            if(!insertList.isEmpty() && count == 0){
                 reportRecordService.saveBatch(insertList);
                 Set<String> studentUserIds = studentList.stream().map(BaseStudentUserPageVo::getId).collect(Collectors.toSet());
                 //发布后,将学生的状态改为不正常

+ 2 - 2
src/main/java/com/xjrsoft/module/student/vo/StudentReportRecordExcelVo.java

@@ -46,8 +46,8 @@ public class StudentReportRecordExcelVo {
     @ApiModelProperty("手机号")
     private String mobile;
 
-    @ExcelProperty("学生来源")
-    @ApiModelProperty("学生来源")
+    @ExcelProperty("学生类别")
+    @ApiModelProperty("学生类别")
     private String studentTypeCn;
 
     @ExcelProperty("就读方式")

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

@@ -170,7 +170,7 @@ public class DictionarydetailController {
         if(dictionaryItem!=null) {
             if ("job_state".equals(dictionaryItem.getCode())) {
                 Integer isNormal = 1;
-                if (dictionaryDetail.getExtendField1().equals("0")) {
+                if ("0".equals(dictionaryDetail.getExtendField1())) {
                     isNormal = 0;
                 }
                 teacherbaseManagerService.changeIsNormal(dictionaryDetail.getCode(), isNormal);
@@ -178,7 +178,7 @@ public class DictionarydetailController {
 
             if("archives_status".equals(dictionaryItem.getCode())){
                 Integer isNormal = 1;
-                if (dictionaryDetail.getExtendField1().equals("0")) {
+                if ("0".equals(dictionaryDetail.getExtendField1())) {
                     isNormal = 0;
                 }
                 baseStudentService.changeIsNormal(dictionaryDetail.getCode(), isNormal);

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

@@ -61,13 +61,6 @@ public class TextbookIssueRecordController {
         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")

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

@@ -162,8 +162,8 @@ public class TextbookWarehouseRecord implements Serializable {
     @ApiModelProperty("已出库数量")
     private Integer issuedNumber;
     /**
-    * 领取后退书数量
-    */
+     * 领取后退书数量
+     */
     @ApiModelProperty("领取后退书数量")
     private Integer recedeNumber;
     /**

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

@@ -242,12 +242,8 @@ public class TextbookSubscriptionServiceImpl extends MPJBaseServiceImpl<Textbook
             stuNum += textbookSubscriptionItem.getStudentNum();
             teaNum += textbookSubscriptionItem.getTeacherNum();
 
-            BigDecimal discount = BigDecimal.valueOf(textbookSubscriptionItem.getDiscount()).divide(BigDecimal.valueOf(10), 2, RoundingMode.DOWN);
-
-            currentPrice = textbookSubscriptionItem.getPrice().multiply(discount);
-
+            currentPrice = textbookSubscriptionItem.getPrice();
             currentTotalPrice = currentPrice.multiply(BigDecimal.valueOf(textbookSubscriptionItem.getTeacherNum() + textbookSubscriptionItem.getStudentNum()));
-
             totalPrice = totalPrice.add(currentTotalPrice);
         }
         TextbookSubscriptionDetailVo textbookSubscriptionDetailVo = new TextbookSubscriptionDetailVo();

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

@@ -63,11 +63,12 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
         textbookWarehouseRecordMPJLambdaWrapper
                 .disableSubLogicDel()
                 .select(TextbookWarehouseRecord::getId)
-                .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
-                .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
                 .selectAs(TextbookWarehouseRecord::getPrice, TextbookWarehouseRecordPageVo::getPrice)
                 .selectAs(TextbookWarehouseRecord::getDiscount, TextbookWarehouseRecordPageVo::getDiscount)
                 .selectAs(TextbookWarehouseRecord::getCreateDate, TextbookWarehouseRecordPageVo::getCreateDate)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, TextbookWarehouseRecordPageVo::getSubtotal)
+                .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
+                .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
                 .innerJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookWarehouseRecord::getBaseSemesterId,
                         wrapper -> wrapper
@@ -97,6 +98,7 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
                 .eq(ObjectUtils.isNotEmpty(dto.getSubjectGroupId()), Textbook::getSubjectGroupId, dto.getSubjectGroupId())
                 .eq(ObjectUtils.isNotEmpty(dto.getCourseSubjectId()), Textbook::getCourseSubjectId, dto.getCourseSubjectId())
                 .like(StringUtils.isNotEmpty(dto.getBookName()), Textbook::getBookName, dto.getBookName())
+                .orderByDesc(TextbookWarehouseRecord::getCreateDate)
                 ;
         return this.selectJoinListPage(ConventPage.getPage(dto), TextbookWarehouseRecordPageVo.class, textbookWarehouseRecordMPJLambdaWrapper);
 //        return textbookWarehouseRecordMapper.getPage(page, dto);

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

@@ -15,6 +15,9 @@ import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.utils.SortCodeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.organization.entity.Role;
+import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.mapper.RoleMapper;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
@@ -60,6 +63,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     private final TextbookClaimUserMapper textbookClaimUserMapper;
 
     private final WorkflowFormRelationMapper workflowFormRelationMapper;
+
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
     @Override
@@ -451,17 +455,17 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             //所有需要添加的可领取人ID
             List<TextbookClaimUser> textbookClaimUserList = new ArrayList<>();
 
-            List<String> roleList = StpUtil.getRoleList();
-
             //申领人自己可以领取
             textbookClaimUserList.add(new TextbookClaimUser() {{
                 setCreateDate(new Date());
                 setWfTextbookClaimId(wfTextbookClaim.getId());
                 setUserId(wfTextbookClaim.getApplicantUserId());
-                if(roleList.contains(RoleEnum.TEACHER.getCode().toString())){
+                if(ClaimTypeEnum.ClaimTeacher.getCode().equals(wfTextbookClaim.getClaimType())
+                    || ClaimTypeEnum.ClaimClass.getCode().equals(wfTextbookClaim.getClaimType())
+                ){
                     setUserType(2);
                 }
-                if(roleList.contains(RoleEnum.STUDENT.getCode().toString())){
+                if(ClaimTypeEnum.ClaimStudent.getCode().equals(wfTextbookClaim.getClaimType())){
                     setUserType(1);
                 }
             }});
@@ -482,7 +486,7 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
             if (ClaimTypeEnum.ClaimTeacher.getCode().equals(wfTextbookClaim.getClaimType())
                     && ObjectUtils.isNotEmpty(wfTextbookClaim.getApplicantUserId())
                     && ObjectUtils.isNotEmpty(wfTextbookClaim.getClaimUserId())
-                    && !wfTextbookClaim.getApplicantUserId().equals(wfTextbookClaim.getClaimUserId())
+                    && !Objects.equals(wfTextbookClaim.getApplicantUserId(), wfTextbookClaim.getClaimUserId())
             ) {
                 textbookClaimUserList.add(new TextbookClaimUser() {{
                     setCreateDate(new Date());
@@ -498,5 +502,4 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
         }
         return true;
     }
-
 }

+ 130 - 74
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java

@@ -1,18 +1,27 @@
 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.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.IssueModeEnum;
+import com.xjrsoft.common.enums.RecedeTypeEnum;
+import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -31,12 +40,14 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
 
     private final WfTextbookRecedeItemMapper wfTextbookRecedeWfTextbookRecedeItemMapper;
 
-    private final TextbookMapper textbookTextbookMapper;
-
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
+    private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper;
+
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
 
+    private final WorkflowFormRelationMapper workflowFormRelationMapper;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(WfTextbookRecede wfTextbookRecede) {
@@ -99,21 +110,19 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
     public Boolean dataHandle(Long formId) {
         WfTextbookRecede wfTextbookRecede = this.getByIdDeep(formId);
 
-        if(ObjectUtils.isNotEmpty(wfTextbookRecede)){
+        // 根据数据id找到所在流程得状态
+        WorkflowFormRelation workflowFormRelation = workflowFormRelationMapper.selectOne(
+                Wrappers.lambdaQuery(WorkflowFormRelation.class)
+                        .eq(WorkflowFormRelation::getFormKeyValue, formId)
+        );
+
+        if (ObjectUtils.isNotEmpty(wfTextbookRecede)
+                && ObjectUtils.isNotEmpty(workflowFormRelation)
+                && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
+        ) {
             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())
@@ -124,70 +133,117 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
                         .collect(Collectors.toMap(TextbookIssueRecord::getId, t -> t, (t1, t2) -> t1))
                         ;
 
+                List<Long> textbookWarehouseRecordIds = textbookIssueRecords.stream()
+                        .map(TextbookIssueRecord::getTextbookWarehouseRecordId)
+                        .collect(Collectors.toList());
+
+                // 获取本学期所有的出库记录对应的所有的入库记录
+                List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(
+                        Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
+                                .in(ObjectUtils.isNotEmpty(textbookWarehouseRecordIds), TextbookWarehouseRecord::getId, textbookWarehouseRecordIds)
+                                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+
+                Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordMap = textbookWarehouseRecords.stream()
+                        .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1, t2) -> t1))
+                        ;
+
                 //遍历每一个退书申请项
-                TextbookWarehouseRecord textbookWarehouseRecord;
-                TextbookIssueRecord textbookIssueRecord;
+                TextbookWarehouseRecord oldTextbookWarehouseRecord;
+                TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
+                TextbookWarehouseRecord updateTextbookWarehouseRecord;
+                TextbookIssueRecord oldTextbookIssueRecord;
+                TextbookIssueRecord newTextbookIssueRecord;
+                TextbookIssueRecord updateTextbookIssueRecord;
                 for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecedeItemList) {
-                    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);
-//                        }});
-//                    }
+                    // 退书项对应的出库记录
+                    oldTextbookIssueRecord = textbookIssueRecordMap.get(wfTextbookRecedeItem.getTextbookIssueRecordId());
+                    // 退书项对应的出库记录对应的入库记录
+                    oldTextbookWarehouseRecord = textbookWarehouseRecordMap.get(oldTextbookIssueRecord.getId());
+
+                    // 退书类型是到教务处
+                    if(RecedeTypeEnum.RecedeeDansOffice.getCode().equals(wfTextbookRecede.getRecedeType())
+                        && ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord)
+                        && ObjectUtils.isNotEmpty(oldTextbookIssueRecord)
+                    ){
+                        // 增加入库详情记录
+                        textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
+                        textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(oldTextbookWarehouseRecord.getId());
+                        textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmRecede.getCode());
+                        textbookWarehouseRecordDetail.setWarehouseNumber(ObjectUtils.isEmpty(wfTextbookRecedeItem.getNumber()) ? 0 : wfTextbookRecedeItem.getNumber());
+                        textbookWarehouseRecordDetail.setCreateDate(new Date());
+                        textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
+
+                        // 修改入库记录
+                        updateTextbookWarehouseRecord = new TextbookWarehouseRecord();
+                        updateTextbookWarehouseRecord.setId(oldTextbookWarehouseRecord.getId());
+                        updateTextbookWarehouseRecord.setRecedeNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRecedeNumber()) ? oldTextbookWarehouseRecord.getRecedeNumber() : 0)
+                                        + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookWarehouseRecord.setRemainNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRemainNumber()) ? oldTextbookWarehouseRecord.getRemainNumber() : 0)
+                                + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookWarehouseRecord.setModifyDate(new Date());
+                        textbookWarehouseRecordMapper.updateById(updateTextbookWarehouseRecord);
+
+                        // 修改出库记录
+                        updateTextbookIssueRecord = new TextbookIssueRecord();
+                        updateTextbookIssueRecord.setId(oldTextbookIssueRecord.getId());
+                        updateTextbookIssueRecord.setRecedeNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getRecedeNumber()) ? oldTextbookIssueRecord.getRecedeNumber() : 0)
+                                        + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookIssueRecord.setActualIssueNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getIssueNumber()) ? oldTextbookIssueRecord.getIssueNumber() : 0)
+                                        +  (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getRecedeNumber()) ? oldTextbookIssueRecord.getRecedeNumber() : 0)
+                        );
+                        updateTextbookIssueRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(oldTextbookIssueRecord.getActualIssueNumber())));
+                        updateTextbookIssueRecord.setModifyDate(new Date());
+                        textbookIssueRecordMapper.updateById(updateTextbookIssueRecord);
+                    }
+
+                    //退书类型是到书店
+                    if(RecedeTypeEnum.RecedeBookstore.getCode().equals(wfTextbookRecede.getRecedeType())
+                            && ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord)
+                    ){
+                        // 新增出库
+                        newTextbookIssueRecord = new TextbookIssueRecord();
+                        newTextbookIssueRecord.setBaseSemesterId(wfTextbookRecede.getBaseSemesterId());
+                        newTextbookIssueRecord.setOrderNumber("退书到书店的出库单号");
+                        newTextbookIssueRecord.setTextbookWarehouseRecordId(oldTextbookWarehouseRecord.getId());
+                        newTextbookIssueRecord.setIssueMode(IssueModeEnum.ImRecede.getCode());
+                        newTextbookIssueRecord.setTextbookId(wfTextbookRecedeItem.getTextbookId());
+                        newTextbookIssueRecord.setIssueNumber(ObjectUtils.isEmpty(wfTextbookRecedeItem.getNumber()) ? 0 : wfTextbookRecedeItem.getNumber());
+                        newTextbookIssueRecord.setRecedeNumber(0);
+                        newTextbookIssueRecord.setActualIssueNumber(newTextbookIssueRecord.getIssueNumber());
+                        newTextbookIssueRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(newTextbookIssueRecord.getActualIssueNumber())));
+                        newTextbookIssueRecord.setIssueUserId(wfTextbookRecede.getCreateUserId());
+                        textbookIssueRecordMapper.insert(newTextbookIssueRecord);
+
+                        // 修改入库记录
+                        updateTextbookWarehouseRecord = new TextbookWarehouseRecord();
+                        updateTextbookWarehouseRecord.setId(oldTextbookWarehouseRecord.getId());
+                        updateTextbookWarehouseRecord.setReturnBookstoreNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getReturnBookstoreNumber()) ? oldTextbookWarehouseRecord.getReturnBookstoreNumber() : 0)
+                                        + newTextbookIssueRecord.getIssueNumber()
+                        );
+                        updateTextbookWarehouseRecord.setActualWarehouseNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getWarehouseNumber()) ? oldTextbookWarehouseRecord.getWarehouseNumber() : 0)
+                                        - updateTextbookWarehouseRecord.getReturnBookstoreNumber()
+                        );
+                        updateTextbookWarehouseRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(updateTextbookWarehouseRecord.getActualWarehouseNumber())));
+                        updateTextbookWarehouseRecord.setRemainNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRemainNumber()) ? oldTextbookWarehouseRecord.getRemainNumber() : 0)
+                                        - newTextbookIssueRecord.getIssueNumber()
+                        );
+                        updateTextbookWarehouseRecord.setModifyDate(new Date());
+                        textbookWarehouseRecordMapper.updateById(updateTextbookWarehouseRecord);
+                    }
                 }
             }
         }
-
         return true;
     }
 }

+ 8 - 4
src/main/resources/sqlScript/init_data.sql

@@ -1,4 +1,8 @@
-insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark) value(1,'超级管理员','ADMIN',2,'超级管理员',1,'2021-07-25 20:42:11',0,1);
-insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark) value(2,'教师','TEACHER',2,'教师',1,'2021-07-25 20:42:11',0,1);
-insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark) value(3,'学生','STUDENT',3,'学生',1,'2021-07-25 20:42:11',0,1);
-insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark) value(4,'家长','PARENT',4,'家长',1,'2021-07-25 20:42:11',0,1);
+ALTER TABLE `xjr_role`
+    ADD COLUMN `is_system` INT DEFAULT 0  NULL   COMMENT '是否是系统角色(1:是 0:否)' AFTER `enabled_mark`;
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(1,'超级管理员','ADMIN',2,'超级管理员',1,'2021-07-25 20:42:11',0,1,1);
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(2,'教师','TEACHER',2,'教师',1,'2021-07-25 20:42:11',0,1,1);
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(3,'学生','STUDENT',3,'学生',1,'2021-07-25 20:42:11',0,1,1);
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(4,'家长','PARENT',4,'家长',1,'2021-07-25 20:42:11',0,1,1);
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(5,'访客','VISITOR',5,'访客',1,'2021-07-25 20:42:11',0,1,1);
+insert xjr_role(id,name,code,sort_code,remark,create_user_id,create_date,delete_mark,enabled_mark,is_system) value(1745630294430511106,'班主任','CLASSTE',6,'班主任',1,'2021-07-25 20:42:11',0,1,1);

File diff suppressed because it is too large
+ 0 - 89
src/main/resources/sqlScript/question[2024年4月28日].sql


+ 2 - 18
src/test/java/com/xjrsoft/module/job/JianyuekbBaseDataTaskTest.java

@@ -95,24 +95,8 @@ class JianyuekbBaseDataTaskTest {
             //查询校区
             String tableName = "xjr_department";
 
-            //推送年级
-            JsonArray schoolDistrictData = dataUtil.getSchoolDistrictData();
-            tableName = "base_grade";
-            Map<String, String> gradeMap = dataMap.get(tableName);
-            //推送教职工
-            tableName = "base_teacher";
-            Map<String, String> teacherMap = dataMap.get(tableName);
-            //推送教室
-            tableName = "base_classroom";
-            Map<String, String> classroomMap = dataMap.get(tableName);
-            //推送行政班,先查询当前学期id
-            String currenSemeter = dataUtil.getCurrenSemeter();
-            tableName = "base_class";
-            sql = "SELECT * FROM base_class WHERE delete_mark = 0" +
-                " and id not in (SELECT source_id FROM jianyue_data WHERE table_name = 'base_class' AND source_id IS NOT NULL)";
-
-            tableName = "base_class";
-            dataUtil.insertClass(tableName, gradeMap, teacherMap, currenSemeter, dataMap.get(tableName), classroomMap);
+            tableName = "base_semester";
+            dataUtil.insertSemester(tableName, dataMap.get(tableName));
         } catch (Exception e) {
         }
     }

+ 69 - 6
src/test/java/com/xjrsoft/module/job/JianyuekbScheduleTaskTest2.java

@@ -1,6 +1,5 @@
 package com.xjrsoft.module.job;
 
-import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.convert.Convert;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.StrUtil;
@@ -24,12 +23,18 @@ import com.xjrsoft.module.courseTable.dto.ClassTeacherDto;
 import com.xjrsoft.module.courseTable.entity.CourseTable;
 import com.xjrsoft.module.courseTable.service.ICourseTableService;
 import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.organization.service.IDepartmentService;
 import com.xjrsoft.module.organization.service.IUserService;
 import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.schedule.entity.CourseReceiveMsg;
 import com.xjrsoft.module.schedule.entity.CourseTableBak;
+import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.schedule.entity.WfCourseAdjust;
+import com.xjrsoft.module.schedule.service.ICourseReceiveMsgService;
 import com.xjrsoft.module.schedule.service.ICourseTableBakService;
+import com.xjrsoft.module.schedule.service.IJianyueDataService;
 import com.xjrsoft.module.schedule.service.IWfCourseAdjustService;
 import com.xjrsoft.module.schedule.util.DataUtil;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
@@ -57,12 +62,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -127,6 +132,15 @@ class JianyuekbScheduleTaskTest2 {
     @Autowired
     private IWorkflowExtraService workflowExtraService;
 
+    @Autowired
+    private ICourseReceiveMsgService receiveMsgService;
+
+    @Autowired
+    private IJianyueDataService jianyueDataService;
+
+    @Autowired
+    private IDepartmentService departmentService;
+
     @Test
     void test2(){
         WfCourseAdjust courseAdjust = adjustService.getById(1851529228440875008L);
@@ -138,7 +152,7 @@ class JianyuekbScheduleTaskTest2 {
         doExecute();
     }
     public void doExecute() {
-        String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback = -1";
+        String sql = "SELECT * FROM course_receive_msg WHERE delete_mark = 0 AND is_callback is null";
         List<Map<String, Object>> receiveMsgs = SqlRunnerAdapter.db().selectList(sql);
         if(receiveMsgs.isEmpty()){
             return;
@@ -180,6 +194,7 @@ class JianyuekbScheduleTaskTest2 {
         Map<String, Map<String, String>> dataMap = initDataMap();
         for (Map<String, Object> receiveMsg : receiveMsgs) {
             String eduYearSerialNo = receiveMsg.get("edu_year_serial_no").toString();
+            Long courseReceiveMsgId = Long.parseLong(receiveMsg.get("id").toString());
             if(ongoing.contains(eduYearSerialNo)){
                 continue;
             }
@@ -234,7 +249,7 @@ class JianyuekbScheduleTaskTest2 {
 
                 ongoing.remove(eduYearSerialNo);
                 redisUtil.set(taskKey, ongoing);
-                insertCourse(allScheduleInfo, dataMap, dataUtil);
+                insertCourse(allScheduleInfo, dataMap, dataUtil, courseReceiveMsgId);
                 //恢复挂起的流程
                 restoreCourseAdjust(processIds);
                 //处理该日期内已经审批通过的调课和顶课申请
@@ -247,7 +262,7 @@ class JianyuekbScheduleTaskTest2 {
         }
     }
 
-    void insertCourse(JsonArray scheduleInfo, Map<String, Map<String, String>> dataMap, DataUtil dataUtil){
+    void insertCourse(JsonArray scheduleInfo, Map<String, Map<String, String>> dataMap, DataUtil dataUtil, Long courseReceiveMsgId){
         //获取年级
         String tableName = "base_grade";
 //            Map<String, Long> gradeMap = dataMap.get(tableName);
@@ -267,10 +282,58 @@ class JianyuekbScheduleTaskTest2 {
         tableName = "base_classroom";
         Map<String, String> classroomMap = dataMap.get(tableName);
 
-        dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, null);
+        Set<String> techerIds = dataUtil.insertCourseTableEntiy(scheduleInfo, classroomMap, courseMap, semesterMap, teacherMap, classMap, courseReceiveMsgId);
+        sendMsg(techerIds, courseReceiveMsgId);
         dataUtil.insertClassTime(scheduleInfo);
     }
 
+    void sendMsg(Set<String> techerIds, Long courseReceiveMsgId){
+        try {
+            CourseReceiveMsg receiveMsg = receiveMsgService.getById(courseReceiveMsgId);
+            JianyueData jianyueData = jianyueDataService.getOne(
+                    new QueryWrapper<JianyueData>().lambda()
+                            .eq(JianyueData::getJianyueId, receiveMsg.getEduYearSerialNo())
+            );
+            String[] sourceId = jianyueData.getSourceId().split("_");
+            Department department = departmentService.getById(sourceId[0]);
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            //通知对应教师
+            List<User> userList = userService.listByIds(new ArrayList<>(techerIds));
+            for (User user : userList) {
+                WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                weChatSendMessageDto.setTemplateId(wechatTemplate);
+                JSONObject paramJson = new JSONObject();
+
+                JSONObject thing8 = new JSONObject();
+                thing8.put("value", "课表更新");
+                paramJson.put("thing8", thing8);
+
+                JSONObject thing2 = new JSONObject();
+                thing2.put("value", department.getName());
+                paramJson.put("thing2", thing2);
+
+                JSONObject thing6 = new JSONObject();
+                thing6.put("value", "教务处");
+                paramJson.put("thing6", thing6);
+
+                JSONObject time3 = new JSONObject();
+                time3.put("value", sdf.format(receiveMsg.getCreateDate()));
+                paramJson.put("time3", time3);
+
+                weChatSendMessageDto.setContent(paramJson);
+                weChatSendMessageDto.setMsgId(IdUtil.getSnowflakeNextId() + "");
+
+                String openId = user.getOpenId();
+                if(openId != null && !"".equals(openId)){
+                    weChatSendMessageDto.setUserId(openId);
+                    weChatService.sendTemplateMessage(weChatSendMessageDto);
+                }
+            }
+        }catch (Exception e){
+            Log.error(e.getMessage(), e);
+        }
+    }
+
     Map<String, Map<String, String>> initDataMap(){
         Map<String, Map<String, String>> dataMap = new HashMap<>();
         String sql = "SELECT distinct table_name FROM jianyue_data WHERE 1 = 1";

+ 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(1889935007730941952L);
+        wfTextbookClaimService.dataHandleAddClaimUserNode(1890244166749831168L);
     }
 
 }

Some files were not shown because too many files changed in this diff