Commit 3cb90a9d by HlQ

[feat]

1.指标新增静默期功能
2.新增用户订阅集团功能
[bug] 项目关联合同文件 bug 修复
1 parent c90ad753
......@@ -29,8 +29,10 @@ public class MyBatisPlusConfig implements MetaObjectHandler {
var vo = (UserVO) StpUtil.getTokenSession().get("curLoginUser");
this.fillHasGetter(metaObject, "creator", vo.getUserid());
this.fillHasGetter(metaObject, "createBy", vo.getUserid());
this.fillHasGetter(metaObject, "createUser", vo.getUserid());
this.fillHasGetter(metaObject, "updater", vo.getUserid());
this.fillHasGetter(metaObject, "updateBy", vo.getUserid());
this.fillHasGetter(metaObject, "updateUser", vo.getUserid());
} catch (Exception ignored) {
}
}
......
......@@ -177,14 +177,14 @@ public class StoreController {
@GetMapping("/store/rContractFile")
@SaCheckPermission(value = "store:contractFile", orRole = "admin")
public List<FileInfo> contractFile(@RequestParam List<Long> storeIdList) {
return storeService.contractFile(storeIdList);
public List<FileInfo> contractFile(@RequestParam Long storeId) {
return storeService.contractFile(storeId);
}
@GetMapping("/store/rContractFileDetail")
@SaCheckPermission(value = "store:contractFileDetail", orRole = "admin")
public List<Map<String, Number>> contractFileDetail(@RequestParam List<Long> storeIdList) {
return storeService.contractFileDetail(storeIdList);
public Map<String, Number> contractFileDetail(@RequestParam Long storeId) {
return storeService.contractFileDetail(storeId);
}
@GetMapping("/store/logNotify")
......
......@@ -4,6 +4,7 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import vion.service.monitor.IMAccountService;
import java.util.List;
......@@ -20,15 +21,33 @@ public class MAccountController {
private final IMAccountService accountService;
@GetMapping("/event/{uid}")
@SaCheckPermission(value = "account:event:query", orRole = "admin")
@SaCheckPermission(value = "maccount:event:query", orRole = "admin")
public List<RAccountEvent> getEventById(@PathVariable String uid) {
return accountService.getEventById(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) {
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.*;
import vion.dto.monitor.MallDTO;
import vion.model.monitor.MAccount;
import vion.model.monitor.RMallRemark;
import vion.model.monitor.RMallSilent;
import vion.service.monitor.IMallService;
import vion.service.monitor.IRMallRemarkService;
import vion.vo.monitor.MallVO;
......@@ -101,7 +102,7 @@ public class MallController {
@PostMapping("/remark/{id}")
@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);
return mallRemarkService.updateById(dto) ? "修改成功" : "修改失败";
}
......@@ -111,6 +112,32 @@ public class MallController {
public String removeRemark(@PathVariable Long 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
}
......@@ -28,6 +28,7 @@ public class MallDTO extends BaseDTO {
* 所属集团uid
*/
private String accountUid;
private List<String> accountUidList;
private String accountName;
/**
......
package vion.event.mqtt;
import com.fasterxml.jackson.databind.JsonNode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.hutool.core.collection.CollUtil;
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.thread.ThreadUtil;
import org.dromara.hutool.core.util.ObjUtil;
import org.dromara.mica.mqtt.codec.MqttQoS;
import org.dromara.mica.mqtt.spring.client.MqttClientSubscribe;
import org.dromara.mica.mqtt.spring.client.MqttClientTemplate;
import org.springframework.stereotype.Service;
import vion.constant.MqttMessageType;
import vion.model.monitor.EventRecord;
import vion.model.monitor.RAgentEvent;
import vion.model.monitor.RMallSilent;
import vion.model.monitor.SendData;
import vion.service.monitor.IEventRecordService;
import vion.service.monitor.IRAgentEventService;
import vion.service.monitor.IRMallSilentService;
import vion.utils.JsonUtil;
import vion.utils.TopicUtil;
import java.time.LocalDate;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* <b>/MS/receive</b> topic 监听事件处理
......@@ -32,42 +39,47 @@ public class MqttClientMessageListener {
private final MqttClientTemplate client;
private final IEventRecordService recordService;
private final IRAgentEventService agentEventService;
private final IRMallSilentService mallSilentService;
@MqttClientSubscribe(value = "${mqtt.client.server-topic:/MS/receive}", qos = MqttQoS.QOS2)
public void onMessage(String topic, byte[] payload) {
try {
JsonNode jsonObj = JsonUtil.parseTree(payload);
String agentUid = jsonObj.path("agentUid").asText();
String type = jsonObj.path("eventType").asText();
SendData sendData = JsonUtil.parseObject(payload, SendData.class);
String agentUid = sendData.getAgentUid();
String type = sendData.getEventType();
log.info("收到[{}]消息,类型:[{}]", agentUid, type);
if (CollUtil.isEmpty(sendData.getRecList())) {
log.info("[{}]上报的指标记录为空", agentUid);
return;
}
switch (MqttMessageType.getEnumByType(type)) {
case REGISTER -> updateTaskByAgent(agentUid);
// region mall + store 共有指标
case PASSENGER_FLOW_INTERRUPT -> handlePassengerFlowInterrupt(jsonObj.toString());
case DEVICE_OFFLINE -> handleDeviceOffline(jsonObj.toString());
case REID_ANALYZE -> handleReid(jsonObj.toString());
case DEVICE_REGISTRATION -> handleDeviceRegistration(jsonObj.toString());
case HEADCOUNT_RATIO -> handleHeadcountRatio(jsonObj.toString());
case STAFF_RECOGNIZE -> handleStaffRecognize(jsonObj.toString());
case PASSENGER_FLOW_INTERRUPT -> handlePassengerFlowInterrupt(sendData);
case DEVICE_OFFLINE -> handleDeviceOffline(sendData);
case REID_ANALYZE -> handleReid(sendData);
case DEVICE_REGISTRATION -> handleDeviceRegistration(sendData);
case HEADCOUNT_RATIO -> handleHeadcountRatio(sendData);
case STAFF_RECOGNIZE -> handleStaffRecognize(sendData);
// endregion
// region store 指标
case STORE_CUSTOMER_UNDULATE -> handleStoreCustomerUndulate(jsonObj.toString());
case STORE_GATE_DATA_UNDULATE -> handleStoreGateDateUndulate(jsonObj.toString());
case STORE_INOUT_MATCH_RATIO -> handleStoreInoutMatchRatio(jsonObj.toString());
case STORE_SINGLE_CLUSTER -> handleStoreSingleCluster(jsonObj.toString());
case STORE_ENTER_RATIO -> handleStoreEnterRatio(jsonObj.toString());
case STORE_CUSTOMER_UNDULATE -> handleStoreCustomerUndulate(sendData);
case STORE_GATE_DATA_UNDULATE -> handleStoreGateDateUndulate(sendData);
case STORE_INOUT_MATCH_RATIO -> handleStoreInoutMatchRatio(sendData);
case STORE_SINGLE_CLUSTER -> handleStoreSingleCluster(sendData);
case STORE_ENTER_RATIO -> handleStoreEnterRatio(sendData);
// endregion
// region mall 指标
case MALL_INOUT_DIFF -> handleMallInoutDiff(jsonObj.toString());
case MALL_SHOP_INOUT_DIFF -> handleMallShopInoutDiff(jsonObj.toString());
case MALL_DATA_UNDULATE -> handleMallDataUndulate(jsonObj.toString());
case MALL_GATE_DATA_UNDULATE -> handleMallGateDataUndulate(jsonObj.toString());
case MALL_SHOP_DATA_UNDULATE -> handleMallShopDataUndulate(jsonObj.toString());
case MALL_DILATATION_UNDULATE -> handleMallDilatationUndulate(jsonObj.toString());
case MALL_INOUT_DIFF -> handleMallInoutDiff(sendData);
case MALL_SHOP_INOUT_DIFF -> handleMallShopInoutDiff(sendData);
case MALL_DATA_UNDULATE -> handleMallDataUndulate(sendData);
case MALL_GATE_DATA_UNDULATE -> handleMallGateDataUndulate(sendData);
case MALL_SHOP_DATA_UNDULATE -> handleMallShopDataUndulate(sendData);
case MALL_DILATATION_UNDULATE -> handleMallDilatationUndulate(sendData);
// endregion
default -> log.info("未定义的消息类型:{}, payload:{}", type, jsonObj);
default -> log.info("未定义的消息类型:{}, payload:{}", type, sendData);
}
} catch (Exception e) {
log.error("解析数据异常", e);
......@@ -107,55 +119,61 @@ public class MqttClientMessageListener {
/**
* 设备离线上报
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleDeviceOffline(String payloadStr) {
saveRecInDB(payloadStr);
private void handleDeviceOffline(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 全天分析异常上报
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleReid(String payloadStr) {
saveRecInDB(payloadStr);
private void handleReid(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 设备注册次数异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleDeviceRegistration(String payloadStr) {
saveRecInDB(payloadStr);
private void handleDeviceRegistration(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 人数/人次异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleHeadcountRatio(String payloadStr) {
saveRecInDB(payloadStr);
private void handleHeadcountRatio(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 店员识别异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStaffRecognize(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStaffRecognize(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 客流数据中断
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handlePassengerFlowInterrupt(String payloadStr) {
saveRecInDB(payloadStr);
private void handlePassengerFlowInterrupt(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
// region store 事件
......@@ -163,47 +181,52 @@ public class MqttClientMessageListener {
/**
* 门店人数波动异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStoreCustomerUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStoreCustomerUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 门店监控点数据波动异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStoreGateDateUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStoreGateDateUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 门店进出匹配率异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStoreInoutMatchRatio(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStoreInoutMatchRatio(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 门店单聚类异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStoreSingleCluster(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStoreSingleCluster(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 门店进店率异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleStoreEnterRatio(String payloadStr) {
saveRecInDB(payloadStr);
private void handleStoreEnterRatio(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
// endregion
......@@ -212,76 +235,131 @@ public class MqttClientMessageListener {
/**
* 广场进出客流差异异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallInoutDiff(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallInoutDiff(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 广场店铺进出差异异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallShopInoutDiff(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallShopInoutDiff(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 广场数据波动异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallDataUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallDataUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 广场外围入口数据波动异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallGateDataUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallGateDataUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 广场店铺数据波动异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallShopDataUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallShopDataUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
/**
* 广场膨胀系数异常
*
* @param payloadStr 事件记录
* @param sendData 事件记录
*/
private void handleMallDilatationUndulate(String payloadStr) {
saveRecInDB(payloadStr);
private void handleMallDilatationUndulate(SendData sendData) {
var recordList = silent(sendData);
saveRecInDB(recordList);
}
// endregion
/**
* 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) {
SendData sendData = JsonUtil.parseObject(payloadStr, SendData.class);
private List<EventRecord> silent(SendData sendData) {
var recList = sendData.getRecList();
if (CollUtil.isNotEmpty(recList)) {
var eventRecordList = recList.stream().peek(rec -> {
rec.setAgentUid(sendData.getAgentUid());
var agentUid = sendData.getAgentUid();
var eventUid = sendData.getEventUid();
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.setEventUid(sendData.getEventUid());
rec.setEventUid(eventUid);
rec.setEventType(sendData.getEventType());
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();
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
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
......@@ -61,7 +61,7 @@ public class EventRecord extends BaseDTO {
private String threshold;
/**
* 事件状态 0:异常 1:正常 -1:未知
* 事件状态 0:异常 1:正常 -1:未知 2:忽略
*/
@TableField(value = "\"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
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
......@@ -29,9 +29,9 @@ public interface IStoreService extends MPJBaseService<Store> {
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);
......
......@@ -438,8 +438,8 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
}
@Override
public List<FileInfo> contractFile(List<Long> storeIdList) {
var contractStoreList = contractStoreService.lambdaQuery().in(RContractStore::getStoreId, storeIdList).list();
public List<FileInfo> contractFile(Long storeId) {
var contractStoreList = contractStoreService.lambdaQuery().eq(RContractStore::getStoreId, storeId).list();
var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList();
return fileService.lambdaQuery()
.in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L)))
......@@ -449,31 +449,27 @@ public class StoreServiceImpl extends MPJBaseServiceImpl<StoreMapper, Store> imp
}
@Override
public List<Map<String, Number>> contractFileDetail(List<Long> storeIdList) {
var contractStoreList = contractStoreService.lambdaQuery().in(RContractStore::getStoreId, storeIdList).list();
public Map<String, Number> contractFileDetail(Long storeId) {
var contractStoreList = contractStoreService.lambdaQuery().eq(RContractStore::getStoreId, storeId).list();
var contractIdList = contractStoreList.stream().map(RContractStore::getContractId).toList();
var fileList = fileService.lambdaQuery()
.in(FileInfo::getSourceId, CollUtil.defaultIfEmpty(contractIdList, List.of(-1L)))
.in(FileInfo::getStoreId, -1L)
.in(FileInfo::getSourceType, 7, 8, 9, 10, 11, 12, 13, 14, 33, 34)
.list();
var storeId2FileMap = fileList.stream().collect(Collectors.groupingBy(FileInfo::getStoreId, Collectors.groupingBy(FileInfo::getSourceType)));
return storeIdList.stream().map(storeId -> {
var fileMap = storeId2FileMap.getOrDefault(storeId, Map.of());
var type2CntMap = fileList.stream().collect(Collectors.groupingBy(FileInfo::getSourceType, Collectors.counting()));
Map<String, Number> map = new HashMap<>();
map.put("storeId", storeId);
map.put("7", fileMap.getOrDefault(7, List.of()).size());
map.put("8", fileMap.getOrDefault(8, List.of()).size());
map.put("9", fileMap.getOrDefault(9, List.of()).size());
map.put("10", fileMap.getOrDefault(10, List.of()).size());
map.put("11", fileMap.getOrDefault(11, List.of()).size());
map.put("12", fileMap.getOrDefault(12, List.of()).size());
map.put("13", fileMap.getOrDefault(13, List.of()).size());
map.put("14", fileMap.getOrDefault(14, List.of()).size());
map.put("33", fileMap.getOrDefault(33, List.of()).size());
map.put("34", fileMap.getOrDefault(34, List.of()).size());
map.put("7", type2CntMap.getOrDefault(7, 0L));
map.put("8", type2CntMap.getOrDefault(8, 0L));
map.put("9", type2CntMap.getOrDefault(9, 0L));
map.put("10", type2CntMap.getOrDefault(10, 0L));
map.put("11", type2CntMap.getOrDefault(11, 0L));
map.put("12", type2CntMap.getOrDefault(12, 0L));
map.put("13", type2CntMap.getOrDefault(13, 0L));
map.put("14", type2CntMap.getOrDefault(14, 0L));
map.put("33", type2CntMap.getOrDefault(33, 0L));
map.put("34", type2CntMap.getOrDefault(34, 0L));
return map;
}).toList();
}
@Override
......
......@@ -6,8 +6,10 @@ import org.springframework.stereotype.Service;
import vion.mapper.monitor.MAccountMapper;
import vion.model.monitor.MAccount;
import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import vion.service.monitor.IMAccountService;
import vion.service.monitor.IRAccountEventService;
import vion.service.monitor.IRUserAccountService;
import java.util.List;
......@@ -20,6 +22,7 @@ import java.util.List;
public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAccount> implements IMAccountService {
private final IRAccountEventService accountEventService;
private final IRUserAccountService userAccountService;
@Override
public List<RAccountEvent> getEventById(String uid) {
......@@ -30,7 +33,23 @@ public class MAccountServiceImpl extends MPJBaseServiceImpl<MAccountMapper, MAcc
public String saveEvent(String agentUid, String uid, RAccountEvent event) {
event.setAgentUid(agentUid);
event.setAccountUid(uid);
accountEventService.save(event);
return "";
return accountEventService.save(event) ? "成功" : "失败";
}
@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
private final IEventRecordService eventRecordService;
private final IRAgentEventService agentEventService;
private final IRMallRemarkService mallRemarkService;
private final IRMallSilentService mallSilentService;
private final AgentMapper agentMapper;
private final MqttClientTemplate client;
private final Converter converter;
......@@ -99,6 +100,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.leftJoin(MAccount.class, MAccount::getUid, Mall::getAccountUid)
.leftJoin(Agent.class, Agent::getUid, Mall::getAgentUid)
.eq(Mall::getAttention, 1)
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), Mall::getAccountUid, dto.getAccountUidList())
.orderByDesc(Mall::getAccountUid, Mall::getName);
var mallVOPage = this.selectJoinListPage(Page.of(dto.getPageNum(), dto.getPageSize()), MallVO.class, wrapper);
if (CollUtil.isNotEmpty(mallVOPage.getRecords())) {
......@@ -137,6 +139,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.leftJoin(Agent.class, Agent::getUid, RAgentEvent::getAgentUid)
.in(RAgentEvent::getEventUid, dto.getEventUidList())
.eq(Agent::getType, dto.getAgentType())
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), RAgentEvent::getAccountUid, dto.getAccountUidList())
.orderByDesc(RAgentEvent::getAccountUid, RAgentEvent::getMallUid);
var agentEventList = agentEventService.selectJoinList(RAgentEvent.class, agentEventWrapper);
if (CollUtil.isEmpty(agentEventList)) {
......@@ -194,6 +197,7 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
.ge(EventRecord::getCreateTime, LocalDateTime.of(LocalDate.now(), LocalTime.MIN))
.eq(EventRecord::getAgentType, dto.getAgentType())
.in(CollUtil.isNotEmpty(dto.getEventUidList()), EventRecord::getEventUid, dto.getEventUidList())
.in(CollUtil.isNotEmpty(dto.getAccountUidList()), EventRecord::getAccountUid, dto.getAccountUidList())
.orderByAsc(EventRecord::getMallUid))
.eq(EventRecord::getStatus, 0);
var eventRecordList = eventRecordService.selectJoinList(EventRecord.class, eventRecWrapper);
......@@ -276,4 +280,26 @@ public class MallServiceImpl extends MPJBaseServiceImpl<MallMapper, Mall> implem
agentEventService.lambdaUpdate().eq(RAgentEvent::getMallUid, attentionMall.getUid()).remove();
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;
import com.github.yulichang.base.MPJBaseService;
import vion.model.monitor.MAccount;
import vion.model.monitor.RAccountEvent;
import vion.model.monitor.RUserAccount;
import java.util.List;
......@@ -16,4 +17,10 @@ public interface IMAccountService extends MPJBaseService<MAccount> {
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;
import vion.dto.monitor.MallDTO;
import vion.model.monitor.MAccount;
import vion.model.monitor.Mall;
import vion.model.monitor.RMallSilent;
import vion.vo.monitor.MallVO;
import java.util.List;
......@@ -33,4 +34,11 @@ public interface IMallService extends MPJBaseService<Mall> {
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!