From f8f37ae22bf6b80df0b47a086918a117b0700b1e Mon Sep 17 00:00:00 2001 From: lld <15027638633@163.com> Date: Thu, 29 Jan 2026 23:16:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=8E=A7=E5=88=B6=E5=8A=A0?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/agri/common/enums/DtuEnum.java | 34 ++ .../interceptor/DeviceStatusHandler.java | 24 ++ .../interceptor/FrontendControlHandler.java | 27 ++ .../framework/manager/MqttAutoOffManager.java | 61 +++- .../controller/SysDevOperLogController.java | 104 ++++++ .../com/agri/system/domain/SysDevOperLog.java | 297 ++++++++++++++++++ .../system/mapper/SysDevOperLogMapper.java | 62 ++++ .../system/service/ISysDevOperLogService.java | 61 ++++ .../impl/SysDevOperLogServiceImpl.java | 94 ++++++ .../mapper/system/SysDevOperLogMapper.xml | 147 +++++++++ 10 files changed, 908 insertions(+), 3 deletions(-) create mode 100644 agri-common/src/main/java/com/agri/common/enums/DtuEnum.java create mode 100644 agri-system/src/main/java/com/agri/system/controller/SysDevOperLogController.java create mode 100644 agri-system/src/main/java/com/agri/system/domain/SysDevOperLog.java create mode 100644 agri-system/src/main/java/com/agri/system/mapper/SysDevOperLogMapper.java create mode 100644 agri-system/src/main/java/com/agri/system/service/ISysDevOperLogService.java create mode 100644 agri-system/src/main/java/com/agri/system/service/impl/SysDevOperLogServiceImpl.java create mode 100644 agri-system/src/main/resources/mapper/system/SysDevOperLogMapper.xml diff --git a/agri-common/src/main/java/com/agri/common/enums/DtuEnum.java b/agri-common/src/main/java/com/agri/common/enums/DtuEnum.java new file mode 100644 index 0000000..2b9593f --- /dev/null +++ b/agri-common/src/main/java/com/agri/common/enums/DtuEnum.java @@ -0,0 +1,34 @@ +package com.agri.common.enums; + +/** + * 设备功能枚举 + */ +public enum DtuEnum { + + JM1K("jm1k", "卷膜1开"), + JM1G("jm1g", "卷膜1关"), + JM2K("jm2k", "卷膜2开"), + JM2G("jm2g", "卷膜2关"), + JM3K("jm3k", "卷膜3开"), + JM3G("jm3g", "卷膜3关"), + JBK("jbk", "卷被开"), + JBG("jbg", "卷被关"); + + + private final String code; + private final String name; + + DtuEnum(String code, String name) { + this.code = code; + this.name = name; + } + + + public String getCode() { + return code; + } + + public String getName() { + return name; + } +} diff --git a/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceStatusHandler.java b/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceStatusHandler.java index 7d4c870..d3749cd 100644 --- a/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceStatusHandler.java +++ b/agri-framework/src/main/java/com/agri/framework/interceptor/DeviceStatusHandler.java @@ -5,12 +5,16 @@ import com.agri.framework.config.MqttConfig; import com.agri.framework.manager.MqttAutoOffManager; import com.agri.framework.manager.MqttSubscriptionManager; import com.agri.system.domain.SysAgriLimit; +import com.agri.system.domain.SysDevOperLog; import com.agri.system.service.ISysAgriLimitService; +import com.agri.system.service.ISysDevOperLogService; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import org.apache.commons.lang3.ObjectUtils; import org.eclipse.paho.client.mqttv3.MqttException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @@ -76,6 +80,9 @@ public class DeviceStatusHandler { @Value("${spring.mqtt.latest-ttl-seconds:120}") private int latestTtlSeconds; + @Autowired + private ISysDevOperLogService sysDevOperLogService; + // 初始化映射(建议放在类初始化块/构造方法中,只初始化一次) private static final Map> LIMIT_MAP = new HashMap<>(); private static final Set VALID_FUNC_CODES = new HashSet<>(); @@ -171,6 +178,23 @@ public class DeviceStatusHandler { mqttAutoOffManager.scheduleAutoOff(deviceId, funcType, autoOffSeconds); log.debug("【自动关任务】标记需要执行,deviceId={}, funcType={}, delay={}s", deviceId, funcType, autoOffSeconds); } + + sysDevOperLogService.lambdaUpdate() + .eq(SysDevOperLog::getImei, deviceId) + .eq(SysDevOperLog::getFuncCode, funcType) + .eq(SysDevOperLog::getOpType, funcValue) + .eq(SysDevOperLog::getLockAcquired,1) + .orderByDesc(SysDevOperLog::getCreateTime) + .last("LIMIT 1") + .set(SysDevOperLog::getExecResult,1) + .set(SysDevOperLog::getAckReceived,1) + .set(SysDevOperLog::getIsLockSuc,1) + .set(SysDevOperLog::getAckSuc, 1) + .set(SysDevOperLog::getIsTask,autoOffSeconds > 0?1:0) + .set(ObjectUtils.isEmpty(autoOffSeconds), SysDevOperLog::getNoTaskReason,"当前运行时间:【"+autoOffSeconds+"】") + .set(SysDevOperLog::getAck, payload) + .set(SysDevOperLog::getExecResult, 1) + .update(); } if (suc && StringUtils.hasText(funcType) && funcValue != null && funcValue == 0) { diff --git a/agri-framework/src/main/java/com/agri/framework/interceptor/FrontendControlHandler.java b/agri-framework/src/main/java/com/agri/framework/interceptor/FrontendControlHandler.java index 7d566c0..972df3b 100644 --- a/agri-framework/src/main/java/com/agri/framework/interceptor/FrontendControlHandler.java +++ b/agri-framework/src/main/java/com/agri/framework/interceptor/FrontendControlHandler.java @@ -2,10 +2,15 @@ package com.agri.framework.interceptor; import com.agri.framework.config.MqttConfig; import com.agri.framework.manager.MqttAutoOffManager; +import com.agri.system.domain.SysAgriInfo; import com.agri.system.domain.SysAgriLimit; +import com.agri.system.domain.SysDevOperLog; +import com.agri.system.service.ISysAgriInfoService; import com.agri.system.service.ISysAgriLimitService; +import com.agri.system.service.ISysDevOperLogService; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.TypeReference; +import org.apache.commons.lang3.ObjectUtils; import org.eclipse.paho.client.mqttv3.MqttException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -56,6 +61,12 @@ public class FrontendControlHandler { @Autowired private ISysAgriLimitService agriLimitService; + @Autowired + private ISysAgriInfoService sysAgriInfoService; + @Autowired + private ISysDevOperLogService sysDevOperLogService; + + @Value("${dtu-ctl-lock-ttl}") private int dtuCtlLockTTL; private static final Map> LIMIT_MAP = new HashMap<>(); @@ -133,6 +144,22 @@ public class FrontendControlHandler { //todo mqttMessageSender.publish(deviceTopic, payload); // testAutoOffTask(deviceId,funcCodeMap); + + SysAgriInfo agriInfo = sysAgriInfoService.lambdaQuery() + .eq(SysAgriInfo::getImei, deviceId) + .one(); + String agriName = (agriInfo!=null && ObjectUtils.isNotEmpty(agriInfo.getAgriName()))?agriInfo.getAgriName():null; + SysDevOperLog logDto = new SysDevOperLog(); + logDto.setAgriName(agriName); + logDto.setImei(deviceId); + logDto.setFuncCode(funcType); + logDto.setOpType(funcCodeMap.get(funcType)); + logDto.setOpSource(1); + logDto.setPayload(payload); + logDto.setLockAcquired(1); + logDto.setLockHolder(clientId); + logDto.setExecResult(1); + sysDevOperLogService.save(logDto); log.info("【指令转发】前端{} → 设备{}的{}功能", clientId, deviceId, funcType); } diff --git a/agri-framework/src/main/java/com/agri/framework/manager/MqttAutoOffManager.java b/agri-framework/src/main/java/com/agri/framework/manager/MqttAutoOffManager.java index daca774..e7c0dd8 100644 --- a/agri-framework/src/main/java/com/agri/framework/manager/MqttAutoOffManager.java +++ b/agri-framework/src/main/java/com/agri/framework/manager/MqttAutoOffManager.java @@ -2,11 +2,17 @@ package com.agri.framework.manager; import com.agri.common.utils.wechat.WxUtil; import com.agri.framework.config.MqttConfig; +import com.agri.system.domain.SysAgriInfo; +import com.agri.system.domain.SysDevOperLog; +import com.agri.system.service.ISysAgriInfoService; +import com.agri.system.service.ISysDevOperLogService; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; +import org.apache.commons.lang3.ObjectUtils; import org.eclipse.paho.client.mqttv3.MqttException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; @@ -67,6 +73,12 @@ public class MqttAutoOffManager { @Value("${dtu-ctl-lock-ttl}") private int dtuCtlLockTTL; + @Autowired + private ISysAgriInfoService sysAgriInfoService; + @Autowired + private ISysDevOperLogService sysDevOperLogService; + + /** * 初始化自动关任务线程池 * @param corePoolSize 核心线程数 @@ -201,8 +213,10 @@ public class MqttAutoOffManager { // 新增:读取最新状态(device:latest:{deviceId}),若仍为1则下发 {"funcType":0} 到 dtu/{id}/down private void runAutoOff(String deviceId, String funcType) throws MqttException { String latest = stringRedisTemplate.opsForValue().get("device:latest:" + deviceId); + String skipReason = ""; if (!StringUtils.hasText(latest)) { //todo + skipReason = "【自动关任务】无最新状态"; log.warn("【自动关任务】无最新状态,跳过:deviceId={}, funcType={}", deviceId, funcType); return; } @@ -211,11 +225,13 @@ public class MqttAutoOffManager { try { latestObj = JSON.parseObject(latest); } catch (Exception e) { + skipReason = "【自动关任务】执行报错-解析异常"; WxUtil.pushText("自动关任务执行报错-解析异常:\n deviceId: " + deviceId + "\n funcType:" + funcType+"\n 异常:"+e.getMessage()+"\n Cause: "+e.getCause()); log.warn("【自动关任务】最新状态JSON解析失败,跳过:deviceId={}, funcType={}", deviceId, funcType); return; } if (latestObj == null || latestObj.isEmpty()) { + skipReason = "【自动关任务】最新状态为空"; return; } @@ -226,8 +242,23 @@ public class MqttAutoOffManager { current = latestObj.getIntValue(funcType); } } catch (Exception ignore) { + skipReason = "【自动关任务】最新状态功能码获取失败"; } + sysDevOperLogService.lambdaUpdate() + .eq(SysDevOperLog::getImei, deviceId) + .eq(SysDevOperLog::getFuncCode, funcType) + .eq(SysDevOperLog::getOpType, 1) + .eq(SysDevOperLog::getOpSource, 1) + .eq(SysDevOperLog::getAckSuc, 1) + .eq(SysDevOperLog::getIsTask, 1) + .orderByDesc(SysDevOperLog::getCreateTime) + .last("LIMIT 1") + .set(SysDevOperLog::getExecResult,1) + .set(SysDevOperLog::getLatestState, latest) + .set(!skipReason.isEmpty(), SysDevOperLog::getSkipReason, skipReason) + .update(); + if (current != null && current == 1) { // 新增:自动关也走分布式锁(避免与前端并发控制同一功能导致乱序/互相覆盖) String lockKey = "lock:" + deviceId + ":" + funcType; @@ -238,12 +269,28 @@ public class MqttAutoOffManager { log.info("【自动关任务】{}功能忙(锁占用),跳过自动关闭:deviceId={}, funcType={}", funcType, deviceId, funcType); return; } + String deviceTopic = "dtu/" + deviceId + "/down"; JSONObject down = new JSONObject(); down.put(funcType, 0); - - String deviceTopic = "dtu/" + deviceId + "/down"; - //todo mqttMessageSender.publish(deviceTopic, down.toJSONString()); + + SysAgriInfo agriInfo = sysAgriInfoService.lambdaQuery() + .eq(SysAgriInfo::getImei, deviceId) + .one(); + String agriName = (agriInfo!=null && ObjectUtils.isNotEmpty(agriInfo.getAgriName()))?agriInfo.getAgriName():null; + SysDevOperLog logDto = new SysDevOperLog(); + logDto.setAgriName(agriName); + logDto.setImei(deviceId); + logDto.setFuncCode(funcType); + logDto.setOpType(0); + logDto.setOpSource(2); + logDto.setPayload(down.toJSONString()); + logDto.setLockAcquired(1); + logDto.setLockHolder("autoOff"); + logDto.setExecResult(1); + logDto.setLatestState(latest); + logDto.setTaskStatus(getFutureStatus().toString()); + sysDevOperLogService.save(logDto); log.info("【自动关任务】检测仍在运行,已下发关闭:deviceId={}, funcType={}, payload={}", deviceId, funcType, down.toJSONString()); } else { log.info("【自动关任务】检测未运行或状态未知,跳过关闭:deviceId={}, funcType={}, current={}", deviceId, funcType, current); @@ -293,5 +340,13 @@ public class MqttAutoOffManager { return autoOffDeviceCnt.size(); } + public JSONObject getFutureStatus() { + JSONObject json = new JSONObject(); + json.put("isEnabled", true); + json.put("isExecutorInited", autoOffExecutor != null); + json.put("getTotalTaskCount", autoOffFutureMap.size()); + json.put("getDeviceTaskCount", autoOffDeviceCnt.size()); + return json; + } } \ No newline at end of file diff --git a/agri-system/src/main/java/com/agri/system/controller/SysDevOperLogController.java b/agri-system/src/main/java/com/agri/system/controller/SysDevOperLogController.java new file mode 100644 index 0000000..8fe47ed --- /dev/null +++ b/agri-system/src/main/java/com/agri/system/controller/SysDevOperLogController.java @@ -0,0 +1,104 @@ +package com.agri.system.controller; + +import java.util.List; +import javax.servlet.http.HttpServletResponse; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.agri.common.annotation.Log; +import com.agri.common.core.controller.BaseController; +import com.agri.common.core.domain.AjaxResult; +import com.agri.common.enums.BusinessType; +import com.agri.system.domain.SysDevOperLog; +import com.agri.system.service.ISysDevOperLogService; +import com.agri.common.utils.poi.ExcelUtil; +import com.agri.common.core.page.TableDataInfo; + +/** + * 设备控制操作日志Controller + * + * @author lld + * @date 2026-01-29 + */ +@RestController +@RequestMapping("/control/controllog") +public class SysDevOperLogController extends BaseController +{ + @Autowired + private ISysDevOperLogService sysDevOperLogService; + + /** + * 查询设备控制操作日志列表 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:list')") + @GetMapping("/list") + public TableDataInfo list(SysDevOperLog sysDevOperLog) + { + startPage(); + List list = sysDevOperLogService.selectSysDevOperLogList(sysDevOperLog); + return getDataTable(list); + } + + /** + * 导出设备控制操作日志列表 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:export')") + @Log(title = "设备控制操作日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(HttpServletResponse response, SysDevOperLog sysDevOperLog) + { + List list = sysDevOperLogService.selectSysDevOperLogList(sysDevOperLog); + ExcelUtil util = new ExcelUtil(SysDevOperLog.class); + util.exportExcel(response, list, "设备控制操作日志数据"); + } + + /** + * 获取设备控制操作日志详细信息 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:query')") + @GetMapping(value = "/{id}") + public AjaxResult getInfo(@PathVariable("id") Long id) + { + return success(sysDevOperLogService.selectSysDevOperLogById(id)); + } + + /** + * 新增设备控制操作日志 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:add')") + @Log(title = "设备控制操作日志", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody SysDevOperLog sysDevOperLog) + { + return toAjax(sysDevOperLogService.insertSysDevOperLog(sysDevOperLog)); + } + + /** + * 修改设备控制操作日志 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:edit')") + @Log(title = "设备控制操作日志", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody SysDevOperLog sysDevOperLog) + { + return toAjax(sysDevOperLogService.updateSysDevOperLog(sysDevOperLog)); + } + + /** + * 删除设备控制操作日志 + */ + @PreAuthorize("@ss.hasPermi('control:controllog:remove')") + @Log(title = "设备控制操作日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) + { + return toAjax(sysDevOperLogService.deleteSysDevOperLogByIds(ids)); + } +} diff --git a/agri-system/src/main/java/com/agri/system/domain/SysDevOperLog.java b/agri-system/src/main/java/com/agri/system/domain/SysDevOperLog.java new file mode 100644 index 0000000..56d3170 --- /dev/null +++ b/agri-system/src/main/java/com/agri/system/domain/SysDevOperLog.java @@ -0,0 +1,297 @@ +package com.agri.system.domain; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Builder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableName; +import com.agri.common.annotation.Excel; +import com.agri.common.core.domain.BaseEntity; + +/** + * 设备控制操作日志对象 sys_dev_oper_log + * + * @author lld + * @date 2026-01-29 + */ +@TableName("sys_dev_oper_log") +public class SysDevOperLog extends BaseEntity +{ + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + /** 主键ID */ + @TableId(type = IdType.ASSIGN_ID) + @JsonSerialize(using = ToStringSerializer.class) + private Long id; + + /** 大棚名称 */ + @Excel(name = "大棚名称") + private String agriName; + + /** imei */ + @Excel(name = "imei") + private String imei; + + /** 功能码 */ + @Excel(name = "功能码") + private String funcCode; + + /** 操作类型 */ + @Excel(name = "操作类型") + private int opType; + + /** 操作来源 */ + @Excel(name = "操作来源") + private int opSource; + + /** 指令 */ + @Excel(name = "指令") + private String payload; + + /** 是否成功获取锁 */ + @Excel(name = "是否成功获取锁") + private int lockAcquired; + + /** 锁持有者 */ + @Excel(name = "锁持有者") + private String lockHolder; + + /** 当前任务队列情况 */ + @Excel(name = "当前任务队列情况") + private String taskStatus; + + /** 是否收到设备回执 */ + @Excel(name = "是否收到设备回执") + private int ackReceived; + + /** 设备控制是否成功 */ + @Excel(name = "设备控制是否成功") + private int ackSuc; + + /** 设备控制锁是否释放成功 */ + @Excel(name = "设备控制锁是否释放成功") + private int isLockSuc; + + /** 是否触发定时任务 */ + @Excel(name = "是否触发定时任务") + private int isTask; + + /** 未触发原因 */ + @Excel(name = "未触发原因") + private String noTaskReason; + + /** 设备回执 */ + @Excel(name = "设备回执") + private String ack; + + /** 自动关任务最终执行结果 */ + @Excel(name = "自动关任务最终执行结果") + private int execResult; + + /** 未执行原因(如:锁占用、无最新状态、JSON异常) */ + @Excel(name = "未执行原因", readConverterExp = "如=:锁占用、无最新状态、JSON异常") + private String skipReason; + + /** 执行前读取的状态快照 */ + @Excel(name = "执行前读取的状态快照") + private String latestState; + + /** 乐观锁版本号 */ + @Version + private Long version; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getAgriName() { + return agriName; + } + + public void setAgriName(String agriName) { + this.agriName = agriName; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getFuncCode() { + return funcCode; + } + + public void setFuncCode(String funcCode) { + this.funcCode = funcCode; + } + + public int getOpType() { + return opType; + } + + public void setOpType(int opType) { + this.opType = opType; + } + + public int getOpSource() { + return opSource; + } + + public void setOpSource(int opSource) { + this.opSource = opSource; + } + + public String getPayload() { + return payload; + } + + public void setPayload(String payload) { + this.payload = payload; + } + + public int getLockAcquired() { + return lockAcquired; + } + + public void setLockAcquired(int lockAcquired) { + this.lockAcquired = lockAcquired; + } + + public String getLockHolder() { + return lockHolder; + } + + public void setLockHolder(String lockHolder) { + this.lockHolder = lockHolder; + } + + public String getTaskStatus() { + return taskStatus; + } + + public void setTaskStatus(String taskStatus) { + this.taskStatus = taskStatus; + } + + public int getAckReceived() { + return ackReceived; + } + + public void setAckReceived(int ackReceived) { + this.ackReceived = ackReceived; + } + + public int getAckSuc() { + return ackSuc; + } + + public void setAckSuc(int ackSuc) { + this.ackSuc = ackSuc; + } + + public int getIsLockSuc() { + return isLockSuc; + } + + public void setIsLockSuc(int isLockSuc) { + this.isLockSuc = isLockSuc; + } + + public int getIsTask() { + return isTask; + } + + public void setIsTask(int isTask) { + this.isTask = isTask; + } + + public String getNoTaskReason() { + return noTaskReason; + } + + public void setNoTaskReason(String noTaskReason) { + this.noTaskReason = noTaskReason; + } + + public String getAck() { + return ack; + } + + public void setAck(String ack) { + this.ack = ack; + } + + public int getExecResult() { + return execResult; + } + + public void setExecResult(int execResult) { + this.execResult = execResult; + } + + public String getSkipReason() { + return skipReason; + } + + public void setSkipReason(String skipReason) { + this.skipReason = skipReason; + } + + + public String getLatestState() { + return latestState; + } + + public void setLatestState(String latestState) { + this.latestState = latestState; + } + + public Long getVersion() { + return version; + } + + public void setVersion(Long version) { + this.version = version; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("agriName", getAgriName()) + .append("imei", getImei()) + .append("funcCode", getFuncCode()) + .append("opType", getOpType()) + .append("opSource", getOpSource()) + .append("payload", getPayload()) + .append("lockAcquired", getLockAcquired()) + .append("lockHolder", getLockHolder()) + .append("taskStatus", getTaskStatus()) + .append("ackReceived", getAckReceived()) + .append("ackSuc", getAckSuc()) + .append("isLockSuc", getIsLockSuc()) + .append("isTask", getIsTask()) + .append("noTaskReason", getNoTaskReason()) + .append("ack", getAck()) + .append("execResult", getExecResult()) + .append("skipReason", getSkipReason()) + .append("latestState", getLatestState()) + .append("remark", getRemark()) + .append("version", getVersion()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/agri-system/src/main/java/com/agri/system/mapper/SysDevOperLogMapper.java b/agri-system/src/main/java/com/agri/system/mapper/SysDevOperLogMapper.java new file mode 100644 index 0000000..6d4a6c3 --- /dev/null +++ b/agri-system/src/main/java/com/agri/system/mapper/SysDevOperLogMapper.java @@ -0,0 +1,62 @@ +package com.agri.system.mapper; + +import java.util.List; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.agri.system.domain.SysDevOperLog; + +/** + * 设备控制操作日志Mapper接口 + * + * @author lld + * @date 2026-01-29 + */ +public interface SysDevOperLogMapper extends BaseMapper +{ + /** + * 查询设备控制操作日志 + * + * @param id 设备控制操作日志主键 + * @return 设备控制操作日志 + */ + public SysDevOperLog selectSysDevOperLogById(Long id); + + /** + * 查询设备控制操作日志列表 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 设备控制操作日志集合 + */ + public List selectSysDevOperLogList(SysDevOperLog sysDevOperLog); + + /** + * 新增设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + public int insertSysDevOperLog(SysDevOperLog sysDevOperLog); + + /** + * 修改设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + public int updateSysDevOperLog(SysDevOperLog sysDevOperLog); + + /** + * 删除设备控制操作日志 + * + * @param id 设备控制操作日志主键 + * @return 结果 + */ + public int deleteSysDevOperLogById(Long id); + + /** + * 批量删除设备控制操作日志 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + public int deleteSysDevOperLogByIds(Long[] ids); +} diff --git a/agri-system/src/main/java/com/agri/system/service/ISysDevOperLogService.java b/agri-system/src/main/java/com/agri/system/service/ISysDevOperLogService.java new file mode 100644 index 0000000..2f87a3b --- /dev/null +++ b/agri-system/src/main/java/com/agri/system/service/ISysDevOperLogService.java @@ -0,0 +1,61 @@ +package com.agri.system.service; + +import java.util.List; +import com.baomidou.mybatisplus.extension.service.IService; +import com.agri.system.domain.SysDevOperLog; + +/** + * 设备控制操作日志Service接口 + * + * @author lld + * @date 2026-01-29 + */ +public interface ISysDevOperLogService extends IService { + /** + * 查询设备控制操作日志 + * + * @param id 设备控制操作日志主键 + * @return 设备控制操作日志 + */ + public SysDevOperLog selectSysDevOperLogById(Long id); + + /** + * 查询设备控制操作日志列表 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 设备控制操作日志集合 + */ + public List selectSysDevOperLogList(SysDevOperLog sysDevOperLog); + + /** + * 新增设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + public int insertSysDevOperLog(SysDevOperLog sysDevOperLog); + + /** + * 修改设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + public int updateSysDevOperLog(SysDevOperLog sysDevOperLog); + + /** + * 批量删除设备控制操作日志 + * + * @param ids 需要删除的设备控制操作日志主键集合 + * @return 结果 + */ + public int deleteSysDevOperLogByIds(Long[] ids); + + /** + * 删除设备控制操作日志信息 + * + * @param id 设备控制操作日志主键 + * @return 结果 + */ + public int deleteSysDevOperLogById(Long id); +} diff --git a/agri-system/src/main/java/com/agri/system/service/impl/SysDevOperLogServiceImpl.java b/agri-system/src/main/java/com/agri/system/service/impl/SysDevOperLogServiceImpl.java new file mode 100644 index 0000000..bdb48d0 --- /dev/null +++ b/agri-system/src/main/java/com/agri/system/service/impl/SysDevOperLogServiceImpl.java @@ -0,0 +1,94 @@ +package com.agri.system.service.impl; + +import java.util.List; +import com.agri.common.utils.DateUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import com.agri.system.mapper.SysDevOperLogMapper; +import com.agri.system.domain.SysDevOperLog; +import com.agri.system.service.ISysDevOperLogService; + +/** + * 设备控制操作日志Service业务层处理 + * + * @author lld + * @date 2026-01-29 + */ +@Service +public class SysDevOperLogServiceImpl extends ServiceImpl implements ISysDevOperLogService +{ + + /** + * 查询设备控制操作日志 + * + * @param id 设备控制操作日志主键 + * @return 设备控制操作日志 + */ + @Override + public SysDevOperLog selectSysDevOperLogById(Long id) + { + return baseMapper.selectSysDevOperLogById(id); + } + + /** + * 查询设备控制操作日志列表 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 设备控制操作日志 + */ + @Override + public List selectSysDevOperLogList(SysDevOperLog sysDevOperLog) + { + return baseMapper.selectSysDevOperLogList(sysDevOperLog); + } + + /** + * 新增设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + @Override + public int insertSysDevOperLog(SysDevOperLog sysDevOperLog) + { + sysDevOperLog.setCreateTime(DateUtils.getNowDate()); + return baseMapper.insertSysDevOperLog(sysDevOperLog); + } + + /** + * 修改设备控制操作日志 + * + * @param sysDevOperLog 设备控制操作日志 + * @return 结果 + */ + @Override + public int updateSysDevOperLog(SysDevOperLog sysDevOperLog) + { + sysDevOperLog.setUpdateTime(DateUtils.getNowDate()); + return baseMapper.updateSysDevOperLog(sysDevOperLog); + } + + /** + * 批量删除设备控制操作日志 + * + * @param ids 需要删除的设备控制操作日志主键 + * @return 结果 + */ + @Override + public int deleteSysDevOperLogByIds(Long[] ids) + { + return baseMapper.deleteSysDevOperLogByIds(ids); + } + + /** + * 删除设备控制操作日志信息 + * + * @param id 设备控制操作日志主键 + * @return 结果 + */ + @Override + public int deleteSysDevOperLogById(Long id) + { + return baseMapper.deleteSysDevOperLogById(id); + } +} diff --git a/agri-system/src/main/resources/mapper/system/SysDevOperLogMapper.xml b/agri-system/src/main/resources/mapper/system/SysDevOperLogMapper.xml new file mode 100644 index 0000000..8ea617a --- /dev/null +++ b/agri-system/src/main/resources/mapper/system/SysDevOperLogMapper.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, agri_name, imei, func_code, op_type, op_source, payload, lock_acquired, lock_holder, task_status, ack_received, ack_suc, is_lock_suc, is_task, no_task_reason, ack, exec_result, skip_reason, latest_state, remark, version, create_by, create_time, update_by, update_time from sys_dev_oper_log + + + + + + + + insert into sys_dev_oper_log + + agri_name, + imei, + func_code, + op_type, + op_source, + payload, + lock_acquired, + lock_holder, + task_status, + ack_received, + ack_suc, + is_lock_suc, + is_task, + no_task_reason, + ack, + exec_result, + skip_reason, + latest_state, + remark, + version, + create_by, + create_time, + update_by, + update_time, + + + #{agriName}, + #{imei}, + #{funcCode}, + #{opType}, + #{opSource}, + #{payload}, + #{lockAcquired}, + #{lockHolder}, + #{taskStatus}, + #{ackReceived}, + #{ackSuc}, + #{isLockSuc}, + #{isTask}, + #{noTaskReason}, + #{ack}, + #{execResult}, + #{skipReason}, + #{latestState}, + #{remark}, + #{version}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update sys_dev_oper_log + + agri_name = #{agriName}, + imei = #{imei}, + func_code = #{funcCode}, + op_type = #{opType}, + op_source = #{opSource}, + payload = #{payload}, + lock_acquired = #{lockAcquired}, + lock_holder = #{lockHolder}, + task_status = #{taskStatus}, + ack_received = #{ackReceived}, + ack_suc = #{ackSuc}, + is_lock_suc = #{isLockSuc}, + is_task = #{isTask}, + no_task_reason = #{noTaskReason}, + ack = #{ack}, + exec_result = #{execResult}, + skip_reason = #{skipReason}, + latest_state = #{latestState}, + remark = #{remark}, + version = #{version}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from sys_dev_oper_log where id = #{id} + + + + delete from sys_dev_oper_log where id in + + #{id} + + + \ No newline at end of file