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