Commit 3cb90a9d by HlQ

[feat]

1.指标新增静默期功能
2.新增用户订阅集团功能
[bug] 项目关联合同文件 bug 修复
1 parent c90ad753
...@@ -29,8 +29,10 @@ public class MyBatisPlusConfig implements MetaObjectHandler { ...@@ -29,8 +29,10 @@ public class MyBatisPlusConfig implements MetaObjectHandler {
var vo = (UserVO) StpUtil.getTokenSession().get("curLoginUser"); var vo = (UserVO) StpUtil.getTokenSession().get("curLoginUser");
this.fillHasGetter(metaObject, "creator", vo.getUserid()); this.fillHasGetter(metaObject, "creator", vo.getUserid());
this.fillHasGetter(metaObject, "createBy", vo.getUserid()); this.fillHasGetter(metaObject, "createBy", vo.getUserid());
this.fillHasGetter(metaObject, "createUser", vo.getUserid());
this.fillHasGetter(metaObject, "updater", vo.getUserid()); this.fillHasGetter(metaObject, "updater", vo.getUserid());
this.fillHasGetter(metaObject, "updateBy", vo.getUserid()); this.fillHasGetter(metaObject, "updateBy", vo.getUserid());
this.fillHasGetter(metaObject, "updateUser", vo.getUserid());
} catch (Exception ignored) { } catch (Exception ignored) {
} }
} }
......
...@@ -177,14 +177,14 @@ public class StoreController { ...@@ -177,14 +177,14 @@ public class StoreController {
@GetMapping("/store/rContractFile") @GetMapping("/store/rContractFile")
@SaCheckPermission(value = "store:contractFile", orRole = "admin") @SaCheckPermission(value = "store:contractFile", orRole = "admin")
public List<FileInfo> contractFile(@RequestParam List<Long> storeIdList) { public List<FileInfo> contractFile(@RequestParam Long storeId) {
return storeService.contractFile(storeIdList); return storeService.contractFile(storeId);
} }
@GetMapping("/store/rContractFileDetail") @GetMapping("/store/rContractFileDetail")
@SaCheckPermission(value = "store:contractFileDetail", orRole = "admin") @SaCheckPermission(value = "store:contractFileDetail", orRole = "admin")
public List<Map<String, Number>> contractFileDetail(@RequestParam List<Long> storeIdList) { public Map<String, Number> contractFileDetail(@RequestParam Long storeId) {
return storeService.contractFileDetail(storeIdList); return storeService.contractFileDetail(storeId);
} }
@GetMapping("/store/logNotify") @GetMapping("/store/logNotify")
......
...@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission; ...@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import vion.model.monitor.RAccountEvent; import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import vion.service.monitor.IMAccountService; import vion.service.monitor.IMAccountService;
import java.util.List; import java.util.List;
...@@ -20,15 +21,33 @@ public class MAccountController { ...@@ -20,15 +21,33 @@ public class MAccountController {
private final IMAccountService accountService; private final IMAccountService accountService;
@GetMapping("/event/{uid}") @GetMapping("/event/{uid}")
@SaCheckPermission(value = "account:event:query", orRole = "admin") @SaCheckPermission(value = "maccount:event:query", orRole = "admin")
public List<RAccountEvent> getEventById(@PathVariable String uid) { public List<RAccountEvent> getEventById(@PathVariable String uid) {
return accountService.getEventById(uid); return accountService.getEventById(uid);
} }
@PostMapping("/event/{agentUid}/{uid}") @PostMapping("/event/{agentUid}/{uid}")
@SaCheckPermission(value = "account:event:editAndSave", orRole = "admin") @SaCheckPermission(value = "maccount:event:editAndSave", orRole = "admin")
public String saveEvent(@PathVariable String agentUid, @PathVariable String uid, @RequestBody RAccountEvent event) { public String saveEvent(@PathVariable String agentUid, @PathVariable String uid, @RequestBody RAccountEvent event) {
return accountService.saveEvent(agentUid, uid, event); return accountService.saveEvent(agentUid, uid, event);
} }
@GetMapping("/subList/{userId}")
@SaCheckPermission(value = "maccount:subList", orRole = "admin")
public List<RUserAccount> subList(@PathVariable Long userId) {
return accountService.subList(userId);
}
@PostMapping("/sub")
@SaCheckPermission(value = "maccount:sub", orRole = "admin")
public String sub(@RequestBody RUserAccount userAccount) {
return accountService.sub(userAccount);
}
@PostMapping("/unsub")
@SaCheckPermission(value = "maccount:unsub", orRole = "admin")
public String unsub(@RequestBody RUserAccount userAccount) {
return accountService.unsub(userAccount);
}
} }
...@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -7,6 +7,7 @@ import org.springframework.web.bind.annotation.*;
import vion.dto.monitor.MallDTO; import vion.dto.monitor.MallDTO;
import vion.model.monitor.MAccount; import vion.model.monitor.MAccount;
import vion.model.monitor.RMallRemark; import vion.model.monitor.RMallRemark;
import vion.model.monitor.RMallSilent;
import vion.service.monitor.IMallService; import vion.service.monitor.IMallService;
import vion.service.monitor.IRMallRemarkService; import vion.service.monitor.IRMallRemarkService;
import vion.vo.monitor.MallVO; import vion.vo.monitor.MallVO;
...@@ -101,7 +102,7 @@ public class MallController { ...@@ -101,7 +102,7 @@ public class MallController {
@PostMapping("/remark/{id}") @PostMapping("/remark/{id}")
@SaCheckPermission(value = "mall:remark:edit", orRole = "admin") @SaCheckPermission(value = "mall:remark:edit", orRole = "admin")
public String editRemark(@PathVariable Long id, @RequestBody RMallRemark dto) { public String updateRemark(@PathVariable Long id, @RequestBody RMallRemark dto) {
dto.setId(id); dto.setId(id);
return mallRemarkService.updateById(dto) ? "修改成功" : "修改失败"; return mallRemarkService.updateById(dto) ? "修改成功" : "修改失败";
} }
...@@ -111,6 +112,32 @@ public class MallController { ...@@ -111,6 +112,32 @@ public class MallController {
public String removeRemark(@PathVariable Long id) { public String removeRemark(@PathVariable Long id) {
return mallRemarkService.removeById(id) ? "删除成功" : "删除失败"; return mallRemarkService.removeById(id) ? "删除成功" : "删除失败";
} }
// endregion
// region 指标静默期配置
@GetMapping("/silent/{mallUid}")
@SaCheckPermission(value = "mall:silent:list", orRole = "admin")
public List<RMallSilent> listSilent(@PathVariable String mallUid) {
return mallService.listSilent(mallUid);
}
@PostMapping("/silent/{agentUid}/{mallUid}")
@SaCheckPermission(value = "mall:silent:save", orRole = "admin")
public String saveSilent(@PathVariable String agentUid, @PathVariable String mallUid, @RequestBody RMallSilent dto) {
return mallService.saveSilent(agentUid, mallUid, dto);
}
@PostMapping("/silent/{id}")
@SaCheckPermission(value = "mall:silent:edit", orRole = "admin")
public String updateSilent(@PathVariable Long id, @RequestBody RMallSilent dto) {
dto.setId(id);
return mallService.updateSilent(dto);
}
@DeleteMapping("/silent/{id}")
@SaCheckPermission(value = "mall:silent:remove", orRole = "admin")
public String removeSilent(@PathVariable Long id) {
return mallService.removeSilent(id);
}
// endregion // endregion
} }
...@@ -28,6 +28,7 @@ public class MallDTO extends BaseDTO { ...@@ -28,6 +28,7 @@ public class MallDTO extends BaseDTO {
* 所属集团uid * 所属集团uid
*/ */
private String accountUid; private String accountUid;
private List<String> accountUidList;
private String accountName; private String accountName;
/** /**
......
package vion.event.mqtt; package vion.event.mqtt;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.collection.CollUtil; import org.dromara.hutool.core.collection.CollUtil;
import org.dromara.hutool.core.collection.ListUtil; import org.dromara.hutool.core.collection.ListUtil;
import org.dromara.hutool.core.date.TimeUtil;
import org.dromara.hutool.core.text.StrUtil; import org.dromara.hutool.core.text.StrUtil;
import org.dromara.hutool.core.thread.ThreadUtil; import org.dromara.hutool.core.thread.ThreadUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.mica.mqtt.codec.MqttQoS; import org.dromara.mica.mqtt.codec.MqttQoS;
import org.dromara.mica.mqtt.spring.client.MqttClientSubscribe; import org.dromara.mica.mqtt.spring.client.MqttClientSubscribe;
import org.dromara.mica.mqtt.spring.client.MqttClientTemplate; import org.dromara.mica.mqtt.spring.client.MqttClientTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import vion.constant.MqttMessageType; import vion.constant.MqttMessageType;
import vion.model.monitor.EventRecord;
import vion.model.monitor.RAgentEvent; import vion.model.monitor.RAgentEvent;
import vion.model.monitor.RMallSilent;
import vion.model.monitor.SendData; import vion.model.monitor.SendData;
import vion.service.monitor.IEventRecordService; import vion.service.monitor.IEventRecordService;
import vion.service.monitor.IRAgentEventService; import vion.service.monitor.IRAgentEventService;
import vion.service.monitor.IRMallSilentService;
import vion.utils.JsonUtil; import vion.utils.JsonUtil;
import vion.utils.TopicUtil; import vion.utils.TopicUtil;
import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* <b>/MS/receive</b> topic 监听事件处理 * <b>/MS/receive</b> topic 监听事件处理
...@@ -32,42 +39,47 @@ public class MqttClientMessageListener { ...@@ -32,42 +39,47 @@ public class MqttClientMessageListener {
private final MqttClientTemplate client; private final MqttClientTemplate client;
private final IEventRecordService recordService; private final IEventRecordService recordService;
private final IRAgentEventService agentEventService; private final IRAgentEventService agentEventService;
private final IRMallSilentService mallSilentService;
@MqttClientSubscribe(value = "${mqtt.client.server-topic:/MS/receive}", qos = MqttQoS.QOS2) @MqttClientSubscribe(value = "${mqtt.client.server-topic:/MS/receive}", qos = MqttQoS.QOS2)
public void onMessage(String topic, byte[] payload) { public void onMessage(String topic, byte[] payload) {
try { try {
JsonNode jsonObj = JsonUtil.parseTree(payload); SendData sendData = JsonUtil.parseObject(payload, SendData.class);
String agentUid = jsonObj.path("agentUid").asText(); String agentUid = sendData.getAgentUid();
String type = jsonObj.path("eventType").asText(); String type = sendData.getEventType();
log.info("收到[{}]消息,类型:[{}]", agentUid, type); log.info("收到[{}]消息,类型:[{}]", agentUid, type);
if (CollUtil.isEmpty(sendData.getRecList())) {
log.info("[{}]上报的指标记录为空", agentUid);
return;
}
switch (MqttMessageType.getEnumByType(type)) { switch (MqttMessageType.getEnumByType(type)) {
case REGISTER -> updateTaskByAgent(agentUid); case REGISTER -> updateTaskByAgent(agentUid);
// region mall + store 共有指标 // region mall + store 共有指标
case PASSENGER_FLOW_INTERRUPT -> handlePassengerFlowInterrupt(jsonObj.toString()); case PASSENGER_FLOW_INTERRUPT -> handlePassengerFlowInterrupt(sendData);
case DEVICE_OFFLINE -> handleDeviceOffline(jsonObj.toString()); case DEVICE_OFFLINE -> handleDeviceOffline(sendData);
case REID_ANALYZE -> handleReid(jsonObj.toString()); case REID_ANALYZE -> handleReid(sendData);
case DEVICE_REGISTRATION -> handleDeviceRegistration(jsonObj.toString()); case DEVICE_REGISTRATION -> handleDeviceRegistration(sendData);
case HEADCOUNT_RATIO -> handleHeadcountRatio(jsonObj.toString()); case HEADCOUNT_RATIO -> handleHeadcountRatio(sendData);
case STAFF_RECOGNIZE -> handleStaffRecognize(jsonObj.toString()); case STAFF_RECOGNIZE -> handleStaffRecognize(sendData);
// endregion // endregion
// region store 指标 // region store 指标
case STORE_CUSTOMER_UNDULATE -> handleStoreCustomerUndulate(jsonObj.toString()); case STORE_CUSTOMER_UNDULATE -> handleStoreCustomerUndulate(sendData);
case STORE_GATE_DATA_UNDULATE -> handleStoreGateDateUndulate(jsonObj.toString()); case STORE_GATE_DATA_UNDULATE -> handleStoreGateDateUndulate(sendData);
case STORE_INOUT_MATCH_RATIO -> handleStoreInoutMatchRatio(jsonObj.toString()); case STORE_INOUT_MATCH_RATIO -> handleStoreInoutMatchRatio(sendData);
case STORE_SINGLE_CLUSTER -> handleStoreSingleCluster(jsonObj.toString()); case STORE_SINGLE_CLUSTER -> handleStoreSingleCluster(sendData);
case STORE_ENTER_RATIO -> handleStoreEnterRatio(jsonObj.toString()); case STORE_ENTER_RATIO -> handleStoreEnterRatio(sendData);
// endregion // endregion
// region mall 指标 // region mall 指标
case MALL_INOUT_DIFF -> handleMallInoutDiff(jsonObj.toString()); case MALL_INOUT_DIFF -> handleMallInoutDiff(sendData);
case MALL_SHOP_INOUT_DIFF -> handleMallShopInoutDiff(jsonObj.toString()); case MALL_SHOP_INOUT_DIFF -> handleMallShopInoutDiff(sendData);
case MALL_DATA_UNDULATE -> handleMallDataUndulate(jsonObj.toString()); case MALL_DATA_UNDULATE -> handleMallDataUndulate(sendData);
case MALL_GATE_DATA_UNDULATE -> handleMallGateDataUndulate(jsonObj.toString()); case MALL_GATE_DATA_UNDULATE -> handleMallGateDataUndulate(sendData);
case MALL_SHOP_DATA_UNDULATE -> handleMallShopDataUndulate(jsonObj.toString()); case MALL_SHOP_DATA_UNDULATE -> handleMallShopDataUndulate(sendData);
case MALL_DILATATION_UNDULATE -> handleMallDilatationUndulate(jsonObj.toString()); case MALL_DILATATION_UNDULATE -> handleMallDilatationUndulate(sendData);
// endregion // endregion
default -> log.info("未定义的消息类型:{}, payload:{}", type, jsonObj); default -> log.info("未定义的消息类型:{}, payload:{}", type, sendData);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("解析数据异常", e); log.error("解析数据异常", e);
...@@ -107,55 +119,61 @@ public class MqttClientMessageListener { ...@@ -107,55 +119,61 @@ public class MqttClientMessageListener {
/** /**
* 设备离线上报 * 设备离线上报
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleDeviceOffline(String payloadStr) { private void handleDeviceOffline(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 全天分析异常上报 * 全天分析异常上报
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleReid(String payloadStr) { private void handleReid(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 设备注册次数异常 * 设备注册次数异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleDeviceRegistration(String payloadStr) { private void handleDeviceRegistration(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 人数/人次异常 * 人数/人次异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleHeadcountRatio(String payloadStr) { private void handleHeadcountRatio(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 店员识别异常 * 店员识别异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStaffRecognize(String payloadStr) { private void handleStaffRecognize(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 客流数据中断 * 客流数据中断
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handlePassengerFlowInterrupt(String payloadStr) { private void handlePassengerFlowInterrupt(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
// region store 事件 // region store 事件
...@@ -163,47 +181,52 @@ public class MqttClientMessageListener { ...@@ -163,47 +181,52 @@ public class MqttClientMessageListener {
/** /**
* 门店人数波动异常 * 门店人数波动异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStoreCustomerUndulate(String payloadStr) { private void handleStoreCustomerUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 门店监控点数据波动异常 * 门店监控点数据波动异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStoreGateDateUndulate(String payloadStr) { private void handleStoreGateDateUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 门店进出匹配率异常 * 门店进出匹配率异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStoreInoutMatchRatio(String payloadStr) { private void handleStoreInoutMatchRatio(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 门店单聚类异常 * 门店单聚类异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStoreSingleCluster(String payloadStr) { private void handleStoreSingleCluster(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 门店进店率异常 * 门店进店率异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleStoreEnterRatio(String payloadStr) { private void handleStoreEnterRatio(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
// endregion // endregion
...@@ -212,76 +235,131 @@ public class MqttClientMessageListener { ...@@ -212,76 +235,131 @@ public class MqttClientMessageListener {
/** /**
* 广场进出客流差异异常 * 广场进出客流差异异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallInoutDiff(String payloadStr) { private void handleMallInoutDiff(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 广场店铺进出差异异常 * 广场店铺进出差异异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallShopInoutDiff(String payloadStr) { private void handleMallShopInoutDiff(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 广场数据波动异常 * 广场数据波动异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallDataUndulate(String payloadStr) { private void handleMallDataUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 广场外围入口数据波动异常 * 广场外围入口数据波动异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallGateDataUndulate(String payloadStr) { private void handleMallGateDataUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 广场店铺数据波动异常 * 广场店铺数据波动异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallShopDataUndulate(String payloadStr) { private void handleMallShopDataUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
/** /**
* 广场膨胀系数异常 * 广场膨胀系数异常
* *
* @param payloadStr 事件记录 * @param sendData 事件记录
*/ */
private void handleMallDilatationUndulate(String payloadStr) { private void handleMallDilatationUndulate(SendData sendData) {
saveRecInDB(payloadStr); var recordList = silent(sendData);
saveRecInDB(recordList);
} }
// endregion // endregion
/** /**
* agent 发送过来的记录入库 * agent 发送过来的记录入库
* *
* @param payloadStr 事件记录 * @param recList 事件记录
*/
private void saveRecInDB(List<EventRecord> recList) {
recordService.saveBatch(recList);
}
/**
* 静默期处理
*
* @param sendData Agent 上报的数据
* @return java.util.List<vion.model.monitor.EventRecord>
*/ */
private void saveRecInDB(String payloadStr) { private List<EventRecord> silent(SendData sendData) {
SendData sendData = JsonUtil.parseObject(payloadStr, SendData.class);
var recList = sendData.getRecList(); var recList = sendData.getRecList();
if (CollUtil.isNotEmpty(recList)) { var agentUid = sendData.getAgentUid();
var eventRecordList = recList.stream().peek(rec -> { var eventUid = sendData.getEventUid();
rec.setAgentUid(sendData.getAgentUid()); var mallUidList = recList.stream().map(EventRecord::getMallUid).toList();
var silentList = mallSilentService.lambdaQuery()
.eq(RMallSilent::getAgentUid, agentUid)
.in(RMallSilent::getMallUid, mallUidList)
.eq(RMallSilent::getEventUid, eventUid)
.list();
var mallUid2SilentMap = silentList.stream().collect(Collectors.toMap(RMallSilent::getMallUid, Function.identity()));
return recList.stream().peek(rec -> {
rec.setAgentUid(agentUid);
rec.setAgentType(sendData.getAgentType()); rec.setAgentType(sendData.getAgentType());
rec.setEventUid(sendData.getEventUid()); rec.setEventUid(eventUid);
rec.setEventType(sendData.getEventType()); rec.setEventType(sendData.getEventType());
rec.setThreshold(sendData.getThreshold()); rec.setThreshold(sendData.getThreshold());
var rMallSilent = mallUid2SilentMap.get(rec.getMallUid());
if (ObjUtil.isNotNull(rMallSilent)) {
if (TimeUtil.isIn(LocalDate.now(), rMallSilent.getStartDate(), rMallSilent.getEndDate())) {
// 静默期,状态设置为忽略
rec.setStatus(((short) 2));
// 设备离线指标静默期处理
if ("BqCXCrwKgnvR12dvIaJ_".equals(eventUid) && ObjUtil.isNotNull(rMallSilent.getDataJson())) {
var dataJson = JsonUtil.toJsonString(rMallSilent.getDataJson());
var finalData = offlineDevice(dataJson, rec.getData().toString());
rec.setData(StrUtil.isEmpty(finalData) ? null : finalData);
}
}
}
}).toList(); }).toList();
recordService.saveBatch(eventRecordList); }
/**
* 设备离线指标静默期处理
*
* @param dataJson 设备离线指标静默期配置
* @param data 设备离线指标上报的数据
* @return java.lang.String 静默期处理后的数据
*/
private String offlineDevice(String dataJson, String data) {
var arr = JsonUtil.createArr();
var jsonNode = JsonUtil.parseTree(data);
for (var node : jsonNode) {
var serialNo = node.path("serialNo").asText();
if (!dataJson.contains(serialNo)) {
arr.add(node);
} }
} }
return arr.isEmpty() ? "" : arr.toString();
}
} }
package vion.mapper.monitor;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vion.model.monitor.RMallSilent;
/**
* @author vion
* @date 2025/1/4
*/
public interface RMallSilentMapper extends BaseMapper<RMallSilent> {
}
\ No newline at end of file \ No newline at end of file
package vion.mapper.monitor;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import vion.model.monitor.RUserAccount;
/**
* @author vion
* @date 2025/1/3
*/
public interface RUserAccountMapper extends BaseMapper<RUserAccount> {
}
\ No newline at end of file \ No newline at end of file
...@@ -61,7 +61,7 @@ public class EventRecord extends BaseDTO { ...@@ -61,7 +61,7 @@ public class EventRecord extends BaseDTO {
private String threshold; private String threshold;
/** /**
* 事件状态 0:异常 1:正常 -1:未知 * 事件状态 0:异常 1:正常 -1:未知 2:忽略
*/ */
@TableField(value = "\"status\"") @TableField(value = "\"status\"")
private Short status; private Short status;
......
package vion.model.monitor;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
import vion.config.mp.JsonbTypeHandler;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
* 指标静默期配置表
*/
@Getter
@Setter
@TableName(value = "mr_mall_silent", autoResultMap = true)
public class RMallSilent {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField(value = "agent_uid")
private String agentUid;
@TableField(value = "account_uid")
private String accountUid;
@TableField(value = "mall_uid")
private String mallUid;
/**
* 关联指标uid
*/
@TableField(value = "event_uid")
private String eventUid;
/**
* 关联指标类型
*/
@TableField(value = "event_type")
private String eventType;
/**
* 特殊配置json
*/
@TableField(value = "data_json", typeHandler = JsonbTypeHandler.class)
private Object dataJson;
/**
* 静默开始日期
*/
@TableField(value = "start_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate startDate;
/**
* 静默结束日期
*/
@TableField(value = "end_date")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate endDate;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
@TableField(value = "create_by", fill = FieldFill.INSERT)
private String createBy;
@TableField(value = "update_by", fill = FieldFill.INSERT_UPDATE)
private String updateBy;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
\ No newline at end of file \ No newline at end of file
package vion.model.monitor;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
/**
* 用户订阅集团表
*/
@Getter
@Setter
@TableName(value = "mr_user_account")
public class RUserAccount {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 用户id
*/
@TableField(value = "user_id")
private Long userId;
/**
* 集团id
*/
@TableField(value = "account_id")
private String accountId;
@TableField(value = "create_time", fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
}
\ No newline at end of file \ No newline at end of file
...@@ -29,9 +29,9 @@ public interface IStoreService extends MPJBaseService<Store> { ...@@ -29,9 +29,9 @@ public interface IStoreService extends MPJBaseService<Store> {
List<Map<String, Number>> fileDetail(List<Long> storeIdList); List<Map<String, Number>> fileDetail(List<Long> storeIdList);
List<FileInfo> contractFile(List<Long> storeIdList); List<FileInfo> contractFile(Long storeId);
List<Map<String, Number>> contractFileDetail(List<Long> storeIdList); Map<String, Number> contractFileDetail(Long storeId);
Boolean logNotify(Long id, String[] userIdStr); Boolean logNotify(Long id, String[] userIdStr);
......
...@@ -438,8 +438,8 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -438,8 +438,8 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
} }
@Override @Override
public List<FileInfo> contractFile(List<Long> storeIdList) { public List<FileInfo> contractFile(Long storeId) {
var contractStoreList = contractStoreService.lambdaQuery().in(RContractStore::getStoreId, storeIdList).list(); var contractStoreList = contractStoreService.lambdaQuery().eq(RContractStore::getStoreId, storeId).list();
var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList(); var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList();
return fileService.lambdaQuery() return fileService.lambdaQuery()
.in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L))) .in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L)))
...@@ -449,31 +449,27 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp ...@@ -449,31 +449,27 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
} }
@Override @Override
public List<Map<String, Number>> contractFileDetail(List<Long> storeIdList) { public Map<String, Number> contractFileDetail(Long storeId) {
var contractStoreList = contractStoreService.lambdaQuery().in(RContractStore::getStoreId, storeIdList).list(); var contractStoreList = contractStoreService.lambdaQuery().eq(RContractStore::getStoreId, storeId).list();
var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList(); var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList();
var fileList = fileService.lambdaQuery() var fileList = fileService.lambdaQuery()
.in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L))) .in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L)))
.in(FileInfo::getStoreId, -1L) .in(FileInfo::getStoreId, -1L)
.in(FileInfo::getSourceType, 7, 8, 9, 10, 11, 12, 13, 14, 33, 34) .in(FileInfo::getSourceType, 7, 8, 9, 10, 11, 12, 13, 14, 33, 34)
.list(); .list();
var storeId2FileMap = fileList.stream().collect(Collectors.groupingBy(FileInfo::getStoreId, Collectors.groupingBy(FileInfo::getSourceType))); var type2CntMap = fileList.stream().collect(Collectors.groupingBy(FileInfo::getSourceType, Collectors.counting()));
return storeIdList.stream().map(storeId -> {
var fileMap = storeId2FileMap.getOrDefault(storeId, Map.of());
Map<String, Number> map = new HashMap<>(); Map<String, Number> map = new HashMap<>();
map.put("storeId", storeId); map.put("7", type2CntMap.getOrDefault(7, 0L));
map.put("7", fileMap.getOrDefault(7, List.of()).size()); map.put("8", type2CntMap.getOrDefault(8, 0L));
map.put("8", fileMap.getOrDefault(8, List.of()).size()); map.put("9", type2CntMap.getOrDefault(9, 0L));
map.put("9", fileMap.getOrDefault(9, List.of()).size()); map.put("10", type2CntMap.getOrDefault(10, 0L));
map.put("10", fileMap.getOrDefault(10, List.of()).size()); map.put("11", type2CntMap.getOrDefault(11, 0L));
map.put("11", fileMap.getOrDefault(11, List.of()).size()); map.put("12", type2CntMap.getOrDefault(12, 0L));
map.put("12", fileMap.getOrDefault(12, List.of()).size()); map.put("13", type2CntMap.getOrDefault(13, 0L));
map.put("13", fileMap.getOrDefault(13, List.of()).size()); map.put("14", type2CntMap.getOrDefault(14, 0L));
map.put("14", fileMap.getOrDefault(14, List.of()).size()); map.put("33", type2CntMap.getOrDefault(33, 0L));
map.put("33", fileMap.getOrDefault(33, List.of()).size()); map.put("34", type2CntMap.getOrDefault(34, 0L));
map.put("34", fileMap.getOrDefault(34, List.of()).size());
return map; return map;
}).toList();
} }
@Override @Override
......
...@@ -6,8 +6,10 @@ import org.springframework.stereotype.Service; ...@@ -6,8 +6,10 @@ import org.springframework.stereotype.Service;
import vion.mapper.monitor.MAccountMapper; import vion.mapper.monitor.MAccountMapper;
import vion.model.monitor.MAccount; import vion.model.monitor.MAccount;
import vion.model.monitor.RAccountEvent; import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import vion.service.monitor.IMAccountService; import vion.service.monitor.IMAccountService;
import vion.service.monitor.IRAccountEventService; import vion.service.monitor.IRAccountEventService;
import vion.service.monitor.IRUserAccountService;
import java.util.List; import java.util.List;
...@@ -20,6 +22,7 @@ import java.util.List; ...@@ -20,6 +22,7 @@ import java.util.List;
public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAccount> implements IMAccountService { public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAccount> implements IMAccountService {
private final IRAccountEventService accountEventService; private final IRAccountEventService accountEventService;
private final IRUserAccountService userAccountService;
@Override @Override
public List<RAccountEvent> getEventById(String uid) { public List<RAccountEvent> getEventById(String uid) {
...@@ -30,7 +33,23 @@ public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAcc ...@@ -30,7 +33,23 @@ public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAcc
public String saveEvent(String agentUid, String uid, RAccountEvent event) { public String saveEvent(String agentUid, String uid, RAccountEvent event) {
event.setAgentUid(agentUid); event.setAgentUid(agentUid);
event.setAccountUid(uid); event.setAccountUid(uid);
accountEventService.save(event); return accountEventService.save(event) ? "成功" : "失败";
return ""; }
@Override
public List<RUserAccount> subList(Long userId) {
return userAccountService.lambdaQuery().eq(RUserAccount::getUserId, userId).list();
}
@Override
public String sub(RUserAccount userAccount) {
return userAccountService.save(userAccount) ? "订阅成功" : "订阅失败";
}
@Override
public String unsub(RUserAccount userAccount) {
return userAccountService.lambdaUpdate()
.eq(RUserAccount::getAccountId, userAccount.getAccountId())
.eq(RUserAccount::getUserId, userAccount.getUserId()).remove() ? "取消订阅成功" : "取消订阅失败";
} }
} }
...@@ -45,6 +45,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem ...@@ -45,6 +45,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
private final IEventRecordService eventRecordService; private final IEventRecordService eventRecordService;
private final IRAgentEventService agentEventService; private final IRAgentEventService agentEventService;
private final IRMallRemarkService mallRemarkService; private final IRMallRemarkService mallRemarkService;
private final IRMallSilentService mallSilentService;
private final AgentMapper agentMapper; private final AgentMapper agentMapper;
private final MqttClientTemplate client; private final MqttClientTemplate client;
private final Converter converter; private final Converter converter;
...@@ -99,6 +100,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem ...@@ -99,6 +100,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.leftJoin(MAccount.class, MAccount::getUid, Mall::getAccountUid) .leftJoin(MAccount.class, MAccount::getUid, Mall::getAccountUid)
.leftJoin(Agent.class, Agent::getUid, Mall::getAgentUid) .leftJoin(Agent.class, Agent::getUid, Mall::getAgentUid)
.eq(Mall::getAttention, 1) .eq(Mall::getAttention, 1)
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), Mall::getAccountUid, dto.getAccountUidList())
.orderByDesc(Mall::getAccountUid, Mall::getName); .orderByDesc(Mall::getAccountUid, Mall::getName);
var mallVOPage = this.selectJoinListPage(Page.of(dto.getPageNum(), dto.getPageSize()), MallVO.class, wrapper); var mallVOPage = this.selectJoinListPage(Page.of(dto.getPageNum(), dto.getPageSize()), MallVO.class, wrapper);
if (CollUtil.isNotEmpty(mallVOPage.getRecords())) { if (CollUtil.isNotEmpty(mallVOPage.getRecords())) {
...@@ -137,6 +139,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem ...@@ -137,6 +139,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.leftJoin(Agent.class, Agent::getUid, RAgentEvent::getAgentUid) .leftJoin(Agent.class, Agent::getUid, RAgentEvent::getAgentUid)
.in(RAgentEvent::getEventUid, dto.getEventUidList()) .in(RAgentEvent::getEventUid, dto.getEventUidList())
.eq(Agent::getType, dto.getAgentType()) .eq(Agent::getType, dto.getAgentType())
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), RAgentEvent::getAccountUid, dto.getAccountUidList())
.orderByDesc(RAgentEvent::getAccountUid, RAgentEvent::getMallUid); .orderByDesc(RAgentEvent::getAccountUid, RAgentEvent::getMallUid);
var agentEventList = agentEventService.selectJoinList(RAgentEvent.class, agentEventWrapper); var agentEventList = agentEventService.selectJoinList(RAgentEvent.class, agentEventWrapper);
if (CollUtil.isEmpty(agentEventList)) { if (CollUtil.isEmpty(agentEventList)) {
...@@ -194,6 +197,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem ...@@ -194,6 +197,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.ge(EventRecord::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN)) .ge(EventRecord::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
.eq(EventRecord::getAgentType, dto.getAgentType()) .eq(EventRecord::getAgentType, dto.getAgentType())
.in(CollUtil.isNotEmpty(dto.getEventUidList()), EventRecord::getEventUid, dto.getEventUidList()) .in(CollUtil.isNotEmpty(dto.getEventUidList()), EventRecord::getEventUid, dto.getEventUidList())
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), EventRecord::getAccountUid, dto.getAccountUidList())
.orderByAsc(EventRecord::getMallUid)) .orderByAsc(EventRecord::getMallUid))
.eq(EventRecord::getStatus, 0); .eq(EventRecord::getStatus, 0);
var eventRecordList = eventRecordService.selectJoinList(EventRecord.class, eventRecWrapper); var eventRecordList = eventRecordService.selectJoinList(EventRecord.class, eventRecWrapper);
...@@ -276,4 +280,26 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem ...@@ -276,4 +280,26 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
agentEventService.lambdaUpdate().eq(RAgentEvent::getMallUid, attentionMall.getUid()).remove(); agentEventService.lambdaUpdate().eq(RAgentEvent::getMallUid, attentionMall.getUid()).remove();
return "取消成功"; return "取消成功";
} }
@Override
public List<RMallSilent> listSilent(String mallUid) {
return mallSilentService.lambdaQuery().eq(RMallSilent::getMallUid, mallUid).list();
}
@Override
public String saveSilent(String agentUid, String mallUid, RMallSilent dto) {
dto.setAgentUid(agentUid);
dto.setMallUid(mallUid);
return mallSilentService.save(dto) ? "新增成功" : "新增失败";
}
@Override
public String updateSilent(RMallSilent dto) {
return mallSilentService.updateById(dto) ? "修改成功" : "修改失败";
}
@Override
public String removeSilent(Long id) {
return mallSilentService.removeById(id) ? "删除成功" : "删除失败";
}
} }
package vion.service.impl.monitor;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import vion.mapper.monitor.RMallSilentMapper;
import vion.model.monitor.RMallSilent;
import vion.service.monitor.IRMallSilentService;
/**
* @author vion
* @date 2025/1/4
*/
@Service
public class RMallSilentServiceImpl extends ServiceImpl<RMallSilentMapper, RMallSilent> implements IRMallSilentService {
}
package vion.service.impl.monitor;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import vion.mapper.monitor.RUserAccountMapper;
import vion.model.monitor.RUserAccount;
import vion.service.monitor.IRUserAccountService;
/**
* @author vion
* @date 2025/1/3
*/
@Service
public class RUserAccountServiceImpl extends ServiceImpl<RUserAccountMapper, RUserAccount> implements IRUserAccountService {
}
...@@ -3,6 +3,7 @@ package vion.service.monitor; ...@@ -3,6 +3,7 @@ package vion.service.monitor;
import com.github.yulichang.base.MPJBaseService; import com.github.yulichang.base.MPJBaseService;
import vion.model.monitor.MAccount; import vion.model.monitor.MAccount;
import vion.model.monitor.RAccountEvent; import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import java.util.List; import java.util.List;
...@@ -16,4 +17,10 @@ public interface IMAccountService extends MPJBaseService<MAccount> { ...@@ -16,4 +17,10 @@ public interface IMAccountService extends MPJBaseService<MAccount> {
String saveEvent(String agentUid, String uid, RAccountEvent event); String saveEvent(String agentUid, String uid, RAccountEvent event);
List<RUserAccount> subList(Long userId);
String sub(RUserAccount userAccount);
String unsub(RUserAccount userAccount);
} }
...@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService; ...@@ -5,6 +5,7 @@ import com.github.yulichang.base.MPJBaseService;
import vion.dto.monitor.MallDTO; import vion.dto.monitor.MallDTO;
import vion.model.monitor.MAccount; import vion.model.monitor.MAccount;
import vion.model.monitor.Mall; import vion.model.monitor.Mall;
import vion.model.monitor.RMallSilent;
import vion.vo.monitor.MallVO; import vion.vo.monitor.MallVO;
import java.util.List; import java.util.List;
...@@ -33,4 +34,11 @@ public interface IMallService extends MPJBaseService<Mall> { ...@@ -33,4 +34,11 @@ public interface IMallService extends MPJBaseService<Mall> {
String cancelAttention(Long id); String cancelAttention(Long id);
List<RMallSilent> listSilent(String mallUid);
String saveSilent(String agentUid, String mallUid, RMallSilent dto);
String updateSilent(RMallSilent dto);
String removeSilent(Long id);
} }
package vion.service.monitor;
import com.baomidou.mybatisplus.extension.service.IService;
import vion.model.monitor.RMallSilent;
/**
* @author vion
* @date 2025/1/4
*/
public interface IRMallSilentService extends IService<RMallSilent>{
}
package vion.service.monitor;
import com.baomidou.mybatisplus.extension.service.IService;
import vion.model.monitor.RUserAccount;
/**
* @author vion
* @date 2025/1/3
*/
public interface IRUserAccountService extends IService<RUserAccount>{
}
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!