Commit 461af497 by HlQ

[add]

1.指标监测添加时区逻辑
2.添加服务器记录、服务记录删除任务
3.项目管理单独添加接口
1 parent 8f122681
......@@ -71,6 +71,20 @@ public class ContractController {
return contractService.getVOById(id);
}
// region 项目管理单独使用接口
@GetMapping("/contractMainByPro")
@SaCheckPermission(value = "contract:listMain", orRole = "admin")
public Page<ContractVO> listMainByPro(ContractDTO dto) {
return contractService.listByMain(dto);
}
@GetMapping("/contractByPro/{id}")
@SaCheckPermission(value = "contract:query", orRole = "admin")
public ContractVO getByIdByPro(@PathVariable Long id) {
return contractService.getVOById(id);
}
// endregion
@GetMapping("/contractByNo/{no}")
@SaCheckPermission(value = "contract:queryByNo", orRole = "admin")
public ContractVO getByNo(@PathVariable String no) {
......
......@@ -34,4 +34,12 @@ public class ContractPaymentController {
return contractPaymentService.saveBatch(converter.convert(dtoList, ContractPayment.class)) ? "更新成功" : "更新失败";
}
// region 项目管理单独使用接口
@GetMapping("/contractPaymentByPro/{id}")
@SaCheckPermission(value = "contractPayment:query", orRole = "admin")
public List<ContractPaymentVO> getPaymentByIdByPro(@PathVariable Long id) {
return converter.convert(contractPaymentService.lambdaQuery().eq(ContractPayment::getContractId, id).orderByAsc(ContractPayment::getPaymentType).list(), ContractPaymentVO.class);
}
// endregion
}
......@@ -72,8 +72,9 @@ public class EventController {
@PostMapping("/bind/{agentUid}/{mallUid}")
@SaCheckPermission(value = "event:bind", orRole = "admin")
public String bind(@PathVariable String agentUid, @PathVariable String mallUid, @RequestBody List<RAgentEvent> dtoList) {
return agentEventService.bind(agentUid, mallUid, dtoList);
public String bind(@PathVariable String agentUid, @PathVariable String mallUid, String timeZone,
@RequestBody List<RAgentEvent> dtoList) {
return agentEventService.bind(agentUid, mallUid, timeZone, dtoList);
}
@PostMapping("/unbind/{agentUid}/{mallUid}")
......
package vion.cron.monitor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import vion.model.monitor.AgentRecord;
import vion.model.monitor.ServiceRecord;
import vion.service.monitor.IAgentRecordService;
import vion.service.monitor.IServiceRecordService;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
* 服务器记录、服务记录删除任务
*/
@Component
@RequiredArgsConstructor
@Slf4j
public class MonitorRecRunner {
private final IAgentRecordService agentRecordService;
private final IServiceRecordService serviceRecordService;
@Scheduled(cron = "50 0 0 * * ?")
public void deleteRecord() {
log.info("删除服务器记录、服务记录");
var time = LocalDateTime.of(LocalDate.now().minusDays(30), LocalTime.MIN);
agentRecordService.lambdaUpdate().lt(AgentRecord::getCreateTime, time).remove();
serviceRecordService.lambdaUpdate().lt(ServiceRecord::getCreateTime, time).remove();
log.info("删除服务器记录、服务记录完成");
}
}
......@@ -14,7 +14,7 @@ import java.util.List;
@Getter
@Setter
@TableName(value = "mr_agent_event")
public class RAgentEvent {
public class RAgentEvent {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
......@@ -55,6 +55,18 @@ import java.util.List;
private String cron;
/**
* 时区
*/
@TableField(value = "time_zone")
private String timeZone;
/**
* 时区偏移后的Cron表达式
*/
@TableField(value = "offset_cron")
private String offsetCron;
/**
* 默认阈值,可为空
*/
@TableField(value = "threshold")
......@@ -95,4 +107,7 @@ import java.util.List;
@TableField(exist = false)
private String description;
@TableField(exist = false)
private String remark;
}
\ No newline at end of file
......@@ -246,24 +246,28 @@ public class ContractServiceImpl extends MPJBaseServiceImpl<ContractMapper, Cont
.leftJoin(ContractLog.class, ContractLog::getContractNo, Contract::getContractNo)
.eq(Contract::getId, id);
ContractVO contractVO = this.selectJoinOne(ContractVO.class, wrapper);
// 不是这三个角色,不返回金额信息
// 是这三个角色任意角色返回合同详情的产品信息
if (!roleCodeList.contains("admin") && !roleCodeList.contains("xiaoshou") && !roleCodeList.contains("caiwu")) {
contractVO.setTotalAmount(null);
contractVO.setPaidAmount(null);
contractVO.setReceivableAmount(null);
contractVO.setOutstandingAmount(null);
contractVO.setInvoiceAmount(null);
} else {
// 合同关联产品
var contractProducts = contractProductService.lambdaQuery()
.eq(RContractProduct::getContractNo, contractVO.getContractNo())
.list();
contractVO.setContractProducts(contractProducts);
}
// 合同关联产品
var contractProducts = contractProductService.lambdaQuery()
.eq(RContractProduct::getContractNo, contractVO.getContractNo())
.list();
// 合同绑定销售
Opt.ofEmptyAble(contractUserService.lambdaQuery().eq(RContractUser::getContractId, contractVO.getId()).list())
.ifPresent(l -> l.stream()
.max(Comparator.comparing(RContractUser::getEnterDate))
.map(RContractUser::getUsername)
.ifPresent(contractVO::setSaleName));
contractVO.setContractProducts(contractProducts);
return contractVO;
}
......
......@@ -17,6 +17,7 @@ import vion.model.monitor.Mall;
import vion.model.monitor.RAgentEvent;
import vion.service.monitor.IRAgentEventService;
import vion.utils.JsonUtil;
import vion.utils.TimeZoneUtil;
import vion.utils.TopicUtil;
import java.util.ArrayList;
......@@ -37,7 +38,7 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
private final MqttClientTemplate client;
@Override
public String bind(String agentUid, String mallUid, List<RAgentEvent> dtoList) {
public String bind(String agentUid, String mallUid, String timeZone, List<RAgentEvent> dtoList) {
dtoList.forEach(ae -> ae.setAgentUid(agentUid));
var agentEventList = this.lambdaQuery().eq(RAgentEvent::getMallUid, mallUid).list();
var eventUid2AEMap = agentEventList.stream().collect(Collectors.toMap(RAgentEvent::getEventUid, Function.identity()));
......@@ -45,6 +46,13 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
List<RAgentEvent> updList = new ArrayList<>();
List<RAgentEvent> insList = new ArrayList<>();
dtoList.forEach(dto -> {
dto.setTimeZone(timeZone);
String offsetCron = dto.getCron();
if (StrUtil.isNotBlank(timeZone)) {
var offsetMinute = TimeZoneUtil.getOffsetMinute(timeZone);
offsetCron = TimeZoneUtil.convertCronExpression(offsetCron, offsetMinute);
}
dto.setOffsetCron(offsetCron);
if (eventUid2AEMap.containsKey(dto.getEventUid())) {
var ae = eventUid2AEMap.get(dto.getEventUid());
dto.setId(ae.getId());
......@@ -106,6 +114,7 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
if (existMall2EventList.contains(m.getUid())) {
return null;
}
var timeZone = m.getTimeZone();
var rAgentEvent = new RAgentEvent();
rAgentEvent.setAgentUid(agentUid);
rAgentEvent.setAccountUid(accountUid);
......@@ -113,6 +122,13 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
rAgentEvent.setEventUid(dto.getEventUid());
rAgentEvent.setEventType(dto.getEventType());
rAgentEvent.setCron(dto.getCron());
rAgentEvent.setTimeZone(timeZone);
String offsetCron = dto.getCron();
if (StrUtil.isNotBlank(timeZone)) {
var offsetMinute = TimeZoneUtil.getOffsetMinute(timeZone);
offsetCron = TimeZoneUtil.convertCronExpression(offsetCron, offsetMinute);
}
rAgentEvent.setOffsetCron(offsetCron);
rAgentEvent.setThreshold(dto.getThreshold());
rAgentEvent.setControlSwitch((short) 1);
return rAgentEvent;
......@@ -134,6 +150,7 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
if (existMall2EventList.contains(m.getUid())) {
return null;
}
var timeZone = m.getTimeZone();
var rAgentEvent = new RAgentEvent();
rAgentEvent.setAgentUid(agentUid);
rAgentEvent.setAccountUid(m.getAccountUid());
......@@ -141,6 +158,13 @@ public class RAgentEventServiceImpl extends MPJBaseServiceImpl<RAgentEventMapper
rAgentEvent.setEventUid(dto.getEventUid());
rAgentEvent.setEventType(dto.getEventType());
rAgentEvent.setCron(dto.getCron());
rAgentEvent.setTimeZone(timeZone);
String offsetCron = dto.getCron();
if (StrUtil.isNotBlank(timeZone)) {
var offsetMinute = TimeZoneUtil.getOffsetMinute(timeZone);
offsetCron = TimeZoneUtil.convertCronExpression(offsetCron, offsetMinute);
}
rAgentEvent.setOffsetCron(offsetCron);
rAgentEvent.setThreshold(dto.getThreshold());
rAgentEvent.setControlSwitch((short) 1);
return rAgentEvent;
......
......@@ -11,7 +11,7 @@ import java.util.List;
*/
public interface IRAgentEventService extends MPJBaseService<RAgentEvent> {
String bind(String agentUid, String mallUid, List<RAgentEvent> dtoList);
String bind(String agentUid, String mallUid, String timeZone, List<RAgentEvent> dtoList);
String unbind(String agentUid, String mallUid, List<Long> idList);
......
package vion.utils;
import org.dromara.hutool.core.text.StrUtil;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* 时区工具类
*/
public class TimeZoneUtil {
/**
* 获取默认时区和给定时区的时间差
*
* @param zoneId 时区id
* @return int 小时
*/
public static int getOffsetMinute(String zoneId) {
if (StrUtil.isBlank(zoneId)) {
return 0;
}
try {
// 获取当前时区
ZoneId currentZone = ZoneId.systemDefault();
// 指定目标时区
ZoneId targetZone = ZoneId.of(zoneId);
// 获取当前时间
ZonedDateTime currentTime = ZonedDateTime.now(currentZone);
// 在目标时区计算时间
ZonedDateTime targetTime = currentTime.withZoneSameInstant(targetZone);
// 计算时差
ZoneOffset currentOffset = currentTime.getOffset();
ZoneOffset targetOffset = targetTime.getOffset();
return (currentOffset.getTotalSeconds() - targetOffset.getTotalSeconds()) / 60;
} catch (Exception e) {
return 0;
}
}
/**
* 转换Cron表达式
*
* @param originalCron 原始Cron表达式
* @param offsetMinutes 偏移分钟
* @return 转换后的Cron表达式
*/
public static String convertCronExpression(String originalCron, int offsetMinutes) {
// 分割Cron表达式
String[] parts = originalCron.split(" ");
// 转换每个部分
String convertedMinute = convertField(parts[1], offsetMinutes, 0, 59);
String convertedHour = convertField(parts[2], offsetMinutes / 60, 0, 23);
// 重新组装Cron表达式
parts[1] = convertedMinute;
parts[2] = convertedHour;
return String.join(" ", parts);
}
/**
* 转换Cron表达式的单个字段
*
* @param field 原始字段
* @param offset 偏移量
* @param min 最小值
* @param max 最大值
* @return 转换后的字段
*/
private static String convertField(String field, long offset, int min, int max) {
// 处理通配符
if ("*".equals(field)) {
return "*";
}
// 处理步进模式 如: */5
if (field.startsWith("*/")) {
return field;
}
// 处理范围模式 如: 1-5
if (field.contains("-")) {
String[] range = field.split("-");
int start = Integer.parseInt(range[0]);
int end = Integer.parseInt(range[1]);
start = normalize(start + (int) offset, min, max);
end = normalize(end + (int) offset, min, max);
if (start > end) {
return start + "-" + max + "," + min + "-" + end;
}
return start + "-" + end;
}
// 处理多个具体时间点 如: 1,3,5
if (field.contains(",")) {
List<String> convertedPoints = new ArrayList<>();
for (String point : field.split(",")) {
int convertedPoint = normalize(Integer.parseInt(point) + (int) offset, min, max);
convertedPoints.add(String.valueOf(convertedPoint));
}
return String.join(",", convertedPoints);
}
// 处理单个时间点
int convertedValue = normalize(Integer.parseInt(field) + (int) offset, min, max);
return String.valueOf(convertedValue);
}
/**
* 规范化值,确保在指定范围内
*
* @param value 原始值
* @param min 最小值
* @param max 最大值
* @return 规范化后的值
*/
private static int normalize(int value, int min, int max) {
while (value < min) {
value += (max - min + 1);
}
while (value > max) {
value -= (max - min + 1);
}
return value;
}
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!