From 99758c1a6075cc3734e22b0766eb291ac6edc79e Mon Sep 17 00:00:00 2001 From: lxj <15683799673@163.com> Date: Sat, 9 Aug 2025 20:58:21 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=B5=B7=E5=BA=B7=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=BA=BA=E5=83=8F=E5=BA=93=E5=9B=BE=E7=89=87=E4=B8=8A=E4=BC=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 18 +- .../org/dromara/sis/sdk/hik/HCNetSDK.java | 45 ++++- .../java/org/dromara/sis/sdk/hik/HikApi.java | 20 --- .../dromara/sis/sdk/hik/HikApiService.java | 124 +++++++++++++- .../sis/sdk/hik/calback/HikAlarmCallBack.java | 2 +- .../sdk/hik/model/upload/FaceAppendData.java | 72 ++++++++ .../sdk/hik/model/upload/SimpleMemory.java | 11 ++ .../sdk/hik/model/upload/UploadStatus.java | 18 ++ .../sis/sdk/hik/service/FaceService.java | 4 + .../sdk/hik/service/FdLibUploadService.java | 155 ++++++++++++++++++ .../sis/sdk/hik/service/SdkBaseServer.java | 5 +- 11 files changed, 444 insertions(+), 30 deletions(-) delete mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApi.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/FaceAppendData.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/SimpleMemory.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/UploadStatus.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FaceService.java create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FdLibUploadService.java diff --git a/pom.xml b/pom.xml index fd5c0f8f..e599e58c 100644 --- a/pom.xml +++ b/pom.xml @@ -91,8 +91,22 @@ dev - by.missmoc.top:8848 - by.missmoc.top:4560 + 10.20.1.60:8848 + 10.20.1.60:4560 + DEFAULT_GROUP + DEFAULT_GROUP + nacos + nacos + + + + + test + + + test + 192.168.24.101:8848 + 192.168.24.101:4560 DEFAULT_GROUP DEFAULT_GROUP nacos diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HCNetSDK.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HCNetSDK.java index d3cff30a..418d5d75 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HCNetSDK.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HCNetSDK.java @@ -3,7 +3,6 @@ package org.dromara.sis.sdk.hik; import com.sun.jna.*; import com.sun.jna.examples.win32.W32API; import com.sun.jna.examples.win32.W32API.HWND; -import com.sun.jna.ptr.ByteByReference; import com.sun.jna.ptr.IntByReference; import com.sun.jna.ptr.ShortByReference; @@ -9711,6 +9710,10 @@ DVR实现巡航数据结构 boolean NET_DVR_StopGetFile(int lFileHandle); + int NET_DVR_StartDownload(int lUserID, int dwDownloadType, NET_DVR_DOWNLOAD_FILEVOLUME_PARAM lpInBuffer, int dwInBufferSize, String sFileName); + + boolean NET_DVR_StopDownload(int lDownloadHandle); + int NET_DVR_GetDownloadPos(int lFileHandle); int NET_DVR_GetPlayBackPos(int lPlayHandle); @@ -10682,6 +10685,46 @@ DVR实现巡航数据结构 public byte byWorkMode ;//云台锁定控制:0- 解锁,1- 锁定 public byte[] byRes = new byte[123]; } + + + /** + * sdk 下载图片回调 + */ + interface DownloadCallBack extends Callback { + public void invoke(int lHandle, NET_DOWNLOAD_CB_INFO pCBInfo, Pointer pUserData); + } + + class NET_DOWNLOAD_CB_INFO extends SDK_Structure { + public int dwType; + public Pointer pData; + public int dwDataLen; + public Pointer pFileInfo; + public int dwFileInfoLen; + public byte[] byRes = new byte[120]; + } + + class NET_DVR_DOWNLOAD_FILEVOLUME_PARAM extends SDK_Structure { + private static final int MAX_URL_LEN = 240; + // 结构体大小 + public int dwSize; + // 文件上传路径 + public byte[] sUrl = new byte[MAX_URL_LEN]; + // 保留,置为0 + public byte[] byRes = new byte[248]; + public DownloadCallBack fnDownloadDataCB; + public Pointer pUserData; + } + + class NET_DVR_UPLOAD_FILEVOLUME_PRARAM extends SDK_Structure { + private static final int NET_SDK_MAX_FILE_NAME = 100; + public int dwSize; + public byte byFileType; + public byte byFileVolnumeID; + public byte[] byRes1 = new byte[2]; + public int dwFileSize; + public byte[] szFileName = new byte[NET_SDK_MAX_FILE_NAME]; + public byte[] byRes = new byte[300]; + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApi.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApi.java deleted file mode 100644 index 574da875..00000000 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApi.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.dromara.sis.sdk.hik; - -public interface HikApi { - - - Boolean login(String ip, short port, String user, String psw); - - - void getAcsStatus(String deviceIp); - - - Boolean controlGateway(String deviceIp, Integer floorNum, Integer cmd); - - /** - * 设备登出 - * - * @param deviceIp 设备ip - */ - Boolean loginOut(String deviceIp); -} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java index 1e33a7eb..fc94a909 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/HikApiService.java @@ -1,12 +1,16 @@ package org.dromara.sis.sdk.hik; +import cn.hutool.core.util.IdUtil; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.Base64Utils; import org.dromara.sis.sdk.hik.model.DeviceInfo; -import org.dromara.sis.sdk.hik.service.CamearService; -import org.dromara.sis.sdk.hik.service.DoorService; -import org.dromara.sis.sdk.hik.service.LoginService; -import org.dromara.sis.sdk.hik.service.SdkBaseServer; +import org.dromara.sis.sdk.hik.model.upload.FaceAppendData; +import org.dromara.sis.sdk.hik.model.upload.UploadStatus; +import org.dromara.sis.sdk.hik.service.*; +import java.io.FileInputStream; +import java.util.Arrays; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; /** @@ -151,4 +155,116 @@ public class HikApiService { Integer lHandel = CACHE.get(deviceIp); return CamearService.getDeviceChannelInfo(lHandel); } + + // 允许上传的文件类型 + private static final List ALLOW_PIC_TYPES = Arrays.asList("jpg"); + + /** + * 人像比对文件上传 + * + * @param deviceIp 设备ip + * @param file 上传文件 + * @return 返回上传文件名称 + */ + public static String fdLibUpload(String deviceIp, byte[] file, int libId, FaceAppendData data) { + long startTime = System.currentTimeMillis(); + // 文件名称 + String fileNamePrefix = IdUtil.fastSimpleUUID(); + int luserId = CACHE.get(deviceIp); + if (luserId == -1) { + log.error("海康设备[{}]未登录,上传文件失败.", deviceIp); + return null; + } + int uploadId = -1; + // 获取文件类型 + String type = Base64Utils.getType(file); + log.info("获取上传的文件类型,type: {}", type); + if (type == null) { + log.error("上传文件获取类型失败."); + return null; + } + if (!ALLOW_PIC_TYPES.contains(type)) { + log.error("不允许的上传文件类型, type: {}", type); + return null; + } + // 生成文件名称 + String fileName = fileNamePrefix + "." + type; + // 上传状态 + int statusCode = -1; + // 已发送的数据 + int fileLen = file.length; + log.info("开始文件上传,fileName={}, len={}", fileName, fileLen); + try { + // 1 发起上传 + uploadId = FdLibUploadService.uploadFile(luserId, libId); + log.info("开始发起hik上传操作,uploadId={}", uploadId); + if (uploadId == -1) { + log.info("发起上传失败,errCode: {}", FdLibUploadService.getErrorCode()); + return null; + } + // 2 发送图片的二进制数据 + byte fileType = getFileType(type); + FdLibUploadService.uploadSend(uploadId, file, fileType, data); + // 3 循环查询, 上传进度 总共查询300次 每次等待20ms + int num = 200; // 循环次数 + int sleepTime = 40; // 每次循环休眠时间 + int allowQueryErrorNum = 5; // 最多允许接口调用异常 + int errorNum = 0; // 错误次数 + for (int i = 0; i < num; i++) { + UploadStatus uploadState = FdLibUploadService.getUploadState(uploadId); + log.info("循环获取文件上传进度, uploadState= {}", uploadState); + if (uploadState.getStatusCode() == -1) { + int errorCode = FdLibUploadService.getErrorCode(); + log.info("文件进度查询失败, errorCode:{}", errorCode); + errorNum += 1; + if (errorNum == allowQueryErrorNum) { + log.info("sdk 接口错误次数达到设置上限,退出文件上传"); + throw new RuntimeException("sdk接口错误次数达到设置上限,退出文件上传, maxErrorNum=" + allowQueryErrorNum); + } + } else { + // 上传成功 + if (uploadState.getStatusCode() == 1) { + statusCode = 1; + break; + } + // 上传中 + else if (uploadState.getStatusCode() == 2) { + Thread.sleep(sleepTime); + } + // 上传失败 + else if (uploadState.getStatusCode() == 3) { + throw new RuntimeException("文件上传失败, 返回码:3"); + } + // 其他异常 + else { + throw new RuntimeException("文件上传失败, 返回码:" + uploadState); + } + } + } + if (statusCode == -1) { + log.info("图片上传失败,取消上传."); + return null; + } + // 4 获取上传图片的路径 + String uploadResult = FdLibUploadService.getUploadResult(uploadId); + log.info("文件上传完成, result= {}, 耗时={}ms", uploadResult, System.currentTimeMillis() - startTime); + return uploadResult; + } catch (Exception e) { + if (uploadId != -1) { + FdLibUploadService.uploadClose(uploadId); + } + e.printStackTrace(); + } + return null; + } + + private static byte getFileType(String type) { + return switch (type) { + case "jpg" -> 1; + case "png" -> 3; + case "bmp" -> 2; + case "gif" -> 5; + default -> throw new RuntimeException("不允许上传的图片类型:" + type); + }; + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index 13f27e41..4724034e 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -35,7 +35,7 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer(); pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size()); strFaceSnapInfo.read(); - handleFaceSnap(strFaceSnapInfo, pAlarmer); +// handleFaceSnap(strFaceSnapInfo, pAlarmer); break; } // 异常行为检测 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/FaceAppendData.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/FaceAppendData.java new file mode 100644 index 00000000..c07c3eee --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/FaceAppendData.java @@ -0,0 +1,72 @@ +package org.dromara.sis.sdk.hik.model.upload; + +import jakarta.xml.bind.annotation.*; +import lombok.Data; + +/** + * 上传图片的附件信息 + * + * @author lxj + */ +@Data +@XmlRootElement(name = "FaceAppendData") +@XmlAccessorType(XmlAccessType.FIELD) +public class FaceAppendData { + + @XmlAttribute + private String version = "2.0"; + + @XmlAttribute + private String xmlns = "http://www.isapi.org/ver20/XMLSchema"; + + /** + * 出生日期,例如:2014-12-12T00:00:00Z + */ + @XmlElement + private String bornTime; + + @XmlElement + private String name; + + /** + * male, female + */ + @XmlElement + private String sex; + + /** + * 省份,代码索引具体请参考"全国各省份城市列表 + */ + @XmlElement + private String province; + + /** + * ,城市,代码索引具体请参考"全国各省份城市列表 + */ + @XmlElement + private String city; + + /** + * 证件类型: ID-身份证, passportID-护照, other-其他 + */ + @XmlElement + private String certificateType; + + /** + * 证件号 + */ + @XmlElement + private String certificateNumber; + + /** + * 电话号码 + */ + @XmlElement + private String phoneNumber; + + /** + * 自定人员id + */ + @XmlElement + private String customHumanID; +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/SimpleMemory.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/SimpleMemory.java new file mode 100644 index 00000000..4779fd37 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/SimpleMemory.java @@ -0,0 +1,11 @@ +package org.dromara.sis.sdk.hik.model.upload; + +import com.sun.jna.Memory; + +public class SimpleMemory extends Memory { + + + public SimpleMemory(long size) { + super(size); + } +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/UploadStatus.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/UploadStatus.java new file mode 100644 index 00000000..96c7e68e --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/model/upload/UploadStatus.java @@ -0,0 +1,18 @@ +package org.dromara.sis.sdk.hik.model.upload; + +import lombok.Data; + +@Data +public class UploadStatus { + + /** + * 上传状态码 + */ + private Integer statusCode; + + /** + * 上传进度 + */ + private Integer process; + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FaceService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FaceService.java new file mode 100644 index 00000000..56f59e08 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FaceService.java @@ -0,0 +1,4 @@ +package org.dromara.sis.sdk.hik.service; + +public class FaceService extends SdkBaseServer{ +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FdLibUploadService.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FdLibUploadService.java new file mode 100644 index 00000000..1565ad68 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/FdLibUploadService.java @@ -0,0 +1,155 @@ +package org.dromara.sis.sdk.hik.service; + +import cn.hutool.core.util.StrUtil; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.IntByReference; +import jakarta.xml.bind.JAXBContext; +import jakarta.xml.bind.JAXBException; +import jakarta.xml.bind.Marshaller; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.Base64Utils; +import org.dromara.sis.sdk.hik.HCNetSDK; +import org.dromara.sis.sdk.hik.model.upload.FaceAppendData; +import org.dromara.sis.sdk.hik.model.upload.SimpleMemory; +import org.dromara.sis.sdk.hik.model.upload.UploadStatus; + +import java.io.StringWriter; +import java.nio.charset.StandardCharsets; + +import static org.dromara.sis.sdk.hik.HCNetSDK.IMPORT_DATA_TO_FACELIB; + +/** + * 海康上传服务 + */ +@Slf4j +public class FdLibUploadService extends SdkBaseServer { + + /** + * 上传文件到人脸库 + * + * @param luserId 登录句柄 + * @return 返回上传句柄 + */ + public static int uploadFile(int luserId, int libId) { + HCNetSDK.NET_DVR_FACELIB_COND param = new HCNetSDK.NET_DVR_FACELIB_COND(); + param.dwSize = param.size(); + byte[] bytes = String.valueOf(libId).getBytes(); + System.arraycopy(bytes, 0, param.szFDID, 0, bytes.length); + param.byConcurrent = 0; // 设备并发处理:0- 不开启(设备自动会建模),1- 开始(设备不会自动进行建模) + param.byCover = 1; + param.byCustomFaceLibID = 0; + param.byPictureSaveMode = 0; + int dwInBufferSize = param.size(); + param.write(); + return hcNetSDK.NET_DVR_UploadFile_V40(luserId, IMPORT_DATA_TO_FACELIB, param.getPointer(), dwInBufferSize, null, null, 0); + } + + /** + * 上传数据发送 + * + * @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值 + * @param data 上传文件的二进制数据 + * @param fileType 文件的类型 + * @return -1表示失败,大于等于0表示本次发送成功的字节数,未发送成功的剩余字节数可以再次调用该接口进行发送。 + */ + public static int uploadSend(int lUploadHandle, byte[] data, byte fileType, FaceAppendData userInfo) throws JAXBException { + HCNetSDK.NET_DVR_SEND_PARAM_IN param = new HCNetSDK.NET_DVR_SEND_PARAM_IN(); + SimpleMemory memory = new SimpleMemory(data.length); + memory.write(0, data, 0, data.length); + // 设置人像附加信息 + JAXBContext context = JAXBContext.newInstance(FaceAppendData.class); + Marshaller marshaller = context.createMarshaller(); + // 转换为字符串 + StringWriter writer = new StringWriter(); + marshaller.marshal(userInfo, writer); + String xmlString = writer.toString(); + byte[] faceBytes = xmlString.getBytes(); + SimpleMemory addendData = new SimpleMemory(faceBytes.length); + addendData.write(0, faceBytes, 0, faceBytes.length); + + param.pSendData = memory; + param.dwSendDataLen = data.length; + param.byPicType = fileType; + param.pSendAppendData = addendData; + param.dwSendAppendDataLen = faceBytes.length; + return hcNetSDK.NET_DVR_UploadSend(lUploadHandle, param, null); + } + + + /** + * 查询上传数据进度 + * + * @param lUploadHandle 文件上传句柄,NET_DVR_UploadFile_V40的返回值 + * @return -1表示函数调用失败,其他为上传的状态值见下表说明。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。 + * -1:表示调用失败 + * 1:上传成功 + * 2:正在上传 + * 3:上传失败 + * 其他状态码请参考sdk开发文档 + */ + public static UploadStatus getUploadState(int lUploadHandle) { + IntByReference reference = new IntByReference(0); + int i = hcNetSDK.NET_DVR_GetUploadState(lUploadHandle, reference.getPointer()); + UploadStatus status = new UploadStatus(); + status.setStatusCode(i); + status.setProcess(reference.getValue()); + return status; + } + + public static String getUploadResult(int lUploadHandle) { + HCNetSDK.NET_DVR_UPLOAD_FILE_RET params = new HCNetSDK.NET_DVR_UPLOAD_FILE_RET(); + params.write(); + Pointer lpOutBuffer = params.getPointer(); + int dwOutBufferSize = params.size(); + boolean b = hcNetSDK.NET_DVR_GetUploadResult(lUploadHandle, lpOutBuffer, dwOutBufferSize); + if (b) { + params.read(); + String url = new String(params.sUrl, StandardCharsets.UTF_8); + if (StrUtil.isNotEmpty(url)) { + return url.trim(); + } + } + return null; + } + + public static boolean uploadClose(int lUploadHandle) { + // TRUE表示成功,FALSE表示失败。接口返回失败请调用NET_DVR_GetLastError获取错误码,通过错误码判断出错原因。 + boolean b = hcNetSDK.NET_DVR_UploadClose(lUploadHandle); + if (b) { + log.info("文件上传关闭成功, lUploadHandle:{}", lUploadHandle); + } else { + int errorCode = hcNetSDK.NET_DVR_GetLastError(); + System.out.println("文件上传关闭失败, errorCode:" + errorCode); + } + return b; + } + + public static int download(int luserId, String url, HCNetSDK.DownloadCallBack callback) { + HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM param = new HCNetSDK.NET_DVR_DOWNLOAD_FILEVOLUME_PARAM(); + byte[] fns = url.getBytes(); + System.arraycopy(fns, 0, param.sUrl, 0, fns.length); + param.fnDownloadDataCB = callback; + param.write(); + param.dwSize = param.size(); + int i = hcNetSDK.NET_DVR_StartDownload(luserId, 20, param, param.dwSize, null); + if (i == -1) { + log.info("发起图片下载失败,lDownloadHandle={}, errorCode={}", i, getErrorCode()); + } + return i; + } + + /** + * 关闭文件下载 + * + * @param lDownloadHandle 下载句柄 + */ + public static void stopDownload(int lDownloadHandle) { + boolean b = hcNetSDK.NET_DVR_StopDownload(lDownloadHandle); + if (b) { + log.info("文件下载关闭成功, lDownloadHandle={}", lDownloadHandle); + } else { + System.out.println("文件下载关闭失败, errorCode:" + getErrorCode()); + } + } + +} diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java index da31abe6..94cd1a76 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/service/SdkBaseServer.java @@ -1,11 +1,9 @@ package org.dromara.sis.sdk.hik.service; -import com.sun.jna.Memory; import com.sun.jna.Native; import com.sun.jna.Pointer; import lombok.extern.slf4j.Slf4j; import org.dromara.sis.sdk.hik.HCNetSDK; -import org.dromara.sis.sdk.hik.SDK_Structure; import org.springframework.util.Assert; import static org.dromara.sis.sdk.hik.common.osSelect.isWindows; @@ -120,6 +118,9 @@ public class SdkBaseServer { } } + public static int getErrorCode() { + return getHcNetSDK().NET_DVR_GetLastError(); + } /** * 登出操作 From af2218511144a6d87aa85d2dda17d74f0ef7b791 Mon Sep 17 00:00:00 2001 From: yuyongle <1150359267@qq.com> Date: Mon, 11 Aug 2025 09:38:57 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E5=B7=A5?= =?UTF-8?q?=E5=8D=95bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../InspectionTaskDetailController.java | 22 +++--- .../property/domain/InspectionTaskDetail.java | 56 +++++++++++++-- .../property/domain/ServiceWorkOrders.java | 4 ++ .../domain/bo/InspectionTaskDetailBo.java | 53 ++++++++++++-- .../domain/bo/ServiceWorkOrdersBo.java | 10 ++- .../domain/vo/InspectionTaskDetailVo.java | 71 +++++++++++++++++-- .../domain/vo/ServiceWorkOrdersInfoVo.java | 4 ++ .../domain/vo/ServiceWorkOrdersVo.java | 4 ++ .../mapper/InspectionTaskDetailMapper.java | 6 +- .../service/IInspectionTaskDetailService.java | 7 +- .../impl/InspectionTaskDetailServiceImpl.java | 19 +++-- .../impl/ServiceWorkOrdersServiceImpl.java | 2 - 12 files changed, 214 insertions(+), 44 deletions(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java index c080cd01..ab2de8f8 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/InspectionTaskDetailController.java @@ -6,9 +6,6 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; -import org.dromara.property.domain.bo.InspectionTaskDetailBo; -import org.dromara.property.domain.vo.InspectionTaskDetailVo; -import org.dromara.property.service.IInspectionTaskDetailService; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -20,14 +17,17 @@ import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.property.domain.vo.InspectionTaskDetailVo; +import org.dromara.property.domain.bo.InspectionTaskDetailBo; +import org.dromara.property.service.IInspectionTaskDetailService; import org.dromara.common.mybatis.core.page.TableDataInfo; /** * 巡检明细 - * 前端访问路由地址为:/system/taskDetail + * 前端访问路由地址为:/property/taskDetail * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ @Validated @RequiredArgsConstructor @@ -40,7 +40,7 @@ public class InspectionTaskDetailController extends BaseController { /** * 查询巡检明细列表 */ - //@SaCheckPermission("system:taskDetail:list") + @SaCheckPermission("property:taskDetail:list") @GetMapping("/list") public TableDataInfo list(InspectionTaskDetailBo bo, PageQuery pageQuery) { return inspectionTaskDetailService.queryPageList(bo, pageQuery); @@ -49,7 +49,7 @@ public class InspectionTaskDetailController extends BaseController { /** * 导出巡检明细列表 */ - @SaCheckPermission("system:taskDetail:export") + @SaCheckPermission("property:taskDetail:export") @Log(title = "巡检明细", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(InspectionTaskDetailBo bo, HttpServletResponse response) { @@ -62,7 +62,7 @@ public class InspectionTaskDetailController extends BaseController { * * @param id 主键 */ - @SaCheckPermission("system:taskDetail:query") + @SaCheckPermission("property:taskDetail:query") @GetMapping("/{id}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable("id") Long id) { @@ -72,7 +72,7 @@ public class InspectionTaskDetailController extends BaseController { /** * 新增巡检明细 */ - @SaCheckPermission("system:taskDetail:add") + @SaCheckPermission("property:taskDetail:add") @Log(title = "巡检明细", businessType = BusinessType.INSERT) @RepeatSubmit() @PostMapping() @@ -83,7 +83,7 @@ public class InspectionTaskDetailController extends BaseController { /** * 修改巡检明细 */ - @SaCheckPermission("system:taskDetail:edit") + @SaCheckPermission("property:taskDetail:edit") @Log(title = "巡检明细", businessType = BusinessType.UPDATE) @RepeatSubmit() @PutMapping() @@ -96,7 +96,7 @@ public class InspectionTaskDetailController extends BaseController { * * @param ids 主键串 */ - @SaCheckPermission("system:taskDetail:remove") + @SaCheckPermission("property:taskDetail:remove") @Log(title = "巡检明细", businessType = BusinessType.DELETE) @DeleteMapping("/{ids}") public R remove(@NotEmpty(message = "主键不能为空") diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTaskDetail.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTaskDetail.java index 92b32b1b..5d1b45cd 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTaskDetail.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/InspectionTaskDetail.java @@ -4,8 +4,10 @@ import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.common.translation.annotation.Translation; import java.util.Date; - +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.translation.constant.TransConstant; import java.io.Serial; @@ -13,7 +15,7 @@ import java.io.Serial; * 巡检明细对象 inspection_task_detail * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ @Data @EqualsAndHashCode(callSuper = true) @@ -55,20 +57,60 @@ public class InspectionTaskDetail extends TenantEntity { private String patrolType; /** - * 签到类型 + * 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码) */ private String signType; + /** + * 实际巡检时间 + */ + private Date actualInspectionTime; + + /** + * 实际签到状态(1已签到2.未签到) + */ + private String actualSignState; + /** * 巡检状态(0未完成,1已完成) */ private String inspectionState; /** - * 巡检照片 + * 巡检图片 */ private String inspectionImage; + /** + * 计划巡检人 + */ + private String planInspectionPerson; + + /** + * 实际巡检人 + */ + private String actualInspectionPerson; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 巡检结果 + */ + private String inspectionResults; + + /** + * 巡检描述 + */ + private String inspectionDesc; + + /** + * 巡检位置 + */ + private String inspectionLocation; + /** * 实际巡检时间 */ @@ -89,4 +131,10 @@ public class InspectionTaskDetail extends TenantEntity { */ private Date pointEndTime; + /** + * 搜索值 + */ + private String searchValue; + + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java index 69c57064..de379feb 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/ServiceWorkOrders.java @@ -105,6 +105,10 @@ public class ServiceWorkOrders extends TenantEntity { * 工单图片 */ private String orderImgUrl; + /** + * 上报类型 + */ + private String reportingType; /** * 备注 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskDetailBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskDetailBo.java index 9c60718a..1582ae77 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskDetailBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/InspectionTaskDetailBo.java @@ -1,5 +1,6 @@ package org.dromara.property.domain.bo; +import org.dromara.property.domain.InspectionTaskDetail; import org.dromara.common.mybatis.core.domain.BaseEntity; import org.dromara.common.core.validate.AddGroup; import org.dromara.common.core.validate.EditGroup; @@ -7,14 +8,16 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; -import org.dromara.property.domain.InspectionTaskDetail; - +import org.dromara.common.translation.annotation.Translation; import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.translation.constant.TransConstant; + /** * 巡检明细业务对象 inspection_task_detail * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ @Data @EqualsAndHashCode(callSuper = true) @@ -55,20 +58,60 @@ public class InspectionTaskDetailBo extends BaseEntity { private String patrolType; /** - * 签到类型 + * 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码) */ private String signType; + /** + * 实际巡检时间 + */ + private Date actualInspectionTime; + + /** + * 实际签到状态(1已签到2.未签到) + */ + private String actualSignState; + /** * 巡检状态(0未完成,1已完成) */ private String inspectionState; /** - * 巡检照片 + * 巡检图片 */ private String inspectionImage; + /** + * 计划巡检人 + */ + private String planInspectionPerson; + + /** + * 实际巡检人 + */ + private String actualInspectionPerson; + + /** + * 任务状态 + */ + private String taskStatus; + + /** + * 巡检结果 + */ + private String inspectionResults; + + /** + * 巡检描述 + */ + private String inspectionDesc; + + /** + * 巡检位置 + */ + private String inspectionLocation; + /** * 实际巡检时间 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java index 68b7bdf0..ee3e8d83 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/ServiceWorkOrdersBo.java @@ -3,6 +3,7 @@ package org.dromara.property.domain.bo; import cn.idev.excel.annotation.ExcelProperty; import io.github.linpeilie.annotations.AutoMapper; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Data; import lombok.EqualsAndHashCode; @@ -26,7 +27,7 @@ public class ServiceWorkOrdersBo extends BaseEntity { /** * id */ - @NotNull(message = "id不能为空", groups = { EditGroup.class }) + @NotBlank(message = "id不能为空", groups = { EditGroup.class }) private Long id; /** @@ -37,7 +38,7 @@ public class ServiceWorkOrdersBo extends BaseEntity { /** * 工单名称 */ - @NotNull(message = "工单名称不能为空", groups = { EditGroup.class }) + @NotBlank(message = "工单名称不能为空", groups = { EditGroup.class }) private String orderName; /** * 权重 @@ -49,6 +50,11 @@ public class ServiceWorkOrdersBo extends BaseEntity { */ @NotNull(message = "工单类型不能为空", groups = { EditGroup.class }) private Long type; + /** + * 上报类型 + */ + @NotBlank(message = "上报类型不能为空", groups = { EditGroup.class }) + private String reportingType; /** * 状态 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskDetailVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskDetailVo.java index d939c423..4fbc9878 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskDetailVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/InspectionTaskDetailVo.java @@ -1,10 +1,16 @@ package org.dromara.property.domain.vo; +import org.dromara.common.translation.annotation.Translation; +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import org.dromara.common.translation.constant.TransConstant; +import org.dromara.property.domain.InspectionTaskDetail; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; -import org.dromara.property.domain.InspectionTaskDetail; import java.io.Serial; import java.io.Serializable; @@ -16,7 +22,7 @@ import java.util.Date; * 巡检明细视图对象 inspection_task_detail * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ @Data @ExcelIgnoreUnannotated @@ -63,11 +69,23 @@ public class InspectionTaskDetailVo implements Serializable { private String patrolType; /** - * 签到类型 + * 签到类型(1.现场拍照、2.摄像头签到、3.现场扫码) */ - @ExcelProperty(value = "签到类型") + @ExcelProperty(value = "签到类型(1.现场拍照、2.摄像头签到、3.现场扫码)") private String signType; + /** + * 实际巡检时间 + */ + @ExcelProperty(value = "实际巡检时间") + private Date actualInspectionTime; + + /** + * 实际签到状态(1已签到2.未签到) + */ + @ExcelProperty(value = "实际签到状态(1已签到2.未签到)") + private String actualSignState; + /** * 巡检状态(0未完成,1已完成) */ @@ -75,11 +93,52 @@ public class InspectionTaskDetailVo implements Serializable { private String inspectionState; /** - * 巡检照片 + * 巡检图片 */ - @ExcelProperty(value = "巡检照片") + @ExcelProperty(value = "巡检图片") private String inspectionImage; + /** + * 巡检图片Url + */ + @Translation(type = TransConstant.OSS_ID_TO_URL, mapper = "inspectionImage") + private String inspectionImageUrl; + /** + * 计划巡检人 + */ + @ExcelProperty(value = "计划巡检人") + private String planInspectionPerson; + + /** + * 实际巡检人 + */ + @ExcelProperty(value = "实际巡检人") + private String actualInspectionPerson; + + /** + * 任务状态 + */ + @ExcelProperty(value = "任务状态") + private String taskStatus; + + /** + * 巡检结果 + */ + @ExcelProperty(value = "巡检结果") + private String inspectionResults; + + /** + * 巡检描述 + */ + @ExcelProperty(value = "巡检描述") + private String inspectionDesc; + + /** + * 巡检位置 + */ + @ExcelProperty(value = "巡检位置") + private String inspectionLocation; + /** * 实际巡检时间 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java index 046f9a7d..87a9e11f 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersInfoVo.java @@ -48,6 +48,10 @@ public class ServiceWorkOrdersInfoVo implements Serializable { */ @ExcelProperty(value = "工单类型") private Long type; + /** + * 上报类型 + */ + private String reportingType; /** * 权重 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java index da00307b..67a807cd 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/ServiceWorkOrdersVo.java @@ -54,6 +54,10 @@ public class ServiceWorkOrdersVo implements Serializable { */ @ExcelProperty(value = "工单类型") private Long type; + /** + * 上报类型 + */ + private String reportingType; /** * 工单类型名称 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskDetailMapper.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskDetailMapper.java index daa3a291..5ecc936e 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskDetailMapper.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/mapper/InspectionTaskDetailMapper.java @@ -1,17 +1,15 @@ package org.dromara.property.mapper; -import org.apache.ibatis.annotations.Mapper; -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; import org.dromara.property.domain.InspectionTaskDetail; import org.dromara.property.domain.vo.InspectionTaskDetailVo; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** * 巡检明细Mapper接口 * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ -@Mapper public interface InspectionTaskDetailMapper extends BaseMapperPlus { } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskDetailService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskDetailService.java index 1f821add..47497e69 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskDetailService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IInspectionTaskDetailService.java @@ -1,9 +1,10 @@ package org.dromara.property.service; +import org.dromara.property.domain.InspectionTaskDetail; +import org.dromara.property.domain.vo.InspectionTaskDetailVo; +import org.dromara.property.domain.bo.InspectionTaskDetailBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.property.domain.bo.InspectionTaskDetailBo; -import org.dromara.property.domain.vo.InspectionTaskDetailVo; import java.util.Collection; import java.util.List; @@ -12,7 +13,7 @@ import java.util.List; * 巡检明细Service接口 * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ public interface IInspectionTaskDetailService { diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskDetailServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskDetailServiceImpl.java index 86c0ed9d..08940d1c 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskDetailServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/InspectionTaskDetailServiceImpl.java @@ -9,13 +9,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.dromara.property.domain.InspectionTaskDetail; +import org.springframework.stereotype.Service; import org.dromara.property.domain.bo.InspectionTaskDetailBo; import org.dromara.property.domain.vo.InspectionTaskDetailVo; +import org.dromara.property.domain.InspectionTaskDetail; import org.dromara.property.mapper.InspectionTaskDetailMapper; import org.dromara.property.service.IInspectionTaskDetailService; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Map; @@ -25,7 +24,7 @@ import java.util.Collection; * 巡检明细Service业务层处理 * * @author mocheng - * @date 2025-07-15 + * @date 2025-08-08 */ @Slf4j @RequiredArgsConstructor @@ -81,7 +80,16 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer lqw.eq(bo.getPointId() != null, InspectionTaskDetail::getPointId, bo.getPointId()); lqw.eq(StringUtils.isNotBlank(bo.getPatrolType()), InspectionTaskDetail::getPatrolType, bo.getPatrolType()); lqw.eq(StringUtils.isNotBlank(bo.getSignType()), InspectionTaskDetail::getSignType, bo.getSignType()); + lqw.eq(bo.getActualInspectionTime() != null, InspectionTaskDetail::getActualInspectionTime, bo.getActualInspectionTime()); + lqw.eq(StringUtils.isNotBlank(bo.getActualSignState()), InspectionTaskDetail::getActualSignState, bo.getActualSignState()); lqw.eq(StringUtils.isNotBlank(bo.getInspectionState()), InspectionTaskDetail::getInspectionState, bo.getInspectionState()); + lqw.eq(StringUtils.isNotBlank(bo.getInspectionImage()), InspectionTaskDetail::getInspectionImage, bo.getInspectionImage()); + lqw.eq(StringUtils.isNotBlank(bo.getPlanInspectionPerson()), InspectionTaskDetail::getPlanInspectionPerson, bo.getPlanInspectionPerson()); + lqw.eq(StringUtils.isNotBlank(bo.getActualInspectionPerson()), InspectionTaskDetail::getActualInspectionPerson, bo.getActualInspectionPerson()); + lqw.eq(StringUtils.isNotBlank(bo.getTaskStatus()), InspectionTaskDetail::getTaskStatus, bo.getTaskStatus()); + lqw.eq(StringUtils.isNotBlank(bo.getInspectionResults()), InspectionTaskDetail::getInspectionResults, bo.getInspectionResults()); + lqw.eq(StringUtils.isNotBlank(bo.getInspectionDesc()), InspectionTaskDetail::getInspectionDesc, bo.getInspectionDesc()); + lqw.eq(StringUtils.isNotBlank(bo.getInspectionLocation()), InspectionTaskDetail::getInspectionLocation, bo.getInspectionLocation()); lqw.eq(bo.getInspectionTime() != null, InspectionTaskDetail::getInspectionTime, bo.getInspectionTime()); lqw.eq(bo.getPointStartTime() != null, InspectionTaskDetail::getPointStartTime, bo.getPointStartTime()); lqw.eq(bo.getPointEndTime() != null, InspectionTaskDetail::getPointEndTime, bo.getPointEndTime()); @@ -96,7 +104,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer * @return 是否新增成功 */ @Override - @Transactional(rollbackFor = Exception.class) public Boolean insertByBo(InspectionTaskDetailBo bo) { InspectionTaskDetail add = MapstructUtils.convert(bo, InspectionTaskDetail.class); validEntityBeforeSave(add); @@ -114,7 +121,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer * @return 是否修改成功 */ @Override - @Transactional(rollbackFor = Exception.class) public Boolean updateByBo(InspectionTaskDetailBo bo) { InspectionTaskDetail update = MapstructUtils.convert(bo, InspectionTaskDetail.class); validEntityBeforeSave(update); @@ -136,7 +142,6 @@ public class InspectionTaskDetailServiceImpl implements IInspectionTaskDetailSer * @return 是否删除成功 */ @Override - @Transactional(rollbackFor = Exception.class) public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { if(isValid){ //TODO 做一些业务上的校验,判断是否需要校验 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java index 68ac9a24..814caacf 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/ServiceWorkOrdersServiceImpl.java @@ -247,13 +247,11 @@ public class ServiceWorkOrdersServiceImpl implements IServiceWorkOrdersService { ordersLambdaQueryWrapper.eq(ServiceWorkOrdersRecord::getStatus, entity.getStatus()); boolean exists = workOrdersRecordMapper.exists(ordersLambdaQueryWrapper); //TODO 做一些数据校验,如唯一约束 - if (!exists) { ServiceWorkOrdersRecord serviceWorkOrdersRecord = new ServiceWorkOrdersRecord(); serviceWorkOrdersRecord.setOrderId(entity.getId()); serviceWorkOrdersRecord.setStatus(entity.getStatus()); serviceWorkOrdersRecord.setHandler(entity.getHandler()); workOrdersRecordMapper.insert(serviceWorkOrdersRecord); - } } /** From 32b37687896e9563012cd41c900c3579677c8855 Mon Sep 17 00:00:00 2001 From: dy <2389062315@qq.com> Date: Mon, 11 Aug 2025 10:10:36 +0800 Subject: [PATCH 3/8] 1 --- .../AttendanceArrangementController.java | 3 + .../AttendanceUserGroupController.java | 11 + .../property/domain/AttendanceUserGroup.java | 14 +- .../domain/bo/AttendanceUserGroupBo.java | 21 +- .../domain/vo/AttendanceUserGroupVo.java | 26 ++- .../IAttendanceArrangementService.java | 1 + .../service/IAttendanceUserGroupService.java | 3 +- .../AttendanceArrangementServiceImpl.java | 3 + .../impl/AttendanceUserGroupServiceImpl.java | 131 +++++++++++- .../sis/controller/AlarmPushController.java | 189 ++++++++++++++++++ 10 files changed, 389 insertions(+), 13 deletions(-) create mode 100644 ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java index 3b4e675a..eaeb2018 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceArrangementController.java @@ -45,6 +45,9 @@ public class AttendanceArrangementController extends BaseController { return attendanceArrangementService.queryPageList(bo, pageQuery); } + + + /** * 查询某个月的日历排班信息的排班列表 */ diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java index 0079ab1e..58ffb3b0 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/controller/AttendanceUserGroupController.java @@ -6,6 +6,8 @@ import lombok.RequiredArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.constraints.*; import cn.dev33.satoken.annotation.SaCheckPermission; +import org.dromara.property.domain.bo.AttendanceArrangementBo; +import org.dromara.property.domain.vo.AttendanceArrangementVo; import org.springframework.web.bind.annotation.*; import org.springframework.validation.annotation.Validated; import org.dromara.common.idempotent.annotation.RepeatSubmit; @@ -103,4 +105,13 @@ public class AttendanceUserGroupController extends BaseController { @PathVariable("ids") Long[] ids) { return toAjax(attendanceUserGroupService.deleteWithValidByIds(List.of(ids), true)); } + + /** + * 查询排班的班表视图 + */ + @SaCheckPermission("Property:userGroup:queryScheduleView") + @GetMapping("/queryScheduleView") + public TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) { + return attendanceUserGroupService.queryScheduleView(bo, pageQuery); + } } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java index af8673e7..c8b6ab0e 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java @@ -4,8 +4,10 @@ import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; +import java.time.LocalDate; /** * 排班明细对象 attendance_user_group @@ -22,7 +24,7 @@ public class AttendanceUserGroup extends TenantEntity { private static final long serialVersionUID = 1L; /** - * + * */ @TableId(value = "id") private Long id; @@ -52,5 +54,15 @@ public class AttendanceUserGroup extends TenantEntity { */ private String deptName; + /** + * 开始日期 + */ + private LocalDate startDate; + + /** + * 结束日期(仅date_type=3时有效) + */ + private LocalDate endDate; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java index d5b860c0..44f51f94 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java @@ -8,6 +8,9 @@ import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; import lombok.EqualsAndHashCode; import jakarta.validation.constraints.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.time.LocalDate; /** * 排班明细业务对象 attendance_user_group @@ -21,7 +24,7 @@ import jakarta.validation.constraints.*; public class AttendanceUserGroupBo extends BaseEntity { /** - * + * */ @NotNull(message = "不能为空", groups = { EditGroup.class }) private Long id; @@ -51,5 +54,21 @@ public class AttendanceUserGroupBo extends BaseEntity { */ private String deptName; + /** + * 开始日期 + */ + private LocalDate startDate; + + /** + * 结束日期(仅date_type=3时有效) + */ + private LocalDate endDate; + + + /** + * 前端传某天的当前日期 + */ + private LocalDate currentDate; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java index 37456201..df4cfc0b 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java @@ -1,15 +1,17 @@ package org.dromara.property.domain.vo; -import org.dromara.property.domain.AttendanceUserGroup; +import org.dromara.property.domain.*; import cn.idev.excel.annotation.ExcelIgnoreUnannotated; import cn.idev.excel.annotation.ExcelProperty; import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.io.Serializable; +import java.time.LocalDate; import java.util.Date; @@ -29,7 +31,7 @@ public class AttendanceUserGroupVo implements Serializable { private static final long serialVersionUID = 1L; /** - * + * */ @ExcelProperty(value = "") private Long id; @@ -64,5 +66,25 @@ public class AttendanceUserGroupVo implements Serializable { @ExcelProperty(value = "部门名称") private String deptName; + /** + * 开始日期 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate startDate; + + /** + * 结束日期(仅date_type=3时有效) + */ + @DateTimeFormat(pattern = "yyyy-MM-dd") + private LocalDate endDate; + + private AttendanceArrangement attendanceArrangement; + + private AttendanceGroup attendanceGroup; + + private AttendanceShift attendanceShift; + + private AttendanceScheduleCycle scheduleCycle; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java index 856014de..c452f573 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceArrangementService.java @@ -67,4 +67,5 @@ public interface IAttendanceArrangementService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +// TableDataInfo queryScheduleView(AttendanceArrangementBo bo, PageQuery pageQuery); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java index eb51e331..0c800425 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/IAttendanceUserGroupService.java @@ -1,6 +1,5 @@ package org.dromara.property.service; -import org.dromara.property.domain.AttendanceUserGroup; import org.dromara.property.domain.vo.AttendanceUserGroupVo; import org.dromara.property.domain.bo.AttendanceUserGroupBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -66,4 +65,6 @@ public interface IAttendanceUserGroupService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery); } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index e14f152b..9f8b6157 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -255,6 +255,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS return TableDataInfo.build(attendanceArrangementVoPage); } + + /** * 查询某个月的日历排班信息的排班列表 * @@ -570,4 +572,5 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS } + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java index fb38fc40..44ecf723 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java @@ -9,16 +9,21 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.property.domain.*; +import org.dromara.property.domain.bo.AttendanceArrangementBo; +import org.dromara.property.domain.constant.StatusConstant; +import org.dromara.property.domain.vo.AttendanceArrangementVo; +import org.dromara.property.mapper.*; import org.springframework.stereotype.Service; import org.dromara.property.domain.bo.AttendanceUserGroupBo; import org.dromara.property.domain.vo.AttendanceUserGroupVo; -import org.dromara.property.domain.AttendanceUserGroup; -import org.dromara.property.mapper.AttendanceUserGroupMapper; import org.dromara.property.service.IAttendanceUserGroupService; -import java.util.List; -import java.util.Map; -import java.util.Collection; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; +import java.util.*; +import java.util.stream.Collectors; /** * 排班明细Service业务层处理 @@ -33,6 +38,16 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi private final AttendanceUserGroupMapper baseMapper; + private final AttendanceArrangementMapper arrangementMapper; + + private final AttendanceGroupMapper groupMapper; + + private final AttendanceWeekSetMapper weekSetMapper; + + private final AttendanceShiftMapper shiftMapper; + + private final AttendanceScheduleCycleMapper scheduleCycleMapper; + /** * 查询排班明细 * @@ -40,7 +55,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi * @return 排班明细 */ @Override - public AttendanceUserGroupVo queryById(Long id){ + public AttendanceUserGroupVo queryById(Long id) { return baseMapper.selectVoById(id); } @@ -115,7 +130,7 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi /** * 保存前的数据校验 */ - private void validEntityBeforeSave(AttendanceUserGroup entity){ + private void validEntityBeforeSave(AttendanceUserGroup entity) { //TODO 做一些数据校验,如唯一约束 } @@ -128,9 +143,109 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi */ @Override public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { - if(isValid){ + if (isValid) { //TODO 做一些业务上的校验,判断是否需要校验 } return baseMapper.deleteByIds(ids) > 0; } + + + /** + * 查询排班的班表视图 + */ + @Override + public TableDataInfo queryScheduleView(AttendanceUserGroupBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + //查询当前日期在哪些人员组中,当前日期大于等于人员组开始日期,小于等于人员组结束日期 + LambdaQueryWrapper ge = lqw + .le(AttendanceUserGroup::getStartDate, bo.getCurrentDate()) + .ge(AttendanceUserGroup::getEndDate, bo.getCurrentDate()); + + Page result = baseMapper.selectVoPage(pageQuery.build(), ge); + Page attendanceArrangementVoPage = result.setRecords(result.getRecords().stream().map(vo -> { + // 根据当前日期查询在开始时间和结束时间之间的人员组信息 + if ((bo.getCurrentDate().isAfter(vo.getStartDate()) || bo.getCurrentDate().isEqual(vo.getStartDate())) && + (bo.getCurrentDate().isBefore(vo.getEndDate()) || bo.getCurrentDate().isEqual(vo.getEndDate()))) { + + // 根据查询出来的result取出scheduleId + Long scheduleId = vo.getScheduleId(); + // 根据排班的id查询出排班的人员详细信息 +// List userGroupList = baseMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, scheduleId)); + + //根据scheduleId查询出排班的详细信息 + AttendanceArrangement attendanceArrangement = arrangementMapper.selectOne(Wrappers.lambdaQuery().eq(AttendanceArrangement::getId, scheduleId)); + // 假设每个vo只有一个scheduleId + Long userGroupListScheduleId = attendanceArrangement.getId(); + AttendanceArrangement arrangement = arrangementMapper.selectOne(Wrappers.lambdaQuery().eq(AttendanceArrangement::getId, userGroupListScheduleId)); + vo.setAttendanceArrangement(arrangement); + + // 根据scheduleId过滤出groupId + Long groupId = arrangement.getGroupId(); + // 根据groupId查询出考勤组的详细信息 + AttendanceGroup attendanceGroup = groupMapper.selectById(groupId); + vo.setAttendanceGroup(attendanceGroup); + + // 判断当前考勤组的班制是固定班制还是排班制 + if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.FIXEDSCHEDULE)) { + // 固定班制 + // 根据考勤组id查询出班制信息的dayOfWeek + List weekSetList = weekSetMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceWeekSet::getGroupId, groupId)); + // 将当前日期转换为周几 + int weekNumber = bo.getCurrentDate().getDayOfWeek().getValue(); + // 匹配weekNumber和weekSetList中的dayOfWeek,匹配成功则将weekSet存到vo中 + AttendanceWeekSet attendanceWeekSet = weekSetList.stream().filter(weekSet -> weekSet.getDayOfWeek() == weekNumber).findFirst().orElse(null); + if (attendanceWeekSet != null) { + // 根据过滤出来的attendanceWeekSet的weekSetId查询出shiftId + Long shiftId = attendanceWeekSet.getShiftId(); + // 根据shiftId查询出班次的详细信息 + AttendanceShift attendanceShift = shiftMapper.selectById(shiftId); + // 将attendanceShift存到vo中 + vo.setAttendanceShift(attendanceShift); + } + } else if (Objects.equals(attendanceGroup.getAttendanceType(), StatusConstant.SHIFTSCHEDULE)) { + // 排班制 + // 将startDate作为第一天,endDate作为最后一天,循环判断当前日期是第几天,取出当前天数的班次信息。 + LocalDate startDate = vo.getStartDate(); + LocalDate endDate = vo.getEndDate(); + LocalDate currentDate = bo.getCurrentDate(); + + // 取出attendanceScheduleCycle表中的天数 + List cycleDaysList = scheduleCycleMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, groupId)).stream() + .map(AttendanceScheduleCycle::getDayNumber) + .toList(); + + // 在startDate和endDate之间循环,判断当前日期是cycleDays中的第几天 + for (LocalDate date = startDate; date.isBefore(endDate) || date.isEqual(endDate); date = date.plusDays(1)) { + if (date.isEqual(currentDate)) { + // 判断当前日期是cycleDays中的第几天 + int dayNumber = (int) (ChronoUnit.DAYS.between(startDate, date) + 1); + int cycleDay = dayNumber % cycleDaysList.size(); + if (cycleDay == 0) { + cycleDay = cycleDaysList.size(); + } + // 根据cycleDay查询出当前日期的班次信息 + AttendanceScheduleCycle cycle = scheduleCycleMapper.selectOne(Wrappers.lambdaQuery() + .eq(AttendanceScheduleCycle::getGroupId, groupId) + .eq(AttendanceScheduleCycle::getDayNumber, cycleDay)); + if (cycle != null) { + // 将cycle存到vo中 + vo.setScheduleCycle(cycle); + // 根据cycleId查询出shiftId + Long shiftId = cycle.getShiftId(); + // 根据shiftId查询出班次的详细信息 + AttendanceShift attendanceShift = shiftMapper.selectById(shiftId); + // 将shift存到vo中 + vo.setAttendanceShift(attendanceShift); + } + break; // 找到当前日期后跳出循环 + } + } + } + } + return vo; + }).collect(Collectors.toList())); + + return TableDataInfo.build(attendanceArrangementVoPage); + + } } diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java new file mode 100644 index 00000000..929d50c0 --- /dev/null +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/controller/AlarmPushController.java @@ -0,0 +1,189 @@ +package org.dromara.sis.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.sis.domain.AlarmRecord; +import org.dromara.sis.domain.bo.SisAlarmEventsBo; +import org.dromara.sis.service.AlarmRecordService; +import org.dromara.sis.service.ISisAlarmEventsService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * 告警数据主动推送控制器 + * 接收外部系统推送的告警数据并同步到数据库 + */ +@Slf4j +@RestController +@RequestMapping("/api/alarm/push") +@RequiredArgsConstructor +public class AlarmPushController { + + private final AlarmRecordService alarmRecordService; + private final ISisAlarmEventsService sisAlarmEventsService; + + /** + * 接收单条告警数据推送 + */ + @PostMapping("/single") + public ResponseEntity> pushSingleAlarm(@RequestBody Map alarmData) { + try { + // 处理单条数据 + processAlarmData(Collections.singletonList(alarmData)); + + Map result = new HashMap<>(); + result.put("success", true); + result.put("message", "告警数据推送成功"); + result.put("timestamp", new Date()); + return ResponseEntity.ok(result); + } catch (Exception e) { + log.error("处理单条告警推送失败: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage())); + } + } + + /** + * 接收批量告警数据推送 + */ + @PostMapping("/batch") + public ResponseEntity> pushBatchAlarms(@RequestBody List> alarmDataList) { + if (alarmDataList == null || alarmDataList.isEmpty()) { + return ResponseEntity.badRequest().body(Collections.singletonMap("error", "推送数据不能为空")); + } + + try { + int processedCount = processAlarmData(alarmDataList); + + Map result = new HashMap<>(); + result.put("success", true); + result.put("message", "批量告警数据推送成功"); + result.put("processedCount", processedCount); + result.put("totalReceived", alarmDataList.size()); + result.put("timestamp", new Date()); + return ResponseEntity.ok(result); + } catch (Exception e) { + log.error("处理批量告警推送失败: {}", e.getMessage(), e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(Collections.singletonMap("error", "处理告警数据失败: " + e.getMessage())); + } + } + + /** + * 处理告警数据并保存到数据库 + * @param alarmDataList 告警数据列表 + * @return 处理成功的数量 + */ + private int processAlarmData(List> alarmDataList) { + log.info("开始处理推送的告警数据,共 {} 条", alarmDataList.size()); + + // 转换报警记录 + List records = alarmDataList.stream() + .map(alarmRecordService::convertFromMap) + .collect(Collectors.toList()); + + // 提取操作记录数据 + Map>> operatorMap = new HashMap<>(); + for (Map recordMap : alarmDataList) { + // 确保Id存在且为有效数字 + Object idObj = recordMap.get("Id"); + if (idObj == null) { + log.warn("跳过缺少Id的告警数据: {}", recordMap); + continue; + } + + Long recordId; + try { + recordId = Long.valueOf(idObj.toString()); + } catch (NumberFormatException e) { + log.warn("告警数据Id格式错误: {}", idObj, e); + continue; + } + + // 处理操作记录 + List> operators = (List>) recordMap.get("TaskOperators"); + if (operators != null && !operators.isEmpty()) { + operatorMap.put(recordId, operators); + } + + // 同步到alarmEvents表 + SisAlarmEventsBo sisAlarmEvents = convertToAlarmEvents(recordMap, recordId); + sisAlarmEventsService.insertByBo(sisAlarmEvents); + } + + // 保存数据(包含操作记录) + return alarmRecordService.saveOrUpdateRecords(records, operatorMap); + } + + /** + * 将原始告警数据转换为SisAlarmEventsBo对象 + */ + private SisAlarmEventsBo convertToAlarmEvents(Map recordMap, Long recordId) { + SisAlarmEventsBo sisAlarmEvents = new SisAlarmEventsBo(); + sisAlarmEvents.setId(recordId); + + // 转换类型和级别 + sisAlarmEvents.setType(convertToLong(recordMap.get("Type"))); + sisAlarmEvents.setLevel(convertToLong(recordMap.get("Level"))); + + // 设备信息 + sisAlarmEvents.setDeviceIp((String) recordMap.get("DeviceSipNum")); + sisAlarmEvents.setDeviceName(Objects.toString(recordMap.get("DeviceName"), "")); + sisAlarmEvents.setDeviceGroupId(convertToLong(recordMap.get("GroupId"))); + sisAlarmEvents.setDeviceGroupName(Objects.toString(recordMap.get("GroupName"), "")); + + // 时间和状态 + sisAlarmEvents.setReportTime((Date) recordMap.get("StartTime")); + sisAlarmEvents.setState(convertToInteger(recordMap.get("State"))); + + // 工单ID(仅当状态为3时) + if (sisAlarmEvents.getState() == 3) { + sisAlarmEvents.setWorkOrderId(convertToLong(recordMap.get("WorkOrderId"))); + } + + return sisAlarmEvents; + } + + /** + * 安全地将对象转换为Long类型 + */ + private Long convertToLong(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number) { + return ((Number) value).longValue(); + } + try { + return Long.valueOf(value.toString()); + } catch (NumberFormatException e) { + log.warn("转换为Long失败: {}", value, e); + return null; + } + } + + /** + * 安全地将对象转换为Integer类型 + */ + private Integer convertToInteger(Object value) { + if (value == null) { + return null; + } + if (value instanceof Number) { + return ((Number) value).intValue(); + } + try { + return Integer.valueOf(value.toString()); + } catch (NumberFormatException e) { + log.warn("转换为Integer失败: {}", value, e); + return null; + } + } +} From 4861c89c57f0ee89811efdabf3543f42a03fea44 Mon Sep 17 00:00:00 2001 From: dy <2389062315@qq.com> Date: Mon, 11 Aug 2025 16:44:26 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=A0=B9=E6=8D=AEid=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-modules/Property/pom.xml | 6 ++++++ .../property/domain/AttendanceUserGroup.java | 20 +++++++++++-------- .../domain/bo/AttendanceArrangementBo.java | 4 ++++ .../domain/bo/AttendanceUserGroupBo.java | 16 +++++++-------- .../domain/vo/AttendanceUserGroupVo.java | 20 +++++++++---------- .../AttendanceArrangementServiceImpl.java | 17 ++++++++++++++++ 6 files changed, 57 insertions(+), 26 deletions(-) diff --git a/ruoyi-modules/Property/pom.xml b/ruoyi-modules/Property/pom.xml index fdb2815b..1436b359 100644 --- a/ruoyi-modules/Property/pom.xml +++ b/ruoyi-modules/Property/pom.xml @@ -120,6 +120,12 @@ sis-api 2.4.0 + + org.dromara + ruoyi-system + 2.4.0 + compile + diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java index c8b6ab0e..bff194a1 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java @@ -4,10 +4,12 @@ import org.dromara.common.tenant.core.TenantEntity; import com.baomidou.mybatisplus.annotation.*; import lombok.Data; import lombok.EqualsAndHashCode; +import org.dromara.system.domain.SysUser; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; import java.time.LocalDate; +import java.util.List; /** * 排班明细对象 attendance_user_group @@ -39,20 +41,20 @@ public class AttendanceUserGroup extends TenantEntity { */ private Long employeeId; - /** - * 员工姓名 - */ - private String employeeName; +// /** +// * 员工姓名 +// */ +// private String employeeName; /** * 部门ID */ private Long deptId; - /** - * 部门名称 - */ - private String deptName; +// /** +// * 部门名称 +// */ +// private String deptName; /** * 开始日期 @@ -64,5 +66,7 @@ public class AttendanceUserGroup extends TenantEntity { */ private LocalDate endDate; + private SysUser sysUser; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceArrangementBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceArrangementBo.java index 05b3f073..2968a7cb 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceArrangementBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceArrangementBo.java @@ -84,6 +84,10 @@ public class AttendanceArrangementBo extends BaseEntity { */ private Long status; + private List employeeId; + + private List deptId; + /** * * 排班用户组 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java index 44f51f94..a9c45c75 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/bo/AttendanceUserGroupBo.java @@ -39,20 +39,20 @@ public class AttendanceUserGroupBo extends BaseEntity { */ private Long employeeId; - /** - * 员工姓名 - */ - private String employeeName; +// /** +// * 员工姓名 +// */ +// private String employeeName; /** * 部门ID */ private Long deptId; - /** - * 部门名称 - */ - private String deptName; +// /** +// * 部门名称 +// */ +// private String deptName; /** * 开始日期 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java index df4cfc0b..f8507a78 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java @@ -48,11 +48,11 @@ public class AttendanceUserGroupVo implements Serializable { @ExcelProperty(value = "员工ID") private Long employeeId; - /** - * 员工姓名 - */ - @ExcelProperty(value = "员工姓名") - private String employeeName; +// /** +// * 员工姓名 +// */ +// @ExcelProperty(value = "员工姓名") +// private String employeeName; /** * 部门ID @@ -60,11 +60,11 @@ public class AttendanceUserGroupVo implements Serializable { @ExcelProperty(value = "部门ID") private Long deptId; - /** - * 部门名称 - */ - @ExcelProperty(value = "部门名称") - private String deptName; +// /** +// * 部门名称 +// */ +// @ExcelProperty(value = "部门名称") +// private String deptName; /** * 开始日期 diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index 9f8b6157..c41842fd 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; +import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.mybatis.core.page.PageQuery; @@ -18,6 +19,8 @@ import org.dromara.property.domain.constant.StatusConstant; import org.dromara.property.domain.vo.AttendanceArrangementVo; import org.dromara.property.mapper.*; import org.dromara.property.service.IAttendanceArrangementService; +import org.dromara.system.domain.SysUser; +import org.dromara.system.mapper.SysUserMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,6 +40,7 @@ import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Service +@DubboService(interfaceClass = SysUser.class) public class AttendanceArrangementServiceImpl implements IAttendanceArrangementService { private final AttendanceArrangementMapper baseMapper; @@ -54,6 +58,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS private final AttendanceScheduleCycleMapper scheduleCycleMapper; + private final SysUserMapper sysUserMapper; + /** * 查询排班 * @@ -311,6 +317,15 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS for (AttendanceArrangementVo vo : result) { // 根据排班查询出人员组的详细信息 List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId())); + + //通过userGroupList查询出人员的详细信息 + + //将userList存到userGroupList中 + userGroupList.forEach(userGroup -> { + SysUser sysUser = sysUserMapper.selectById(userGroup.getEmployeeId()); + userGroup.setSysUser(sysUser); + } + ); // 将排班人员信息添加到排班信息中 vo.setUserGroupList(userGroupList); @@ -448,6 +463,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS List userGroupList = bo.getUserGroupList(); for (AttendanceUserGroup userGroup : userGroupList) { userGroup.setScheduleId(ArrangementId); + userGroup.setStartDate(bo.getStartDate()); + userGroup.setEndDate(bo.getEndDate()); userGroupMapper.insert(userGroup); } From a7db0253e8e6831327007057bff02e0a695ef337 Mon Sep 17 00:00:00 2001 From: dy <2389062315@qq.com> Date: Tue, 12 Aug 2025 11:16:23 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=A0=B9=E6=8D=AEid=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/AttendanceArrangementServiceImpl.java | 15 ++++++++++++++- .../impl/AttendanceUserGroupServiceImpl.java | 4 ++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index c41842fd..b64ff3ba 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -40,7 +40,6 @@ import java.util.stream.Collectors; @Slf4j @RequiredArgsConstructor @Service -@DubboService(interfaceClass = SysUser.class) public class AttendanceArrangementServiceImpl implements IAttendanceArrangementService { private final AttendanceArrangementMapper baseMapper; @@ -503,6 +502,13 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS // judgeDate(bo, update); + //根据排班id获取人员id + //根据人员id删除人员信息 + //新增人员信息 + //根据排班id获取部门id + //根据部门id删除部门信息 + //新增部门信息 + //取出当前排班的id assert update != null; Long ArrangementId = update.getId(); @@ -513,6 +519,13 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList) .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + //根据排班id获取部门id + List deptIdList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId)) + .stream().map(AttendanceUserGroup::getDeptId).toList(); + //根据deptId和ArrangementId删除attendanceDeptGroup表中的数据 + userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getDeptId, deptIdList) + .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + //用获取到的排班id向attendanceUserGroup表中批量插入数据 List userGroupList = bo.getUserGroupList(); diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java index 44ecf723..63c4d027 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceUserGroupServiceImpl.java @@ -91,9 +91,9 @@ public class AttendanceUserGroupServiceImpl implements IAttendanceUserGroupServi lqw.orderByAsc(AttendanceUserGroup::getId); lqw.eq(bo.getScheduleId() != null, AttendanceUserGroup::getScheduleId, bo.getScheduleId()); lqw.eq(bo.getEmployeeId() != null, AttendanceUserGroup::getEmployeeId, bo.getEmployeeId()); - lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), AttendanceUserGroup::getEmployeeName, bo.getEmployeeName()); +// lqw.like(StringUtils.isNotBlank(bo.getEmployeeName()), AttendanceUserGroup::getEmployeeName, bo.getEmployeeName()); lqw.eq(bo.getDeptId() != null, AttendanceUserGroup::getDeptId, bo.getDeptId()); - lqw.like(StringUtils.isNotBlank(bo.getDeptName()), AttendanceUserGroup::getDeptName, bo.getDeptName()); +// lqw.like(StringUtils.isNotBlank(bo.getDeptName()), AttendanceUserGroup::getDeptName, bo.getDeptName()); return lqw; } From 59dc46f019ff376a0581289f430d2a50186bbb49 Mon Sep 17 00:00:00 2001 From: lxj <15683799673@163.com> Date: Tue, 12 Aug 2025 15:48:27 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E6=8A=A5=E8=AD=A6=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java | 2 +- .../dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java | 4 ++-- .../sis/service/impl/SisAlarmEventsServiceImpl.java | 7 ++++--- .../sis/service/impl/ZeroSensationPassageServiceImpl.java | 8 ++++---- 4 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java index 9056b669..d5af0418 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/hik/calback/HikAlarmCallBack.java @@ -40,7 +40,7 @@ public class HikAlarmCallBack implements HCNetSDK.FMSGCallBack_V31 { Pointer pFaceSnapInfo = strFaceSnapInfo.getPointer(); pFaceSnapInfo.write(0, pAlarmInfo.getByteArray(0, strFaceSnapInfo.size()), 0, strFaceSnapInfo.size()); strFaceSnapInfo.read(); -// handleFaceSnap(strFaceSnapInfo, pAlarmer); + handleFaceSnap(strFaceSnapInfo, pAlarmer); break; } // 异常行为检测 diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java index c04a8249..c003ade3 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/sdk/zkmedia/ZLMediaKitServiceImpl.java @@ -243,8 +243,8 @@ public class ZLMediaKitServiceImpl implements ZLMediaKitService { commonParams.put("src_url", url); commonParams.put("dst_url", targetUrl); commonParams.put("timeout_ms", 10000); - commonParams.put("enable_hls", false); - commonParams.put("enable_mp4", false); + commonParams.put("enable_hls", true); + commonParams.put("enable_mp4", true); R result = HttpClientUtil.get(getRequestUrl("addFFmpegSource"), commonParams, AddStreamProxyResp.class); if (result != null) { if (result.getCode() == 0) { diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java index 9427887f..9bd6cf42 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/SisAlarmEventsServiceImpl.java @@ -1,5 +1,6 @@ package org.dromara.sis.service.impl; +import cn.dev33.satoken.context.mock.SaTokenContextMockUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -151,7 +152,7 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { @Async @Override @Transactional(rollbackFor = Exception.class) - public void createAlarmRecord(String deviceIp, Integer level, Integer type,String msg, byte[] smallImg, byte[] bigImg) { + public void createAlarmRecord(String deviceIp, Integer level, Integer type, String msg, byte[] smallImg, byte[] bigImg) { // 校验设备信息 SisDeviceManage sisDeviceManage = deviceManageService.queryByDeviceIp(deviceIp); if (sisDeviceManage == null) { @@ -186,10 +187,10 @@ public class SisAlarmEventsServiceImpl implements ISisAlarmEventsService { } public SisAlarmEventAttachments createEventAttachments(byte[] img, SisAlarmEvents alarmEvents, SisDeviceManage sisDeviceManage) { - RemoteFile result = remoteFileService.uploadImg(img); + RemoteFile remoteFile = SaTokenContextMockUtil.setMockContext(() -> remoteFileService.uploadImg(img)); SisAlarmEventAttachments attachments = new SisAlarmEventAttachments(); attachments.setEventId(alarmEvents.getId()); - attachments.setOssId(result.getOssId()); + attachments.setOssId(remoteFile.getOssId()); attachments.setType(1L); attachments.setTenantId(sisDeviceManage.getTenantId()); attachments.setCreateDept(sisDeviceManage.getCreateDept()); diff --git a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java index ccad1e28..75e3ea5a 100644 --- a/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java +++ b/ruoyi-modules/Sis/src/main/java/org/dromara/sis/service/impl/ZeroSensationPassageServiceImpl.java @@ -65,7 +65,7 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer if (result.getCode() != 200) { log.info("华为盒子比对失败,msg={}", result.getMessage()); // 产生告警数据 -// alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg); + alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "人脸比对失败", smallImg, bigImg); return; } log.info("人脸比对执行完成,耗时:{}ms", interval.intervalMs()); @@ -76,19 +76,19 @@ public class ZeroSensationPassageServiceImpl implements IZeroSensationPassageSer if (authRecord == null) { log.info("人员[{}]没有授权记录,判定为陌生人", person); // 不是内部人员 产生紧急的告警信息 -// alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "陌生人员入内", smallImg, bigImg); + alarmEventsService.createAlarmRecord(deviceIp, 1, 1, "陌生人员入内", smallImg, bigImg); return; } else { if (Objects.equals(authRecord.getRosterType(), RosterTypeEnum.BLACK_LIST.getCode())) { log.info("人员[{}]在黑名单中,暂不处理。", person); -// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg); + alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "黑名单人员入内", smallImg, bigImg); return; } } Date now = new Date(); if (DateUtil.compare(now, authRecord.getEndDate()) > 0) { -// alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg); + alarmEventsService.createAlarmRecord(deviceIp, 3, 1, "人员授权信息已过期", smallImg, bigImg); log.info("当前人脸已过期,暂不处理。"); return; } From 1b64c976269e9150fe83bca90cfb4c5d1d88c701 Mon Sep 17 00:00:00 2001 From: dy <2389062315@qq.com> Date: Tue, 12 Aug 2025 16:17:54 +0800 Subject: [PATCH 7/8] 1 --- .../property/domain/AttendanceUserGroup.java | 2 +- .../domain/vo/AttendanceArrangementVo.java | 2 +- .../domain/vo/AttendanceUserGroupVo.java | 4 ++ .../AttendanceArrangementServiceImpl.java | 49 +++++++++++-------- .../service/impl/SysUserServiceImpl.java | 2 + 5 files changed, 36 insertions(+), 23 deletions(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java index bff194a1..666f0ae6 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/AttendanceUserGroup.java @@ -66,7 +66,7 @@ public class AttendanceUserGroup extends TenantEntity { */ private LocalDate endDate; - private SysUser sysUser; +// private SysUser sysUser; } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceArrangementVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceArrangementVo.java index 77cb3442..c2955ad9 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceArrangementVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceArrangementVo.java @@ -79,7 +79,7 @@ public class AttendanceArrangementVo implements Serializable { private AttendanceGroup attendanceGroup; //用户组 - private List userGroupList; + private List userGroupList; //固定排班 private AttendanceWeekSet weekSet; diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java index f8507a78..f64884a3 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/domain/vo/AttendanceUserGroupVo.java @@ -7,6 +7,8 @@ import org.dromara.common.excel.annotation.ExcelDictFormat; import org.dromara.common.excel.convert.ExcelDictConvert; import io.github.linpeilie.annotations.AutoMapper; import lombok.Data; +import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serial; @@ -86,5 +88,7 @@ public class AttendanceUserGroupVo implements Serializable { private AttendanceScheduleCycle scheduleCycle; + private SysUserVo sysUser; + } diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index b64ff3ba..a6462fd5 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.BeanUtils; +import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; @@ -17,10 +18,13 @@ import org.dromara.property.domain.*; import org.dromara.property.domain.bo.AttendanceArrangementBo; import org.dromara.property.domain.constant.StatusConstant; import org.dromara.property.domain.vo.AttendanceArrangementVo; +import org.dromara.property.domain.vo.AttendanceUserGroupVo; import org.dromara.property.mapper.*; import org.dromara.property.service.IAttendanceArrangementService; import org.dromara.system.domain.SysUser; +import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysUserMapper; +import org.dromara.system.service.ISysUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -57,8 +61,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS private final AttendanceScheduleCycleMapper scheduleCycleMapper; - private final SysUserMapper sysUserMapper; - + @DubboReference + private final ISysUserService sysUserService; /** * 查询排班 * @@ -75,7 +79,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS vo.setAttendanceGroup(attendanceGroup); //根据id查询排班人员信息 - List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id)); +// List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id)); + List userGroupList = userGroupMapper.selectVoList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id)); //将排班人员信息添加到排班信息中 vo.setUserGroupList(userGroupList); return vo; @@ -100,6 +105,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS Page result = baseMapper.selectVoPage(pageQuery.build(), ge); Page attendanceArrangementVoPage = result.setRecords(result.getRecords().stream().map(vo -> { + + //根据当前日期查询在开始时间和结束时间之间的排班信息 //从前端查询出来的当前日期,判断是否在排班时间内 if ((bo.getCurrentDate().isAfter(vo.getStartDate()) || bo.getCurrentDate().isEqual(vo.getStartDate())) && (bo.getCurrentDate().isBefore(vo.getEndDate()) || bo.getCurrentDate().isEqual(vo.getEndDate()))) { @@ -107,8 +114,20 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS //根据查询出来的result取出shceduleId Long scheduleId = vo.getId(); //根据排班的id查询出排班的人员详细信息 - List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId)); - vo.setUserGroupList(userGroupList); +// List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId)); + List userGroupVoList = userGroupMapper.selectVoList(Wrappers.lambdaQuery().in(AttendanceUserGroup::getScheduleId, scheduleId)); + //通过userGroupList查询出人员的详细信息 + + //将userList存到userGroupList中 + userGroupVoList.forEach(userGroup -> { + SysUserVo sysUserVo = sysUserService.selectUserById(userGroup.getEmployeeId()); +// SysUserVo sysUserVo1 = sysUserService.selectUserById(userGroupVoList.get(0).getEmployeeId()); + userGroup.setSysUser(sysUserVo); +// userGroup.setSysUser(sysUserVo1); + } + ); + + vo.setUserGroupList(userGroupVoList); //2.查询考勤组信息 //根据查询出来的信息取出考勤组的id @@ -261,7 +280,6 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS } - /** * 查询某个月的日历排班信息的排班列表 * @@ -315,16 +333,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS // 循环排班列表,查询排班人员信息 for (AttendanceArrangementVo vo : result) { // 根据排班查询出人员组的详细信息 - List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId())); - - //通过userGroupList查询出人员的详细信息 - - //将userList存到userGroupList中 - userGroupList.forEach(userGroup -> { - SysUser sysUser = sysUserMapper.selectById(userGroup.getEmployeeId()); - userGroup.setSysUser(sysUser); - } - ); +// List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId())); + List userGroupList = userGroupMapper.selectVoList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, vo.getId())); // 将排班人员信息添加到排班信息中 vo.setUserGroupList(userGroupList); @@ -454,8 +464,6 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS judgeDate(bo, add); - - //取出当前新增的排班的id Long ArrangementId = add.getId(); //用获取到的排班id向attendanceUserGroup表中插入数据 @@ -514,10 +522,10 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS Long ArrangementId = update.getId(); //根据arrangementId查询出人员组的所有employeeId List employeeIdList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId)) - .stream().map(AttendanceUserGroup::getEmployeeId).toList(); + .stream().map(AttendanceUserGroup::getEmployeeId).toList(); //根据employeeId和ArrangementId删除attendanceUserGroup表中的数据 userGroupMapper.delete(Wrappers.lambdaQuery().in(AttendanceUserGroup::getEmployeeId, employeeIdList) - .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); + .eq(AttendanceUserGroup::getScheduleId, ArrangementId)); //根据排班id获取部门id List deptIdList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, ArrangementId)) @@ -602,5 +610,4 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS } - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index e7e8407e..d42d1d44 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.dubbo.config.annotation.DubboService; import org.dromara.common.core.constant.CacheNames; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.exception.ServiceException; @@ -44,6 +45,7 @@ import java.util.Map; @Slf4j @RequiredArgsConstructor @Service +@DubboService public class SysUserServiceImpl implements ISysUserService { private final SysUserMapper baseMapper; From 627f2a1a11731c5526a14dedc830ace48c3e003b Mon Sep 17 00:00:00 2001 From: dy <2389062315@qq.com> Date: Tue, 12 Aug 2025 16:42:50 +0800 Subject: [PATCH 8/8] bug1 --- .../service/impl/AttendanceArrangementServiceImpl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java index a6462fd5..11457675 100644 --- a/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java +++ b/ruoyi-modules/Property/src/main/java/org/dromara/property/service/impl/AttendanceArrangementServiceImpl.java @@ -79,8 +79,12 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS vo.setAttendanceGroup(attendanceGroup); //根据id查询排班人员信息 -// List userGroupList = userGroupMapper.selectList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id)); List userGroupList = userGroupMapper.selectVoList(Wrappers.lambdaQuery().eq(AttendanceUserGroup::getScheduleId, id)); + //查询所有的用户信息 + userGroupList.forEach(userGroup -> { + SysUserVo sysUserVo = sysUserService.selectUserById(userGroup.getEmployeeId()); + userGroup.setSysUser(sysUserVo); + }); //将排班人员信息添加到排班信息中 vo.setUserGroupList(userGroupList); return vo;