Crazy 8 meses atrás
pai
commit
a7ae60f734

+ 45 - 33
yudao-module-md/yudao-module-md-biz/src/main/java/Acs/EventSearch.java

@@ -4,6 +4,7 @@ import NetSDKDemo.HCNetSDK;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendancePageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.studentAttendance.vo.StudentAttendanceSaveReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.user.vo.profile.UserProfileUpdatePasswordReqVO;
@@ -21,6 +22,8 @@ import com.sun.jna.Pointer;
 
 import java.io.*;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -53,7 +56,8 @@ public final class EventSearch {
      * @throws UnsupportedEncodingException
      * @throws InterruptedException
      */
-    public static List<Object> searchAllEvent(int lUserID ,AdminUserService adminUserService,StudentAttendanceService studentAttendanceService) throws UnsupportedEncodingException, InterruptedException {
+
+    public static List<Object> searchAllEvent(int lUserID ,AdminUserService adminUserService,StudentAttendanceService studentAttendanceService, FileApi fileApi) throws UnsupportedEncodingException, InterruptedException {
         int i = 0; //事件条数
         HCNetSDK.NET_DVR_ACS_EVENT_COND struAcsEventCond = new HCNetSDK.NET_DVR_ACS_EVENT_COND();
         struAcsEventCond.read();
@@ -76,8 +80,10 @@ public final class EventSearch {
         struAcsEventCond.struEndTime.dwMinute = 59;
         struAcsEventCond.struEndTime.dwSecond = 59;
         struAcsEventCond.wInductiveEventType = 1;
-        struAcsEventCond.byPicEnable = 0; //是否带图片,0-不带图片,1-带图片
+        struAcsEventCond.byPicEnable = 1; //是否带图片,0-不带图片,1-带图片
         struAcsEventCond.write();
+
+
         Pointer ptrStruEventCond = struAcsEventCond.getPointer();
         int m_lSearchEventHandle = AcsService.hCNetSDK.NET_DVR_StartRemoteConfig(lUserID, HCNetSDK.NET_DVR_GET_ACS_EVENT, ptrStruEventCond, struAcsEventCond.size(), null, null);
         if (m_lSearchEventHandle<=-1)
@@ -106,6 +112,7 @@ public final class EventSearch {
                 System.out.println("获取事件出现异常");
                 break;
             } else if (dwEventSearch == HCNetSDK.NET_SDK_GET_NEXT_STATUS_SUCCESS) {
+                StudentAttendanceDO attendance =new StudentAttendanceDO();
                 struAcsEventCfg.read();
                 //获取的事件信息通过struAcsEventCfg结构体进行解析,
                 //System.out.println(i + "获取事件成功, 报警主类型:" + Integer.toHexString(struAcsEventCfg.dwMajor) + "报警次类型:" + Integer.toHexString(struAcsEventCfg.dwMinor) + "卡号:" + new String(struAcsEventCfg.struAcsEventInfo.byCardNo).trim());
@@ -122,6 +129,32 @@ public final class EventSearch {
                         " 时:"+struAcsEventCfg.struTime.dwHour+" 分:"+struAcsEventCfg.struTime.dwMinute+" 秒:"+struAcsEventCfg.struTime.dwSecond);
                 System.out.println("刷卡信息:"+new String(struAcsEventCfg.struAcsEventInfo.byCardNo));
 
+
+                //打卡人脸信息
+                String photoUrl = null;
+                if (struAcsEventCfg.dwPicDataLen > 0 || struAcsEventCfg.pPicData != null) {
+                     // 用于保存文件的 URL,初始值为 null
+                    try {
+                        /**
+                         * 人脸图片保存路径
+                         */
+                        ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(0, struAcsEventCfg.dwPicDataLen);
+                        byte[] bytes = new byte[struAcsEventCfg.dwPicDataLen];
+                        buffers.rewind();
+                        buffers.get(bytes);
+
+                        Path tempFilePath = Files.createTempFile("photo", ".jpg");
+
+                        Files.write(tempFilePath, bytes);
+
+                        photoUrl = fileApi.createFile(Files.readAllBytes(tempFilePath)); // 上传文件并获取 URL
+                    } catch (FileNotFoundException e) {
+                        e.printStackTrace();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+
                 String clockInTime = (struAcsEventCfg.struTime.dwYear + "-" +
                         String.format("%02d", struAcsEventCfg.struTime.dwMonth) + "-" +
                         String.format("%02d", struAcsEventCfg.struTime.dwDay) + " " +
@@ -141,10 +174,12 @@ public final class EventSearch {
                     employeeNo = String.valueOf(struAcsEventCfg.struAcsEventInfo.dwEmployeeNo);
                 }
 
-                StudentAttendanceDO attendance =new StudentAttendanceDO();
                 attendance.setClockInTime(parsedTime);//打卡时间
                 attendance.setDate(date);//打卡日期
                 attendance.setUserNumber(employeeNo);//学号
+                if (photoUrl != null) {
+                    attendance.setPhoto(photoUrl); // 只在 photoUrl 不为 null 时设置
+                }
 
                 StudentAttendanceDO ST  = studentAttendanceService.getStudentAttendanceOne(employeeNo,parsedTime);//获取这个学生对应的这个考勤记录
                 AdminUserDO user = adminUserService.findUserByUserNumber(employeeNo);//找到这个学生
@@ -160,6 +195,7 @@ public final class EventSearch {
                             attendance.setCreateTime(parsedTime);
                             attendance.setUpdateTime(parsedTime);
                             //插入考勤表
+                            studentAttendance.add(attendance);
                             studentAttendanceService.createStudentAttendance(BeanUtils.toBean(attendance, StudentAttendanceSaveReqVO.class));
                         } else {
                             System.out.println("没有找到该用户" + employeeNo);
@@ -179,42 +215,18 @@ public final class EventSearch {
                                 if ("1".equals(re.getClockInStatus())) {//找到未打卡的
                                     re.setClockInStatus("0");//变成正常
                                     re.setClockInTime(parsedTime);//更新打卡时间
-                                    attendance.setCreateTime(parsedTime);//更新时间
-                                    attendance.setUpdateTime(parsedTime);
+                                    re.setCreateTime(parsedTime);//更新时间
+                                    re.setUpdateTime(parsedTime);
+                                    if (photoUrl != null) {
+                                        re.setPhoto(photoUrl); //
+                                    }
+                                    studentAttendance.add(re);//测试查询
                                     studentAttendanceService.updateStudentAttendance(BeanUtils.toBean(re, StudentAttendanceSaveReqVO.class));
                                 }
                             }
                         }
                     }
                 }
-                studentAttendance.add(attendance);
-
-                //人脸图片保存(没用)
-                if (struAcsEventCfg.dwPicDataLen>0 || struAcsEventCfg.pPicData != null )
-                {
-                    FileOutputStream fout;
-                    try {
-                        /**
-                         * 人脸图片保存路径
-                         */
-                        String filename = ".\\pic\\"+i+"_event.jpg";
-                        fout = new FileOutputStream(filename);
-                        //将字节写入文件
-                        long offset = 0;
-                        ByteBuffer buffers = struAcsEventCfg.pPicData.getByteBuffer(offset, struAcsEventCfg.dwPicDataLen);
-                        byte[] bytes = new byte[struAcsEventCfg.dwPicDataLen];
-                        buffers.rewind();
-                        buffers.get(bytes);
-                        fout.write(bytes);
-                        fout.close();
-                    } catch (FileNotFoundException e) {
-                        // TODO Auto-generated catch block
-                        e.printStackTrace();
-                    } catch (IOException e) {
-                        // TODO Auto-generated catch block
-                        e.printStackTrace();
-                    }
-                }
                 i++;
                 continue;
             }

+ 7 - 6
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/controller/admin/AcsController.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.md.controller.admin;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import cn.iocoder.yudao.module.md.controller.admin.vo.attendanceImportExcelVO;
 import cn.iocoder.yudao.module.md.controller.admin.vo.attendanceImportRespVO;
 import cn.iocoder.yudao.module.md.controller.admin.vo.importResponse;
@@ -61,12 +62,13 @@ public class AcsController {
     private StudentAttendanceService studentAttendanceService;
     @Resource
     private AdminUserService adminUserService;
-
+    @Resource
+    private FileApi fileApi;
 
     //
     @Scheduled(cron = "0 */10 * * * ?") // 每10分钟执行
     public void scheduledTask() throws UnsupportedEncodingException, InterruptedException {
-        acsService.searchEvents(adminUserService, studentAttendanceService);
+        acsService.searchEvents(adminUserService, studentAttendanceService,fileApi);
     }
 
 /**
@@ -224,9 +226,8 @@ public class AcsController {
     @GetMapping("/searchEvents")
     public CommonResult<List<Object>> searchEvents() throws UnsupportedEncodingException, InterruptedException {
 
-        List<Object> result = acsService.searchEvents(adminUserService,studentAttendanceService);
+        List<Object> result = acsService.searchEvents(adminUserService,studentAttendanceService,fileApi);
         return success(result);
-
     }
 
     @PostMapping("/import-data")
@@ -258,9 +259,9 @@ public class AcsController {
     public CommonResult<String> importUserData(@RequestParam("photoUrl") String photoUrl) {
         try {
             String result = acsService.addSelfImage(photoUrl);
-            return CommonResult.success(result);
+            return success(result);
         } catch (Exception e) {
-            return CommonResult.error(500, "导入过程中发生错误: " + e.getMessage());
+            return error(500, "导入过程中发生错误: " + e.getMessage());
         }
     }
 

+ 8 - 11
yudao-module-md/yudao-module-md-biz/src/main/java/cn/iocoder/yudao/module/md/service/AcsService.java

@@ -52,7 +52,12 @@ public class AcsService {
 //    private HCNetSDK hCNetSDK;
     private int lUserID = -1;
 
-    private AdminUserApi adminUserApi;
+    @Resource
+    private FileApi fileApi;
+
+    @Resource
+    private AdminUserService userService;
+
     /**
      * 初始化 SDK 并登录设备
      */
@@ -263,19 +268,11 @@ public class AcsService {
      * @return
      */
 
-    public  List<Object> searchEvents(AdminUserService adminUserService, StudentAttendanceService studentAttendanceService) throws UnsupportedEncodingException, InterruptedException {
-        return  EventSearch.searchAllEvent(lUserID, adminUserService,studentAttendanceService);
+    public  List<Object> searchEvents(AdminUserService adminUserService, StudentAttendanceService studentAttendanceService,FileApi fileApi) throws UnsupportedEncodingException, InterruptedException {
+        return  EventSearch.searchAllEvent(lUserID, adminUserService,studentAttendanceService,fileApi);
     }
 
 
-  //lsq
-    @Resource
-    private FileApi fileApi;
-
-    @Resource
-    private AdminUserService userService;
-
-
     //用户添加自己的照片(也可以对考勤机那添加用户信息照片或更新照片)
     @Transactional(rollbackFor = Exception.class) //
     public String addSelfImage(String photoUrl) throws Exception {

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceRespVO.java

@@ -57,4 +57,7 @@ public class StudentAttendanceRespVO {
     @ExcelProperty("备注原因")
     private String remark;
 
+    @Schema(description = "打卡照片", example = "url")
+    private String photo;
+
 }

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/studentAttendance/vo/StudentAttendanceSaveReqVO.java

@@ -47,4 +47,7 @@ public class StudentAttendanceSaveReqVO {
     @Schema(description = "导师id", example = "142")
     private Long supervisorId;
 
+    @Schema(description = "打卡照片", example = "url")
+    private String photo;
+
 }

+ 3 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/UserSaveReqVO.java

@@ -47,12 +47,14 @@ public class UserSaveReqVO {
 
     @Schema(description = "用户邮箱", example = "yudao@iocoder.cn")
     @Email(message = "邮箱格式不正确")
+    @NotBlank(message = "用户邮箱不能为空")
     @Size(max = 50, message = "邮箱长度不能超过 50 个字符")
     @DiffLogField(name = "用户邮箱")
     private String email;
 
     @Schema(description = "手机号码", example = "15601691300")
     @Mobile
+    @NotBlank(message = "用户手机号码")
     @DiffLogField(name = "手机号码")
     private String mobile;
 
@@ -82,7 +84,7 @@ public class UserSaveReqVO {
     }
 
     //新加的
-    @Schema(description ="照片url")
+    @Schema(description ="照片")
     private String  photoUrl;
 
     //新加修改传来的值

+ 1 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/graduateStudentImportExcelVO.java

@@ -21,7 +21,7 @@ import lombok.experimental.Accessors;
 @Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
 public class graduateStudentImportExcelVO {
 
-    @ExcelProperty("登录名称")
+    @ExcelProperty("登录账号")
     private String username;
 
     @ExcelProperty("用户密码")

+ 2 - 1
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/user/vo/user/teacherImportExcelVO.java

@@ -10,6 +10,8 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.experimental.Accessors;
 
+import javax.validation.constraints.NotNull;
+
 /**
  * 用户 Excel 导入 VO
  */
@@ -41,7 +43,6 @@ public class teacherImportExcelVO {
     @ExcelProperty("用户邮箱")
     private String email;
 
-
     @ExcelProperty("工作间名称")
     private String deptName;
 

+ 5 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/studentAttendance/StudentAttendanceDO.java

@@ -71,6 +71,11 @@ public class StudentAttendanceDO extends BaseDO {
      */
     private Long supervisorId;
 
+    /**
+     * 导师id
+     */
+    private String photo;
+
     //新加
     /**
      * 导师名称

+ 3 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/user/AdminUserServiceImpl.java

@@ -94,6 +94,9 @@ public class AdminUserServiceImpl implements AdminUserService {
                 throw exception(USER_COUNT_MAX, tenant.getAccountCount());
             }
         });
+        if ("3".equals(createReqVO.getUserType())){
+
+        }
         // 1.2 校验正确性
         validateUserForCreateOrUpdate(null, createReqVO.getUsername(),
                 createReqVO.getMobile(), createReqVO.getEmail(), createReqVO.getDeptId(), createReqVO.getPostIds(),createReqVO.getSupervisor());