Browse Source

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

dzx 9 months ago
parent
commit
f642c1c71d
19 changed files with 991 additions and 19 deletions
  1. 134 0
      src/main/java/com/xjrsoft/module/attendance/controller/AttendanceMessageSetController.java
  2. 54 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceMessageSetDto.java
  3. 53 0
      src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceMessageUserRelationDto.java
  4. 15 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceMessageSetDto.java
  5. 26 0
      src/main/java/com/xjrsoft/module/attendance/dto/AttendanceMessageSetPageDto.java
  6. 33 0
      src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceMessageSetDto.java
  7. 109 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceMessageSet.java
  8. 103 0
      src/main/java/com/xjrsoft/module/attendance/entity/AttendanceMessageUserRelation.java
  9. 17 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceMessageSetMapper.java
  10. 17 0
      src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceMessageUserRelationMapper.java
  11. 48 0
      src/main/java/com/xjrsoft/module/attendance/service/IAttendanceMessageSetService.java
  12. 102 0
      src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceMessageSetServiceImpl.java
  13. 84 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageSetPageVo.java
  14. 60 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageSetVo.java
  15. 54 0
      src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageUserRelationVo.java
  16. 32 13
      src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java
  17. 6 2
      src/main/java/com/xjrsoft/module/job/HikvisionBaseDataTask.java
  18. 10 4
      src/test/java/com/xjrsoft/module/job/HikvisionBaseDataTaskTest.java
  19. 34 0
      src/test/java/com/xjrsoft/xjrsoftboot/FreeMarkerGeneratorTest.java

+ 134 - 0
src/main/java/com/xjrsoft/module/attendance/controller/AttendanceMessageSetController.java

@@ -0,0 +1,134 @@
+package com.xjrsoft.module.attendance.controller;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.github.yulichang.toolkit.MPJWrappers;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.constant.GlobalConstant;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.page.PageOutput;
+import com.xjrsoft.common.model.result.RT;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.attendance.dto.AddAttendanceMessageSetDto;
+import com.xjrsoft.module.attendance.dto.AttendanceMessageSetDto;
+import com.xjrsoft.module.attendance.dto.UpdateAttendanceMessageSetDto;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+
+import com.xjrsoft.module.attendance.dto.AttendanceMessageSetPageDto;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageSet;
+import com.xjrsoft.module.attendance.entity.TeacherAttendanceRecord;
+import com.xjrsoft.module.attendance.service.IAttendanceMessageSetService;
+import com.xjrsoft.module.attendance.vo.AttendanceMessageSetPageVo;
+
+import com.xjrsoft.module.attendance.vo.AttendanceMessageSetVo;
+import com.xjrsoft.module.attendance.vo.AttendanceMessageUserRelationVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@RestController
+@RequestMapping("/attendance" + "/attendanceMessageSet")
+@Api(value = "/attendance"  + "/attendanceMessageSet",tags = "考勤消息设置代码")
+@AllArgsConstructor
+public class AttendanceMessageSetController {
+
+
+    private final IAttendanceMessageSetService attendanceMessageSetService;
+
+    @GetMapping(value = "/page")
+    @ApiOperation(value="考勤消息设置列表(分页)")
+    @SaCheckPermission("attendancemessageset:detail")
+    public RT<PageOutput<AttendanceMessageSetPageVo>> page(@Valid AttendanceMessageSetPageDto dto){
+
+        LambdaQueryWrapper<AttendanceMessageSet> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper
+                    .orderByDesc(AttendanceMessageSet::getId)
+                .select(AttendanceMessageSet.class,x -> VoToColumnUtil.fieldsToColumns(AttendanceMessageSetPageVo.class).contains(x.getProperty()));
+        IPage<AttendanceMessageSet> page = attendanceMessageSetService.page(ConventPage.getPage(dto), queryWrapper);
+        PageOutput<AttendanceMessageSetPageVo> pageOutput = ConventPage.getPageOutput(page, AttendanceMessageSetPageVo.class);
+        return RT.ok(pageOutput);
+    }
+
+    @GetMapping(value = "/list")
+    @ApiOperation(value="考勤消息设置列表")
+    @SaCheckPermission("attendancemessageset:detail")
+    public RT<List<AttendanceMessageSetVo>> list(@Valid AttendanceMessageSetDto dto) {
+        List<AttendanceMessageSet> list = attendanceMessageSetService.list(MPJWrappers.<AttendanceMessageSet>lambdaJoin().eq(ObjectUtil.isNotNull(dto.getRoleType()) && dto.getRoleType() != 0, AttendanceMessageSet::getRoleType, dto.getRoleType()));
+        List<AttendanceMessageSetVo> res = new ArrayList<>();
+        for (AttendanceMessageSet item : list) {
+            AttendanceMessageSet attendanceMessageSet = attendanceMessageSetService.getByIdDeep(item.getId());
+            if (attendanceMessageSet != null) {
+                res.add(BeanUtil.toBean(attendanceMessageSet, AttendanceMessageSetVo.class));
+            }
+        }
+        return RT.ok(res);
+    }
+
+    @GetMapping(value = "/info")
+    @ApiOperation(value="根据id查询考勤消息设置信息")
+    @SaCheckPermission("attendancemessageset:detail")
+    public RT<AttendanceMessageSetVo> info(@RequestParam Long id){
+        AttendanceMessageSet attendanceMessageSet = attendanceMessageSetService.getByIdDeep(id);
+        if (attendanceMessageSet == null) {
+           return RT.error("找不到此数据!");
+        }
+        return RT.ok(BeanUtil.toBean(attendanceMessageSet, AttendanceMessageSetVo.class));
+    }
+
+
+    @PostMapping
+    @ApiOperation(value = "新增考勤消息设置")
+    @SaCheckPermission("attendancemessageset:add")
+    public RT<Boolean> add(@Valid @RequestBody AddAttendanceMessageSetDto dto){
+        AttendanceMessageSet attendanceMessageSet = BeanUtil.toBean(dto, AttendanceMessageSet.class);
+        boolean isSuccess = attendanceMessageSetService.add(attendanceMessageSet);
+    return RT.ok(isSuccess);
+    }
+
+    @PutMapping
+    @ApiOperation(value = "修改考勤消息设置")
+    @SaCheckPermission("attendancemessageset:edit")
+    public RT<Boolean> update(@Valid @RequestBody UpdateAttendanceMessageSetDto dto){
+        AttendanceMessageSet attendanceMessageSet = BeanUtil.toBean(dto, AttendanceMessageSet.class);
+        return RT.ok(attendanceMessageSetService.update(attendanceMessageSet));
+    }
+
+    @PostMapping("edit")
+    @ApiOperation(value = "新增考勤消息设置")
+    @SaCheckPermission("attendancemessageset:add")
+    public RT<Boolean> add(@Valid @RequestBody List<UpdateAttendanceMessageSetDto> dtos) {
+        List<AttendanceMessageSet> attendanceMessageSets = new ArrayList<>();
+        for (UpdateAttendanceMessageSetDto dto : dtos) {
+            AttendanceMessageSet attendanceMessageSet = BeanUtil.toBean(dto, AttendanceMessageSet.class);
+            attendanceMessageSets.add(attendanceMessageSet);
+        }
+        boolean isSuccess = attendanceMessageSetService.edit(attendanceMessageSets);
+        return RT.ok(isSuccess);
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "删除考勤消息设置")
+    @SaCheckPermission("attendancemessageset:delete")
+    public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
+        return RT.ok(attendanceMessageSetService.delete(ids));
+
+    }
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceMessageSetDto.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
+
+
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceMessageSetDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)
+    */
+    @ApiModelProperty("消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)")
+    private Integer messageCategory;
+    /**
+    * 时间段(1:上午 2:下午 3:晚上 4:返校)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午 3:晚上 4:返校)")
+    private Integer timePeriod;
+    /**
+    * 指定人员
+    */
+    @ApiModelProperty("指定人员")
+    private String userRelation;
+
+    /**
+    * attendanceMessageUserRelation
+    */
+    @ApiModelProperty("attendanceMessageUserRelation子表")
+    private List<AddAttendanceMessageUserRelationDto> attendanceMessageUserRelationList;
+}

+ 53 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AddAttendanceMessageUserRelationDto.java

@@ -0,0 +1,53 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+
+/**
+* @title: 考勤消息提醒人员
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class AddAttendanceMessageUserRelationDto implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Integer classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Integer deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private String userId;
+    /**
+    * 考勤消息设置(attendance_message_set)
+    */
+    @ApiModelProperty("考勤消息设置(attendance_message_set)")
+    private String attendanceMessageSetId;
+
+}

+ 15 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceMessageSetDto.java

@@ -0,0 +1,15 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceMessageSetDto {
+    /**
+     * 人员类别(1:教职工 2:学生)
+     */
+    @ApiModelProperty("人员类别(1:教职工 2:学生)")
+    private  Integer roleType;
+}

+ 26 - 0
src/main/java/com/xjrsoft/module/attendance/dto/AttendanceMessageSetPageDto.java

@@ -0,0 +1,26 @@
+package com.xjrsoft.module.attendance.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+/**
+* @title: 考勤消息设置分页查询入参
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class AttendanceMessageSetPageDto extends PageInput {
+
+
+}

+ 33 - 0
src/main/java/com/xjrsoft/module/attendance/dto/UpdateAttendanceMessageSetDto.java

@@ -0,0 +1,33 @@
+package com.xjrsoft.module.attendance.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
+
+
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class UpdateAttendanceMessageSetDto extends AddAttendanceMessageSetDto {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+}

+ 109 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceMessageSet.java

@@ -0,0 +1,109 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_message_set")
+@ApiModel(value = "attendance_message_set", description = "考勤消息设置")
+public class AttendanceMessageSet 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;
+    /**
+    * 消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)
+    */
+    @ApiModelProperty("消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)")
+    private Integer messageCategory;
+    /**
+    * 时间段(1:上午 2:下午 3:晚上 4:返校)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午 3:晚上 4:返校)")
+    private Integer timePeriod;
+    /**
+    * 指定人员
+    */
+    @ApiModelProperty("指定人员")
+    private String userRelation;
+    /**
+     * 人员类别(1:教职工 2:学生)
+     */
+    @ApiModelProperty("人员类别(1:教职工 2:学生)")
+    private  Integer roleType;
+    /**
+    * attendanceMessageUserRelation
+    */
+    @ApiModelProperty("attendanceMessageUserRelation子表")
+    @TableField(exist = false)
+    @EntityMapping(thisField = "id", joinField = "attendanceMessageSetId")
+    private List<AttendanceMessageUserRelation> attendanceMessageUserRelationList;
+
+}

+ 103 - 0
src/main/java/com/xjrsoft/module/attendance/entity/AttendanceMessageUserRelation.java

@@ -0,0 +1,103 @@
+package com.xjrsoft.module.attendance.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.github.yulichang.annotation.EntityMapping;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+
+/**
+* @title: 考勤消息提醒人员
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+@TableName("attendance_message_user_relation")
+@ApiModel(value = "attendance_message_user_relation", description = "考勤消息提醒人员")
+public class AttendanceMessageUserRelation 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;
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Integer classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Integer deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private String userId;
+    /**
+    * 考勤消息设置(attendance_message_set)
+    */
+    @ApiModelProperty("考勤消息设置(attendance_message_set)")
+    private Long attendanceMessageSetId;
+
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceMessageSetMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageSet;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceMessageSetMapper extends MPJBaseMapper<AttendanceMessageSet> {
+
+}

+ 17 - 0
src/main/java/com/xjrsoft/module/attendance/mapper/AttendanceMessageUserRelationMapper.java

@@ -0,0 +1,17 @@
+package com.xjrsoft.module.attendance.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.github.yulichang.base.MPJBaseMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+* @title: 考勤消息提醒人员
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Mapper
+public interface AttendanceMessageUserRelationMapper extends MPJBaseMapper<AttendanceMessageUserRelation> {
+
+}

+ 48 - 0
src/main/java/com/xjrsoft/module/attendance/service/IAttendanceMessageSetService.java

@@ -0,0 +1,48 @@
+package com.xjrsoft.module.attendance.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageSet;
+import lombok.Data;
+import java.util.List;
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+
+public interface IAttendanceMessageSetService extends MPJBaseService<AttendanceMessageSet> {
+    /**
+    * 新增
+    *
+    * @param attendanceMessageSet
+    * @return
+    */
+    Boolean add(AttendanceMessageSet attendanceMessageSet);
+
+    /**
+    * 更新
+    *
+    * @param attendanceMessageSet
+    * @return
+    */
+    Boolean update(AttendanceMessageSet attendanceMessageSet);
+
+    /**
+     * 更新
+     *
+     * @param attendanceMessageSets
+     * @return
+     */
+    Boolean edit(List<AttendanceMessageSet>  attendanceMessageSets);
+
+    /**
+    * 删除
+    *
+    * @param ids
+    * @return
+    */
+    Boolean delete(List<Long> ids);
+}

+ 102 - 0
src/main/java/com/xjrsoft/module/attendance/service/impl/AttendanceMessageSetServiceImpl.java

@@ -0,0 +1,102 @@
+package com.xjrsoft.module.attendance.service.impl;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
+import com.xjrsoft.module.attendance.mapper.AttendanceMessageUserRelationMapper;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageSet;
+import com.xjrsoft.module.attendance.mapper.AttendanceMessageSetMapper;
+import com.xjrsoft.module.attendance.service.IAttendanceMessageSetService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+
+/**
+* @title: 考勤消息设置
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Service
+@AllArgsConstructor
+public class AttendanceMessageSetServiceImpl extends MPJBaseServiceImpl<AttendanceMessageSetMapper, AttendanceMessageSet> implements IAttendanceMessageSetService {
+    private final AttendanceMessageSetMapper attendanceMessageSetAttendanceMessageSetMapper;
+
+    private final AttendanceMessageUserRelationMapper attendanceMessageSetAttendanceMessageUserRelationMapper;
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean add(AttendanceMessageSet attendanceMessageSet) {
+        attendanceMessageSetAttendanceMessageSetMapper.insert(attendanceMessageSet);
+        for (AttendanceMessageUserRelation attendanceMessageUserRelation : attendanceMessageSet.getAttendanceMessageUserRelationList()) {
+            attendanceMessageUserRelation.setAttendanceMessageSetId(attendanceMessageSet.getId());
+            attendanceMessageSetAttendanceMessageUserRelationMapper.insert(attendanceMessageUserRelation);
+        }
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean update(AttendanceMessageSet attendanceMessageSet) {
+        attendanceMessageSetAttendanceMessageSetMapper.updateById(attendanceMessageSet);
+        //********************************* AttendanceMessageUserRelation  增删改  开始 *******************************************/
+        {
+            // 查出所有子级的id
+            List<AttendanceMessageUserRelation> attendanceMessageUserRelationList = attendanceMessageSetAttendanceMessageUserRelationMapper.selectList(Wrappers.lambdaQuery(AttendanceMessageUserRelation.class).eq(AttendanceMessageUserRelation::getAttendanceMessageSetId, attendanceMessageSet.getId()).select(AttendanceMessageUserRelation::getId));
+            List<Long> attendanceMessageUserRelationIds = attendanceMessageUserRelationList.stream().map(AttendanceMessageUserRelation::getId).collect(Collectors.toList());
+            //原有子表单 没有被删除的主键
+            List<Long> attendanceMessageUserRelationOldIds = attendanceMessageSet.getAttendanceMessageUserRelationList().stream().map(AttendanceMessageUserRelation::getId).filter(Objects::nonNull).collect(Collectors.toList());
+            //找到需要删除的id
+            List<Long> attendanceMessageUserRelationRemoveIds = attendanceMessageUserRelationIds.stream().filter(item -> !attendanceMessageUserRelationOldIds.contains(item)).collect(Collectors.toList());
+
+            for (AttendanceMessageUserRelation attendanceMessageUserRelation : attendanceMessageSet.getAttendanceMessageUserRelationList()) {
+                //如果不等于空则修改
+                if (attendanceMessageUserRelation.getId() != null) {
+                    attendanceMessageSetAttendanceMessageUserRelationMapper.updateById(attendanceMessageUserRelation);
+                }
+                //如果等于空 则新增
+                else {
+                    //已经不存在的id 删除
+                    attendanceMessageUserRelation.setAttendanceMessageSetId(attendanceMessageSet.getId());
+                    attendanceMessageSetAttendanceMessageUserRelationMapper.insert(attendanceMessageUserRelation);
+                }
+            }
+            //已经不存在的id 删除
+            if(attendanceMessageUserRelationRemoveIds.size() > 0){
+                attendanceMessageSetAttendanceMessageUserRelationMapper.deleteBatchIds(attendanceMessageUserRelationRemoveIds);
+            }
+        }
+        //********************************* AttendanceMessageUserRelation  增删改  结束 *******************************************/
+
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean edit(List<AttendanceMessageSet>  attendanceMessageSets) {
+        for (AttendanceMessageSet attendanceMessageSet : attendanceMessageSets) {
+            if (ObjectUtil.isNotNull(attendanceMessageSet.getId()) && attendanceMessageSet.getId() != 0) {
+                update(attendanceMessageSet);
+            } else {
+                add(attendanceMessageSet);
+            }
+        }
+        return true;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean delete(List<Long> ids) {
+        attendanceMessageSetAttendanceMessageSetMapper.deleteBatchIds(ids);
+        attendanceMessageSetAttendanceMessageUserRelationMapper.delete(Wrappers.lambdaQuery(AttendanceMessageUserRelation.class).in(AttendanceMessageUserRelation::getAttendanceMessageSetId, ids));
+
+        return true;
+    }
+}

+ 84 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageSetPageVo.java

@@ -0,0 +1,84 @@
+package com.xjrsoft.module.attendance.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import com.xjrsoft.common.annotation.Trans;
+import com.xjrsoft.common.enums.TransType;
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+* @title: 考勤消息设置分页列表出参
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class AttendanceMessageSetPageVo {
+
+    /**
+    * 
+    */
+    @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;
+    /**
+    * 消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)
+    */
+    @ApiModelProperty("消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)")
+    private Integer messageCategory;
+    /**
+    * 时间段(1:上午 2:下午 3:晚上 4:返校)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午 3:晚上 4:返校)")
+    private Integer timePeriod;
+    /**
+    * 指定人员
+    */
+    @ApiModelProperty("指定人员")
+    private String userRelation;
+    /**
+     * 人员类别(1:教职工 2:学生)
+     */
+    @ApiModelProperty("人员类别(1:教职工 2:学生)")
+    private  Integer roleType;
+
+}

+ 60 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageSetVo.java

@@ -0,0 +1,60 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+import com.xjrsoft.module.attendance.entity.AttendanceMessageUserRelation;
+
+/**
+* @title: 考勤消息设置表单出参
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class AttendanceMessageSetVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)
+    */
+    @ApiModelProperty("消息类别(1:迟到消息 2:旷课消息 3:缺勤消息)")
+    private Integer messageCategory;
+    /**
+    * 时间段(1:上午 2:下午 3:晚上 4:返校)
+    */
+    @ApiModelProperty("时间段(1:上午 2:下午 3:晚上 4:返校)")
+    private Integer timePeriod;
+    /**
+    * 指定人员
+    */
+    @ApiModelProperty("指定人员")
+    private String userRelation;
+
+    /**
+     * 人员类别(1:教职工 2:学生)
+     */
+    @ApiModelProperty("人员类别(1:教职工 2:学生)")
+    private  Integer roleType;
+
+    /**
+    * attendanceMessageUserRelation
+    */
+    @ApiModelProperty("attendanceMessageUserRelation子表")
+    private List<AttendanceMessageUserRelationVo> attendanceMessageUserRelationList;
+
+}

+ 54 - 0
src/main/java/com/xjrsoft/module/attendance/vo/AttendanceMessageUserRelationVo.java

@@ -0,0 +1,54 @@
+package com.xjrsoft.module.attendance.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalTime;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Date;
+
+/**
+* @title: 考勤消息提醒人员表单出参
+* @Author dzx
+* @Date: 2024-05-20
+* @Version 1.0
+*/
+@Data
+public class AttendanceMessageUserRelationVo {
+
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Long id;
+    /**
+    * 
+    */
+    @ApiModelProperty("")
+    private Integer sortCode;
+    /**
+    * 所属班级id
+    */
+    @ApiModelProperty("所属班级id")
+    private Integer classId;
+    /**
+    * 所属部门id
+    */
+    @ApiModelProperty("所属部门id")
+    private Integer deptId;
+    /**
+    * 用户id
+    */
+    @ApiModelProperty("用户id")
+    private String userId;
+    /**
+    * 考勤消息设置(attendance_message_set)
+    */
+    @ApiModelProperty("考勤消息设置(attendance_message_set)")
+    private String attendanceMessageSetId;
+
+
+
+}

+ 32 - 13
src/main/java/com/xjrsoft/module/hikvision/util/DataUtil.java

@@ -7,18 +7,18 @@ import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseGrade;
-import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.personnel.entity.CarMessageApply;
-import com.xjrsoft.module.personnel.mapper.TeacherFaceProcessMapper;
 import com.xjrsoft.module.system.entity.DictionaryDetail;
 import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import lombok.extern.slf4j.Slf4j;
 import lombok.var;
+import org.apache.velocity.runtime.directive.Foreach;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.sql.SQLException;
+import java.text.SimpleDateFormat;
 import java.util.*;
-import java.util.concurrent.ThreadLocalRandom;
 
 /**
  * @author dzx
@@ -30,8 +30,6 @@ public class DataUtil {
      * 同步组织数据
      * 只有批量添加接口,需要一个层级一个层级的添加
      */
-    private static FaceImportMapper faceImportMapper;
-
     public Map<String, String> insertDepartment(Db db, String tableName, Map<String, String> tableData) throws Exception {
         String sql = "SELECT DISTINCT LENGTH(hierarchy) FROM " + tableName + " WHERE delete_mark = 0";
         List<Integer[]> list = db.query(sql, Integer[].class);
@@ -454,10 +452,11 @@ public class DataUtil {
     }
 
     /*同步车辆数据*/
-    public Map<Long, String> insertCar(Db db, String tableName, Map<Long, String> tableData) throws Exception {
+    public Map<Long, String> insertCar(Db db, String tableName, Map<String, String> tableData, FaceImportMapper faceImportMapper) throws Exception {
         String sql = "SELECT * FROM " + tableName + " WHERE delete_mark = 0 and status = 1";
         List<CarMessageApply> dataList = db.query(sql, CarMessageApply.class);
         String apiPath = "/api/resource/v1/vehicle/batch/add";
+        String apiPathTime = "/api/pms/v1/car/charge";
         Map<Long, String> idMap = new HashMap<>();
         JsonParser jsonParser = new JsonParser();
         ApiUtil apiUtil = new ApiUtil();
@@ -466,18 +465,25 @@ public class DataUtil {
         Map<String, String> tagMap = new HashMap<>();
         tagMap.put("tagId", "frs");
 
-        String sqlHik = "SELECT * FROM " + "hikvision_data" + " WHERE delete_mark = 0 and status = 1";
-        List<HikvisionData> HikList =  db.query(sqlHik, HikvisionData.class);
+        String existingPlatesSql = "SELECT source_id FROM hikvision_data";
+        List<String> existingPlates = db.query(existingPlatesSql, String.class);
+
+        for (String h : existingPlates){
+            System.out.println(h + "qqq");
+        }
 
         JsonArray dataArray = new JsonArray();
         String result = null;
         int clientId = 1;
         for (CarMessageApply carMessageApply : dataList) {
+            if(tableData != null && tableData.containsKey(existingPlates.get(clientId - 1))){
+                continue;
+            }
 
             JsonObject paramJson = new JsonObject();
             paramJson.addProperty("clientId", clientId);
             paramJson.addProperty("plateNo", carMessageApply.getCarNumber());
-            paramJson.addProperty("PersonId", faceImportMapper.GetHikvisonPersonId(carMessageApply.getId()));
+            paramJson.addProperty("personId", faceImportMapper.GetHikvisonPersonId(Long.valueOf(Long.parseLong(carMessageApply.getId().toString()))));
 
             int vehicleTypeNum;
             switch (carMessageApply.getVehicleType()) {
@@ -501,20 +507,33 @@ public class DataUtil {
         }
         result = apiUtil.doPost(apiPath, dataArray.toString(), tagMap, null);
 
-        JsonElement parse = jsonParser.parse(result);
+        for (CarMessageApply carMessageApply : dataList) {
+            JsonObject paramJsonTime = new JsonObject();
+            paramJsonTime.addProperty("parkSyscode", "c69f2a7c48a74216bcab7d65f24d4a09");
+            paramJsonTime.addProperty("plateNo", carMessageApply.getCarNumber());
+            paramJsonTime.addProperty("startTime", String.valueOf(carMessageApply.getStartTime()));
+            paramJsonTime.addProperty("endTime", String.valueOf(carMessageApply.getEndTime()));
+            String aa = apiUtil.doPost(apiPathTime, String.valueOf(paramJsonTime), tagMap, null);
+        }
 
+        JsonElement parse = jsonParser.parse(result);
         JsonObject resultJson = parse.getAsJsonObject();
         if ("0".equals(resultJson.get("code").getAsString()) && "success".equals(resultJson.get("msg").getAsString())) {
             JsonArray array = resultJson.get("data").getAsJsonObject().get("successes").getAsJsonArray();
             for (JsonElement jsonElement : array) {
                 JsonObject jsonObject = jsonElement.getAsJsonObject();
-                idMap.put(clientMap.get(jsonObject.get("clientId")), jsonObject.get("vehicleId").getAsString());
+                int responseClientId = jsonObject.get("clientId").getAsInt();
+                Long sourceId = clientMap.get(responseClientId);
+                if (sourceId != null) {
+                    idMap.put(sourceId, jsonObject.get("vehicleId").getAsString());
+                } else {
+                    System.err.println("No matching clientId found in clientMap for: " + responseClientId);
+                }
             }
+            insertRecord(db, tableName, idMap);
         } else {
             System.err.println("API call failed: " + resultJson.get("msg").getAsString());
         }
-
-        insertRecord(db, tableName, idMap);
         return idMap;
     }
 

+ 6 - 2
src/main/java/com/xjrsoft/module/job/HikvisionBaseDataTask.java

@@ -7,7 +7,9 @@ import com.xjrsoft.common.utils.DatasourceUtil;
 import com.xjrsoft.module.hikvision.entity.HikvisionData;
 import com.xjrsoft.module.hikvision.util.DataUtil;
 import com.xjrsoft.module.schedule.entity.JianyueData;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 
@@ -25,7 +27,8 @@ import java.util.Set;
 @Component
 @Slf4j
 public class HikvisionBaseDataTask {
-
+    @Autowired
+    private FaceImportMapper faceImportMapper;
 
     @Scheduled(cron = "0 */15 * * * ?")
     public void RefreshConnectionPool() {
@@ -73,7 +76,8 @@ public class HikvisionBaseDataTask {
 
             //推送车辆
             String carTableName = "car_message_apply";
-            dataUtil.insertCar(use, carTableName, null);
+            Map<String, String> baseCar = dataMap.get(carTableName);
+            dataUtil.insertCar(use, carTableName, baseCar, faceImportMapper);
 
             tableName = "base_class";
             Map<String, String> baseClass = dataMap.get(tableName);

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

@@ -14,9 +14,11 @@ import com.xjrsoft.module.hikvision.util.DataUtil;
 import com.xjrsoft.module.organization.entity.Department;
 import com.xjrsoft.module.schedule.entity.JianyueData;
 import com.xjrsoft.module.teacher.entity.XjrUser;
+import com.xjrsoft.module.teacher.mapper.FaceImportMapper;
 import lombok.var;
 import org.junit.jupiter.api.Test;
 import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
@@ -36,6 +38,8 @@ import java.util.Set;
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = XjrSoftApplication.class)
 class HikvisionBaseDataTaskTest {
+    @Autowired
+    private FaceImportMapper faceImportMapper;
 
     @Test
     void test() throws Exception {
@@ -71,10 +75,12 @@ class HikvisionBaseDataTaskTest {
 //        tableName = "base_teacher";
 //        dataUtil.insertTeacher(use, tableName, dataMap.get(tableName), department);
 //
-//        //推送车辆
-//        String carTableName = "car_message_apply";
-//        dataUtil.insertCar(use, carTableName, null);
-//
+        //推送车辆
+
+        String carTableName = "car_message_apply";
+        Map<String, String> baseClass = dataMap.get(carTableName);
+        dataUtil.insertCar(use, carTableName,baseClass, faceImportMapper);
+
 //        tableName = "base_class";
 //        Map<String, String> baseClass = dataMap.get(tableName);
 //        Map<String, String> classes = dataUtil.insertClass(use, tableName, baseClass);

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

@@ -3129,4 +3129,38 @@ public class FreeMarkerGeneratorTest {
 
         apiGeneratorService.generateCodes(params);
     }
+
+    @Test
+    public void gcAttendanceMessageSet() throws IOException {
+        List<TableConfig> tableConfigs = new ArrayList<>();
+        TableConfig mainTable = new TableConfig();
+        mainTable.setTableName("attendance_message_set");//init_sql中的表名
+        mainTable.setIsMain(true);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        tableConfigs.add(mainTable);
+
+        mainTable = new TableConfig();
+        mainTable.setTableName("attendance_message_user_relation");//init_sql中的表名
+        mainTable.setIsMain(false);//是否是主表,一般默认为true
+        mainTable.setPkField(GlobalConstant.DEFAULT_PK);//设置主键
+        mainTable.setPkType(GlobalConstant.DEFAULT_PK_TYPE);//设置主键类型
+        mainTable.setRelationField("attendance_message_set_id");//设置外键
+        mainTable.setRelationTableField(GlobalConstant.DEFAULT_PK);//设置外键
+        tableConfigs.add(mainTable);
+
+        ApiGenerateCodesDto params = new ApiGenerateCodesDto();
+        params.setAuthor("dzx");//作者名称
+        params.setPackageName("attendance");//包名
+        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);
+    }
 }