瀏覽代碼

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

大数据与最优化研究所 1 年之前
父節點
當前提交
c73e1be364
共有 52 個文件被更改,包括 1291 次插入99 次删除
  1. 1 1
      src/main/java/com/xjrsoft/module/base/service/impl/BaseClassServiceImpl.java
  2. 80 7
      src/main/java/com/xjrsoft/module/hikvision/controller/EventController.java
  3. 1 1
      src/main/java/com/xjrsoft/module/hikvision/util/ApiUtil.java
  4. 15 15
      src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java
  5. 163 0
      src/main/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTask.java
  6. 7 5
      src/main/java/com/xjrsoft/module/job/InsertOutInRecordTask.java
  7. 48 7
      src/main/java/com/xjrsoft/module/organization/controller/UserController.java
  8. 3 0
      src/main/java/com/xjrsoft/module/organization/entity/UserStudent.java
  9. 36 0
      src/main/java/com/xjrsoft/module/organization/vo/UserStudentInfoVo.java
  10. 3 0
      src/main/java/com/xjrsoft/module/organization/vo/UserStudentVo.java
  11. 2 2
      src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java
  12. 58 26
      src/main/java/com/xjrsoft/module/schedule/util/DataUtil.java
  13. 8 1
      src/main/java/com/xjrsoft/module/student/controller/BaseStudentInfoController.java
  14. 94 5
      src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java
  15. 0 1
      src/main/java/com/xjrsoft/module/student/entity/BaseStudentFamilyMember.java
  16. 15 0
      src/main/java/com/xjrsoft/module/student/service/IBaseStudentFamilyMemberService.java
  17. 5 1
      src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java
  18. 23 0
      src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentFamilyMemberServiceImpl.java
  19. 30 3
      src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java
  20. 3 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentSchoolRollVo.java
  21. 6 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java
  22. 1 0
      src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserVo.java
  23. 7 0
      src/main/java/com/xjrsoft/module/system/controller/LoginController.java
  24. 2 0
      src/main/java/com/xjrsoft/module/system/service/ILoginService.java
  25. 81 1
      src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java
  26. 13 2
      src/main/java/com/xjrsoft/module/teacher/controller/AttendanceRecordController.java
  27. 100 0
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherAwardItemController.java
  28. 0 1
      src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java
  29. 53 0
      src/main/java/com/xjrsoft/module/teacher/dto/AddTeacherAwardItemDto.java
  30. 19 0
      src/main/java/com/xjrsoft/module/teacher/dto/TeacherAwardItemPageDto.java
  31. 24 0
      src/main/java/com/xjrsoft/module/teacher/dto/UpdateTeacherAwardItemDto.java
  32. 105 0
      src/main/java/com/xjrsoft/module/teacher/entity/TeacherAwardItem.java
  33. 1 1
      src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java
  34. 16 0
      src/main/java/com/xjrsoft/module/teacher/mapper/TeacherAwardItemMapper.java
  35. 0 1
      src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java
  36. 0 3
      src/main/java/com/xjrsoft/module/teacher/service/IBaseTeacherService.java
  37. 14 0
      src/main/java/com/xjrsoft/module/teacher/service/ITeacherAwardItemService.java
  38. 0 1
      src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java
  39. 19 0
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherAwardItemServiceImpl.java
  40. 0 1
      src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherbaseManagerServiceImpl.java
  41. 84 0
      src/main/java/com/xjrsoft/module/teacher/vo/TeacherAwardItemPageVo.java
  42. 58 0
      src/main/java/com/xjrsoft/module/teacher/vo/TeacherAwardItemVo.java
  43. 2 2
      src/main/java/com/xjrsoft/module/workflow/utils/WorkFlowUtil.java
  44. 2 1
      src/main/resources/application-dev.yml
  45. 2 1
      src/main/resources/application-pre.yml
  46. 1 0
      src/main/resources/application-prod.yml
  47. 25 2
      src/main/resources/mapper/student/BaseStudentMapper.xml
  48. 0 1
      src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml
  49. 3 3
      src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml
  50. 30 0
      src/test/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTaskTest.java
  51. 3 3
      src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java
  52. 25 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

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

@@ -39,7 +39,7 @@ public class BaseClassServiceImpl extends MPJBaseServiceImpl<BaseClassMapper, Ba
      */
     public List<UserStudentVo> getStudents(long id) {
         List<Long> studentIds = userStudentService.list(Wrappers.lambdaQuery(UserStudent.class)
-                        .eq(UserStudent::getUserId, id))
+                        .eq(UserStudent::getUserId, id).eq(UserStudent::getStatus, 1))
                 .stream().map(UserStudent::getStudentId).collect(Collectors.toList());
         List<UserStudentVo> list = null;
         if (studentIds.size() > 0) {

+ 80 - 7
src/main/java/com/xjrsoft/module/hikvision/util/EventController.java → src/main/java/com/xjrsoft/module/hikvision/controller/EventController.java

@@ -1,12 +1,26 @@
-package com.xjrsoft.module.hikvision.util;
+package com.xjrsoft.module.hikvision.controller;
 
 import cn.hutool.db.Db;
+import com.alibaba.fastjson.JSONObject;
+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.constant.GlobalConstant;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.DatasourceUtil;
 import com.xjrsoft.config.HikvisionConfig;
+import com.xjrsoft.module.base.entity.BaseClass;
+import com.xjrsoft.module.base.service.IBaseClassService;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.hikvision.util.ApiUtil;
+import com.xjrsoft.module.hikvision.util.OutInRecordUtil;
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.entity.UserStudent;
+import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -21,6 +35,8 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.text.ParseException;
+import java.util.List;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/event")
@@ -28,12 +44,15 @@ import java.text.ParseException;
 @AllArgsConstructor
 @Slf4j
 public class EventController {
-    private final Out_In_RecordUtil outInRecordUtil = new Out_In_RecordUtil();
+    private final OutInRecordUtil outInRecordUtil = new OutInRecordUtil();
 
     DataSource datasource = DatasourceUtil.getDataSource(GlobalConstant.DEFAULT_DATASOURCE_KEY);
     private final Db use = Db.use(datasource);
     private final FaceImportMapper faceImportMapper;
     private final HikvisionConfig hikvisionConfig;
+    private final IBaseClassService classService;
+    private final IWeChatService weChatService;
+    private final IXjrUserService xjrUserService;
 
     @PostMapping("/receiveCar")
     @ApiOperation(value = "接收车辆事件")
@@ -57,7 +76,60 @@ public class EventController {
         log.info("Received event data: {}", eventData);
         new Thread(() -> {
             try {
-                outInRecordUtil.GetTeacherAndStudentRecordsTest(use, faceImportMapper, eventData);
+                JsonObject data = new JsonParser().parse(eventData).getAsJsonObject();
+                outInRecordUtil.GetTeacherAndStudentRecordsTest(use, faceImportMapper, data);
+
+                JsonObject paramsObject = data.getAsJsonObject("params");
+                JsonArray eventsArray = paramsObject.getAsJsonArray("events");
+                for (JsonElement eventElement : eventsArray) {
+                    JsonObject eventObject = eventElement.getAsJsonObject();
+                    JsonObject dataObject = eventObject.getAsJsonObject("data");
+
+                    String idNum = null;
+                    if (dataObject.has("ExtEventPersonNo")) {
+                        idNum = dataObject.get("ExtEventPersonNo").getAsString();
+                    }
+                    String happenTime = eventObject.get("happenTime").getAsString();
+                    String recordTimeStr = outInRecordUtil.ChangeTime(happenTime);
+                    int status = eventObject.get("status").getAsInt();
+                    if (idNum == null) continue;
+                    if (!Objects.equals(faceImportMapper.IsStudentTypeByPersonId(Long.valueOf(idNum)), "学生")) {
+                        continue;
+                    }
+
+                    List<XjrUser> userList = xjrUserService.list(
+                        new MPJLambdaWrapper<XjrUser>()
+                        .leftJoin(UserStudent.class, UserStudent::getUserId, XjrUser::getId)
+                        .eq(UserStudent::getStudentId, idNum)
+                    );
+
+                    for (XjrUser member : userList) {
+                        XjrUser student = xjrUserService.getById(idNum);
+                        BaseClass baseClass = classService.getOne(
+                            new MPJLambdaWrapper<BaseClass>()
+                            .leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getClassId, BaseClass::getId)
+                            .eq(BaseStudentSchoolRoll::getUserId, student.getId())
+                        );
+
+                        WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+                        weChatSendMessageDto.setUserId(member.getOpenId());
+                        weChatSendMessageDto.setTemplateId("ERkMebHjsziZO6WBrlzsbENiEuRR4vrlhJw5LR4aDr8");
+                        weChatSendMessageDto.setMsgId(member.getId().toString());
+                        JSONObject paramJson = new JSONObject();
+
+                        paramJson.put("thing1", student.getName());
+                        paramJson.put("time3", recordTimeStr);
+                        paramJson.put("thing2", baseClass.getName());
+                        if(status == 1){
+                            paramJson.put("const4", "进校");
+                        }else{
+                            paramJson.put("const4", "出校");
+                        }
+
+                        weChatSendMessageDto.setContent(paramJson);
+                        weChatService.sendTemplateMessage(weChatSendMessageDto);
+                    }
+                }
             } catch (SQLException | ParseException e) {
                 log.error("Error processing event data", e);
             }
@@ -75,8 +147,9 @@ public class EventController {
         JsonObject paramJson = new JsonObject();
 //*******手动更改****************************************************
 //        eventList.add(196893); //人脸匹配成功
-        eventList.add(771760131); //入场放行事件
-        eventList.add(771760134); //出场放行事件
+//        eventList.add(197151); //人脸匹配失败
+        eventList.add(771760130); //入场放行事件
+        eventList.add(771760133); //出场放行事件
         paramJson.addProperty("eventDest", hikvisionConfig.getCarUrl()); //要修改第二个参数
 //******************************************************************
         paramJson.add("eventTypes", eventList);
@@ -109,8 +182,8 @@ public class EventController {
         JsonArray eventList = new JsonArray();
 //*******手动更改****************************************************
         eventList.add(196893);
-        eventList.add(771760131); //正常过车
-        eventList.add(771760134);
+//        eventList.add(771760131); //正常过车
+//        eventList.add(771760134);
 //******************************************************************
         JsonObject paramJson = new JsonObject();
         paramJson.add("eventTypes", eventList);

+ 1 - 1
src/main/java/com/xjrsoft/module/hikvision/util/ApiUtil.java

@@ -67,7 +67,7 @@ public class ApiUtil {
     }
 
     public static String GetRedirectURL(String uri){
-        if (!uri.isEmpty())
+        if (uri != null && !uri.isEmpty())
             return "https://" + ApiUtil.host + "/" + uri;
         else
             return "";

+ 15 - 15
src/main/java/com/xjrsoft/module/hikvision/util/Out_In_RecordUtil.java → src/main/java/com/xjrsoft/module/hikvision/util/OutInRecordUtil.java

@@ -21,8 +21,8 @@ import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
 
-public class Out_In_RecordUtil {
-    private static final Logger log = LoggerFactory.getLogger(Out_In_RecordUtil.class);
+public class OutInRecordUtil {
+    private static final Logger log = LoggerFactory.getLogger(OutInRecordUtil.class);
 
     private void teacherInsertRecord(Db db, Long userId, String recordTime, String facePhoto, int status, String eventId, String attendanceStatus) throws SQLException {
 
@@ -40,10 +40,10 @@ public class Out_In_RecordUtil {
     }
 
 
-    public void visitInsertRecord(Db db, Long reservation_school_people_id, String recordTime,String facePhoto, int status) throws SQLException {
-        String sql = "INSERT INTO visitor_out_in_record(create_date, reservation_school_people_id, record_time, face_photo, status,delete_mark,enabled_mark) " +
+    public void visitInsertRecord(Db db, Long reservation_school_people_id, String recordTime,String facePhoto, int status, String eventId) throws SQLException {
+        String sql = "INSERT INTO visitor_out_in_record(create_date, reservation_school_people_id, record_time, face_photo, event_id, status,delete_mark,enabled_mark) " +
                 "VALUES(now(), '"  + reservation_school_people_id + "', '" +
-                 recordTime + "', '" + facePhoto + "', '" + status +  "',0,1)";
+                 recordTime + "', '" + facePhoto + "', '" + eventId + "', '" + status +  "',0,1)";
         db.execute(sql);
     }
 
@@ -295,16 +295,16 @@ public class Out_In_RecordUtil {
     }
 
     private void InsertVisitRecords(Db use, JsonArray eventsResponse, JsonArray doorEventsResponse,FaceImportMapper faceImportMapper) throws SQLException, ParseException {
-        List<Long> visit_id_list = faceImportMapper.GetReservationSchoolIdList();
 
         for (JsonElement element : eventsResponse) {
+            List<String> visit_id_list = faceImportMapper.GetReservationSchoolIdList();
             JsonObject item = element.getAsJsonObject();
 
-            String picUri = item.get("visitorPhotoUri").isJsonNull() ? null : ApiUtil.GetRedirectURL(item.get("visitorPhotoUri").getAsString());
+            String picUri = item.get("visitorPhotoUri").isJsonNull() ? "" : ApiUtil.GetRedirectURL(item.get("visitorPhotoUri").getAsString());
             String orderId = item.get("orderId").isJsonNull() ? null : item.get("orderId").getAsString();
             String eventTime = item.get("eventTime").isJsonNull() ? null : ChangeTime(item.get("eventTime").getAsString());
-            //todo: reservationSchoolId
-//            Long reservationSchoolId = faceImportMapper.GetReservationSchoolId(orderId) == null ? 1 : faceImportMapper.GetReservationSchoolId(orderId);
+            String reservationSchoolId = faceImportMapper.GetReservationSchoolId(orderId) == null ? "0" : String.valueOf(faceImportMapper.GetReservationSchoolId(orderId));
+            String eventId = item.get("eventId").isJsonNull() ? null : item.get("eventId").getAsString();
 
             int status = -1;
             for (JsonElement e : doorEventsResponse){
@@ -315,8 +315,9 @@ public class Out_In_RecordUtil {
                 }
             }
 
-            if (visit_id_list.contains(1)) continue;
-            visitInsertRecord(use, Long.parseLong("123"), eventTime, picUri, status);
+            if (visit_id_list.contains(eventId)) continue;
+
+            visitInsertRecord(use, Long.parseLong(reservationSchoolId), eventTime, picUri, status, eventId);
         }
 
     }
@@ -443,21 +444,20 @@ public class Out_In_RecordUtil {
         return apiUtil.doPost(apiPath, String.valueOf(paramJson), null);
     }
 
-    private String ChangeTime(String recordTime) throws ParseException {
+    public String ChangeTime(String recordTime) throws ParseException {
         SimpleDateFormat isoFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
         SimpleDateFormat mysqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date date = isoFormat.parse(recordTime);
         return mysqlFormat.format(date);
     }
 
-    public void GetTeacherAndStudentRecordsTest(Db use, FaceImportMapper faceImportMapper, String data) throws SQLException, ParseException {
+    public void GetTeacherAndStudentRecordsTest(Db use, FaceImportMapper faceImportMapper, JsonObject data) throws SQLException, ParseException {
         try {
             List<String> teacherEventIdList = faceImportMapper.GetTeacherUrlList();
             List<String> studentEventIdList = faceImportMapper.GetStudentUrlList();
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
-            JsonObject jsonObject = new Gson().fromJson(data, JsonObject.class);
-            JsonObject paramsObject = jsonObject.getAsJsonObject("params");
+            JsonObject paramsObject = data.getAsJsonObject("params");
             JsonArray eventsArray = paramsObject.getAsJsonArray("events");
 
             for (JsonElement eventElement : eventsArray) {

+ 163 - 0
src/main/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTask.java

@@ -0,0 +1,163 @@
+package com.xjrsoft.module.job;
+
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xjrsoft.module.attendance.entity.AttendanceRuleDetails;
+import com.xjrsoft.module.attendance.entity.AttendanceUserRelation;
+import com.xjrsoft.module.attendance.mapper.AttendanceUserRelationMapper;
+import com.xjrsoft.module.attendance.service.IAttendanceRuleCategoryService;
+import com.xjrsoft.module.concat.service.IXjrUserService;
+import com.xjrsoft.module.organization.dto.WeChatSendMessageDto;
+import com.xjrsoft.module.organization.service.IWeChatService;
+import com.xjrsoft.module.teacher.entity.XjrUser;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 考勤预警通知
+ * @author dzx
+ * @date 2024年5月21日
+ */
+@Component
+@Slf4j
+public class AttenDanceWarnNoticeTask {
+    @Autowired
+    private IAttendanceRuleCategoryService categoryService;
+
+    @Autowired
+    private IXjrUserService userService;
+
+    @Autowired
+    private AttendanceUserRelationMapper relationMapper;
+
+    @Autowired
+    private IWeChatService weChatService;
+
+    @Scheduled(cron = "0 */10 * * * ?")
+    public void RefreshConnectionPool() {
+        //获取当前时间
+        LocalDateTime now = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        String timeStr = now.format(formatter);
+
+        //查询今天所有的考勤规则
+        List<AttendanceRuleDetails> ruleDetailsList = categoryService.getTodayRules();
+        Map<Long, AttendanceRuleDetails> ruleDetailsMap = new HashMap<>();
+        for (AttendanceRuleDetails ruleDetail : ruleDetailsList) {
+            ruleDetailsMap.put(ruleDetail.getAttendanceRuleCategoryId(), ruleDetail);
+        }
+
+        //查询出所有人的考勤规则
+        List<AttendanceUserRelation> relationList = relationMapper.selectList(
+                new QueryWrapper<AttendanceUserRelation>().lambda()
+                        .eq(AttendanceUserRelation::getDeleteMark, 0)
+        );
+        Map<Long, AttendanceRuleDetails> allTodyRule = new HashMap<>();
+        for (AttendanceUserRelation userRelation : relationList) {
+            allTodyRule.put(userRelation.getUserId(), ruleDetailsMap.get(userRelation.getAttendanceRuleCategoryId()));
+        }
+
+        //判断所有当前时间下,哪几条规则需要进行提醒
+        Map<Long, Integer> ruleDetailsJudgeMap = judgeExecuteNotice(now, ruleDetailsList);
+
+        //查询
+
+        //根据规则中的用户id查询出所有绑定了微信的学生和教师
+        List<XjrUser> userList = getUserList(allTodyRule.keySet());
+        for (XjrUser xjrUser : userList) {
+            AttendanceRuleDetails ruleDetails = allTodyRule.get(xjrUser.getId());
+            Integer status = ruleDetailsJudgeMap.get(ruleDetails.getId());
+            if(status == 0){
+                continue;
+            }
+
+            WeChatSendMessageDto weChatSendMessageDto = new WeChatSendMessageDto();
+            weChatSendMessageDto.setUserId(xjrUser.getOpenId());
+            weChatSendMessageDto.setTemplateId("Fg4AWVQRGernl0PiJQ8gRgCUFHEGZuizlClQNuVhqu4");
+            weChatSendMessageDto.setMsgId(xjrUser.getId().toString());
+            JSONObject paramJson = new JSONObject();
+
+            paramJson.put("thing8", xjrUser.getName());
+            paramJson.put("time9", timeStr);
+            if(status == 1){
+                paramJson.put("const12", "进校");
+            }else{
+                paramJson.put("const12", "出校");
+            }
+
+            weChatSendMessageDto.setContent(paramJson);
+            weChatService.sendTemplateMessage(weChatSendMessageDto);
+        }
+    }
+
+    /**
+     * 判断所有规则,哪些需要发送
+     * @param judgeTime
+     * @param ruleDetailsList
+     * @return 0:不需要提醒,-1:待打卡,1:未打卡
+     */
+    Map<Long, Integer> judgeExecuteNotice(LocalDateTime judgeTime, List<AttendanceRuleDetails> ruleDetailsList){
+        Map<Long, Integer> result = new HashMap<>();
+        for (AttendanceRuleDetails ruleDetails : ruleDetailsList) {
+            if(ruleDetails.getIsAllowInOutSchool() != null && ruleDetails.getIsAllowInOutSchool() != 1
+                    && ruleDetails.getIsAttendance() != null && ruleDetails.getIsAttendance() == 1){
+
+                LocalDateTime amStartTime = judgeTime.with(ruleDetails.getAmStartTime());
+                long amBetween = ChronoUnit.MINUTES.between(judgeTime, amStartTime);
+                if(amBetween == ruleDetails.getAgoMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }else if(amBetween == ruleDetails.getOverMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }
+
+                LocalDateTime pmStartTime = judgeTime.with(ruleDetails.getPmStartTime());
+                long pmBetween = ChronoUnit.MINUTES.between(judgeTime, pmStartTime);
+                if(pmBetween == ruleDetails.getAgoMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }else if(pmBetween == ruleDetails.getOverMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }
+
+                LocalDateTime eveningStartTime = judgeTime.with(ruleDetails.getEveningStartTime());
+                long eveningBetween = ChronoUnit.MINUTES.between(judgeTime, eveningStartTime);
+                if(eveningBetween == ruleDetails.getAgoMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }else if(eveningBetween == ruleDetails.getOverMinutes()){
+                    result.put(ruleDetails.getId(), - 1);
+                }
+                if(!result.containsKey(ruleDetails.getId())){
+                    result.put(ruleDetails.getId(), 0);
+                }
+            }else{
+                result.put(ruleDetails.getId(), 0);
+            }
+
+        }
+        return result;
+    }
+    /**
+     * 查询出所有用户信息(openId不为空的)
+     * @param userIds 需要插叙的userid
+     * @return 用户信息
+     */
+    List<XjrUser> getUserList(Set<Long> userIds){
+        return userService.list(
+            new QueryWrapper<XjrUser>().lambda()
+            .eq(XjrUser::getId, userIds)
+            .isNotNull(XjrUser::getOpenId)
+        );
+    }
+
+
+
+}

+ 7 - 5
src/main/java/com/xjrsoft/module/job/InsertOutInRecordTask.java

@@ -4,7 +4,7 @@ import cn.hutool.db.Db;
 import cn.hutool.extra.spring.SpringUtil;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.utils.DatasourceUtil;
-import com.xjrsoft.module.hikvision.util.Out_In_RecordUtil;
+import com.xjrsoft.module.hikvision.util.OutInRecordUtil;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,9 +23,9 @@ public class InsertOutInRecordTask {
     @Autowired
     private FaceImportMapper faceImportMapper;
 
-    Out_In_RecordUtil out_in_recordUtil = new Out_In_RecordUtil();
+    OutInRecordUtil out_in_recordUtil = new OutInRecordUtil();
 
-    @Scheduled(cron = "0 */15 * * * ?")
+    @Scheduled(cron = "*/15 * * * * ?")
     public void RefreshConnectionPool() {
         String active = SpringUtil.getActiveProfile();
         if(!"prod".equals(active)){
@@ -38,9 +38,11 @@ public class InsertOutInRecordTask {
             Db use = Db.use(datasource);
 
             //教师&学生拉取数据
-            out_in_recordUtil.GetTeacherAndStudentRecords(use, faceImportMapper);
+//            out_in_recordUtil.GetTeacherAndStudentRecords(use, faceImportMapper);
             //拉取车辆数据
-            out_in_recordUtil.GetVehicleRecord(use, faceImportMapper);
+//            out_in_recordUtil.GetVehicleRecord(use, faceImportMapper);
+            //拉取访客数据
+            out_in_recordUtil.GetVisitRecord(use, faceImportMapper);
 
             log.info("数据拉取完成");
         } catch (Exception e) {

+ 48 - 7
src/main/java/com/xjrsoft/module/organization/controller/UserController.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.core.type.TypeReference;
+import com.github.yulichang.toolkit.MPJWrappers;
 import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.DeleteMark;
@@ -29,6 +30,7 @@ import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.TreeUtil;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.config.CommonPropertiesConfig;
+import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -46,13 +48,7 @@ import com.xjrsoft.module.organization.dto.UserPageDto;
 import com.xjrsoft.module.organization.dto.UserStudentAddDto;
 import com.xjrsoft.module.organization.dto.UserStudentBindDto;
 import com.xjrsoft.module.organization.dto.UserStudentDeleteDto;
-import com.xjrsoft.module.organization.entity.Department;
-import com.xjrsoft.module.organization.entity.Post;
-import com.xjrsoft.module.organization.entity.Role;
-import com.xjrsoft.module.organization.entity.User;
-import com.xjrsoft.module.organization.entity.UserDeptRelation;
-import com.xjrsoft.module.organization.entity.UserPostRelation;
-import com.xjrsoft.module.organization.entity.UserRoleRelation;
+import com.xjrsoft.module.organization.entity.*;
 import com.xjrsoft.module.organization.service.IDepartmentService;
 import com.xjrsoft.module.organization.service.IPostService;
 import com.xjrsoft.module.organization.service.IRoleService;
@@ -65,10 +61,13 @@ import com.xjrsoft.module.organization.utils.OrganizationUtil;
 import com.xjrsoft.module.organization.vo.*;
 import com.xjrsoft.module.oss.factory.OssFactory;
 import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
+import com.xjrsoft.module.student.entity.BaseStudentUser;
+import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.system.entity.File;
 import com.xjrsoft.module.system.service.IFileService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
+import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.workflow.constant.WorkflowConstant;
 import com.xjrsoft.module.workflow.entity.WorkflowExtra;
 import com.xjrsoft.module.workflow.mapper.WorkflowExtraMapper;
@@ -140,6 +139,8 @@ public class UserController {
 
     private final HistoryService historyService;
 
+    private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
+
 
     @GetMapping(value = "/list")
     @ApiOperation(value = "用户列表(不分页)")
@@ -687,6 +688,26 @@ public class UserController {
         return R.ok(userStudentService.add(userStudentAddDto));
     }
 
+    @GetMapping(value = "/validate-student")
+    public  RT<UserStudentInfoVo> getValidateStudent(UserStudentBindDto dto) {
+
+        UserStudentInfoVo userStudentInfoVo = baseStudentSchoolRollService.selectJoinOne(UserStudentInfoVo.class,
+                MPJWrappers.<BaseStudentSchoolRoll>lambdaJoin()
+                        .innerJoin(User.class, User::getId, BaseStudentSchoolRoll::getUserId)
+                        .leftJoin(BaseClass.class,BaseClass::getId,BaseStudentSchoolRoll::getClassId)
+                        .eq(User::getName, dto.getName())
+                        .eq(User::getCredentialNumber, dto.getIdCard())
+                        .select(User::getId, User::getName, User::getMobile, User::getCredentialNumber)
+                        .select(BaseClass::getTeacherId)
+
+        );
+        if (userStudentInfoVo == null) {
+            return RT.error("学生不存在!");
+        }
+
+        return RT.ok(userStudentInfoVo);
+    }
+
     @DeleteMapping("/unbind-student")
     @ApiOperation(value = "解绑学生")
     public R unBindStudent(@Valid @RequestBody UserStudentDeleteDto dto) {
@@ -699,6 +720,26 @@ public class UserController {
         return R.ok(baseClassService.getStudents(id));
     }
 
+    @GetMapping("/user-student")
+    @ApiOperation(value = "获取绑定学生")
+    public RT<List<UserStudentVo>> getBindStudent(@Valid @RequestParam Long id) {
+
+        List<UserStudentVo> userStudentVoList = userStudentService.selectJoinList(UserStudentVo.class,
+                MPJWrappers.<UserStudent>lambdaJoin()
+                        .innerJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, UserStudent::getStudentId)
+                        .innerJoin(BaseStudentUser.class, BaseStudentUser::getId, UserStudent::getStudentId)
+                        .leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId)
+                        .select(BaseStudentSchoolRoll::getClassId)
+                        .select(UserStudent::getStudentId,UserStudent::getStatus)
+                        .selectAs(BaseClass::getName, UserStudentVo::getClassName)
+                        .selectAs(BaseStudentUser::getName, UserStudentVo::getStudentName)
+                        .selectAs(BaseStudentUser::getAvatar, UserStudentVo::getAvatar)
+                        .eq(UserStudent::getUserId, id)
+
+        );
+        return RT.ok(userStudentVoList);
+    }
+
     @PostMapping("/upload-sign")
     @ApiOperation(value = "上传签名")
     public RT<Boolean> uploadSign(@Valid @RequestBody UploadSignDto dto) {

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/entity/UserStudent.java

@@ -24,6 +24,9 @@ public class UserStudent implements Serializable {
     @ApiModelProperty("学生ID(xjr_user)")
     private Long studentId;
 
+    @ApiModelProperty("流程状态(0:审核中,1:通过,2:拒绝)")
+    private Integer status;
+
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createDate;
 

+ 36 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserStudentInfoVo.java

@@ -0,0 +1,36 @@
+package com.xjrsoft.module.organization.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UserStudentInfoVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键
+     */
+    @ApiModelProperty("主键")
+    public Long id;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 手机号
+     */
+    @ApiModelProperty("手机号")
+    private String mobile;
+    /**
+     * 身份证
+     */
+    @ApiModelProperty("身份证")
+    private String credentialNumber;
+    /**
+     * 班主任
+     */
+    @ApiModelProperty("班主任")
+    public Long teacherId;
+
+}

+ 3 - 0
src/main/java/com/xjrsoft/module/organization/vo/UserStudentVo.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.organization.vo;
 
 import com.xjrsoft.module.organization.dto.UserStudentUpdateDto;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 @Data
@@ -9,4 +10,6 @@ public class UserStudentVo extends UserStudentUpdateDto {
     private String className;
     private String avatar;
     private Long classId;
+    @ApiModelProperty("流程状态(0:审核中,1:通过,2:拒绝)")
+    private Integer status;
 }

+ 2 - 2
src/main/java/com/xjrsoft/module/personnel/controller/StundentFaceProcessController.java

@@ -211,8 +211,8 @@ public class StundentFaceProcessController {
             ZipEntry entry = entries.nextElement();
             String filename = entry.getName();
             InputStream inputStream = zipFile.getInputStream(entry); //读取文件内容
-
-            String idNumber = filename.substring(0, 18);
+            String[] split = filename.split("\\.");
+            String idNumber = split[0].substring(split[0].length() - 18);
             BaseStudentUser studentUser = studentMap.get(idNumber);
             if(studentUser == null){
                 continue;

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

@@ -23,7 +23,6 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CompletableFuture;
 
 /**
  * @author dzx
@@ -55,7 +54,7 @@ public class DataUtil {
                 long timestamp = System.currentTimeMillis();
                 //生成签名
                 String sign = ScheduleUtil.createSign(timestamp);
-                String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
                 continue;
             }
 
@@ -80,13 +79,11 @@ public class DataUtil {
                 " INNER JOIN base_office_build t2 ON t1.office_build_id = t2.id" +
                 " WHERE t1.delete_mark = 0 AND t2.delete_mark = 0";
         List<ClassroomJianyuekbVo> dataList = db.query(sql, ClassroomJianyuekbVo.class);
-        String url  = ScheduleUtil.apiUrl + "classroom/create";
+
         JsonParser jsonParser = new JsonParser();
         Map<Long, String> idMap = new HashMap<>();
         for (ClassroomJianyuekbVo classroom : dataList) {
-            if(ids != null && ids.get(classroom.getExtendId()) != null){
-                continue;
-            }
+            String url  = ScheduleUtil.apiUrl + "classroom/create";
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("schoolDistrictId", schoolDistrictId);
             paramJson.addProperty("name", classroom.getName());
@@ -95,10 +92,19 @@ public class DataUtil {
             paramJson.addProperty("location", classroom.getLocation());
             paramJson.addProperty("extendId", classroom.getExtendId());
             paramJson.addProperty("floor", classroom.getFloor());
+
             //获取时间戳
             long timestamp = System.currentTimeMillis();
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
+
+            if(ids != null && ids.get(classroom.getExtendId()) != null){
+                url  = ScheduleUtil.apiUrl + "classroom/update";
+                paramJson.addProperty("serialNo", ids.get(classroom.getExtendId()));
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
+
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
             if(result == null){
                 continue;
@@ -120,13 +126,11 @@ public class DataUtil {
                 " AND t1.student_id IS NOT NULL AND t1.student_id != ''" +
                 " AND t3.archives_status = 'FB2901'";
         List<StudentJianyuekbVo> dataList = db.query(sql, StudentJianyuekbVo.class);
-        String url  = ScheduleUtil.apiUrl + "student/create";
+
         JsonParser jsonParser = new JsonParser();
         Map<Long, String> idMap = new HashMap<>();
         for (StudentJianyuekbVo student : dataList) {
-            if(ids != null && ids.get(student.getExtendId()) != null){
-                continue;
-            }
+            String url  = ScheduleUtil.apiUrl + "student/create";
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("registerNo", student.getRegisterNo());
             if("SB10001".equals(student.getGender())){
@@ -143,6 +147,14 @@ public class DataUtil {
             long timestamp = System.currentTimeMillis();
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
+
+            if(ids != null && ids.get(student.getExtendId()) != null){
+                paramJson.addProperty("serialNo", ids.get(student.getExtendId()));
+                url  = ScheduleUtil.apiUrl + "student/update";
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
+
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
             if(result == null){
                 continue;
@@ -166,14 +178,11 @@ public class DataUtil {
                 " inner join " + tableName + " t3 on t1.id = t3.user_id" +
                 " where t1.delete_mark = 0 and t2.role_id = 2";
         List<XjrUser> xjrUsers = db.query(sql, XjrUser.class);
-        String url  = ScheduleUtil.apiUrl + "teacher/create";
         JsonParser jsonParser = new JsonParser();
 
         Map<Long, String> idMap = new HashMap<>();
         for (XjrUser user : xjrUsers) {
-            if(ids != null && ids.get(user.getId()) != null){
-                continue;
-            }
+            String url  = ScheduleUtil.apiUrl + "teacher/create";
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("jobNumber", user.getUserName());
             if("SB10001".equals(user.getGender())){
@@ -189,6 +198,13 @@ public class DataUtil {
             long timestamp = System.currentTimeMillis();
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
+            if(ids != null && ids.get(user.getId()) != null){
+                url  = ScheduleUtil.apiUrl + "teacher/update";
+                paramJson.addProperty("serialNo", ids.get(user.getId()));
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
+
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
             if(result == null){
                 continue;
@@ -206,13 +222,12 @@ public class DataUtil {
     public Map<Long, String> insertCourse(Db db, String tableName, Map<Long, String> ids, Map<Long, String> tagMap) throws Exception {
         String sql = "select * from " + tableName + " where delete_mark = 0";
         List<BaseCourseSubject> list = db.query(sql, BaseCourseSubject.class);
-        String url  = ScheduleUtil.apiUrl + "courseclass/Create";
+
         Map<Long, String> idMap = new HashMap<>();
         JsonParser jsonParser = new JsonParser();
         for (BaseCourseSubject courseSubject : list) {
-            if(ids != null && ids.get(courseSubject.getId()) != null){
-                continue;
-            }
+            String url  = ScheduleUtil.apiUrl + "courseclass/Create";
+
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("name", courseSubject.getName());
             paramJson.addProperty("code", courseSubject.getCode());
@@ -227,6 +242,14 @@ public class DataUtil {
             long timestamp = System.currentTimeMillis();
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
+
+            if(ids != null && ids.get(courseSubject.getId()) != null){
+                url  = ScheduleUtil.apiUrl + "courseclass/update";
+                paramJson.addProperty("id", ids.get(courseSubject.getId()));
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
+
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
             if(result == null){
                 continue;
@@ -246,7 +269,7 @@ public class DataUtil {
     public Map<Long, String> insertSemester(Db db, String tableName, Map<Long, String> ids) throws Exception {
         String sql = "select * from " + tableName + " where delete_mark = 0";
         List<BaseSemester> list = db.query(sql, BaseSemester.class);
-        String url  = ScheduleUtil.apiUrl + "semester/Create";
+
         Map<Long, String> idMap = new HashMap<>();
         JsonParser jsonParser = new JsonParser();
         SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy");
@@ -255,9 +278,7 @@ public class DataUtil {
         String autumn = "秋";
 
         for (BaseSemester semester : list) {
-            if(ids != null && ids.get(semester.getId()) != null){
-                continue;
-            }
+            String url  = ScheduleUtil.apiUrl + "semester/Create";
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("schoolYear", Integer.parseInt(sdfYear.format(semester.getStartDate())));
             Integer period = null;
@@ -282,6 +303,12 @@ public class DataUtil {
             }else{
                 paramJson.addProperty("isCurrent", Boolean.FALSE);
             }
+            if(ids != null && ids.get(semester.getId()) != null){
+                url  = ScheduleUtil.apiUrl + "semester/update";
+                paramJson.addProperty("serialNo", ids.get(semester.getId()));
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
 
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
 
@@ -335,13 +362,11 @@ public class DataUtil {
     public Map<Long, String> insertGrade(Db db, String tableName, String schoolDistrictId, Map<Long, String> ids) throws Exception {
         String sql = "select * from " + tableName + " where delete_mark = 0 and status = 1";
         List<BaseGrade> list = db.query(sql, BaseGrade.class);
-        String url = ScheduleUtil.apiUrl + "eduyear/create";
+
         JsonParser jsonParser = new JsonParser();
         Map<Long, String> idMap = new HashMap<>();
         for (BaseGrade baseGrade : list) {
-            if(ids !=null && ids.get(baseGrade.getId()) != null){
-                continue;
-            }
+            String url = ScheduleUtil.apiUrl + "eduyear/create";
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("schoolDistrictId", schoolDistrictId);
             paramJson.addProperty("period", 4);
@@ -354,6 +379,13 @@ public class DataUtil {
             //生成签名
             String sign = ScheduleUtil.createSign(timestamp);
 
+            if(ids !=null && ids.get(baseGrade.getId()) != null){
+                paramJson.addProperty("serialNo", ids.get(baseGrade.getId()));
+                url = ScheduleUtil.apiUrl + "eduyear/update";
+                ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
+                continue;
+            }
+
             String result = ScheduleUtil.doPost(url, paramJson.toString(), sign, timestamp);
 
             JsonObject resultJson = jsonParser.parse(result).getAsJsonObject();

+ 8 - 1
src/main/java/com/xjrsoft/module/student/controller/BaseStudentInfoController.java

@@ -9,10 +9,13 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.module.student.dto.BaseStudentInfoDetailDto;
 import com.xjrsoft.module.student.dto.BaseStudentInfoPageDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentInfoDto;
+import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.service.IBaseStudentSchoolRollService;
+import com.xjrsoft.module.student.service.IStudentManagerService;
 import com.xjrsoft.module.student.vo.BaseStudentInfoDetailVo;
 import com.xjrsoft.module.student.vo.BaseStudentInfoPageDataVo;
 import com.xjrsoft.module.student.vo.BaseStudentInfoPageVo;
+import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.MobileClassStatisticsVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -38,7 +41,7 @@ import javax.validation.Valid;
 @AllArgsConstructor
 public class BaseStudentInfoController {
 
-
+    private final IStudentManagerService studentManagerService;
     private final IBaseStudentSchoolRollService baseStudentSchoolRollService;
 
     @GetMapping(value = "/mobile-page")
@@ -46,6 +49,10 @@ public class BaseStudentInfoController {
     @SaCheckPermission("basestudentpost:detail")
     public RT<PageOutput<BaseStudentInfoPageVo>> mobilePage(@Valid BaseStudentInfoPageDto dto){
         Page<BaseStudentInfoPageVo> mobilePage = baseStudentSchoolRollService.getMobilePage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        for (BaseStudentInfoPageVo record : mobilePage.getRecords()) {
+            BaseStudentUser user = studentManagerService.getById(record.getId());
+            record.setAvatar(user.getAvatar());
+        }
         PageOutput<BaseStudentInfoPageVo> pageOutput = ConventPage.getPageOutput(mobilePage, BaseStudentInfoPageVo.class);
         return RT.ok(pageOutput);
     }

+ 94 - 5
src/main/java/com/xjrsoft/module/student/controller/StudentManagerController.java

@@ -10,13 +10,17 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.StringPool;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.enums.DeleteMark;
 import com.xjrsoft.common.enums.GenderDictionaryEnum;
+import com.xjrsoft.common.exception.MyException;
 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.FileZipUtil;
 import com.xjrsoft.common.utils.TreeUtil;
+import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseGrade;
 import com.xjrsoft.module.base.service.IBaseClassService;
@@ -28,6 +32,7 @@ import com.xjrsoft.module.room.service.IRoomBedService;
 import com.xjrsoft.module.student.dto.AddBaseStudentUserDto;
 import com.xjrsoft.module.student.dto.BaseStudentUserPageDto;
 import com.xjrsoft.module.student.dto.UpdateBaseStudentUserDto;
+import com.xjrsoft.module.student.entity.BaseStudent;
 import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.service.IStudentManagerService;
 import com.xjrsoft.module.student.vo.BaseStudentSchoolRollVo;
@@ -38,6 +43,7 @@ import com.xjrsoft.module.teacher.entity.XjrUser;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -49,14 +55,22 @@ import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.validation.Valid;
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Base64;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 
 @RestController
 @RequestMapping("/student" + "/studentmanager")
@@ -76,6 +90,10 @@ public class StudentManagerController {
     public R page(@Valid BaseStudentUserPageDto dto) {
 
         IPage<BaseStudentUserPageVo> page = studentManagerService.getStudentPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
+        for (BaseStudentUserPageVo record : page.getRecords()) {
+            BaseStudentUser user = studentManagerService.getById(record.getId());
+            record.setAvatar(user.getAvatar());
+        }
         PageOutput<BaseStudentUserPageVo> pageOutput = ConventPage.getPageOutput(page, BaseStudentUserPageVo.class);
         return R.ok(pageOutput);
     }
@@ -169,6 +187,7 @@ public class StudentManagerController {
         userVo.setDepartmentIds(allDeptIdStr);
 
         userVo.setGenderCn(GenderDictionaryEnum.getValue(userVo.getGender()));
+
         return R.ok(userVo);
     }
 
@@ -176,18 +195,22 @@ public class StudentManagerController {
     @PostMapping
     @ApiOperation(value = "新增学生")
     @SaCheckPermission("studentmanager:add")
-    public R add(@Valid @RequestBody AddBaseStudentUserDto dto) {
+    public R add(@Valid @RequestBody AddBaseStudentUserDto dto){
         return R.ok(studentManagerService.add(dto));
     }
 
+    @PostMapping("upload-image")
+    @ApiOperation(value = "上传学生学籍照片")
+    @SaCheckPermission("studentmanager:add")
+    public R uploadImage(@RequestParam("file") MultipartFile file, @Valid @RequestParam Long userId) throws IOException {
+        return R.ok(studentManagerService.uploadImage(userId, file));
+    }
+
     @PutMapping
     @ApiOperation(value = "修改学生")
     @SaCheckPermission("studentmanager:edit")
-    public R update(@Valid @RequestBody UpdateBaseStudentUserDto dto) {
-
-
+    public R update(@Valid @RequestBody UpdateBaseStudentUserDto dto){
         return R.ok(studentManagerService.update(dto));
-
     }
 
     @DeleteMapping
@@ -212,4 +235,70 @@ public class StudentManagerController {
 
         return RT.ok(studentManagerService.importStudentData(excelDataList));
     }
+
+
+    @PostMapping(value = "/avatar-import")
+    @ApiOperation(value = "批量导入学生学学籍照")
+    @SaCheckPermission("stundentfaceprocess:batch-upload")
+    public RT<Boolean> batchUpload(@RequestParam("file") MultipartFile file) throws Exception {
+        List<BaseStudentUser> list = studentManagerService.list(
+                new MPJLambdaWrapper<BaseStudentUser>().distinct()
+                        .select(BaseStudentUser::getId)
+                        .select(BaseStudentUser.class, x -> VoToColumnUtil.fieldsToColumns(BaseStudentUser.class).contains(x.getProperty()))
+                        .leftJoin(BaseStudent.class, BaseStudent::getUserId, BaseStudentUser::getId)
+                        .eq(BaseStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseStudentUser::getDeleteMark, DeleteMark.NODELETE.getCode())
+        );
+        Map<String, BaseStudentUser> studentMap = new HashMap<>();
+        for (BaseStudentUser baseStudentUser : list) {
+            studentMap.put(baseStudentUser.getCredentialNumber(), baseStudentUser);
+        }
+
+        ZipFile zipFile = FileZipUtil.convertToZipFile(file);
+        Enumeration<? extends ZipEntry> entries = zipFile.entries();
+
+
+        Map<String, String> map = new HashMap<String, String>() {
+            {
+                put("jpg", "data:image/jpg;base64,");
+                put("jpeg", "data:image/jpeg;base64,");
+                put("png", "data:image/png;base64,");
+            }
+        };
+        String[] imgSuffix = new String[]{"png", "jpg", "jpeg"};
+        while (entries.hasMoreElements()){
+            ZipEntry entry = entries.nextElement();
+            String filename = entry.getName();
+            InputStream inputStream = zipFile.getInputStream(entry); //读取文件内容
+            String[] split = filename.split("\\.");
+            String idNumber = split[0].substring(split[0].length() - 18);
+            String suffix = StringUtils.substringAfterLast(filename, StringPool.DOT);
+
+
+            BaseStudentUser studentUser = studentMap.get(idNumber);
+            if(studentUser == null){
+                continue;
+            }
+            if (!Arrays.asList(imgSuffix).contains(suffix)) {
+                throw new MyException("图片格式不正确!");
+            }
+            //将照片转换成base64
+            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+            byte[] buffer = new byte[4096];
+            int bytesRead;
+            while ((bytesRead = inputStream.read(buffer)) != -1) {
+                outputStream.write(buffer, 0, bytesRead);
+            }
+            byte[] imageBytes = outputStream.toByteArray();
+            String base64String = map.get(suffix) + Base64.getEncoder().encodeToString(imageBytes);
+            inputStream.close();
+            outputStream.close();
+
+            studentUser.setAvatar(base64String);
+
+            studentManagerService.updateById(studentUser);
+
+        }
+        return RT.ok(true);
+    }
 }

+ 0 - 1
src/main/java/com/xjrsoft/module/student/entity/BaseStudentFamilyMember.java

@@ -178,5 +178,4 @@ public class BaseStudentFamilyMember implements Serializable {
     @ApiModelProperty("微信号")
     private String wechat;
 
-
 }

+ 15 - 0
src/main/java/com/xjrsoft/module/student/service/IBaseStudentFamilyMemberService.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.student.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
+
+/**
+* @title: 学生家长
+* @Author dzx
+* @Date: 2024年6月4日
+* @Version 1.0
+*/
+
+public interface IBaseStudentFamilyMemberService extends MPJBaseService<BaseStudentFamilyMember> {
+
+}

+ 5 - 1
src/main/java/com/xjrsoft/module/student/service/IStudentManagerService.java

@@ -9,7 +9,9 @@ import com.xjrsoft.module.student.entity.BaseStudentUser;
 import com.xjrsoft.module.student.vo.BaseStudentClassVo;
 import com.xjrsoft.module.student.vo.BaseStudentUserPageVo;
 import com.xjrsoft.module.student.vo.PersonalPortraitPersonalInfoVo;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.text.ParseException;
 import java.util.List;
 import java.util.Map;
@@ -22,7 +24,7 @@ public interface IStudentManagerService extends MPJBaseService<BaseStudentUser>
      * @param baseStudentUser
      * @return
      */
-    Boolean add(AddBaseStudentUserDto baseStudentUser);
+    Long add(AddBaseStudentUserDto baseStudentUser);
 
     /**
      * 更新
@@ -59,4 +61,6 @@ public interface IStudentManagerService extends MPJBaseService<BaseStudentUser>
 
 
     Page<BaseStudentUserPageVo> getStudentPage(Page<BaseStudentUserPageVo> page, BaseStudentUserPageDto dto);
+
+    Boolean uploadImage(Long userId, MultipartFile file) throws IOException;
 }

+ 23 - 0
src/main/java/com/xjrsoft/module/student/service/impl/BaseStudentFamilyMemberServiceImpl.java

@@ -0,0 +1,23 @@
+package com.xjrsoft.module.student.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.student.entity.BaseStudentFamily;
+import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
+import com.xjrsoft.module.student.mapper.BaseStudentFamilyMapper;
+import com.xjrsoft.module.student.mapper.BaseStudentFamilyMemberMapper;
+import com.xjrsoft.module.student.service.IBaseStudentFamilyMemberService;
+import com.xjrsoft.module.student.service.IBaseStudentFamilyService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+ * @title: 学生家长
+ * @Author dzx
+ * @Date: 2024年6月4日
+ * @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class BaseStudentFamilyMemberServiceImpl extends MPJBaseServiceImpl<BaseStudentFamilyMemberMapper, BaseStudentFamilyMember> implements IBaseStudentFamilyMemberService {
+
+}

+ 30 - 3
src/main/java/com/xjrsoft/module/student/service/impl/StudentManagerServiceImpl.java

@@ -65,10 +65,13 @@ import com.xjrsoft.module.system.mapper.DictionarydetailMapper;
 import com.xjrsoft.module.system.mapper.DictionaryitemMapper;
 import com.xjrsoft.module.system.service.IAreaService;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
@@ -109,10 +112,11 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean add(AddBaseStudentUserDto dto) {
+    public Long add(AddBaseStudentUserDto dto){
 
         BaseStudentUser baseStudentUser = BeanUtil.toBean(dto, BaseStudentUser.class);
         baseStudentUser.setCode(dto.getUserName());
+
         // 用户身份证后6位作为默认密码
         baseStudentUser.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
         studentbaseManagerBaseStudentUserMapper.insert(baseStudentUser);
@@ -172,15 +176,16 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
             List<UserRoleRelation> userRoleRelationList = userRoleRelationMapper.selectList(Wrappers.lambdaQuery(UserRoleRelation.class));
             redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
         });
-        return true;
+        return baseStudentUser.getId();
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Boolean update(UpdateBaseStudentUserDto dto) {
+    public Boolean update(UpdateBaseStudentUserDto dto){
 
         BaseStudentUser baseStudentUser = BeanUtil.toBean(dto, BaseStudentUser.class);
         baseStudentUser.setCode(dto.getUserName());
+
         studentbaseManagerBaseStudentUserMapper.updateById(baseStudentUser);
 
         //先删除再新增
@@ -955,6 +960,28 @@ public class StudentManagerServiceImpl extends MPJBaseServiceImpl<BaseStudentUse
         return baseStudentMapper.getStudentPage(page, dto);
     }
 
+    @Override
+    public Boolean uploadImage(Long userId, MultipartFile file) throws IOException {
+        BaseStudentUser studentUser = studentbaseManagerBaseStudentUserMapper.selectById(userId);
+        String[] imgSuffix = new String[]{"png", "jpg", "jpeg"};
+        String suffix = StringUtils.substringAfterLast(file.getOriginalFilename(), StringPool.DOT);
+        if (!Arrays.asList(imgSuffix).contains(suffix)) {
+            throw new MyException("图片格式不正确!");
+        }
+        String base64String = Base64.getEncoder().encodeToString(file.getBytes());
+
+        Map<String, String> map = new HashMap<String, String>() {
+            {
+                put("jpg", "data:image/jpg;base64,");
+                put("jpeg", "data:image/jpeg;base64,");
+                put("png", "data:image/png;base64,");
+            }
+        };
+        studentUser.setAvatar(map.get(suffix) + base64String);
+        studentbaseManagerBaseStudentUserMapper.updateById(studentUser);
+        return true;
+    }
+
     /**
      * 初始化字典信息
      * 身份证类型、

+ 3 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentSchoolRollVo.java

@@ -151,4 +151,7 @@ public class BaseStudentSchoolRollVo {
     @ApiModelProperty("寝室号")
     private String roomName;
 
+
+
+
 }

+ 6 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserPageVo.java

@@ -35,4 +35,10 @@ public class BaseStudentUserPageVo {
 
     @ApiModelProperty("学生类别")
     private String studentTypeCn;
+
+    @ApiModelProperty("头像照片")
+    private String avatar;
+
+    @ApiModelProperty("学习形式")
+    private String learnStatusCn;
 }

+ 1 - 0
src/main/java/com/xjrsoft/module/student/vo/BaseStudentUserVo.java

@@ -128,4 +128,5 @@ public class BaseStudentUserVo {
 
     @ApiModelProperty("部门id")
     private String departmentIds;
+
 }

+ 7 - 0
src/main/java/com/xjrsoft/module/system/controller/LoginController.java

@@ -88,6 +88,13 @@ public class LoginController {
         return R.ok(loginService.login(dto));
     }
 
+    @PostMapping("/findUserByCode")
+    @ApiOperation(value = "登录", notes = "code")
+    @XjrLog(value = "Code登录成功")
+    public R findUserByCode(@RequestBody @Valid LoginByCodeDto dto) throws Exception {
+        return R.ok(loginService.findUserByCode(dto));
+    }
+
     @PostMapping("/loginByCode")
     @ApiOperation(value = "登录", notes = "code")
     @XjrLog(value = "Code登录成功")

+ 2 - 0
src/main/java/com/xjrsoft/module/system/service/ILoginService.java

@@ -35,4 +35,6 @@ public interface ILoginService {
      * @throws Exception
      */
     Boolean loginQRCode(LoginQRCodeDto dto) throws Exception;
+
+    LoginVo findUserByCode(LoginByCodeDto dto) throws Exception;
 }

+ 81 - 1
src/main/java/com/xjrsoft/module/system/service/impl/LoginServiceImpl.java

@@ -16,11 +16,11 @@ import com.xjrsoft.common.constant.GlobalConstant;
 import com.xjrsoft.common.enums.EnabledMark;
 import com.xjrsoft.common.enums.RoleEnum;
 import com.xjrsoft.common.exception.MyException;
-import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.utils.FixedArithmeticCaptcha;
 import com.xjrsoft.common.utils.RSAUtil;
 import com.xjrsoft.common.utils.RedisUtil;
 import com.xjrsoft.common.utils.WeChatUtil;
+import com.xjrsoft.config.CommonPropertiesConfig;
 import com.xjrsoft.config.LicenseConfig;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.Post;
@@ -52,6 +52,7 @@ import org.springframework.stereotype.Service;
 
 import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**
@@ -82,6 +83,8 @@ public class LoginServiceImpl implements ILoginService {
 
     private final IFileService fileService;
 
+    private final CommonPropertiesConfig propertiesConfig;
+
     @Override
     public LoginVo login(LoginDto dto) throws Exception {
         if (licenseConfig.getEnabled()) {
@@ -227,6 +230,83 @@ public class LoginServiceImpl implements ILoginService {
         return Boolean.TRUE;
     }
 
+    @Override
+    public LoginVo findUserByCode(LoginByCodeDto dto) throws Exception {
+        WeChatUserInfo weChatUserInfo;
+        if (dto.getType() == 0) {
+            weChatUserInfo = weChatUtil.getMpOpenid(dto.getCode());
+        }else{
+            weChatUserInfo = weChatUtil.getOpenid(dto.getCode());
+        }
+        LoginByCodeVo result = new LoginByCodeVo(){{
+            setOpenId(weChatUserInfo.getOpenid());
+            setUnionId(weChatUserInfo.getUnionid());
+        }};
+        if (weChatUserInfo == null) throw new MyException("code无效");
+
+        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(User::getOpenId, weChatUserInfo.getOpenid());
+
+        User loginUser = userService.getOne(queryWrapper);
+        if (loginUser == null) {//如果未找到用户,需要创建一个游客账号
+            User user = new User();
+            user.setUnionId(weChatUserInfo.getOpenid());
+            user.setOpenId(weChatUserInfo.getOpenid());
+            user.setName("游客");
+            user.setUserName(getUserName());
+            user.setCode(getUserName());
+            //密码加密加盐存储到数据库
+            user.setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
+            userService.save(user);
+            //给用户增加游客角色
+            UserRoleRelation userRoleRelation = new UserRoleRelation();
+            userRoleRelation.setUserId(user.getId());
+            userRoleRelation.setRoleId(5L);
+            userRoleRelationMapper.insert(userRoleRelation);
+
+            //给用户增加部门
+            UserDeptRelation userDeptRelation = new UserDeptRelation();
+            userDeptRelation.setUserId(user.getId());
+            userDeptRelation.setDeptId(1684107782861680000L);
+            userDeptRelationService.save(userDeptRelation);
+
+            CompletableFuture.runAsync(() -> {
+                List<User> list = userService.list();
+                redisUtil.set(GlobalConstant.USER_CACHE_KEY, list);
+
+                List<UserDeptRelation> deptRelationList = userDeptRelationService.list(Wrappers.lambdaQuery(UserDeptRelation.class));
+                redisUtil.set(GlobalConstant.USER_DEPT_RELATION_CACHE_KEY, deptRelationList);
+
+                List<UserRoleRelation> roleRelationList = userRoleRelationMapper.selectList(Wrappers.lambdaQuery(UserRoleRelation.class));
+                redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, roleRelationList);
+            });
+            loginUser = user;
+        }
+        LoginVo loginVo = getLoginInfo(loginUser, "WX-MP");
+        result.setToken(loginVo.getToken());
+        result.setUserType(loginVo.getUserType());
+
+        return result;
+    }
+
+    private String getUserName(){
+        StringBuilder sb = new StringBuilder();
+        String temp = "0123456789abcdefghjkmnpqrstuvwxyz";
+
+        for(int i=0; i < 6; i++){
+            int intVal = (int)(Math.random() * temp.length());
+            sb.append(temp.charAt(intVal));
+        }
+        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(User::getUserName,sb.toString());
+        long count = userService.count(queryWrapper);
+        if(count > 0){
+            return getUserName();
+        }
+
+        return sb.toString();
+    }
+
     private LoginVo getLoginInfo(User loginUser, String loginType) throws Exception {
         LoginVo result = new LoginVo();
         if (loginUser.getEnabledMark() == EnabledMark.DISABLED.getCode()) {

+ 13 - 2
src/main/java/com/xjrsoft/module/teacher/controller/AttendanceRecordController.java

@@ -13,7 +13,11 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
-import com.xjrsoft.module.teacher.dto.*;
+import com.xjrsoft.module.teacher.dto.AddAttendanceRecordDto;
+import com.xjrsoft.module.teacher.dto.AttendanceRecordPageDto;
+import com.xjrsoft.module.teacher.dto.ClockInDto;
+import com.xjrsoft.module.teacher.dto.GetCheckInDayDto;
+import com.xjrsoft.module.teacher.dto.UpdateAttendanceRecordDto;
 import com.xjrsoft.module.teacher.entity.AttendanceRecord;
 import com.xjrsoft.module.teacher.entity.XjrUser;
 import com.xjrsoft.module.teacher.service.IAttendanceRecordService;
@@ -24,7 +28,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
+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 javax.validation.Valid;
 import java.io.ByteArrayOutputStream;

+ 100 - 0
src/main/java/com/xjrsoft/module/teacher/controller/TeacherAwardItemController.java

@@ -0,0 +1,100 @@
+package com.xjrsoft.module.teacher.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.TreeUtil;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.teacher.dto.AddTeacherAwardItemDto;
+import com.xjrsoft.module.teacher.dto.TeacherAwardItemPageDto;
+import com.xjrsoft.module.teacher.dto.UpdateTeacherAwardItemDto;
+import com.xjrsoft.module.teacher.entity.TeacherAwardItem;
+import com.xjrsoft.module.teacher.service.ITeacherAwardItemService;
+import com.xjrsoft.module.teacher.vo.TeacherAwardItemPageVo;
+import com.xjrsoft.module.teacher.vo.TeacherAwardItemVo;
+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 javax.validation.Valid;
+import java.util.List;
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/teacher" + "/teacherAwardItem")
+@Api(value = "/teacher"  + "/teacherAwardItem",tags = "教师奖项代码")
+@AllArgsConstructor
+public class TeacherAwardItemController {
+
+
+    private final ITeacherAwardItemService teacherAwardItemService;
+
+    @GetMapping(value = "/tree-list")
+    @ApiOperation(value="教师奖项列表(树)")
+    @SaCheckPermission("teacherawarditem:detail")
+    public RT<List<TeacherAwardItemVo>> page(@Valid TeacherAwardItemPageDto dto){
+
+        LambdaQueryWrapper<TeacherAwardItem> queryWrapper = new LambdaQueryWrapper<>();
+
+        queryWrapper
+                    .orderByDesc(TeacherAwardItem::getId)
+                .select(TeacherAwardItem.class,x -> VoToColumnUtil.fieldsToColumns(TeacherAwardItemPageVo.class).contains(x.getProperty()));
+        List<TeacherAwardItem> list = teacherAwardItemService.list(queryWrapper);
+        List<TeacherAwardItemVo> itemVos = BeanUtil.copyToList(list, TeacherAwardItemVo.class);
+        List<TeacherAwardItemVo> build = TreeUtil.build(itemVos);
+        return RT.ok(build);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询教师奖项信息")
+    @SaCheckPermission("teacherawarditem:detail")
+    public RT<TeacherAwardItemVo> info(@RequestParam Long id){
+        TeacherAwardItem teacherAwardItem = teacherAwardItemService.getById(id);
+        if (teacherAwardItem == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(teacherAwardItem, TeacherAwardItemVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增教师奖项")
+    @SaCheckPermission("teacherawarditem:add")
+    public RT<Boolean> add(@Valid @RequestBody AddTeacherAwardItemDto dto){
+        TeacherAwardItem teacherAwardItem = BeanUtil.toBean(dto, TeacherAwardItem.class);
+        boolean isSuccess = teacherAwardItemService.save(teacherAwardItem);
+        return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改教师奖项")
+    @SaCheckPermission("teacherawarditem:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateTeacherAwardItemDto dto){
+
+        TeacherAwardItem teacherAwardItem = BeanUtil.toBean(dto, TeacherAwardItem.class);
+        return RT.ok(teacherAwardItemService.updateById(teacherAwardItem));
+
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除教师奖项")
+    @SaCheckPermission("teacherawarditem:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(teacherAwardItemService.removeBatchByIds(ids));
+    }
+
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/teacher/controller/TeacherbaseManagerController.java

@@ -14,7 +14,6 @@ import com.xjrsoft.common.model.result.R;
 import com.xjrsoft.common.page.ConventPage;
 import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
-import com.xjrsoft.module.attendance.entity.StudentAttendanceRecord;
 import com.xjrsoft.module.organization.entity.UserDeptRelation;
 import com.xjrsoft.module.organization.service.IUserDeptRelationService;
 import com.xjrsoft.module.system.entity.DictionaryDetail;

+ 53 - 0
src/main/java/com/xjrsoft/module/teacher/dto/AddTeacherAwardItemDto.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+public class AddTeacherAwardItemDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 奖项名称
+    */
+    @ApiModelProperty("奖项名称")
+    private String name;
+    /**
+    * 是否论文(1:是 0:否)
+    */
+    @ApiModelProperty("是否论文(1:是 0:否)")
+    private Integer isThesis;
+    /**
+    * 是否频分标准(1:是 0:否)
+    */
+    @ApiModelProperty("是否频分标准(1:是 0:否)")
+    private Integer isStandard;
+    /**
+    * 分数
+    */
+    @ApiModelProperty("分数")
+    private BigDecimal score;
+    /**
+    * 父级id
+    */
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+}

+ 19 - 0
src/main/java/com/xjrsoft/module/teacher/dto/TeacherAwardItemPageDto.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.teacher.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 教师奖项分页查询入参
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class TeacherAwardItemPageDto extends PageInput {
+
+
+}

+ 24 - 0
src/main/java/com/xjrsoft/module/teacher/dto/UpdateTeacherAwardItemDto.java

@@ -0,0 +1,24 @@
+package com.xjrsoft.module.teacher.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+public class UpdateTeacherAwardItemDto extends AddTeacherAwardItemDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 105 - 0
src/main/java/com/xjrsoft/module/teacher/entity/TeacherAwardItem.java

@@ -0,0 +1,105 @@
+package com.xjrsoft.module.teacher.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+@TableName("teacher_award_item")
+@ApiModel(value = "teacher_award_item", description = "教师奖项")
+public class TeacherAwardItem implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableId
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.UPDATE)
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    @TableLogic
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    @TableField(fill = FieldFill.INSERT)
+    private Integer enabledMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 奖项名称
+    */
+    @ApiModelProperty("奖项名称")
+    private String name;
+    /**
+    * 是否论文(1:是 0:否)
+    */
+    @ApiModelProperty("是否论文(1:是 0:否)")
+    private Integer isThesis;
+    /**
+    * 是否频分标准(1:是 0:否)
+    */
+    @ApiModelProperty("是否频分标准(1:是 0:否)")
+    private Integer isStandard;
+    /**
+    * 分数
+    */
+    @ApiModelProperty("分数")
+    private BigDecimal score;
+    /**
+    * 父级id
+    */
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+
+}

+ 1 - 1
src/main/java/com/xjrsoft/module/teacher/mapper/FaceImportMapper.java

@@ -23,7 +23,7 @@ public interface FaceImportMapper {
     List<String> GetStudentUrlList();
     List<String> GetTeacherUrlList();
 
-    List<Long> GetReservationSchoolIdList();
+    List<String> GetReservationSchoolIdList();
     Long GetReservationSchoolId(@Param("id") String id);
 
     String GetCarMessageApplyIdByCarNumber(@Param("id") String id);

+ 16 - 0
src/main/java/com/xjrsoft/module/teacher/mapper/TeacherAwardItemMapper.java

@@ -0,0 +1,16 @@
+package com.xjrsoft.module.teacher.mapper;
+
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.teacher.entity.TeacherAwardItem;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Mapper
+public interface TeacherAwardItemMapper extends MPJBaseMapper<TeacherAwardItem> {
+
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/teacher/mapper/WfTeacherleaveMapper.java

@@ -7,7 +7,6 @@ import org.apache.ibatis.annotations.Param;
 
 import java.time.LocalDateTime;
 import java.util.List;
-import java.util.Map;
 
 /**
 * @title: 教职工请假流程

+ 0 - 3
src/main/java/com/xjrsoft/module/teacher/service/IBaseTeacherService.java

@@ -2,9 +2,6 @@ package com.xjrsoft.module.teacher.service;
 
 import com.github.yulichang.base.MPJBaseService;
 import com.xjrsoft.module.teacher.entity.BaseTeacher;
-import com.xjrsoft.module.teacher.entity.XjrUser;
-
-import java.util.List;
 
 /**
 * @title: service

+ 14 - 0
src/main/java/com/xjrsoft/module/teacher/service/ITeacherAwardItemService.java

@@ -0,0 +1,14 @@
+package com.xjrsoft.module.teacher.service;
+
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.teacher.entity.TeacherAwardItem;
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+
+public interface ITeacherAwardItemService extends MPJBaseService<TeacherAwardItem> {
+}

+ 0 - 1
src/main/java/com/xjrsoft/module/teacher/service/IWfTeacherleaveService.java

@@ -1,7 +1,6 @@
 package com.xjrsoft.module.teacher.service;
 
 import com.github.yulichang.base.MPJBaseService;
-import com.xjrsoft.module.personnel.entity.ReservationSchool;
 import com.xjrsoft.module.teacher.entity.WfTeacherleave;
 
 import java.time.LocalDateTime;

+ 19 - 0
src/main/java/com/xjrsoft/module/teacher/service/impl/TeacherAwardItemServiceImpl.java

@@ -0,0 +1,19 @@
+package com.xjrsoft.module.teacher.service.impl;
+
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.teacher.entity.TeacherAwardItem;
+import com.xjrsoft.module.teacher.mapper.TeacherAwardItemMapper;
+import com.xjrsoft.module.teacher.service.ITeacherAwardItemService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+/**
+* @title: 教师奖项
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class TeacherAwardItemServiceImpl extends MPJBaseServiceImpl<TeacherAwardItemMapper, TeacherAwardItem> implements ITeacherAwardItemService {
+}

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

@@ -46,7 +46,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
-import java.util.concurrent.CompletableFuture;
 import java.util.stream.Collectors;
 
 /**

+ 84 - 0
src/main/java/com/xjrsoft/module/teacher/vo/TeacherAwardItemPageVo.java

@@ -0,0 +1,84 @@
+package com.xjrsoft.module.teacher.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 教师奖项分页列表出参
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+public class TeacherAwardItemPageVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private String id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long createUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Date createDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long modifyUserId;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Date modifyDate;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer deleteMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer enabledMark;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 奖项名称
+    */
+    @ApiModelProperty("奖项名称")
+    private String name;
+    /**
+    * 是否论文(1:是 0:否)
+    */
+    @ApiModelProperty("是否论文(1:是 0:否)")
+    private Integer isThesis;
+    /**
+    * 是否频分标准(1:是 0:否)
+    */
+    @ApiModelProperty("是否频分标准(1:是 0:否)")
+    private Integer isStandard;
+    /**
+    * 分数
+    */
+    @ApiModelProperty("分数")
+    private BigDecimal score;
+    /**
+    * 父级id
+    */
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+}

+ 58 - 0
src/main/java/com/xjrsoft/module/teacher/vo/TeacherAwardItemVo.java

@@ -0,0 +1,58 @@
+package com.xjrsoft.module.teacher.vo;
+
+import com.xjrsoft.common.model.tree.ITreeNode;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+* @title: 教师奖项表单出参
+* @Author dzx
+* @Date: 2024-06-04
+* @Version 1.0
+*/
+@Data
+public class TeacherAwardItemVo implements ITreeNode<TeacherAwardItemVo,Long>, Serializable {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 奖项名称
+    */
+    @ApiModelProperty("奖项名称")
+    private String name;
+    /**
+    * 是否论文(1:是 0:否)
+    */
+    @ApiModelProperty("是否论文(1:是 0:否)")
+    private Integer isThesis;
+    /**
+    * 是否频分标准(1:是 0:否)
+    */
+    @ApiModelProperty("是否频分标准(1:是 0:否)")
+    private Integer isStandard;
+    /**
+    * 分数
+    */
+    @ApiModelProperty("分数")
+    private BigDecimal score;
+    /**
+    * 父级id
+    */
+    @ApiModelProperty("父级id")
+    private Long parentId;
+
+
+    private List<TeacherAwardItemVo> children;
+}

+ 2 - 2
src/main/java/com/xjrsoft/module/workflow/utils/WorkFlowUtil.java

@@ -135,8 +135,8 @@ public class WorkFlowUtil {
                 .replace(WorkflowConstant.TASK_ID_PLACEHOLDER, workflowSchema.getDefinitionId())
                 .replace(WorkflowConstant.INITIATOR_ID_PLACEHOLDER, StrUtil.toString(user.getId()))
                 .replace(WorkflowConstant.INITIATOR_USER_NAME_PLACEHOLDER, user.getName())
-                .replace(WorkflowConstant.INITIATOR_CODE_PLACEHOLDER, user.getCode())
-                .replace(WorkflowConstant.INITIATOR_MOBILE_PLACEHOLDER, user.getMobile())
+                .replace(WorkflowConstant.INITIATOR_CODE_PLACEHOLDER, user.getCode()==null?"":user.getCode())
+                .replace(WorkflowConstant.INITIATOR_MOBILE_PLACEHOLDER, user.getMobile()==null?"":user.getMobile())
                 .replace(WorkflowConstant.INITIATOR_DEPT_NAME_PLACEHOLDER, department.getName()==null?"":department.getName())
 //                .replace(WorkflowConstant.INITIATOR_POST_NAME_PLACEHOLDER, post.getName())
                 .replace(WorkflowConstant.YYYYMMDDHHMMSS_24_PLACEHOLDER, DateUtil.format(LocalDateTime.now(), GlobalConstant.YYYY_MM_DD_HH_MM_SS_24))

+ 2 - 1
src/main/resources/application-dev.yml

@@ -113,6 +113,7 @@ xjrsoft:
       - /system/QR-code-login
       - /event/receivePeople
       - /event/receiveCar
+      - /system/findUserByCode
     approval-time: 300 # 审核超时时间 目前设为5分钟
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
@@ -146,7 +147,7 @@ xjrsoft:
     appKey: 21350095
     appSecret: LXi9rE2fm8IfRoLnTA2G
     people-url: http://ff.cf.yingcaibx.com/event/receivePeople
-    car-url: http://ff.cf.yingcaibx.com/event/receive
+    car-url: http://ff.cf.yingcaibx.com/event/receiveCar
   keycloak:
     url: http://192.168.0.221:12829/auth/
     realm: test

+ 2 - 1
src/main/resources/application-pre.yml

@@ -97,6 +97,7 @@ xjrsoft:
       - /system/QR-code-login
       - /event/receivePeople
       - /event/receiveCar
+      - /system/findUserByCode
     approval-time: 300 # 审核超时时间 目前设为5分钟
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>
@@ -130,7 +131,7 @@ xjrsoft:
     appKey: 21350095
     appSecret: LXi9rE2fm8IfRoLnTA2G
     people-url: http://ff.cf.yingcaibx.com/event/receivePeople
-    car-url: http://ff.cf.yingcaibx.com/event/receive
+    car-url: http://ff.cf.yingcaibx.com/event/receiveCar
   keycloak:
     url: http://192.168.0.221:12829/auth/
     realm: test

+ 1 - 0
src/main/resources/application-prod.yml

@@ -93,6 +93,7 @@ xjrsoft:
       - /system/QR-code-login
       - /event/receivePeople
       - /event/receiveCar
+      - /system/findUserByCode
     approval-time: 300 # 审核超时时间 目前设为5分钟
   email:
     host:  #邮件服务器的SMTP地址,可选,默认为smtp.<发件人邮箱后缀>

+ 25 - 2
src/main/resources/mapper/student/BaseStudentMapper.xml

@@ -52,7 +52,7 @@
     </select>
     <select id="getStudentPage" parameterType="com.xjrsoft.module.student.dto.BaseStudentUserPageDto" resultType="com.xjrsoft.module.student.vo.BaseStudentUserPageVo">
         SELECT t1.id,t4.name AS class_name,t5.name AS teacher_name,t1.name,t6.name AS gender_cn,t1.credential_number,
-        t1.mobile,t7.name AS archives_status_cn ,t8.name AS stduy_status_cn,t9.name AS student_type_cn FROM xjr_user t1
+        t1.mobile,t7.name AS archives_status_cn ,t8.name AS stduy_status_cn,t9.name AS student_type_cn,t10.name as learn_status_cn FROM xjr_user t1
         INNER JOIN base_student t2 ON t1.id = t2.user_id
         LEFT JOIN base_student_school_roll t3 ON t1.id = t3.user_id
         LEFT JOIN base_class t4 ON t4.id = t3.class_id
@@ -61,7 +61,9 @@
         LEFT JOIN xjr_dictionary_detail t7 ON t3.archives_status = t7.code AND t7.item_id = 2023000000000000029
         LEFT JOIN xjr_dictionary_detail t8 ON t3.stduy_status = t8.code AND t8.item_id = 2023000000000000030
         LEFT JOIN xjr_dictionary_detail t9 ON t3.student_type = t9.code AND t9.item_id = 2023000000000000028
+        LEFT JOIN xjr_dictionary_detail t10 ON t3.learn_status = t10.code AND t10.item_id = 1762024751192084482
         WHERE t1.delete_mark = 0 AND t2.delete_mark = 0
+        and t3.archives_status = 'FB2901'
         <if test="dto.name != null and dto.name != ''">
             and t1.name like concat('%', #{dto.name},'%')
         </if>
@@ -77,7 +79,28 @@
         <if test="dto.classId != null">
             and t4.id = #{dto.classId}
         </if>
-        order by t1.id
+        <if test="dto.order == null">
+            order by t1.id
+        </if>
+        <if test="dto.order != null">
+            <if test="dto.order == 'ascend'">
+                <if test="dto.field != null and dto.field == 'stduyStatusCn'">
+                    order by t8.name
+                </if>
+                <if test="dto.field != null and dto.field == 'name'">
+                    order by t1.name asc
+                </if>
+            </if>
+            <if test="dto.order == 'descend'">
+                <if test="dto.field != null and dto.field == 'stduyStatusCn'">
+                    order by t8.name desc
+                </if>
+                <if test="dto.field != null and dto.field == 'name'">
+                    order by t1.name desc
+                </if>
+            </if>
+        </if>
+
     </select>
 
 </mapper>

+ 0 - 1
src/main/resources/mapper/student/BaseStudentSchoolRollMapper.xml

@@ -22,7 +22,6 @@
             t2.gender,
             t10.name AS genderCn,
             t2.birth_date,
-            t2.avatar,
             t6.name AS nation,
             t3.archives_status AS archivesStatusCode,
             t3.stduy_status AS stduyStatusCode,

+ 3 - 3
src/main/resources/mapper/teacher/TeacherFaceImportMapper.xml

@@ -94,8 +94,8 @@
         where t.delete_mark = 0
     </select>
 
-    <select id="GetReservationSchoolIdList" resultType="java.lang.Long">
-        SELECT reservation_school_people_id
+    <select id="GetReservationSchoolIdList" resultType="java.lang.String">
+        SELECT event_id
         FROM visitor_out_in_record
         where delete_mark = 0
     </select>
@@ -105,7 +105,7 @@
         FROM reservation_school_people
         where delete_mark = 0
         <if test="id != null">
-            and registration_result::text LIKE '%"orderId":"' || #{id} || '"%'
+            and JSON_VALUE(registration_result, '$.data.orderId') = #{id};
         </if>
     </select>
 

+ 30 - 0
src/test/java/com/xjrsoft/module/job/AttenDanceWarnNoticeTaskTest.java

@@ -0,0 +1,30 @@
+package com.xjrsoft.module.job;
+
+import org.junit.jupiter.api.Test;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+/**
+ * @author dzx
+ * @date 2024/6/4
+ */
+class AttenDanceWarnNoticeTaskTest {
+
+
+    @Test
+    void test(){
+        LocalDateTime now = LocalDateTime.now();
+        System.out.println(now.getDayOfWeek().name());
+
+        LocalTime amStartTime = LocalTime.of(8,0,0);
+        System.out.println(now.with(amStartTime));
+
+        System.out.println(1L == 1);
+
+    }
+
+}

+ 3 - 3
src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java

@@ -12,7 +12,7 @@ import com.xjrsoft.module.evaluate.controller.EvaluateItemController;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.util.ApiUtil;
 import com.xjrsoft.module.hikvision.util.DataUtil;
-import com.xjrsoft.module.hikvision.util.Out_In_RecordUtil;
+import com.xjrsoft.module.hikvision.util.OutInRecordUtil;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.teacher.entity.XjrUser;
@@ -46,7 +46,7 @@ class HikvisionBaseDataTaskTest {
     @Autowired
     EvaluateItemController evaluateItemController;
 
-    Out_In_RecordUtil outInRecordUtil = new Out_In_RecordUtil();
+    OutInRecordUtil outInRecordUtil = new OutInRecordUtil();
 
     @Test
     void test() throws Exception {
@@ -104,7 +104,7 @@ class HikvisionBaseDataTaskTest {
 //        String carTableName = "car_message_apply";
 //        selectCar(use, carTableName);
 
-        outInRecordUtil.GetTeacherAndStudentRecords(use,faceImportMapper);
+        outInRecordUtil.GetVisitRecord(use,faceImportMapper);
 ////        selecAllPersonById(use);
 //        selectResource(use);
     }

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

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