Selaa lähdekoodia

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

大数据与最优化研究所 1 vuosi sitten
vanhempi
commit
147d1e5922
27 muutettua tiedostoa jossa 439 lisäystä ja 85 poistoa
  1. 7 0
      src/main/java/com/xjrsoft/module/assessment/controller/AssessmentPlanAnswerController.java
  2. 3 0
      src/main/java/com/xjrsoft/module/assessment/dto/AssessmentPlanAnswerPageDto.java
  3. 3 0
      src/main/java/com/xjrsoft/module/assessment/vo/AssessmentPlanAnswerTeacherPageVo.java
  4. 3 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java
  5. 29 5
      src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java
  6. 22 55
      src/main/java/com/xjrsoft/module/job/StudentDropOutTask.java
  7. 2 0
      src/main/java/com/xjrsoft/module/personnel/service/IFaceManagementService.java
  8. 17 0
      src/main/java/com/xjrsoft/module/personnel/service/impl/FaceManagementServiceImpl.java
  9. 1 6
      src/main/java/com/xjrsoft/module/room/service/impl/WfRoomStayOvernightServiceImpl.java
  10. 5 0
      src/main/java/com/xjrsoft/module/student/entity/BaseStudent.java
  11. 1 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java
  12. 17 1
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java
  13. 44 0
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  14. 41 14
      src/main/java/com/xjrsoft/module/system/controller/DictionarydetailController.java
  15. 15 0
      src/main/java/com/xjrsoft/module/system/dto/AddDictionaryDetailDto.java
  16. 13 0
      src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailChangeStatusDto.java
  17. 15 0
      src/main/java/com/xjrsoft/module/system/dto/UpdateDictionaryDetailDto.java
  18. 14 0
      src/main/java/com/xjrsoft/module/system/entity/DictionaryDetail.java
  19. 15 0
      src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailListVo.java
  20. 15 0
      src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailPageVo.java
  21. 5 1
      src/main/java/com/xjrsoft/module/teacher/entity/BaseTeacher.java
  22. 2 0
      src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java
  23. 50 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  24. 3 2
      src/main/resources/mapper/assessment/AssessmentTemplatePlanMapper.xml
  25. 1 1
      src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml
  26. 65 0
      src/test/java/com/xjrsoft/module/job/StudentDropOutTaskTest.java
  27. 31 0
      src/test/java/com/xjrsoft/module/liteflow/node/WfRoomStayOvernightNodeTest.java

+ 7 - 0
src/main/java/com/xjrsoft/module/assessment/controller/AssessmentPlanAnswerController.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.assessment.controller;
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.stp.StpUtil;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
@@ -72,6 +73,7 @@ public class AssessmentPlanAnswerController {
     @SaCheckPermission("assessmenttemplateplan:detail")
     public RT<PageOutput<AssessmentPlanAnswerTeacherPageVo>> teacherPage(@Valid AssessmentPlanAnswerPageDto dto){
         dto.setTeacherId(StpUtil.getLoginIdAsLong());
+        dto.setIsHeadTeacher(1);
         Page<AssessmentPlanAnswerTeacherPageVo> page = planService.getTeacherPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<AssessmentPlanAnswerTeacherPageVo> pageOutput = ConventPage.getPageOutput(page, AssessmentPlanAnswerTeacherPageVo.class);
         return RT.ok(pageOutput);
@@ -81,6 +83,11 @@ public class AssessmentPlanAnswerController {
     @ApiOperation(value="考核计划答题列表-所有班级(分页)")
     @SaCheckPermission("assessmenttemplateplan:detail")
     public RT<PageOutput<AssessmentPlanAnswerTeacherPageVo>> allClassPage(@Valid AssessmentPlanAnswerPageDto dto){
+
+        if(StpUtil.getRoleList().contains("CLASSTE")){
+            dto.setTeacherId(StpUtil.getLoginIdAsLong());
+            dto.setIsHeadTeacher(0);
+        }
         Page<AssessmentPlanAnswerTeacherPageVo> page = planService.getTeacherPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
         PageOutput<AssessmentPlanAnswerTeacherPageVo> pageOutput = ConventPage.getPageOutput(page, AssessmentPlanAnswerTeacherPageVo.class);
         return RT.ok(pageOutput);

+ 3 - 0
src/main/java/com/xjrsoft/module/assessment/dto/AssessmentPlanAnswerPageDto.java

@@ -40,5 +40,8 @@ public class AssessmentPlanAnswerPageDto extends PageInput {
     @ApiModelProperty("是否确认(0:否 1:是)")
     private Integer isConfirm;
 
+    @ApiModelProperty("是否是班主任(0:否 1:是)")
+    private Integer isHeadTeacher;
+
 
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/assessment/vo/AssessmentPlanAnswerTeacherPageVo.java

@@ -70,4 +70,7 @@ public class AssessmentPlanAnswerTeacherPageVo {
 
     @ApiModelProperty("未提交数量")
     private Integer unsubmittedCount;
+
+    @ApiModelProperty("是否自己的班级(0:否 1:是)")
+    private Integer isMine;
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceStatisticsServiceImpl.java

@@ -288,6 +288,9 @@ public class AttendanceStatisticsServiceImpl extends MPJBaseServiceImpl<Attendan
             for (User user : userList) {
                 AttendanceStatisticsRecord record = new AttendanceStatisticsRecord();
                 record.setUserId(user.getId());
+                if(14954799879750L == user.getId()){
+                    System.out.println(user.getName());
+                }
                 record.setAttendanceStatisticsId(statistics.getId());
                 Long normalCount = 0L;
                 Long leaveCount = 0L;

+ 29 - 5
src/main/java/com/xjrsoft/module/databoard/controller/DataboardController.java

@@ -496,7 +496,7 @@ public class DataboardController {
                 " OR (t1.leave_end_time BETWEEN '" + startTimeStr + "' and '" + endTimeStr + "')" +
                 " OR (t1.leave_start_time > '" + startTimeStr + "' and '" + endTimeStr + "' > t1.leave_end_time)" +
                 " OR ('" + startTimeStr + "' > t1.leave_start_time and t1.leave_end_time > '" + endTimeStr + "')" +
-                ")";
+                " )";
         }
         if(dto.getUserId() != null){
             sql += " and user_id = " + dto.getUserId();
@@ -518,7 +518,8 @@ public class DataboardController {
         sql = "SELECT COUNT(t1.id) AS a_count FROM wf_course_adjust t1" +
             " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
             " WHERE t1.adjust_type = 'course_exchange'" +
-            " AND t2.current_state = 'COMPLETED'";
+            " AND t2.current_state = 'COMPLETED'" +
+            " and t1.delete_mark = 0 and t1.enabled_mark = 1";
         if(startTime != null && endTime != null){
             sql +=" AND t1.adjust_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
         }
@@ -528,10 +529,11 @@ public class DataboardController {
         list = SqlRunnerAdapter.db().selectList(sql);
         result.setAdjustCount(Integer.parseInt(list.get(0).get("a_count").toString()));
 
-        sql = "SELECT COUNT(t1.id) AS a_count FROM wf_course_adjust t1" +
+        sql = "SELECT t1.* FROM wf_course_adjust t1" +
             " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
             " WHERE t1.adjust_type = 'course_substitute'" +
-            " AND t2.current_state = 'COMPLETED'";
+            " AND t2.current_state = 'COMPLETED'" +
+            " and t1.delete_mark = 0 and t1.enabled_mark = 1";
         if(startTime != null && endTime != null){
             sql +=" AND t1.adjust_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
         }
@@ -539,7 +541,29 @@ public class DataboardController {
             sql += " and t1.user_id = " + dto.getUserId();
         }
         list = SqlRunnerAdapter.db().selectList(sql);
-        result.setExchangeCount(Integer.parseInt(list.get(0).get("a_count").toString()));
+        int subCount = list.size();
+
+        sql = "SELECT t1.* FROM wf_course_adjust t1" +
+                " INNER JOIN xjr_workflow_form_relation t2 ON t2.form_key_value = t1.id" +
+                " WHERE t1.adjust_type = 'course_substitute'" +
+                " AND t2.current_state = 'COMPLETED'" +
+                " and t1.delete_mark = 0 and t1.enabled_mark = 1";
+        if(startTime != null && endTime != null){
+            sql +=" AND t1.adjust_date between '" + startTime.format(formatter) + "' and '" + endTime.format(formatter) + "'";
+        }
+        if(dto.getUserId() != null){
+            sql += " and t1.exchange_teacher_id = " + dto.getUserId();
+        }
+        list = SqlRunnerAdapter.db().selectList(sql);
+        int addCount = list.size();
+        result.setExchangeCount(addCount - subCount);
+
+        List<CourseTable> courseList = courseTableService.list(
+                new QueryWrapper<CourseTable>().lambda()
+                        .like(CourseTable::getTeacherId, dto.getUserId())
+                        .between(dto.getStartDate() != null && dto.getEndDate() != null, CourseTable::getScheduleDate, dto.getStartDate(), dto.getEndDate())
+        );
+        result.setCourseCount(courseList.size());
         return RT.ok(result);
     }
 

+ 22 - 55
src/main/java/com/xjrsoft/module/job/StudentDropOutTask.java

@@ -1,38 +1,22 @@
 package com.xjrsoft.module.job;
 
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.xjrsoft.common.enums.ArchivesStatusEnum;
-import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
-import com.xjrsoft.common.utils.SqlRunnerAdapterUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.hikvision.entity.HikvisionData;
-import com.xjrsoft.module.hikvision.mapper.HikvisionDataMapper;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
-import com.xjrsoft.module.hikvision.util.DataUtil;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.service.IUserService;
+import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
+import com.xjrsoft.module.personnel.service.IFaceManagementService;
+import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
-import com.xjrsoft.module.student.entity.StudentDropOut;
-import com.xjrsoft.module.student.mapper.StudentDropOutMapper;
-import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
 import lombok.extern.slf4j.Slf4j;
-import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * @author dzx
@@ -43,11 +27,10 @@ import java.util.Set;
 public class StudentDropOutTask {
 
     @Autowired
-    private HikvisionDataMapper hikvisionDataMapper;
+    private IStundentFaceProcessService stundentFaceProcessService;
 
     @Autowired
-    private IUserService userService;
-
+    private IFaceManagementService faceManagementService;
 
     @Scheduled(cron = "0 */30 * * * ?")
     public void execute() {
@@ -66,49 +49,33 @@ public class StudentDropOutTask {
         }
         log.info("开始推送海康威视基础数据");
         try {
-            List<User> list = userService.list(
-                    new MPJLambdaWrapper<User>()
-                            .select(User::getId)
-                            .select(User.class, x -> VoToColumnUtil.fieldsToColumns(User.class).contains(x.getProperty()))
-                            .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, User::getId)
+            List<StundentFaceProcess> list = stundentFaceProcessService.list(
+                    new MPJLambdaWrapper<StundentFaceProcess>()
+                            .select(StundentFaceProcess::getId)
+                            .select(StundentFaceProcess.class, x -> VoToColumnUtil.fieldsToColumns(StundentFaceProcess.class).contains(x.getProperty()))
+                            .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, StundentFaceProcess::getUserId)
                             .ne(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901)
+                            .isNotNull(StundentFaceProcess::getHikvisionResult)
             );
-            for (User user : list) {
-                //删除海康出入权限
-                String hikvisionId = hikvisionDataMapper.getStudentHikvisionId(user.getId());
-                if(StrUtil.isEmpty(hikvisionId)){
+            JsonParser parser = new JsonParser();
+            for (StundentFaceProcess user : list) {
+                //删除海康人脸
+
+                JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
+                if(!hikvisionResult.get("msg").isJsonNull() && !"success".equals(hikvisionResult.get("msg").getAsString())){
                     continue;
                 }
+                String faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
                 ApiUtil apiUtil = new ApiUtil();
-                String apiPath = "/api/pmas/v1/person/batch/delete";
+                String apiPath = "/api/resource/v1/face/single/delete";
                 JsonObject paramJson = new JsonObject();
-                JsonArray personIndexCodes = new JsonArray();
-                personIndexCodes.add(hikvisionId);
-                paramJson.add("personIndexCodes", personIndexCodes);
+                paramJson.addProperty("faceId", faceId);
                 String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
 
-                JsonParser parser = new JsonParser();
                 JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
                 if(resultJson.get("code").getAsInt() == 0){
-                    JsonArray success = resultJson.get("data").getAsJsonObject().get("success").getAsJsonArray();
-
-                    Set<String> valuesSet = new HashSet<>();
-                    String keyToExtract = "indexCode";
-                    // 遍历 JSON 数组并提取指定键的值
-                    for (JsonElement jsonElement : success) {
-                        JsonObject jsonObject = jsonElement.getAsJsonObject();
-                        if (jsonObject.has(keyToExtract)) {
-                            String value = jsonObject.get(keyToExtract).getAsString();
-                            valuesSet.add(value);
-                        }
-                    }
-                    if(valuesSet.contains(hikvisionId)){
-                        hikvisionDataMapper.delete(
-                                new QueryWrapper<HikvisionData>().lambda()
-                                        .eq(HikvisionData::getSourceId, user.getId())
-                                        .eq(HikvisionData::getHikvisionId, hikvisionId)
-                        );
-                    }
+                    stundentFaceProcessService.removeById(user);
+                    faceManagementService.clearRegisterBase64ByUserId(user.getUserId());
                 }
             }
 

+ 2 - 0
src/main/java/com/xjrsoft/module/personnel/service/IFaceManagementService.java

@@ -29,4 +29,6 @@ public interface IFaceManagementService extends MPJBaseService<FaceManagement> {
      * @return
      */
     Boolean delete(List<Long> ids);
+
+    Boolean clearRegisterBase64ByUserId(Long userId);
 }

+ 17 - 0
src/main/java/com/xjrsoft/module/personnel/service/impl/FaceManagementServiceImpl.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.personnel.service.impl;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.exception.MyException;
@@ -102,4 +103,20 @@ public class FaceManagementServiceImpl extends MPJBaseServiceImpl<FaceManagement
 
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean clearRegisterBase64ByUserId(Long userId) {
+        LambdaQueryWrapper<FaceManagement> queryWrapper = new LambdaQueryWrapper<FaceManagement>().in(FaceManagement::getUserId, userId);
+        List<FaceManagement> oldCars = faceManagementMapper.selectList(queryWrapper);
+        for (FaceManagement item : oldCars) {
+            UpdateWrapper<FaceManagement> updateWrapper = new UpdateWrapper<>();
+            updateWrapper.eq("id", item.getId());
+            updateWrapper.setSql("register_base64 = null");
+            updateWrapper.setSql("delete_mark = 1");
+            this.baseMapper.update(item, updateWrapper);
+        }
+
+        return true;
+    }
 }

+ 1 - 6
src/main/java/com/xjrsoft/module/room/service/impl/WfRoomStayOvernightServiceImpl.java

@@ -5,8 +5,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.base.entity.BaseClass;
-import com.xjrsoft.module.base.service.IBaseClassService;
 import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
 import com.xjrsoft.module.organization.entity.User;
 import com.xjrsoft.module.organization.entity.UserStudent;
@@ -32,8 +30,6 @@ import java.util.List;
 public class WfRoomStayOvernightServiceImpl extends MPJBaseServiceImpl<WfRoomStayOvernightMapper, WfRoomStayOvernight> implements IWfRoomStayOvernightService {
     private final IUserService userService;
 
-    private final IBaseClassService classService;
-
     private final IWeChatService weChatService;
     @Override
     public Boolean noticeParents(Long id) {
@@ -49,7 +45,6 @@ public class WfRoomStayOvernightServiceImpl extends MPJBaseServiceImpl<WfRoomSta
         SimpleDateFormat sdf = new SimpleDateFormat("yyy年MM月dd日");
 
         User student = userService.getById(applicant.getApplicantUserId());
-        BaseClass aClass = classService.getById(applicant.getClassName());
         String wechatTemplate = "pbggflZY985uimp9XQ0pe3-GftuPyF7fG5jCo97_jJU";
         for (User user : list) {
             WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
@@ -68,7 +63,7 @@ public class WfRoomStayOvernightServiceImpl extends MPJBaseServiceImpl<WfRoomSta
             }});
             //班级
             data.put("thing2", new JSONObject() {{
-                put("value", aClass.getName());
+                put("value", applicant.getClassName());
             }});
             weChatSendMessageDto.setContent(data);
             weChatService.sendTemplateMessage(weChatSendMessageDto);

+ 5 - 0
src/main/java/com/xjrsoft/module/student/entity/BaseStudent.java

@@ -261,4 +261,9 @@ public class BaseStudent implements Serializable {
 
     @ApiModelProperty("籍贯类型")
     private String nativePlaceType;
+    /**
+     * 是否正常数据(1:是 0:否)
+     */
+    @ApiModelProperty("是否正常数据(1:是 0:否)")
+    private Integer isNormal;
 }

+ 1 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseStudentService.java

@@ -19,4 +19,5 @@ public interface IBaseStudentService extends MPJBaseService<BaseStudent> {
     StudentPersonalInfoVo getPersonalInfo(Long userId);
 
     List<BaseStudentUserPageVo> getStudentList(BaseStudentUserPageDto dto);
+    void changeIsNormal(String archivesStatus,Integer isNormal);
 }

+ 17 - 1
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentServiceImpl.java

@@ -1,14 +1,19 @@
 package com.xjrsoft.module.student.service.impl;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 import com.xjrsoft.module.student.entity.BaseStudent;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
 import com.xjrsoft.module.student.mapper.BaseStudentMapper;
 import com.xjrsoft.module.student.service.IBaseStudentService;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.StudentPersonalInfoVo;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
 
@@ -33,5 +38,16 @@ public class BaseStudentServiceImpl extends MPJBaseServiceImpl<BaseStudentMapper
         return this.baseMapper.getStudentList(dto);
     }
 
-    ;
+    @Override
+    public void changeIsNormal(String archivesStatus,Integer isNormal) {
+        MPJLambdaWrapper<BaseStudent> wrapper = new MPJLambdaWrapper<BaseStudent>()
+                .selectAll(BaseStudent.class)
+                .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, BaseStudent::getUserId)
+                .eq(BaseStudentSchoolRoll::getArchivesStatus, archivesStatus);
+        List<BaseStudent> baseTeacherList = baseMapper.selectJoinList(BaseStudent.class, wrapper);
+        for (BaseStudent baseTeacher : baseTeacherList) {
+            baseTeacher.setIsNormal(isNormal);
+            baseMapper.updateById(baseTeacher);
+        }
+    }
 }

+ 44 - 0
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -74,6 +74,8 @@ import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.mapper.DictionarydetailMapper;
 import com.xjrsoft.module.system.mapper.DictionaryitemMapper;
 import com.xjrsoft.module.system.service.IAreaService;
+import com.xjrsoft.module.system.service.IDictionarydetailService;
+import com.xjrsoft.module.teacher.entity.BaseTeacher;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -135,6 +137,7 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
     private final IBaseClassService baseClassService;
 
     private final IBaseGradeService baseGradeService;
+    private IDictionarydetailService dictionarydetailService;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -147,8 +150,29 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
         baseStudentUser.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
         studentbaseManagerBaseStudentUserMapper.insert(baseStudentUser);
         for (BaseStudent baseStudent : baseStudentUser.getBaseStudentList()) {
+
             baseStudent.setUserId(baseStudentUser.getId());
+
+            BaseStudentSchoolRoll baseStudentSchoolRoll=baseStudentUser.getBaseStudentSchoolRollList().get(0);
+
+            if (!StrUtil.isNotBlank(baseStudentSchoolRoll.getArchivesStatus())) {
+                baseStudent.setIsNormal(1);
+            } else {
+                DictionaryDetail dictionaryDetail = dictionarydetailService.getOne(Wrappers.<DictionaryDetail>query()
+                        .lambda()
+                        .eq(DictionaryDetail::getCode, baseStudentSchoolRoll.getArchivesStatus())
+                        .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='archives_status'"));
+                if (dictionaryDetail != null) {
+                    if (dictionaryDetail.getExtendField1().equals("0")) {
+                        baseStudent.setIsNormal(0);
+                    } else {
+                        baseStudent.setIsNormal(1);
+                    }
+                }
+            }
+
             baseStudentService.save(baseStudent);
+
         }
         for (BaseStudentContact baseStudentContact : baseStudentUser.getBaseStudentContactList()) {
             baseStudentContact.setUserId(baseStudentUser.getId());
@@ -243,6 +267,25 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
             List<Long> baseStudentRemoveIds = baseStudentIds.stream().filter(item -> !baseStudentOldIds.contains(item)).collect(Collectors.toList());
 
             for (BaseStudent baseStudent : baseStudentUser.getBaseStudentList()) {
+
+                BaseStudentSchoolRoll baseStudentSchoolRoll=baseStudentUser.getBaseStudentSchoolRollList().get(0);
+
+                if (!StrUtil.isNotBlank(baseStudentSchoolRoll.getArchivesStatus())) {
+                    baseStudent.setIsNormal(1);
+                } else {
+                    DictionaryDetail dictionaryDetail = dictionarydetailService.getOne(Wrappers.<DictionaryDetail>query()
+                            .lambda()
+                            .eq(DictionaryDetail::getCode, baseStudentSchoolRoll.getArchivesStatus())
+                            .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='archives_status'"));
+                    if (dictionaryDetail != null) {
+                        if (dictionaryDetail.getExtendField1().equals("0")) {
+                            baseStudent.setIsNormal(0);
+                        } else {
+                            baseStudent.setIsNormal(1);
+                        }
+                    }
+                }
+
                 //如果不等于空则修改
                 if (baseStudent.getId() != null) {
                     baseStudentService.updateById(baseStudent);
@@ -1136,4 +1179,5 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
         }
         return null;
     }
+
 }

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

@@ -8,29 +8,24 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.R;
+import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.system.dto.AddDictionaryDetailDto;
-import com.xjrsoft.module.system.dto.DictionaryDetailListDto;
-import com.xjrsoft.module.system.dto.DictionaryDetailPageDto;
-import com.xjrsoft.module.system.dto.UpdateDictionaryDetailDto;
+import com.xjrsoft.module.student.service.IBaseStudentService;
+import com.xjrsoft.module.system.dto.*;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
+import com.xjrsoft.module.system.entity.DictionaryItem;
 import com.xjrsoft.module.system.service.IDictionarydetailService;
+import com.xjrsoft.module.system.service.IDictionaryitemService;
 import com.xjrsoft.module.system.vo.DictionaryDetailListVo;
 import com.xjrsoft.module.system.vo.DictionaryDetailPageVo;
 import com.xjrsoft.module.system.vo.DictionaryDetailVo;
+import com.xjrsoft.module.teacher.service.ITeacherbaseManagerService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.DeleteMapping;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.PutMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
 import java.util.List;
@@ -50,6 +45,9 @@ import java.util.List;
 public class DictionarydetailController {
 
     private IDictionarydetailService dictionarydetailService;
+    private IDictionaryitemService dictionaryitemService;
+    private ITeacherbaseManagerService teacherbaseManagerService;
+    private IBaseStudentService baseStudentService;
 
     @GetMapping
     @ApiOperation(value = "获取当前数据字典详情(不分页)")
@@ -156,9 +154,27 @@ public class DictionarydetailController {
         if (count > 0) {
             return R.error("字典名称、编码或值已经存在!");
         }
-        DictionaryDetail dictionaryItem = BeanUtil.toBean(dto, DictionaryDetail.class);
+        DictionaryDetail dictionaryDetail = BeanUtil.toBean(dto, DictionaryDetail.class);
+        DictionaryItem dictionaryItem=   dictionaryitemService.getById(dictionaryDetail.getItemId());
+        if(dictionaryItem!=null) {
+            if (dictionaryItem.getCode().equals("job_state")) {
+                Integer isNormal = 1;
+                if (dictionaryDetail.getExtendField1().equals("0")) {
+                    isNormal = 0;
+                }
+                teacherbaseManagerService.changeIsNormal(dictionaryDetail.getCode(), isNormal);
+            }
+
+            if(dictionaryItem.getCode().equals("archives_status")){
+                Integer isNormal = 1;
+                if (dictionaryDetail.getExtendField1().equals("0")) {
+                    isNormal = 0;
+                }
+                baseStudentService.changeIsNormal(dictionaryDetail.getCode(), isNormal);
+            }
+        }
 
-        boolean isSuccess = dictionarydetailService.updateById(dictionaryItem);
+        boolean isSuccess = dictionarydetailService.updateById(dictionaryDetail);
         if (isSuccess) dictionarydetailService.loadCaches();
         return R.ok(isSuccess);
     }
@@ -168,4 +184,15 @@ public class DictionarydetailController {
     public R delete(@RequestBody List<Long> ids) {
         return R.ok(dictionarydetailService.removeBatchByIds(ids));
     }
+
+    @PostMapping(value = "/change-status")
+    @ApiOperation(value="修改状态")
+    public RT<Boolean> changeStatus(@Valid @RequestBody DictionaryDetailChangeStatusDto dto) throws Exception {
+        DictionaryDetail  dictionaryDetail= dictionarydetailService.getById(dto.getId());
+        if(dictionaryDetail!=null){
+            dictionaryDetail.setEnabledMark(dto.getStatus());
+            dictionarydetailService.updateById(dictionaryDetail);
+        }
+        return RT.ok(true);
+    }
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/dto/AddDictionaryDetailDto.java

@@ -42,5 +42,20 @@ public class AddDictionaryDetailDto {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
+
 
 }

+ 13 - 0
src/main/java/com/xjrsoft/module/system/dto/DictionaryDetailChangeStatusDto.java

@@ -0,0 +1,13 @@
+package com.xjrsoft.module.system.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+@Data
+public class DictionaryDetailChangeStatusDto {
+
+    @ApiModelProperty("字典明细")
+    private Long id;
+
+    @ApiModelProperty("启用状态(0:停用 1:启用)")
+    private Integer status;
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/system/dto/UpdateDictionaryDetailDto.java

@@ -42,4 +42,19 @@ public class UpdateDictionaryDetailDto {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
+
 }

+ 14 - 0
src/main/java/com/xjrsoft/module/system/entity/DictionaryDetail.java

@@ -48,4 +48,18 @@ public class DictionaryDetail extends AuditEntity implements Serializable {
     @ApiModelProperty("备注")
     private String remark;
 
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailListVo.java

@@ -35,4 +35,19 @@ public class DictionaryDetailListVo {
 
     @ApiModelProperty("是否有效,0-无效,1-有效")
     private Integer enabledMark;
+
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/system/vo/DictionaryDetailPageVo.java

@@ -31,4 +31,19 @@ public class DictionaryDetailPageVo {
 
     @ApiModelProperty("备注")
     private String remark;
+
+    @ApiModelProperty("扩展1")
+    private String extendField1;
+
+    @ApiModelProperty("扩展2")
+    private String extendField2;
+
+    @ApiModelProperty("扩展3")
+    private String extendField3;
+
+    @ApiModelProperty("扩展4")
+    private String extendField4;
+
+    @ApiModelProperty("扩展5")
+    private String extendField5;
 }

+ 5 - 1
src/main/java/com/xjrsoft/module/teacher/entity/BaseTeacher.java

@@ -199,6 +199,10 @@ public class BaseTeacher implements Serializable {
     */
     @ApiModelProperty("聘用方式(xjr_dictionary_item[employ_type])上级聘用类型")
     private String employWay;
-
+    /**
+     * 是否正常数据(1:是 0:否)
+     */
+    @ApiModelProperty("是否正常数据(1:是 0:否)")
+    private Integer isNormal;
 
 }

+ 2 - 0
src/main/java/com/xjrsoft/module/teacher/service/ITeacherbaseManagerService.java

@@ -41,4 +41,6 @@ public interface ITeacherbaseManagerService extends MPJBaseService<XjrUser> {
     Boolean delete(List<Long> ids);
 
     Boolean importData( List<Map<Integer, Object>> excelDataList);
+
+    void changeIsNormal(String jobState,Integer isNormal);
 }

+ 50 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java

@@ -93,6 +93,7 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
     private final IDictionarydetailService dictionaryService;
     private final IDepartmentService departmentService;
     private final IPostService postService;
+    private IDictionarydetailService dictionarydetailService;
 
 
     @Override
@@ -106,7 +107,26 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
         xjrUser.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
         teacherbaseManagerXjrUserMapper.insert(xjrUser);
         for (BaseTeacher baseTeacher : xjrUser.getBaseTeacherList()) {
+
             baseTeacher.setUserId(xjrUser.getId());
+
+            if (!StrUtil.isNotBlank(baseTeacher.getJobState())) {
+                baseTeacher.setIsNormal(1);
+            } else {
+                DictionaryDetail dictionaryDetail = dictionarydetailService.getOne(Wrappers.<DictionaryDetail>query()
+                        .lambda()
+                        .eq(DictionaryDetail::getCode, baseTeacher.getJobState())
+                        .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='job_state'")
+                );
+                if (dictionaryDetail != null) {
+                    if (dictionaryDetail.getExtendField1().equals("0")) {
+                        baseTeacher.setIsNormal(0);
+                    } else {
+                        baseTeacher.setIsNormal(1);
+                    }
+                }
+            }
+
             teacherbaseManagerBaseTeacherMapper.insert(baseTeacher);
         }
         for (BaseTeacherContact baseTeacherContact : xjrUser.getBaseTeacherContactList()) {
@@ -240,6 +260,24 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
             List<Long> baseTeacherRemoveIds = baseTeacherIds.stream().filter(item -> !baseTeacherOldIds.contains(item)).collect(Collectors.toList());
 
             for (BaseTeacher baseTeacher : xjrUser.getBaseTeacherList()) {
+
+                if (!StrUtil.isNotBlank(baseTeacher.getJobState())) {
+                    baseTeacher.setIsNormal(1);
+                } else {
+                    DictionaryDetail dictionaryDetail = dictionarydetailService.getOne(Wrappers.<DictionaryDetail>query()
+                            .lambda()
+                            .eq(DictionaryDetail::getCode, baseTeacher.getJobState())
+                            .inSql(DictionaryDetail::getItemId,"SELECT id from xjr_dictionary_item where code='job_state'")
+                    );
+                    if (dictionaryDetail != null) {
+                        if (dictionaryDetail.getExtendField1().equals("0")) {
+                            baseTeacher.setIsNormal(0);
+                        } else {
+                            baseTeacher.setIsNormal(1);
+                        }
+                    }
+                }
+
                 //如果不等于空则修改
                 if (baseTeacher.getId() != null) {
                     teacherbaseManagerBaseTeacherMapper.updateById(baseTeacher);
@@ -622,4 +660,16 @@ public class TeacherbaseManagerServiceImpl extends MPJBaseServiceImpl<XjrUserMap
 
         return true;
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public  void changeIsNormal(String jobState,Integer isNormal){
+        List<BaseTeacher> baseTeacherList = teacherbaseManagerBaseTeacherMapper.selectList(Wrappers.lambdaQuery(BaseTeacher.class)
+                .eq(BaseTeacher::getJobState, jobState));
+        for (BaseTeacher baseTeacher : baseTeacherList) {
+            baseTeacher.setIsNormal(isNormal);
+            teacherbaseManagerBaseTeacherMapper.updateById(baseTeacher);
+        }
+
+    }
 }

+ 3 - 2
src/main/resources/mapper/assessment/AssessmentTemplatePlanMapper.xml

@@ -57,12 +57,13 @@
         where a1.delete_mark = 0 and a1.assessment_template_plan_id = t1.id and a2.class_id = t3.class_id and a1.submit_status = 1) as submitted_count,
         (select count(*) from assessment_plan_answer_student a1
         left join base_student_school_roll a2 on a1.student_user_id = a2.user_id
-        where a1.delete_mark = 0 and a1.assessment_template_plan_id = t1.id and a2.class_id = t3.class_id and a1.submit_status = 0) as unsubmitted_count FROM assessment_template_plan t1
+        where a1.delete_mark = 0 and a1.assessment_template_plan_id = t1.id and a2.class_id = t3.class_id and a1.submit_status = 0) as unsubmitted_count,
+        (t4.teacher_id = #{dto.teacherId}) AS is_mine FROM assessment_template_plan t1
         LEFT JOIN assessment_template t2 ON t1.assessment_template_id = t2.id
         LEFT JOIN assessment_plan_answer_class t3 ON t3.assessment_template_plan_id = t1.id
         LEFT JOIN base_class t4 ON t3.class_id = t4.id
         WHERE t1.delete_mark = 0 AND t1.status = 1
-        <if test="dto.teacherId != null">
+        <if test="dto.teacherId != null and dto.isHeadTeacher != null and dto.isHeadTeacher == 1">
             AND t4.teacher_id = #{dto.teacherId}
         </if>
         <if test="dto.name != null and dto.name != ''">

+ 1 - 1
src/main/resources/mapper/outin/TeacherOutInRecordMapper.xml

@@ -10,7 +10,7 @@
             AND #{dto.endTime} >= record_time
         </if>
         <if test="dto.timePeriod == 2">
-            AND record_time between #{dto.startTime} and #{dto.endTime}
+            AND record_time between #{dto.amEndTime} and #{dto.endTime}
         </if>
         <if test="dto.timePeriod == 3">
             AND #{dto.endTime} >= record_time

+ 65 - 0
src/test/java/com/xjrsoft/module/job/StudentDropOutTaskTest.java

@@ -0,0 +1,65 @@
+package com.xjrsoft.module.job;
+
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.common.enums.ArchivesStatusEnum;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.hikvision.util.ApiUtil;
+import com.xjrsoft.module.personnel.entity.StundentFaceProcess;
+import com.xjrsoft.module.personnel.service.IStundentFaceProcessService;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import java.util.List;
+
+/**
+ * @author dzx
+ * @date 2024/12/12
+ */
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class StudentDropOutTaskTest {
+
+    @Autowired
+    private IStundentFaceProcessService stundentFaceProcessService;
+
+    @Test
+    void test(){
+        Long id = 1783747887750492160L;
+        List<StundentFaceProcess> list = stundentFaceProcessService.list(
+                new MPJLambdaWrapper<StundentFaceProcess>()
+                        .select(StundentFaceProcess::getId)
+                        .select(StundentFaceProcess.class, x -> VoToColumnUtil.fieldsToColumns(StundentFaceProcess.class).contains(x.getProperty()))
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, StundentFaceProcess::getUserId)
+                        .ne(BaseStudentSchoolRoll::getArchivesStatus, ArchivesStatusEnum.FB2901)
+                        .isNotNull(StundentFaceProcess::getHikvisionResult)
+                        .eq(StundentFaceProcess::getUserId, id)
+        );
+        JsonParser parser = new JsonParser();
+        for (StundentFaceProcess user : list) {
+            //删除海康人脸
+
+            JsonObject hikvisionResult = parser.parse(user.getHikvisionResult()).getAsJsonObject();
+            if(!hikvisionResult.get("msg").isJsonNull() && !"success".equals(hikvisionResult.get("msg").getAsString())){
+                continue;
+            }
+            String faceId = hikvisionResult.get("data").getAsJsonObject().get("faceId").getAsString();
+            ApiUtil apiUtil = new ApiUtil();
+            String apiPath = "/api/resource/v1/face/single/delete";
+            JsonObject paramJson = new JsonObject();
+            paramJson.addProperty("faceId", faceId);
+            String doPost = apiUtil.doPost(apiPath, paramJson.toString(), null);
+
+            JsonObject resultJson = parser.parse(doPost).getAsJsonObject();
+            if(resultJson.get("code").getAsInt() == 0){
+                stundentFaceProcessService.removeById(user);
+            }
+        }
+    }
+}

+ 31 - 0
src/test/java/com/xjrsoft/module/liteflow/node/WfRoomStayOvernightNodeTest.java

@@ -0,0 +1,31 @@
+package com.xjrsoft.module.liteflow.node;
+
+import com.xjrsoft.XjrSoftApplication;
+import com.xjrsoft.module.room.service.IWfRoomStayOvernightService;
+import org.junit.jupiter.api.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2024/12/12
+ */
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(classes = XjrSoftApplication.class)
+class WfRoomStayOvernightNodeTest {
+
+    @Autowired
+    private IWfRoomStayOvernightService wfRoomStayOvernightService;
+
+    @Test
+    void test(){
+        Long formId = 1867081409462054912L;
+        wfRoomStayOvernightService.noticeParents(formId);
+    }
+
+}