fix: 微信支付,登录接口。

This commit is contained in:
tianyongbao
2026-01-16 14:33:21 +08:00
parent fe0f3e0432
commit 32844af3dd
34 changed files with 2581 additions and 145 deletions

View File

@@ -0,0 +1,72 @@
package com.intc.fishery.constant;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 操作记录类型枚举
*
* @author intc
*/
@Getter
@AllArgsConstructor
public enum OpRecordType {
/**
* 无
*/
NONE(0, ""),
/**
* 用户操作
*/
OP_BY_USER(1, "用户操作"),
/**
* 物理按键操作
*/
OP_BY_HARDWARE(2, "物理按键操作"),
/**
* 单次定时操作
*/
OP_BY_TIMING_CTRL_ONE(3, "单次定时操作"),
/**
* 循环定时操作
*/
OP_BY_TIMING_CTRL_LOOP(4, "循环定时操作"),
/**
* 联动控制
*/
OP_BY_LINKED_CTRL(5, "联动控制");
/**
* 类型值
*/
private final Integer code;
/**
* 类型描述
*/
private final String desc;
/**
* 根据code获取枚举
*
* @param code 类型值
* @return 枚举对象
*/
public static OpRecordType getByCode(Integer code) {
if (code == null) {
return NONE;
}
for (OpRecordType type : values()) {
if (type.getCode().equals(code)) {
return type;
}
}
return NONE;
}
}

View File

@@ -47,6 +47,7 @@ import com.intc.fishery.mapper.PondMapper;
import com.intc.fishery.mapper.LinkedCtrlMapper;
import com.intc.fishery.mapper.DeviceCorrectRecordMapper;
import com.intc.fishery.constant.DefineDeviceWarnCode;
import com.intc.fishery.utils.MessageOpRecordUtil;
import com.intc.common.core.config.properties.DeviceTypeProperties;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -490,12 +491,15 @@ public class DeviceController extends BaseController {
return R.fail("更新失败");
}
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),溶解氧告警开关:%s, 免打扰开关:%s。",
// device.getDeviceName(), device.getSerialNum(),
// request.getIsOpen() == 1 ? "打开" : "关闭",
// request.getIsNoDisturb() == 1 ? "打开" : "关闭"));
// 记录操作日志
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警设置",
String.format("%s(%s) 溶解氧告警开关:%s, 免打扰开关:%s",
device.getDeviceName(), device.getSerialNum(),
request.getIsOpen() == 1 ? "打开" : "关闭",
request.getIsNoDisturb() == 1 ? "打开" : "关闭")
);
return R.ok();
}
@@ -520,12 +524,15 @@ public class DeviceController extends BaseController {
return R.fail("更新失败");
}
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),温度告警开关:%s, 免打扰开关:%s。",
// device.getDeviceName(), device.getSerialNum(),
// request.getIsOpen() == 1 ? "打开" : "关闭",
// request.getIsNoDisturb() == 1 ? "打开" : "关闭"));
// 记录操作日志
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警设置",
String.format("%s(%s) 温度告警开关:%s, 免打扰开关:%s",
device.getDeviceName(), device.getSerialNum(),
request.getIsOpen() == 1 ? "打开" : "关闭",
request.getIsNoDisturb() == 1 ? "打开" : "关闭")
);
return R.ok();
}
@@ -579,11 +586,13 @@ public class DeviceController extends BaseController {
// 记录操作日志(仅当值发生变化时)
if (oldValue == null || !oldValue.equals(request.getOxyWarnLower())) {
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),设置溶解氧下限告警值:%smg/L。",
// device.getDeviceName(), device.getSerialNum(),
// request.getOxyWarnLower()));
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警值设置",
String.format("%s(%s) 设置溶解氧下限告警值:%smg/L",
device.getDeviceName(), device.getSerialNum(),
request.getOxyWarnLower())
);
}
return R.ok();
@@ -641,18 +650,22 @@ public class DeviceController extends BaseController {
// 记录操作日志(仅当值发生变化时)
if (oldUpper == null || Math.abs(oldUpper - request.getTempWarnUpper()) > 0.00001) {
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),设置温度上限告警值:%s℃。",
// device.getDeviceName(), device.getSerialNum(),
// request.getTempWarnUpper()));
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警值设置",
String.format("%s(%s) 设置温度上限告警值:%s℃",
device.getDeviceName(), device.getSerialNum(),
request.getTempWarnUpper())
);
}
if (oldLower == null || Math.abs(oldLower - request.getTempWarnLower()) > 0.00001) {
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),设置温度下限告警值:%s℃。",
// device.getDeviceName(), device.getSerialNum(),
// request.getTempWarnLower()));
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警值设置",
String.format("%s(%s) 设置温度下限告警值:%s℃",
device.getDeviceName(), device.getSerialNum(),
request.getTempWarnLower())
);
}
return R.ok();
@@ -823,10 +836,13 @@ public class DeviceController extends BaseController {
return R.fail("更新失败");
}
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s) 从 %s 移除。",
// device.getDeviceName(), device.getSerialNum(), pondName));
// 记录操作日志
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备塑口操作",
String.format("%s(%s) 从 %s 移除",
device.getDeviceName(), device.getSerialNum(), pondName)
);
// TODO: 清除设备告警等待和通知
// await EventHelper.RemoveDeviceWarnWaitAndNotice(request.getId(), DefineDeviceWarnCode.None);
@@ -882,11 +898,14 @@ public class DeviceController extends BaseController {
return R.fail("更新失败");
}
// TODO: 记录操作日志
// 记录操作日志
String op = request.getIsOpen() == 1 ? "开启" : "关闭";
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s)设置电压告警开关:%s。",
// device.getDeviceName(), device.getSerialNum(), op));
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备告警设置",
String.format("%s(%s) 设置电压告警开关:%s",
device.getDeviceName(), device.getSerialNum(), op)
);
return R.ok();
}
@@ -971,11 +990,14 @@ public class DeviceController extends BaseController {
// DefineDeviceWarnCode.DetectorSalinityOffline);
}
// TODO: 记录操作日志
// 记录操作日志
String operation = request.getIsOpen() == 1 ? "启用溶解氧" : "禁用溶解氧";
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s)%s。",
// device.getDeviceName(), device.getSerialNum(), operation));
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备功能设置",
String.format("%s(%s) %s",
device.getDeviceName(), device.getSerialNum(), operation)
);
return R.ok(deviceBaseData);
}

View File

@@ -52,6 +52,7 @@ import com.intc.fishery.constant.DefineDeviceWarnCode;
import com.intc.fishery.constant.DefineDeviceErrorCode;
import com.intc.fishery.mapper.TimingCtrlMapper;
import com.intc.fishery.domain.TimingCtrl;
import com.intc.fishery.utils.MessageOpRecordUtil;
/**
* 塘口管理
@@ -584,12 +585,12 @@ public class PondController extends BaseController {
// // 清除该设备的报警等待和通知数据
// }
// TODO: 操作记录(类似C#中的CacheData.AddMessageOpRecordUser)
// 可以集成到日志系统中记录以下操作:
// 1. 设备添加到塘口: dictDeviceAdd
// 2. 设备从塘口移除: dictDeviceRemove
// 3. 开关添加到塘口: dictSwitchAdd
// 4. 开关从塘口移除: dictSwitchRemove
// 记录操作日志
// 记录设备添加到塘口的操作
// 记录设备从塘口移除的操作
// 记录开关添加到塘口的操作
// 记录开关从塘口移除的操作
// 具体操作记录可根据业务需求在dictDeviceAdd等集合遍历时添加
return R.ok();
}
@@ -918,18 +919,24 @@ public class PondController extends BaseController {
.set(Device::getIsOxygenWarnExist, 0)
);
// TODO: 记录操作日志
// if (oldPondId != null) {
// // 转移到塘口
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),转移到塘口:%s。",
// device.getDeviceName(), device.getSerialNum(), pond.getPondName()));
// } else {
// // 分配塘口
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s),分配塘口:%s。",
// device.getDeviceName(), device.getSerialNum(), pond.getPondName()));
// }
// 记录操作日志
if (oldPondId != null) {
// 转移到塘口
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备塘口操作",
String.format("%s(%s) 转移到塘口:%s",
device.getDeviceName(), device.getSerialNum(), pond.getPondName())
);
} else {
// 分配塘口
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备塘口操作",
String.format("%s(%s) 分配塘口:%s",
device.getDeviceName(), device.getSerialNum(), pond.getPondName())
);
}
}
// 情凵2从塘口移除
else {
@@ -942,16 +949,19 @@ public class PondController extends BaseController {
.set(Device::getIsOxygenWarnExist, 0)
);
// TODO: 记录操作日志
// if (oldPondId != null) {
// // 需要查询原塘口名称
// Pond oldPond = pondMapper.selectById(oldPondId);
// if (oldPond != null) {
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "设备操作",
// String.format("%s(%s) 从 %s 移除。",
// device.getDeviceName(), device.getSerialNum(), oldPond.getPondName()));
// }
// }
// 记录操作日志
if (oldPondId != null) {
// 需要查询原塘口名称
Pond oldPond = pondMapper.selectById(oldPondId);
if (oldPond != null) {
MessageOpRecordUtil.addMessageOpRecordUser(
rootUserId,
"设备塘口操作",
String.format("%s(%s) 从 %s 移除",
device.getDeviceName(), device.getSerialNum(), oldPond.getPondName())
);
}
}
}
// TODO: 清除设备报警等待和通知数据
@@ -1006,10 +1016,13 @@ public class PondController extends BaseController {
return R.fail("更新失败");
}
// TODO: 记录操作日志
// String op = request.getIsOpen() == 1 ? "开启" : "关闭";
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "塘口操作",
// String.format("塘口(%s夜间防误关%s", pond.getPondName(), op));
// 记录操作日志
String op = request.getIsOpen() == 1 ? "开启" : "关闭";
MessageOpRecordUtil.addMessageOpRecordUser(
pond.getUserId(),
"塘口设置",
String.format("塘口(%s夜间防误关%s", pond.getPondName(), op)
);
return R.ok();
}

View File

@@ -33,6 +33,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import java.util.Calendar;
import java.util.stream.Collectors;
import java.util.Date;
import com.intc.fishery.utils.MessageOpRecordUtil;
/**
* 开关定时控制
@@ -255,10 +256,13 @@ public class TimingCtrlController extends BaseController {
int result = timingCtrlMapper.insert(timingCtrl);
if (result > 0) {
// TODO: 记录操作日志
// CacheData.AddMessageOpRecordUser(rootUserId, userId, "开关定时控制",
// String.format("%s(%s)新增定时控制。",
// device.getDeviceName(), deviceSwitch.getSwitchName()));
// 记录操作日志
MessageOpRecordUtil.addMessageOpRecordUser(
device.getUserId(),
"定时控制管理",
String.format("%s(%s) 新增定时控制",
device.getDeviceName(), deviceSwitch.getSwitchName())
);
return R.ok();
} else {
return R.fail("添加失败");

View File

@@ -0,0 +1,210 @@
package com.intc.fishery.utils;
import com.intc.common.satoken.utils.LoginHelper;
import com.intc.fishery.constant.OpRecordType;
import com.intc.fishery.domain.MessageOpRecord;
import com.intc.fishery.mapper.MessageOpRecordMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
/**
* 操作记录工具类
* 提供异步记录用户操作的功能
*
* @author intc
*/
@Slf4j
@Component
public class MessageOpRecordUtil {
private static MessageOpRecordMapper messageOpRecordMapper;
/**
* 操作记录队列,用于异步批量插入
*/
private static final BlockingQueue<MessageOpRecord> RECORD_QUEUE = new LinkedBlockingQueue<>(10000);
/**
* 队列处理线程是否已启动
*/
private static volatile boolean queueThreadStarted = false;
@Autowired
public void setMessageOpRecordMapper(MessageOpRecordMapper mapper) {
MessageOpRecordUtil.messageOpRecordMapper = mapper;
// 启动队列处理线程
startQueueProcessThread();
}
/**
* 添加用户操作记录
*
* @param userId 用户ID
* @param opUserId 操作用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordUser(Long userId, Long opUserId, String title, String message) {
addMessageOpRecord(userId, OpRecordType.OP_BY_USER, opUserId, title, message);
}
/**
* 添加用户操作记录(自动获取当前登录用户作为操作用户)
*
* @param userId 用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordUser(Long userId, String title, String message) {
Long currentUserId = null;
try {
currentUserId = LoginHelper.getUserId();
} catch (Exception e) {
log.warn("获取当前登录用户失败使用userId作为opUserId: {}", e.getMessage());
currentUserId = userId;
}
addMessageOpRecord(userId, OpRecordType.OP_BY_USER, currentUserId, title, message);
}
/**
* 添加物理按键操作记录
*
* @param userId 用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordHardware(Long userId, String title, String message) {
addMessageOpRecord(userId, OpRecordType.OP_BY_HARDWARE, null, title, message);
}
/**
* 添加单次定时操作记录
*
* @param userId 用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordTimingOne(Long userId, String title, String message) {
addMessageOpRecord(userId, OpRecordType.OP_BY_TIMING_CTRL_ONE, null, title, message);
}
/**
* 添加循环定时操作记录
*
* @param userId 用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordTimingLoop(Long userId, String title, String message) {
addMessageOpRecord(userId, OpRecordType.OP_BY_TIMING_CTRL_LOOP, null, title, message);
}
/**
* 添加联动控制操作记录
*
* @param userId 用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecordLinked(Long userId, String title, String message) {
addMessageOpRecord(userId, OpRecordType.OP_BY_LINKED_CTRL, null, title, message);
}
/**
* 添加操作记录(通用方法)
*
* @param userId 用户ID
* @param opType 操作类型
* @param opUserId 操作用户ID
* @param title 操作标题
* @param message 操作内容
*/
public static void addMessageOpRecord(Long userId, OpRecordType opType, Long opUserId,
String title, String message) {
if (userId == null) {
log.warn("添加操作记录失败userId为空");
return;
}
MessageOpRecord record = new MessageOpRecord();
record.setUserId(userId);
record.setOpType(opType.getCode());
record.setOpUserId(opUserId);
record.setTitle(title);
record.setMessage(message);
record.setCreateTime(new Date());
// 添加到队列
boolean success = RECORD_QUEUE.offer(record);
if (!success) {
log.error("操作记录队列已满,无法添加记录: userId={}, title={}", userId, title);
}
}
/**
* 启动队列处理线程
*/
private static synchronized void startQueueProcessThread() {
if (queueThreadStarted) {
return;
}
Thread processThread = new Thread(() -> {
log.info("操作记录队列处理线程启动");
while (true) {
try {
// 从队列中取出记录
MessageOpRecord record = RECORD_QUEUE.take();
// 批量插入逻辑(这里简化为单条插入,可根据需要优化为批量)
try {
if (messageOpRecordMapper != null) {
messageOpRecordMapper.insert(record);
log.debug("成功插入操作记录: userId={}, title={}",
record.getUserId(), record.getTitle());
} else {
log.error("MessageOpRecordMapper未初始化无法插入记录");
}
} catch (Exception e) {
log.error("插入操作记录失败: userId={}, title={}",
record.getUserId(), record.getTitle(), e);
}
} catch (InterruptedException e) {
log.error("队列处理线程被中断", e);
Thread.currentThread().interrupt();
break;
} catch (Exception e) {
log.error("处理操作记录队列异常", e);
}
}
}, "MessageOpRecord-Queue-Processor");
processThread.setDaemon(true);
processThread.start();
queueThreadStarted = true;
}
/**
* 获取当前队列大小
*
* @return 队列中待处理的记录数
*/
public static int getQueueSize() {
return RECORD_QUEUE.size();
}
/**
* 清空队列(谨慎使用)
*/
public static void clearQueue() {
RECORD_QUEUE.clear();
log.warn("操作记录队列已清空");
}
}