27 changed files with 898 additions and 9 deletions
@ -0,0 +1,15 @@ |
|||
package com.epmet.dto.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
@Data |
|||
public class LogOperationListFormDTO { |
|||
|
|||
private String operatorName; |
|||
|
|||
private String operatorMobile; |
|||
|
|||
private Integer pageNo = 1; |
|||
|
|||
private Integer pageSize = 10; |
|||
} |
@ -0,0 +1,49 @@ |
|||
package com.epmet.dto.region; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* |
|||
*/ |
|||
@Data |
|||
public class LogOperationResultDTO { |
|||
|
|||
/** |
|||
* 大类别。登录login,项目流转project |
|||
*/ |
|||
private String category; |
|||
/** |
|||
* 类型枚举,小类别。登录login,logout退出,shift_project议题转项目等 |
|||
*/ |
|||
private String type; |
|||
|
|||
/** |
|||
* 类型枚举名称 |
|||
*/ |
|||
private String typeDisplay; |
|||
|
|||
/** |
|||
* 内容 |
|||
*/ |
|||
private String content; |
|||
|
|||
/** |
|||
* 操作目标ID |
|||
*/ |
|||
private String targetId; |
|||
|
|||
/** |
|||
* 操作人ID |
|||
*/ |
|||
private String operatorId; |
|||
private String operatorName; |
|||
private String operatorMobile; |
|||
|
|||
/** |
|||
* 操作时间,该时间不是插入数据的时间,而是操作发生的真实时间 |
|||
*/ |
|||
private Date operatingTime; |
|||
|
|||
} |
@ -0,0 +1,39 @@ |
|||
package com.epmet.enums; |
|||
|
|||
/** |
|||
* 操作日志类型枚举 |
|||
*/ |
|||
public enum LogOperationTypeEnum { |
|||
LOGIN("login", "登录"), |
|||
LOGOUT("logout", "退出登录"), |
|||
ISSUE_SHIFT_PROJECT("issue_shift_project", "议题转项目"), |
|||
CLOSE_PROJECT("close_project", "项目结案"), |
|||
PROJECT_TRANSFER("project_transfer", "项目流转"), |
|||
PROJECT_RESPONSE("project_response", "响应处理"), |
|||
PROJECT_APPROVAL("project_approval", "项目立项"); |
|||
|
|||
private String type; |
|||
private String typeDisplay; |
|||
|
|||
LogOperationTypeEnum(String type, String typeDisplay) { |
|||
this.type = type; |
|||
this.typeDisplay = typeDisplay; |
|||
} |
|||
|
|||
public static LogOperationTypeEnum get(String type) { |
|||
for (LogOperationTypeEnum t : LogOperationTypeEnum.values()) { |
|||
if (t.type.equals(type)) { |
|||
return t; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static String getDisplay(String type) { |
|||
LogOperationTypeEnum object = get(type); |
|||
if (object == null) { |
|||
return null; |
|||
} |
|||
return object.typeDisplay; |
|||
} |
|||
} |
@ -0,0 +1,45 @@ |
|||
package com.epmet.controller; |
|||
|
|||
import com.epmet.commons.tools.security.user.LoginUserUtil; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.commons.tools.validator.ValidatorUtils; |
|||
import com.epmet.dto.form.LogOperationListFormDTO; |
|||
import com.epmet.dto.region.LogOperationResultDTO; |
|||
import com.epmet.service.LogOperationService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.util.CollectionUtils; |
|||
import org.springframework.web.bind.annotation.PostMapping; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
@RequestMapping("log/operation") |
|||
@RestController |
|||
public class LogOperationController { |
|||
|
|||
@Autowired |
|||
private LogOperationService logOperationService; |
|||
|
|||
@Autowired |
|||
private LoginUserUtil loginUserUtil; |
|||
|
|||
@PostMapping("/list") |
|||
public Result<List<LogOperationResultDTO>> listLogOperations(@RequestBody LogOperationListFormDTO input) { |
|||
ValidatorUtils.validateEntity(input); |
|||
String operatorMobile = input.getOperatorMobile(); |
|||
String operatorName = input.getOperatorName(); |
|||
Integer pageNo = input.getPageNo(); |
|||
Integer pageSize = input.getPageSize(); |
|||
|
|||
String customerId = loginUserUtil.getLoginUserCustomerId(); |
|||
List<LogOperationResultDTO> resultList = logOperationService.listOperationLogs(operatorName, operatorMobile, customerId, pageNo, pageSize); |
|||
if (CollectionUtils.isEmpty(resultList)) { |
|||
resultList = new ArrayList<>(); |
|||
} |
|||
return new Result<List<LogOperationResultDTO>>().ok(resultList); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,33 @@ |
|||
/** |
|||
* Copyright 2018 人人开源 https://www.renren.io
|
|||
* <p> |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* <p> |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* <p> |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
|
|||
package com.epmet.dao; |
|||
|
|||
import com.epmet.commons.mybatis.dao.BaseDao; |
|||
import com.epmet.entity.LogOperationEntity; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
/** |
|||
* 操作日指标 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Mapper |
|||
public interface LogOperationDao extends BaseDao<LogOperationEntity> { |
|||
|
|||
} |
@ -0,0 +1,70 @@ |
|||
/** |
|||
* Copyright 2018 人人开源 https://www.renren.io
|
|||
* <p> |
|||
* This program is free software: you can redistribute it and/or modify |
|||
* it under the terms of the GNU General Public License as published by |
|||
* the Free Software Foundation, either version 3 of the License, or |
|||
* (at your option) any later version. |
|||
* <p> |
|||
* This program is distributed in the hope that it will be useful, |
|||
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
* GNU General Public License for more details. |
|||
* <p> |
|||
* You should have received a copy of the GNU General Public License |
|||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
*/ |
|||
|
|||
package com.epmet.entity; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.TableName; |
|||
|
|||
import com.epmet.commons.mybatis.entity.BaseEpmetEntity; |
|||
import lombok.Data; |
|||
import lombok.EqualsAndHashCode; |
|||
|
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* 操作日指标 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Data |
|||
@EqualsAndHashCode(callSuper=false) |
|||
@TableName("log_operation") |
|||
public class LogOperationEntity extends BaseEpmetEntity { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 大类别。登录login,项目流转project |
|||
*/ |
|||
private String category; |
|||
/** |
|||
* 类型枚举,小类别。登录login,logout退出,shift_project议题转项目等 |
|||
*/ |
|||
private String type; |
|||
|
|||
/** |
|||
* 内容 |
|||
*/ |
|||
private String content; |
|||
|
|||
/** |
|||
* 操作目标ID |
|||
*/ |
|||
private String targetId; |
|||
|
|||
/** |
|||
* 操作人ID |
|||
*/ |
|||
private String operatorId; |
|||
|
|||
/** |
|||
* 操作时间,该时间不是插入数据的时间,而是操作发生的真实时间 |
|||
*/ |
|||
private Date operatingTime; |
|||
|
|||
} |
@ -0,0 +1,66 @@ |
|||
package com.epmet.mq.listener; |
|||
|
|||
import com.epmet.commons.rocketmq.constants.ConsomerGroupConstants; |
|||
import com.epmet.commons.rocketmq.constants.TopicConstants; |
|||
import com.epmet.commons.tools.enums.EnvEnum; |
|||
import com.epmet.mq.listener.listener.OperationLogListener; |
|||
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; |
|||
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; |
|||
import org.apache.rocketmq.client.exception.MQClientException; |
|||
import org.apache.rocketmq.common.protocol.heartbeat.MessageModel; |
|||
import org.springframework.beans.factory.annotation.Value; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
import javax.annotation.PostConstruct; |
|||
|
|||
@Component |
|||
public class RocketMQConsumerRegister { |
|||
@Value("${spring.profiles.active}") |
|||
private String env; |
|||
@Value("${rocketmq.name-server}") |
|||
private String nameServer; |
|||
|
|||
/** |
|||
* @return |
|||
* @Description 注册监听器 |
|||
* @author wxz |
|||
* @date 2021.03.03 16:09 |
|||
*/ |
|||
@PostConstruct |
|||
public void registerAllListeners() { |
|||
try { |
|||
//if (!EnvEnum.LOCAL.getCode().equals(env)) {
|
|||
register(nameServer, ConsomerGroupConstants.OPERATION_LOG_GROUP, MessageModel.CLUSTERING, TopicConstants.OPERATION_LOG, "*", new OperationLogListener()); |
|||
//}
|
|||
} catch (MQClientException e) { |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
public void register(String nameServer, String group, MessageModel messageModel, String topic, String subException, MessageListenerConcurrently listener) throws MQClientException { |
|||
// 实例化消费者
|
|||
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(group); |
|||
|
|||
// 设置NameServer的地址
|
|||
consumer.setNamesrvAddr(nameServer); |
|||
consumer.setMessageModel(messageModel); |
|||
consumer.setInstanceName(buildInstanceName()); |
|||
// 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
|
|||
consumer.subscribe(topic, subException); |
|||
// 注册回调实现类来处理从broker拉取回来的消息
|
|||
consumer.registerMessageListener(listener); |
|||
// 启动消费者实例
|
|||
consumer.start(); |
|||
} |
|||
|
|||
private String buildInstanceName() { |
|||
String instanceName = ""; |
|||
for (int i = 0; i < 4; i++) { |
|||
int t = (int) (Math.random() * 10); |
|||
instanceName = instanceName.concat(t + ""); |
|||
} |
|||
|
|||
return instanceName; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,76 @@ |
|||
package com.epmet.mq.listener.listener; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.epmet.commons.rocketmq.messages.OperationLogMQMsg; |
|||
import com.epmet.commons.tools.distributedlock.DistributedLock; |
|||
import com.epmet.commons.tools.exception.ExceptionUtils; |
|||
import com.epmet.commons.tools.exception.RenException; |
|||
import com.epmet.commons.tools.utils.SpringContextUtils; |
|||
import com.epmet.service.LogOperationService; |
|||
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; |
|||
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; |
|||
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; |
|||
import org.apache.rocketmq.common.message.MessageExt; |
|||
import org.redisson.api.RLock; |
|||
import org.slf4j.Logger; |
|||
import org.slf4j.LoggerFactory; |
|||
|
|||
import java.util.List; |
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
/** |
|||
* @author wxz |
|||
* @Description 操作日志监听器 |
|||
|
|||
* @return |
|||
* @date 2021.06.07 16:12 |
|||
* |
|||
* |
|||
* { |
|||
* "type": "login", |
|||
* "content": "我登录了", |
|||
* "targetId": "11", |
|||
* "operatorId": "2", |
|||
* "operatingTime": "1623056525000" |
|||
* } |
|||
*/ |
|||
public class OperationLogListener implements MessageListenerConcurrently { |
|||
|
|||
private Logger logger = LoggerFactory.getLogger(getClass()); |
|||
|
|||
@Override |
|||
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) { |
|||
try { |
|||
msgs.forEach(msg -> consumeMessage(msg)); |
|||
} catch (Exception e) { |
|||
logger.error(ExceptionUtils.getErrorStackTrace(e)); |
|||
return ConsumeConcurrentlyStatus.RECONSUME_LATER; |
|||
} |
|||
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; |
|||
} |
|||
|
|||
private void consumeMessage(MessageExt messageExt) { |
|||
String tags = messageExt.getTags(); |
|||
String msg = new String(messageExt.getBody()); |
|||
logger.info("操作日志监听器-收到消息内容:{}", msg); |
|||
OperationLogMQMsg msgObj = JSON.parseObject(msg, OperationLogMQMsg.class); |
|||
|
|||
DistributedLock distributedLock = null; |
|||
RLock lock = null; |
|||
try { |
|||
distributedLock = SpringContextUtils.getBean(DistributedLock.class); |
|||
lock = distributedLock.getLock(String.format("lock:operation_log:%s:%s", msgObj.getType(), msgObj.getTargetId()), |
|||
30L, 30L, TimeUnit.SECONDS); |
|||
SpringContextUtils.getBean(LogOperationService.class).log(msgObj, tags); |
|||
} catch (RenException e) { |
|||
// 如果是我们手动抛出的异常,说明在业务可控范围内。目前不需要MQ重试
|
|||
logger.error("【RocketMQ】添加操作日志失败:".concat(ExceptionUtils.getErrorStackTrace(e))); |
|||
} catch (Exception e) { |
|||
// 不是我们自己抛出的异常,可以让MQ重试
|
|||
logger.error("【RocketMQ】添加操作日志失败:".concat(ExceptionUtils.getErrorStackTrace(e))); |
|||
throw e; |
|||
} finally { |
|||
distributedLock.unLock(lock); |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
package com.epmet.service; |
|||
|
|||
import com.epmet.commons.rocketmq.messages.OperationLogMQMsg; |
|||
import com.epmet.dto.region.LogOperationResultDTO; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 操作日志 |
|||
*/ |
|||
public interface LogOperationService { |
|||
|
|||
/** |
|||
* @Description 记录日志 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 21:56 |
|||
*/ |
|||
void log(OperationLogMQMsg msg, String category); |
|||
|
|||
/** |
|||
* @Description 查询操作日志 列表 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 21:56 |
|||
*/ |
|||
List<LogOperationResultDTO> listOperationLogs(String operatorName, String operatorMobile, String customerId, Integer pageNo, Integer pageSize); |
|||
} |
@ -0,0 +1,186 @@ |
|||
package com.epmet.service.impl; |
|||
|
|||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
|||
import com.baomidou.mybatisplus.core.metadata.IPage; |
|||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
|||
import com.epmet.commons.rocketmq.messages.OperationLogMQMsg; |
|||
import com.epmet.commons.tools.constant.ServiceConstant; |
|||
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|||
import com.epmet.commons.tools.exception.RenException; |
|||
import com.epmet.commons.tools.feign.ResultDataResolver; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.dao.LogOperationDao; |
|||
import com.epmet.dto.CustomerStaffDTO; |
|||
import com.epmet.dto.form.CustomerStaffFormDTO; |
|||
import com.epmet.dto.form.ThirdCustomerStaffFormDTO; |
|||
import com.epmet.dto.region.LogOperationResultDTO; |
|||
import com.epmet.entity.LogOperationEntity; |
|||
import com.epmet.enums.LogOperationTypeEnum; |
|||
import com.epmet.feign.EpmetUserOpenFeignClient; |
|||
import com.epmet.service.LogOperationService; |
|||
import com.github.pagehelper.PageHelper; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.CollectionUtils; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.stream.Collectors; |
|||
|
|||
@Service |
|||
public class LogOperationServiceImpl implements LogOperationService, ResultDataResolver { |
|||
|
|||
@Autowired |
|||
private LogOperationDao logOperationDao; |
|||
|
|||
@Autowired |
|||
private EpmetUserOpenFeignClient userOpenFeignClient; |
|||
|
|||
@Override |
|||
public void log(OperationLogMQMsg msg, String category) { |
|||
LambdaQueryWrapper<LogOperationEntity> w = new LambdaQueryWrapper<>(); |
|||
w.eq(LogOperationEntity::getType, msg.getType()); |
|||
w.eq(LogOperationEntity::getTargetId, msg.getTargetId()); |
|||
w.eq(LogOperationEntity::getOperatorId, msg.getOperatorId()); |
|||
w.eq(LogOperationEntity::getOperatingTime, msg.getOperatingTime()); |
|||
|
|||
Integer existsCount = logOperationDao.selectCount(w); |
|||
if (existsCount > 0) { |
|||
// 该日志已存在,不做任何操作
|
|||
return; |
|||
} |
|||
|
|||
LogOperationEntity insert = new LogOperationEntity(); |
|||
insert.setContent(msg.getContent()); |
|||
insert.setOperatingTime(msg.getOperatingTime()); |
|||
insert.setOperatorId(msg.getOperatorId()); |
|||
insert.setTargetId(msg.getTargetId()); |
|||
insert.setType(msg.getType()); |
|||
insert.setCategory(category); |
|||
logOperationDao.insert(insert); |
|||
} |
|||
|
|||
@Override |
|||
public List<LogOperationResultDTO> listOperationLogs(String operatorName, String operatorMobile, String customerId, Integer pageNo, Integer pageSize) { |
|||
// 1.条件查询
|
|||
if (StringUtils.isNotBlank(operatorMobile)) { |
|||
return listByOperatorMobile(operatorMobile, customerId, pageNo, pageSize); |
|||
} else if (StringUtils.isNotBlank(operatorName)) { |
|||
return listByOperatorName(operatorName, pageNo, pageSize); |
|||
} |
|||
|
|||
// 2.直接分页查询
|
|||
// 条件查询,排序
|
|||
LambdaQueryWrapper<LogOperationEntity> w = new LambdaQueryWrapper<>(); |
|||
w.orderByDesc(LogOperationEntity::getOperatingTime); |
|||
IPage<LogOperationEntity> iPage = logOperationDao.selectPage(new Page<>(pageNo, pageSize), w); |
|||
List<LogOperationEntity> logs = iPage.getRecords(); |
|||
List<String> userIds = logs.stream().map(l -> l.getOperatorId()).collect(Collectors.toList()); |
|||
|
|||
return convertLogOperationEntity2DTO(logs, getStaffMapByUserIds(userIds)); |
|||
} |
|||
|
|||
private Map<String, CustomerStaffDTO> getStaffMapByUserIds(List<String> userIds) { |
|||
CustomerStaffFormDTO form = new CustomerStaffFormDTO(); |
|||
form.setUserIds(userIds); |
|||
Result<List<CustomerStaffDTO>> result = userOpenFeignClient.list(form); |
|||
List<CustomerStaffDTO> staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常"); |
|||
|
|||
HashMap<String, CustomerStaffDTO> staffMap = new HashMap<>(); |
|||
staffs.forEach(s -> { |
|||
staffMap.put(s.getUserId(), s); |
|||
}); |
|||
|
|||
return staffMap; |
|||
} |
|||
|
|||
/** |
|||
* 通过操作人手机号查询操作日志列表 |
|||
* |
|||
* @param operatorMobile |
|||
* @param customerId |
|||
*/ |
|||
private List<LogOperationResultDTO> listByOperatorMobile(String operatorMobile, String customerId, Integer pageNo, Integer pageSize) { |
|||
CustomerStaffFormDTO form = new CustomerStaffFormDTO(); |
|||
form.setCustomerId(customerId); |
|||
form.setMobile(operatorMobile); |
|||
Result<List<CustomerStaffDTO>> result = userOpenFeignClient.list(form); |
|||
List<CustomerStaffDTO> staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务发生异常"); |
|||
|
|||
if (staffs.size() == 0) { |
|||
return null; |
|||
} |
|||
CustomerStaffDTO staff = staffs.get(0); |
|||
|
|||
QueryWrapper<LogOperationEntity> w = new QueryWrapper<>(); |
|||
w.lambda() |
|||
.eq(LogOperationEntity::getOperatorId, staff.getUserId()) |
|||
.eq(LogOperationEntity::getDelFlag, 0) |
|||
.orderByDesc(LogOperationEntity::getOperatingTime); |
|||
|
|||
IPage<LogOperationEntity> iPage = logOperationDao.selectPage(new Page<>(pageNo, pageSize), w); |
|||
|
|||
HashMap<String, CustomerStaffDTO> staffMap = new HashMap<>(); |
|||
staffMap.put(staff.getUserId(), staff); |
|||
|
|||
return convertLogOperationEntity2DTO(iPage.getRecords(), staffMap); |
|||
} |
|||
|
|||
/** |
|||
* @Description 通过操作人姓名查询操作日志列表 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.08 11:12 |
|||
*/ |
|||
private List<LogOperationResultDTO> listByOperatorName(String operatorName, Integer pageNo, Integer pageSize) { |
|||
CustomerStaffFormDTO form = new CustomerStaffFormDTO(); |
|||
form.setRealName(operatorName); |
|||
Result<List<CustomerStaffDTO>> result = userOpenFeignClient.list(form); |
|||
List<CustomerStaffDTO> staffs = getResultDataOrThrowsException(result, ServiceConstant.EPMET_USER_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), "调用user服务查询工作人员信息发生异常"); |
|||
|
|||
List<String> userIds = new ArrayList<>(); |
|||
HashMap<String, CustomerStaffDTO> staffMap = new HashMap<String, CustomerStaffDTO>(); |
|||
staffs.forEach(s -> { |
|||
staffMap.put(s.getUserId(), s); |
|||
userIds.add(s.getUserId()); |
|||
}); |
|||
|
|||
if (CollectionUtils.isEmpty(userIds)) { |
|||
return new ArrayList<>(); |
|||
} |
|||
LambdaQueryWrapper<LogOperationEntity> w = new LambdaQueryWrapper<>(); |
|||
w.in(LogOperationEntity::getOperatorId, userIds); |
|||
w.eq(LogOperationEntity::getDelFlag, 0); |
|||
w.orderByDesc(LogOperationEntity::getOperatingTime); |
|||
|
|||
IPage<LogOperationEntity> iPage = logOperationDao.selectPage(new Page<>(pageNo, pageSize), w); |
|||
|
|||
return convertLogOperationEntity2DTO(iPage.getRecords(), staffMap); |
|||
} |
|||
|
|||
/** |
|||
* @Description 将操作日志entity转化为dto列表 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.08 11:12 |
|||
*/ |
|||
private List<LogOperationResultDTO> convertLogOperationEntity2DTO(List<LogOperationEntity> logOperationEntities, Map<String, CustomerStaffDTO> staffMap) { |
|||
return logOperationEntities.stream().map(l -> { |
|||
LogOperationResultDTO ldto = new LogOperationResultDTO(); |
|||
ldto.setCategory(l.getCategory()); |
|||
ldto.setContent(l.getContent()); |
|||
ldto.setOperatingTime(l.getOperatingTime()); |
|||
ldto.setOperatorId(l.getOperatorId()); |
|||
ldto.setTargetId(l.getTargetId()); |
|||
ldto.setType(l.getType()); |
|||
ldto.setTypeDisplay(LogOperationTypeEnum.getDisplay(l.getType())); |
|||
ldto.setOperatorMobile(staffMap.get(l.getOperatorId()).getMobile()); |
|||
ldto.setOperatorName(staffMap.get(l.getOperatorId()).getRealName()); |
|||
return ldto; |
|||
}).collect(Collectors.toList()); |
|||
} |
|||
} |
@ -0,0 +1,15 @@ |
|||
CREATE TABLE `log_operation` ( |
|||
`ID` varchar(64) NOT NULL COMMENT '主键ID', |
|||
`TYPE` varchar(64) NOT NULL COMMENT '类型枚举', |
|||
`CONTENT` varchar(512) NOT NULL COMMENT '内容', |
|||
`CATEGORY` varchar(64) NOT NULL COMMENT '类别', |
|||
`TARGET_ID` varchar(64) NOT NULL COMMENT '操作目标ID', |
|||
`OPERATOR_ID` varchar(64) NOT NULL COMMENT '操作人ID', |
|||
`OPERATING_TIME` datetime NOT NULL COMMENT '操作时间,该时间不是插入数据的时间,而是操作发生的真实时间', |
|||
`DEL_FLAG` int(11) NOT NULL DEFAULT '0' COMMENT '删除标识 0.未删除 1.已删除', |
|||
`REVISION` int(11) NOT NULL COMMENT '乐观锁', |
|||
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建人', |
|||
`CREATED_TIME` datetime NOT NULL COMMENT '创建时间', |
|||
`UPDATED_BY` varchar(32) NOT NULL COMMENT '更新人', |
|||
`UPDATED_TIME` datetime NOT NULL COMMENT '更新时间' |
|||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='操作日指标' |
@ -0,0 +1,23 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> |
|||
|
|||
<mapper namespace="com.epmet.dao.LogOperationDao"> |
|||
|
|||
<resultMap type="com.epmet.entity.LogOperationEntity" id="logOperationMap"> |
|||
<result property="id" column="ID"/> |
|||
<result property="type" column="TYPE"/> |
|||
<result property="content" column="CONTENT"/> |
|||
<result property="targetId" column="TARGET_ID"/> |
|||
<result property="category" column="CATEGORY"/> |
|||
<result property="operatorId" column="OPERATOR_ID"/> |
|||
<result property="operatingTime" column="OPERATING_TIME"/> |
|||
<result property="delFlag" column="DEL_FLAG"/> |
|||
<result property="revision" column="REVISION"/> |
|||
<result property="createdBy" column="CREATED_BY"/> |
|||
<result property="createdTime" column="CREATED_TIME"/> |
|||
<result property="updatedBy" column="UPDATED_BY"/> |
|||
<result property="updatedTime" column="UPDATED_TIME"/> |
|||
</resultMap> |
|||
|
|||
|
|||
</mapper> |
@ -0,0 +1,16 @@ |
|||
package com.epmet.commons.rocketmq.messages; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
public class OperationLogMQMsg { |
|||
|
|||
private String type; |
|||
private String content; |
|||
private String targetId; |
|||
private String operatorId; |
|||
private Date operatingTime; |
|||
|
|||
} |
@ -0,0 +1,50 @@ |
|||
package com.epmet.commons.tools.feign; |
|||
|
|||
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|||
import com.epmet.commons.tools.exception.RenException; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
|
|||
/** |
|||
* Feign请求结果解析器 |
|||
*/ |
|||
public interface ResultDataResolver { |
|||
|
|||
/** |
|||
* @Description 获取Result种的data,如果失败(返回result为null或者result.success为false),那么返回null |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 22:45 |
|||
*/ |
|||
//default <R> R tryGetResultData(Result<R> result, String targetServiceName) {
|
|||
// Logger logger = LoggerFactory.getLogger(ResultDataResolver.class);
|
|||
// if (result == null) {
|
|||
// logger.error("调用{}服务发生错误,返回Result为null", targetServiceName);
|
|||
// return null;
|
|||
// }
|
|||
// if (!result.success()) {
|
|||
// logger.error("调用{}服务发生错误,错误信息:{}", targetServiceName, result.getInternalMsg());
|
|||
// return null;
|
|||
// }
|
|||
// return result.getData();
|
|||
//}
|
|||
|
|||
/** |
|||
* @Description 获取Result种的data,如果失败(返回result为null或者result.success为false),那么抛出异常 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 22:45 |
|||
*/ |
|||
default <R> R getResultDataOrThrowsException(Result<R> result, String targetServiceName, Integer errorCode, String errorInternalMsg) { |
|||
if (result == null) { |
|||
throw new RenException(EpmetErrorCode.SERVER_ERROR.getCode(), "调用{}服务发生错误,返回Result为null", targetServiceName); |
|||
} |
|||
if (!result.success()) { |
|||
Integer finalErrorCode = errorCode == null ? result.getCode() : errorCode; |
|||
String finalErrorInternalMsg = StringUtils.isBlank(errorInternalMsg) ? result.getInternalMsg() : errorInternalMsg; |
|||
throw new RenException(finalErrorCode, finalErrorInternalMsg); |
|||
} |
|||
return result.getData(); |
|||
} |
|||
|
|||
} |
Loading…
Reference in new issue