185 changed files with 5622 additions and 286 deletions
@ -0,0 +1,13 @@ |
|||
package com.epmet.dto.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
@Data |
|||
public class LogOperationListFormDTO { |
|||
|
|||
private String condition; |
|||
|
|||
private Integer pageNo = 1; |
|||
|
|||
private Integer pageSize = 10; |
|||
} |
@ -0,0 +1,52 @@ |
|||
package com.epmet.dto.region; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties; |
|||
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 Long operatingTime; |
|||
|
|||
} |
@ -0,0 +1,44 @@ |
|||
//package com.epmet.enums;
|
|||
//
|
|||
//import lombok.Data;
|
|||
//
|
|||
///**
|
|||
// * 操作日志类型枚举
|
|||
// */
|
|||
//public enum LogOperationTypeEnum {
|
|||
// LOGIN("login", "登录"),
|
|||
// LOGOUT("logout", "退出登录");
|
|||
//
|
|||
// private String type;
|
|||
// private String typeDisplay;
|
|||
//
|
|||
// public String getType() {
|
|||
// return type;
|
|||
// }
|
|||
//
|
|||
// public String getTypeDisplay() {
|
|||
// return 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,46 @@ |
|||
package com.epmet.controller; |
|||
|
|||
import com.epmet.commons.tools.security.user.LoginUserUtil; |
|||
import com.epmet.commons.tools.utils.IpUtils; |
|||
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 javax.servlet.http.HttpServletRequest; |
|||
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, HttpServletRequest request) { |
|||
ValidatorUtils.validateEntity(input); |
|||
String condition = input.getCondition(); |
|||
Integer pageNo = input.getPageNo(); |
|||
Integer pageSize = input.getPageSize(); |
|||
|
|||
String customerId = loginUserUtil.getLoginUserCustomerId(); |
|||
List<LogOperationResultDTO> resultList = logOperationService.listOperationLogs(condition, 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,87 @@ |
|||
/** |
|||
* 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 typeDisplay; |
|||
|
|||
private String ip; |
|||
|
|||
private String fromApp; |
|||
|
|||
private String fromClient; |
|||
|
|||
/** |
|||
* 内容 |
|||
*/ |
|||
private String content; |
|||
|
|||
/** |
|||
* 操作目标ID |
|||
*/ |
|||
private String targetId; |
|||
|
|||
/** |
|||
* 操作人ID |
|||
*/ |
|||
private String operatorId; |
|||
/** |
|||
* 操作人姓名 |
|||
*/ |
|||
private String operatorName; |
|||
|
|||
/** |
|||
* 操作人手机号 |
|||
*/ |
|||
private String operatorMobile; |
|||
|
|||
/** |
|||
* 操作时间,该时间不是插入数据的时间,而是操作发生的真实时间 |
|||
*/ |
|||
private Date operatingTime; |
|||
|
|||
} |
@ -0,0 +1,68 @@ |
|||
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.AuthOperationLogListener; |
|||
import com.epmet.mq.listener.listener.ProjectOperationLogListener; |
|||
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.AUTH_OPERATION_LOG_GROUP, MessageModel.CLUSTERING, TopicConstants.AUTH, "*", new AuthOperationLogListener()); |
|||
register(nameServer, ConsomerGroupConstants.PROJECT_OPERATION_LOG_GROUP, MessageModel.CLUSTERING, TopicConstants.PROJECT_CHANGED, "*", new ProjectOperationLogListener()); |
|||
} |
|||
} 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,63 @@ |
|||
package com.epmet.mq.listener.bean.log; |
|||
|
|||
import com.epmet.commons.tools.constant.ServiceConstant; |
|||
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|||
import com.epmet.commons.tools.feign.ResultDataResolver; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.commons.tools.utils.SpringContextUtils; |
|||
import com.epmet.dto.CustomerStaffDTO; |
|||
import com.epmet.feign.EpmetUserOpenFeignClient; |
|||
|
|||
/** |
|||
* 操作日志帮助类 单例 |
|||
*/ |
|||
public class LogOperationHelper implements ResultDataResolver { |
|||
|
|||
private EpmetUserOpenFeignClient userOpenFeignClient; |
|||
|
|||
private LogOperationHelper() { |
|||
} |
|||
|
|||
/** |
|||
* @Description 利用类只能加载一次的特性,保证类静态变量只能生成一份,实现单例 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.09 16:55 |
|||
*/ |
|||
private static class SingletonInnerClass { |
|||
public static LogOperationHelper instance = new LogOperationHelper(); |
|||
} |
|||
|
|||
/** |
|||
* @Description 获取实例 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.09 16:54 |
|||
*/ |
|||
public static LogOperationHelper getInstance() { |
|||
return SingletonInnerClass.instance; |
|||
} |
|||
|
|||
/** |
|||
* @Description 获取操作人信息 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.09 16:57 |
|||
*/ |
|||
public OperatorInfo getOperatorInfo(String userId) { |
|||
if (userOpenFeignClient == null) { |
|||
synchronized (this) { |
|||
if (userOpenFeignClient == null) { |
|||
userOpenFeignClient = SpringContextUtils.getBean(EpmetUserOpenFeignClient.class); |
|||
} |
|||
} |
|||
} |
|||
|
|||
CustomerStaffDTO form = new CustomerStaffDTO(); |
|||
form.setUserId(userId); |
|||
Result<CustomerStaffDTO> result = userOpenFeignClient.getCustomerStaffInfoByUserId(form); |
|||
CustomerStaffDTO staffInfo = getResultDataOrThrowsException(result, ServiceConstant.EPMET_ADMIN_SERVER, EpmetErrorCode.SERVER_ERROR.getCode(), |
|||
"调用epmet-user服务获取staff信息发生异常"); |
|||
return new OperatorInfo(staffInfo.getMobile(), staffInfo.getRealName()); |
|||
} |
|||
} |
@ -0,0 +1,11 @@ |
|||
package com.epmet.mq.listener.bean.log; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Data; |
|||
|
|||
@Data |
|||
@AllArgsConstructor |
|||
public class OperatorInfo { |
|||
private String mobile; |
|||
private String name; |
|||
} |
@ -0,0 +1,94 @@ |
|||
package com.epmet.mq.listener.listener; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.epmet.auth.constants.AuthOperationEnum; |
|||
import com.epmet.commons.rocketmq.messages.LoginMQMsg; |
|||
import com.epmet.commons.tools.constant.ServiceConstant; |
|||
import com.epmet.commons.tools.distributedlock.DistributedLock; |
|||
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|||
import com.epmet.commons.tools.exception.ExceptionUtils; |
|||
import com.epmet.commons.tools.exception.RenException; |
|||
import com.epmet.commons.tools.feign.ResultDataResolver; |
|||
import com.epmet.commons.tools.utils.IpUtils; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.commons.tools.utils.SpringContextUtils; |
|||
import com.epmet.dto.CustomerStaffDTO; |
|||
import com.epmet.entity.LogOperationEntity; |
|||
import com.epmet.feign.EpmetUserOpenFeignClient; |
|||
import com.epmet.mq.listener.bean.log.LogOperationHelper; |
|||
import com.epmet.mq.listener.bean.log.OperatorInfo; |
|||
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 |
|||
*/ |
|||
public class AuthOperationLogListener 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); |
|||
LoginMQMsg msgObj = JSON.parseObject(msg, LoginMQMsg.class); |
|||
|
|||
//获取操作人信息
|
|||
OperatorInfo operatorInfo = LogOperationHelper.getInstance().getOperatorInfo(msgObj.getUserId()); |
|||
LogOperationEntity logEntity = new LogOperationEntity(); |
|||
logEntity.setCategory(messageExt.getTopic()); |
|||
logEntity.setType(tags); |
|||
logEntity.setTypeDisplay(AuthOperationEnum.getDisplay(tags)); |
|||
logEntity.setIp(msgObj.getIp()); |
|||
logEntity.setFromApp(msgObj.getFromApp()); |
|||
logEntity.setFromClient(msgObj.getFromClient()); |
|||
logEntity.setTargetId(""); |
|||
logEntity.setOperatorId(msgObj.getUserId()); |
|||
logEntity.setOperatorName(operatorInfo.getName()); |
|||
logEntity.setOperatorMobile(operatorInfo.getMobile()); |
|||
logEntity.setOperatingTime(msgObj.getLoginTime()); |
|||
logEntity.setContent("成功登录系统"); |
|||
|
|||
DistributedLock distributedLock = null; |
|||
RLock lock = null; |
|||
try { |
|||
distributedLock = SpringContextUtils.getBean(DistributedLock.class); |
|||
lock = distributedLock.getLock(String.format("lock:auth_operation_log:%s:%s", logEntity.getType(), logEntity.getOperatorId()), |
|||
30L, 30L, TimeUnit.SECONDS); |
|||
SpringContextUtils.getBean(LogOperationService.class).log(logEntity); |
|||
} 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,109 @@ |
|||
package com.epmet.mq.listener.listener; |
|||
|
|||
import com.alibaba.fastjson.JSON; |
|||
import com.epmet.commons.rocketmq.messages.LoginMQMsg; |
|||
import com.epmet.commons.rocketmq.messages.ProjectChangedMQMsg; |
|||
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.entity.LogOperationEntity; |
|||
import com.epmet.mq.listener.bean.log.LogOperationHelper; |
|||
import com.epmet.mq.listener.bean.log.OperatorInfo; |
|||
import com.epmet.service.LogOperationService; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
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.08 22.21 |
|||
*/ |
|||
public class ProjectOperationLogListener 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); |
|||
ProjectChangedMQMsg msgObj = JSON.parseObject(msg, ProjectChangedMQMsg.class); |
|||
|
|||
String content = StringUtils.isBlank(msgObj.getOperationBrief()) ? "" : msgObj.getOperationBrief(); |
|||
|
|||
OperatorInfo operatorInfo = LogOperationHelper.getInstance().getOperatorInfo(msgObj.getOperatorId()); |
|||
|
|||
LogOperationEntity logEntity = new LogOperationEntity(); |
|||
logEntity.setCategory(messageExt.getTopic()); |
|||
logEntity.setType(msgObj.getOperation()); |
|||
logEntity.setTypeDisplay(getOperationTypeDisplay(msgObj.getOperation())); |
|||
logEntity.setTargetId(msgObj.getProjectId()); |
|||
logEntity.setIp(msgObj.getIp()); |
|||
logEntity.setFromApp(msgObj.getFromApp()); |
|||
logEntity.setFromClient(msgObj.getFromClient()); |
|||
logEntity.setOperatorId(msgObj.getOperatorId()); |
|||
logEntity.setOperatorMobile(operatorInfo.getMobile()); |
|||
logEntity.setOperatorName(operatorInfo.getName()); |
|||
logEntity.setOperatingTime(msgObj.getOperatingTime()); |
|||
logEntity.setContent(content); |
|||
|
|||
DistributedLock distributedLock = null; |
|||
RLock lock = null; |
|||
try { |
|||
distributedLock = SpringContextUtils.getBean(DistributedLock.class); |
|||
lock = distributedLock.getLock(String.format("lock:project_operation_log:%s:%s", logEntity.getType(), logEntity.getTargetId()), |
|||
30L, 30L, TimeUnit.SECONDS); |
|||
SpringContextUtils.getBean(LogOperationService.class).log(logEntity); |
|||
} 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); |
|||
} |
|||
} |
|||
|
|||
private String getOperationTypeDisplay(String type) { |
|||
switch (type) { |
|||
case "response": |
|||
return "项目响应处理"; |
|||
case "issue_shift_project": |
|||
return "议题转项目"; |
|||
case "close": |
|||
return "项目结案"; |
|||
case "return": |
|||
return "项目退回"; |
|||
case "transfer": |
|||
return "项目吹哨"; |
|||
case "created": |
|||
return "项目立项"; |
|||
default: |
|||
return null; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,28 @@ |
|||
package com.epmet.service; |
|||
|
|||
import com.epmet.dto.region.LogOperationResultDTO; |
|||
import com.epmet.entity.LogOperationEntity; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 操作日志 |
|||
*/ |
|||
public interface LogOperationService { |
|||
|
|||
/** |
|||
* @Description 记录日志 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 21:56 |
|||
*/ |
|||
void log(LogOperationEntity msg); |
|||
|
|||
/** |
|||
* @Description 查询操作日志 列表 |
|||
* @return |
|||
* @author wxz |
|||
* @date 2021.06.07 21:56 |
|||
*/ |
|||
List<LogOperationResultDTO> listOperationLogs(String condition, String customerId, Integer pageNo, Integer pageSize); |
|||
} |
@ -0,0 +1,176 @@ |
|||
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.auth.constants.AuthOperationEnum; |
|||
import com.epmet.commons.tools.constant.ServiceConstant; |
|||
import com.epmet.commons.tools.exception.EpmetErrorCode; |
|||
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.region.LogOperationResultDTO; |
|||
import com.epmet.entity.LogOperationEntity; |
|||
import com.epmet.feign.EpmetUserOpenFeignClient; |
|||
import com.epmet.service.LogOperationService; |
|||
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(LogOperationEntity msg) { |
|||
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; |
|||
} |
|||
logOperationDao.insert(msg); |
|||
} |
|||
|
|||
@Override |
|||
public List<LogOperationResultDTO> listOperationLogs(String condition, String customerId, Integer pageNo, Integer pageSize) { |
|||
// 1.条件查询
|
|||
List<LogOperationResultDTO> logDtos = listByOperatorMobile(condition, customerId, pageNo, pageSize); |
|||
if (CollectionUtils.isEmpty(logDtos)) { |
|||
logDtos = listByOperatorName(condition, pageNo, pageSize); |
|||
} |
|||
|
|||
if (CollectionUtils.isEmpty(logDtos)) { |
|||
return new ArrayList<>(); |
|||
} |
|||
|
|||
// 2.直接分页查询
|
|||
// 条件查询,排序
|
|||
LambdaQueryWrapper<LogOperationEntity> w = new LambdaQueryWrapper<>(); |
|||
w.orderByDesc(LogOperationEntity::getOperatingTime); |
|||
IPage<LogOperationEntity> iPage = logOperationDao.selectPage(new Page<>(pageNo, pageSize), w); |
|||
List<LogOperationEntity> logEntities = iPage.getRecords(); |
|||
List<String> userIds = logEntities.stream().map(l -> l.getOperatorId()).collect(Collectors.toList()); |
|||
|
|||
return convertLogOperationEntity2DTO(logEntities, 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().getTime()/1000); |
|||
ldto.setOperatorId(l.getOperatorId()); |
|||
ldto.setTargetId(l.getTargetId()); |
|||
ldto.setType(l.getType()); |
|||
ldto.setTypeDisplay(l.getTypeDisplay()); |
|||
ldto.setOperatorMobile(staffMap.get(l.getOperatorId()).getMobile()); |
|||
ldto.setOperatorName(staffMap.get(l.getOperatorId()).getRealName()); |
|||
return ldto; |
|||
}).collect(Collectors.toList()); |
|||
} |
|||
} |
@ -0,0 +1,21 @@ |
|||
CREATE TABLE `log_operation` ( |
|||
`ID` varchar(64) NOT NULL COMMENT '主键ID', |
|||
`TYPE` varchar(64) NOT NULL COMMENT '动作类型枚举', |
|||
`TYPE_DISPLAY` varchar(64) NOT NULL COMMENT '操作类型中文展示', |
|||
`CONTENT` varchar(512) NOT NULL COMMENT '内容', |
|||
`CATEGORY` varchar(64) NOT NULL COMMENT '操作类型大类。例如login和logout都属于login大类。项目立项,项目流转,项目结案都属于项目大类', |
|||
`IP` varchar(15) NOT NULL COMMENT 'IP地址', |
|||
`FROM_APP` varchar(10) NOT NULL COMMENT '所用的APP', |
|||
`FROM_CLIENT` varchar(10) NOT NULL COMMENT '所用的client', |
|||
`TARGET_ID` varchar(64) NOT NULL COMMENT '操作目标ID', |
|||
`OPERATOR_ID` varchar(64) NOT NULL COMMENT '操作人ID', |
|||
`OPERATOR_NAME` varchar(15) NOT NULL COMMENT '操作者姓名', |
|||
`OPERATOR_MOBILE` varchar(11) NOT NULL COMMENT '操作者电话', |
|||
`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,29 @@ |
|||
<?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="typeDisplay" column="TYPE_DISPLAY"/> |
|||
<result property="content" column="CONTENT"/> |
|||
<result property="targetId" column="TARGET_ID"/> |
|||
<result property="ip" column="IP"/> |
|||
<result property="fromApp" column="FROM_APP"/> |
|||
<result property="fromClient" column="FROM_CLIENT"/> |
|||
<result property="category" column="CATEGORY"/> |
|||
<result property="operatorId" column="OPERATOR_ID"/> |
|||
<result property="operatorName" column="OPERATOR_NAME"/> |
|||
<result property="operatorMobile" column="OPERATOR_MOBILE"/> |
|||
<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,14 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<project xmlns="http://maven.apache.org/POM/4.0.0" |
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
|||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
|||
<parent> |
|||
<artifactId>epmet-cloud</artifactId> |
|||
<groupId>com.epmet</groupId> |
|||
<version>2.0.0</version> |
|||
</parent> |
|||
<modelVersion>4.0.0</modelVersion> |
|||
|
|||
<artifactId>epmet-auth-client</artifactId> |
|||
|
|||
</project> |
@ -0,0 +1,9 @@ |
|||
package com.epmet.auth.constants; |
|||
|
|||
/** |
|||
* 认证操作常量 |
|||
*/ |
|||
public interface AuthOperationConstants { |
|||
String LOGIN = "login"; |
|||
String LOGOUT = "logout"; |
|||
} |
@ -0,0 +1,43 @@ |
|||
package com.epmet.auth.constants; |
|||
|
|||
/** |
|||
* 认证操作枚举 |
|||
*/ |
|||
public enum AuthOperationEnum { |
|||
|
|||
LOGIN(AuthOperationConstants.LOGIN, "登录"), |
|||
LOGOUT(AuthOperationConstants.LOGOUT, "退出"); |
|||
|
|||
private String operationType; |
|||
private String operationDisplay; |
|||
|
|||
AuthOperationEnum(String operationType, String operationDisplay) { |
|||
this.operationType = operationType; |
|||
this.operationDisplay = operationDisplay; |
|||
} |
|||
|
|||
public String getOperationType() { |
|||
return operationType; |
|||
} |
|||
|
|||
public String getOperationDisplay() { |
|||
return operationDisplay; |
|||
} |
|||
|
|||
public static AuthOperationEnum get(String operationType) { |
|||
for (AuthOperationEnum e : AuthOperationEnum.values()) { |
|||
if (e.getOperationType().equals(operationType)) { |
|||
return e; |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
public static String getDisplay(String operationType) { |
|||
AuthOperationEnum obj = get(operationType); |
|||
if (obj == null) { |
|||
return null; |
|||
} |
|||
return obj.getOperationDisplay(); |
|||
} |
|||
} |
@ -0,0 +1,26 @@ |
|||
package com.epmet.commons.rocketmq.messages; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.util.Date; |
|||
|
|||
@Data |
|||
public class LoginMQMsg { |
|||
|
|||
/** |
|||
* 谁登录 |
|||
*/ |
|||
private String userId; |
|||
private String appId; |
|||
/** |
|||
* 什么时间登录的 |
|||
*/ |
|||
private Date loginTime; |
|||
|
|||
private String ip; |
|||
|
|||
private String fromApp; |
|||
|
|||
private String fromClient; |
|||
|
|||
} |
@ -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(); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,131 @@ |
|||
/** |
|||
* 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.dataaggre.dto.epmetuser; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import lombok.Data; |
|||
|
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Data |
|||
public class StaffPatrolDetailDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 主键 |
|||
*/ |
|||
private String id; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* staff_patrol_record.ID |
|||
*/ |
|||
private String staffPatrolRecId; |
|||
|
|||
/** |
|||
* 前端给的序号 |
|||
*/ |
|||
private Integer serialNum; |
|||
|
|||
/** |
|||
* 上传时间,后台自动插入该时间 |
|||
*/ |
|||
private Date uploadTime; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
private String latitude; |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
private String longitude; |
|||
|
|||
/** |
|||
* 速度,单位m/s;开始和结束时默认0 |
|||
*/ |
|||
private String speed; |
|||
|
|||
/** |
|||
* 位置的精确度 |
|||
*/ |
|||
private String accuracy; |
|||
|
|||
/** |
|||
* 高度,单位米 |
|||
*/ |
|||
private String altitude; |
|||
|
|||
/** |
|||
* 垂直经度,单位m |
|||
*/ |
|||
private String verticalaccuracy; |
|||
|
|||
/** |
|||
* 水平经度,单位m |
|||
*/ |
|||
private String horizontalaccuracy; |
|||
|
|||
/** |
|||
* 地址;暂时不用 |
|||
*/ |
|||
private String address; |
|||
|
|||
/** |
|||
* 删除标识 0.未删除 1.已删除 |
|||
*/ |
|||
private Integer delFlag; |
|||
|
|||
/** |
|||
* 乐观锁 |
|||
*/ |
|||
private Integer revision; |
|||
|
|||
/** |
|||
* 创建人 |
|||
*/ |
|||
private String createdBy; |
|||
|
|||
/** |
|||
* 创建时间 |
|||
*/ |
|||
private Date createdTime; |
|||
|
|||
/** |
|||
* 更新人 |
|||
*/ |
|||
private String updatedBy; |
|||
|
|||
/** |
|||
* 更新时间 |
|||
*/ |
|||
private Date updatedTime; |
|||
|
|||
} |
@ -0,0 +1,121 @@ |
|||
/** |
|||
* 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.dataaggre.dto.epmetuser; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import lombok.Data; |
|||
|
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Data |
|||
public class StaffPatrolRecordDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 主键 |
|||
*/ |
|||
private String id; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* 网格id |
|||
*/ |
|||
private String grid; |
|||
|
|||
/** |
|||
* 网格所有上级id |
|||
*/ |
|||
private String gridPids; |
|||
|
|||
/** |
|||
* 工作人员用户id |
|||
*/ |
|||
private String staffId; |
|||
|
|||
/** |
|||
* 工作人员所属组织id=网格所属的组织id |
|||
*/ |
|||
private String agencyId; |
|||
|
|||
/** |
|||
* 巡查开始时间 |
|||
*/ |
|||
private Date patrolStartTime; |
|||
|
|||
/** |
|||
* 巡查结束时间,前端传入 |
|||
*/ |
|||
private Date patrolEndTime; |
|||
|
|||
/** |
|||
* 实际结束时间=操作结束巡查的时间 |
|||
*/ |
|||
private Date actrualEndTime; |
|||
|
|||
/** |
|||
* 本次巡查总耗时,单位秒;结束巡查时写入 |
|||
*/ |
|||
private Integer totalTime; |
|||
|
|||
/** |
|||
* 正在巡查中:patrolling;结束:end |
|||
*/ |
|||
private String status; |
|||
|
|||
/** |
|||
* 删除标识 0.未删除 1.已删除 |
|||
*/ |
|||
private Integer delFlag; |
|||
|
|||
/** |
|||
* 乐观锁 |
|||
*/ |
|||
private Integer revision; |
|||
|
|||
/** |
|||
* 创建人 |
|||
*/ |
|||
private String createdBy; |
|||
|
|||
/** |
|||
* 创建时间 |
|||
*/ |
|||
private Date createdTime; |
|||
|
|||
/** |
|||
* 更新人 |
|||
*/ |
|||
private String updatedBy; |
|||
|
|||
/** |
|||
* 更新时间 |
|||
*/ |
|||
private Date updatedTime; |
|||
|
|||
} |
@ -0,0 +1,54 @@ |
|||
package com.epmet.dataaggre.dto.epmetuser.form; |
|||
|
|||
import com.epmet.commons.tools.validator.group.CustomerClientShowGroup; |
|||
import lombok.Data; |
|||
|
|||
import javax.validation.constraints.Min; |
|||
import javax.validation.constraints.NotBlank; |
|||
import javax.validation.constraints.NotNull; |
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @Description 巡查-各人员巡查记录列表查询-接口入参 |
|||
* @Auth sun |
|||
*/ |
|||
@Data |
|||
public class StaffListFormDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = -3381286960911634231L; |
|||
/** |
|||
* 近1一个月传1; 近3个月传3【自然月分】 |
|||
*/ |
|||
@NotNull(message = "最近时间不能为空", groups = StaffListFormDTO.Staff.class) |
|||
private Integer time; |
|||
/** |
|||
* 排序字段【巡查总次数:patrolTotal;最近开始巡查时间:latestPatrolledTime】 |
|||
*/ |
|||
@NotBlank(message = "排序条件不能为空", groups = StaffListFormDTO.Staff.class) |
|||
private String sortCode; |
|||
/** |
|||
* 网格id集合,为空则查询当前组织下所有网格数据 |
|||
*/ |
|||
private List<String> gridIds; |
|||
/** |
|||
* 工作人员姓名;可空 |
|||
*/ |
|||
private String staffName; |
|||
/** |
|||
* 页码 |
|||
* */ |
|||
@Min(1) |
|||
private Integer pageNo; |
|||
/** |
|||
* 每页多少条 |
|||
* */ |
|||
private Integer pageSize = 20; |
|||
//token中用户Id
|
|||
private String userId; |
|||
//起止巡查开始时间
|
|||
private String patrolStartTime; |
|||
public interface Staff extends CustomerClientShowGroup {} |
|||
|
|||
} |
@ -0,0 +1,32 @@ |
|||
package com.epmet.dataaggre.dto.epmetuser.result; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* @Description 巡查-各人员巡查记录列表查询-接口入参 |
|||
* @Auth sun |
|||
*/ |
|||
@Data |
|||
public class StaffListResultDTO implements Serializable { |
|||
private static final long serialVersionUID = 7129564173128153335L; |
|||
|
|||
//工作人员所属网格id
|
|||
private String gridId = ""; |
|||
//工作人员所在网格名称,最多显示到网格的上两级
|
|||
private String gridName = ""; |
|||
//工作人员用户id
|
|||
private String staffId = ""; |
|||
//真名
|
|||
private String staffName = ""; |
|||
//最近巡查时间[最近一次进行中或已结束巡查的开始时间]
|
|||
private String patrolStartTime = ""; |
|||
//巡查总次数
|
|||
private Integer patrolTotal = 0; |
|||
//性别0.未知,1男,2.女前端默认头像用
|
|||
private String gender = "0"; |
|||
//正在巡查中:patrolling;否则返回空字符串
|
|||
private String status = ""; |
|||
|
|||
} |
@ -0,0 +1,34 @@ |
|||
/** |
|||
* 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.dataaggre.dao.epmetuser; |
|||
|
|||
|
|||
import com.epmet.commons.mybatis.dao.BaseDao; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolDetailEntity; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Mapper |
|||
public interface StaffPatrolDetailDao extends BaseDao<StaffPatrolDetailEntity> { |
|||
|
|||
} |
@ -0,0 +1,44 @@ |
|||
/** |
|||
* 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.dataaggre.dao.epmetuser; |
|||
|
|||
|
|||
import com.epmet.commons.mybatis.dao.BaseDao; |
|||
import com.epmet.dataaggre.dto.epmetuser.form.StaffListFormDTO; |
|||
import com.epmet.dataaggre.dto.epmetuser.result.StaffListResultDTO; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolRecordEntity; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Mapper |
|||
public interface StaffPatrolRecordDao extends BaseDao<StaffPatrolRecordEntity> { |
|||
|
|||
/** |
|||
* @Description 按条件查询巡查业务数据 |
|||
* @author sun |
|||
*/ |
|||
List<StaffListResultDTO> selectPatrolList(StaffListFormDTO formDTO); |
|||
|
|||
} |
@ -0,0 +1,101 @@ |
|||
/** |
|||
* 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.dataaggre.entity.epmetuser; |
|||
|
|||
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("staff_patrol_detail") |
|||
public class StaffPatrolDetailEntity extends BaseEpmetEntity { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* staff_patrol_record.ID |
|||
*/ |
|||
private String staffPatrolRecId; |
|||
|
|||
/** |
|||
* 前端给的序号 |
|||
*/ |
|||
private Integer serialNum; |
|||
|
|||
/** |
|||
* 上传时间,后台自动插入该时间 |
|||
*/ |
|||
private Date uploadTime; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
private String latitude; |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
private String longitude; |
|||
|
|||
/** |
|||
* 速度,单位m/s;开始和结束时默认0 |
|||
*/ |
|||
private String speed; |
|||
|
|||
/** |
|||
* 位置的精确度 |
|||
*/ |
|||
private String accuracy; |
|||
|
|||
/** |
|||
* 高度,单位米 |
|||
*/ |
|||
private String altitude; |
|||
|
|||
/** |
|||
* 垂直经度,单位m |
|||
*/ |
|||
private String verticalaccuracy; |
|||
|
|||
/** |
|||
* 水平经度,单位m |
|||
*/ |
|||
private String horizontalaccuracy; |
|||
|
|||
/** |
|||
* 地址;暂时不用 |
|||
*/ |
|||
private String address; |
|||
|
|||
} |
@ -0,0 +1,91 @@ |
|||
/** |
|||
* 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.dataaggre.entity.epmetuser; |
|||
|
|||
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("staff_patrol_record") |
|||
public class StaffPatrolRecordEntity extends BaseEpmetEntity { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* 网格id |
|||
*/ |
|||
private String grid; |
|||
|
|||
/** |
|||
* 网格所有上级id |
|||
*/ |
|||
private String gridPids; |
|||
|
|||
/** |
|||
* 工作人员用户id |
|||
*/ |
|||
private String staffId; |
|||
|
|||
/** |
|||
* 工作人员所属组织id=网格所属的组织id |
|||
*/ |
|||
private String agencyId; |
|||
|
|||
/** |
|||
* 巡查开始时间 |
|||
*/ |
|||
private Date patrolStartTime; |
|||
|
|||
/** |
|||
* 巡查结束时间,前端传入 |
|||
*/ |
|||
private Date patrolEndTime; |
|||
|
|||
/** |
|||
* 实际结束时间=操作结束巡查的时间 |
|||
*/ |
|||
private Date actrualEndTime; |
|||
|
|||
/** |
|||
* 本次巡查总耗时,单位秒;结束巡查时写入 |
|||
*/ |
|||
private Integer totalTime; |
|||
|
|||
/** |
|||
* 正在巡查中:patrolling;结束:end |
|||
*/ |
|||
private String status; |
|||
|
|||
} |
@ -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.dataaggre.service.epmetuser; |
|||
|
|||
|
|||
import com.epmet.commons.mybatis.service.BaseService; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolDetailEntity; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
public interface StaffPatrolDetailService extends BaseService<StaffPatrolDetailEntity> { |
|||
|
|||
|
|||
} |
@ -0,0 +1,32 @@ |
|||
/** |
|||
* 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.dataaggre.service.epmetuser; |
|||
|
|||
import com.epmet.commons.mybatis.service.BaseService; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolRecordEntity; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
public interface StaffPatrolRecordService extends BaseService<StaffPatrolRecordEntity> { |
|||
|
|||
|
|||
} |
@ -0,0 +1,41 @@ |
|||
/** |
|||
* 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.dataaggre.service.epmetuser.impl; |
|||
|
|||
import com.epmet.commons.dynamic.datasource.annotation.DataSource; |
|||
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; |
|||
import com.epmet.dataaggre.constant.DataSourceConstant; |
|||
import com.epmet.dataaggre.dao.epmetuser.StaffPatrolDetailDao; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolDetailEntity; |
|||
import com.epmet.dataaggre.service.epmetuser.StaffPatrolDetailService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@DataSource(DataSourceConstant.EPMET_USER) |
|||
@Slf4j |
|||
@Service |
|||
public class StaffPatrolDetailServiceImpl extends BaseServiceImpl<StaffPatrolDetailDao, StaffPatrolDetailEntity> implements StaffPatrolDetailService { |
|||
|
|||
|
|||
} |
@ -0,0 +1,42 @@ |
|||
/** |
|||
* 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.dataaggre.service.epmetuser.impl; |
|||
|
|||
import com.epmet.commons.dynamic.datasource.annotation.DataSource; |
|||
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; |
|||
import com.epmet.dataaggre.constant.DataSourceConstant; |
|||
import com.epmet.dataaggre.dao.epmetuser.StaffPatrolRecordDao; |
|||
import com.epmet.dataaggre.entity.epmetuser.StaffPatrolRecordEntity; |
|||
import com.epmet.dataaggre.service.epmetuser.StaffPatrolRecordService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@DataSource(DataSourceConstant.EPMET_USER) |
|||
@Slf4j |
|||
@Service |
|||
public class StaffPatrolRecordServiceImpl extends BaseServiceImpl<StaffPatrolRecordDao, StaffPatrolRecordEntity> implements StaffPatrolRecordService { |
|||
|
|||
|
|||
|
|||
} |
@ -0,0 +1,9 @@ |
|||
<?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.dataaggre.dao.epmetuser.StaffPatrolDetailDao"> |
|||
|
|||
|
|||
|
|||
|
|||
</mapper> |
@ -0,0 +1,52 @@ |
|||
<?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.dataaggre.dao.epmetuser.StaffPatrolRecordDao"> |
|||
|
|||
<select id="selectPatrolList" resultType="com.epmet.dataaggre.dto.epmetuser.result.StaffListResultDTO"> |
|||
SELECT |
|||
spr.grid AS "gridId", |
|||
spr.staff_id AS "staffId", |
|||
MAX(spr.patrol_start_time) AS "patrolStartTime", |
|||
COUNT(spr.staff_id) AS "patrolTotal", |
|||
( |
|||
select |
|||
`status` |
|||
from |
|||
staff_patrol_record |
|||
where |
|||
grid = spr.grid |
|||
and staff_id = spr.staff_id |
|||
order by |
|||
patrol_start_time desc |
|||
limit 1 |
|||
) AS "status", |
|||
cs.real_name AS "staffName", |
|||
cs.gender AS "gender" |
|||
FROM |
|||
staff_patrol_record spr |
|||
LEFT JOIN customer_staff cs ON spr.staff_id = cs.user_id |
|||
WHERE |
|||
spr.del_flag = '0' |
|||
<if test='patrolStartTime != "" and patrolStartTime != null'> |
|||
AND spr.patrol_start_time <![CDATA[ >= ]]> #{patrolStartTime} |
|||
</if> |
|||
<if test='staffName != "" and staffName != null'> |
|||
AND cs.real_name LIKE CONCAT('%',#{staffName},'%') |
|||
</if> |
|||
<foreach collection="gridIds" item="gridId" open="AND( " separator=" OR " close=")"> |
|||
spr.GRID = #{gridId} |
|||
</foreach> |
|||
GROUP BY |
|||
spr.grid, spr.staff_id |
|||
<if test='sortCode != "" and sortCode != null and sortCode == "patrolTotal" '> |
|||
ORDER BY COUNT(spr.staff_id) DESC |
|||
</if> |
|||
<if test='sortCode != "" and sortCode != null and sortCode == "latestPatrolledTime" '> |
|||
ORDER BY MAX(spr.patrol_start_time) DESC |
|||
</if> |
|||
LIMIT |
|||
#{pageNo}, #{pageSize} |
|||
</select> |
|||
|
|||
</mapper> |
@ -0,0 +1,131 @@ |
|||
/** |
|||
* 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.dto; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import lombok.Data; |
|||
|
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Data |
|||
public class StaffPatrolDetailDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 主键 |
|||
*/ |
|||
private String id; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* staff_patrol_record.ID |
|||
*/ |
|||
private String staffPatrolRecId; |
|||
|
|||
/** |
|||
* 前端给的序号 |
|||
*/ |
|||
private Integer serialNum; |
|||
|
|||
/** |
|||
* 上传时间,后台自动插入该时间 |
|||
*/ |
|||
private Date uploadTime; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
private String latitude; |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
private String longitude; |
|||
|
|||
/** |
|||
* 速度,单位m/s;开始和结束时默认0 |
|||
*/ |
|||
private String speed; |
|||
|
|||
/** |
|||
* 位置的精确度 |
|||
*/ |
|||
private String accuracy; |
|||
|
|||
/** |
|||
* 高度,单位米 |
|||
*/ |
|||
private String altitude; |
|||
|
|||
/** |
|||
* 垂直经度,单位m |
|||
*/ |
|||
private String verticalaccuracy; |
|||
|
|||
/** |
|||
* 水平经度,单位m |
|||
*/ |
|||
private String horizontalaccuracy; |
|||
|
|||
/** |
|||
* 地址;暂时不用 |
|||
*/ |
|||
private String address; |
|||
|
|||
/** |
|||
* 删除标识 0.未删除 1.已删除 |
|||
*/ |
|||
private Integer delFlag; |
|||
|
|||
/** |
|||
* 乐观锁 |
|||
*/ |
|||
private Integer revision; |
|||
|
|||
/** |
|||
* 创建人 |
|||
*/ |
|||
private String createdBy; |
|||
|
|||
/** |
|||
* 创建时间 |
|||
*/ |
|||
private Date createdTime; |
|||
|
|||
/** |
|||
* 更新人 |
|||
*/ |
|||
private String updatedBy; |
|||
|
|||
/** |
|||
* 更新时间 |
|||
*/ |
|||
private Date updatedTime; |
|||
|
|||
} |
@ -0,0 +1,121 @@ |
|||
/** |
|||
* 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.dto; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import lombok.Data; |
|||
|
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Data |
|||
public class StaffPatrolRecordDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 主键 |
|||
*/ |
|||
private String id; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* 网格id |
|||
*/ |
|||
private String grid; |
|||
|
|||
/** |
|||
* 网格所有上级id |
|||
*/ |
|||
private String gridPids; |
|||
|
|||
/** |
|||
* 工作人员用户id |
|||
*/ |
|||
private String staffId; |
|||
|
|||
/** |
|||
* 工作人员所属组织id=网格所属的组织id |
|||
*/ |
|||
private String agencyId; |
|||
|
|||
/** |
|||
* 巡查开始时间 |
|||
*/ |
|||
private Date patrolStartTime; |
|||
|
|||
/** |
|||
* 巡查结束时间,前端传入 |
|||
*/ |
|||
private Date patrolEndTime; |
|||
|
|||
/** |
|||
* 实际结束时间=操作结束巡查的时间 |
|||
*/ |
|||
private Date actrualEndTime; |
|||
|
|||
/** |
|||
* 本次巡查总耗时,单位秒;结束巡查时写入 |
|||
*/ |
|||
private Integer totalTime; |
|||
|
|||
/** |
|||
* 正在巡查中:patrolling;结束:end |
|||
*/ |
|||
private String status; |
|||
|
|||
/** |
|||
* 删除标识 0.未删除 1.已删除 |
|||
*/ |
|||
private Integer delFlag; |
|||
|
|||
/** |
|||
* 乐观锁 |
|||
*/ |
|||
private Integer revision; |
|||
|
|||
/** |
|||
* 创建人 |
|||
*/ |
|||
private String createdBy; |
|||
|
|||
/** |
|||
* 创建时间 |
|||
*/ |
|||
private Date createdTime; |
|||
|
|||
/** |
|||
* 更新人 |
|||
*/ |
|||
private String updatedBy; |
|||
|
|||
/** |
|||
* 更新时间 |
|||
*/ |
|||
private Date updatedTime; |
|||
|
|||
} |
@ -0,0 +1,27 @@ |
|||
package com.epmet.user.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import javax.validation.constraints.NotBlank; |
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* @Author zxc |
|||
* @DateTime 2021/6/7 2:57 下午 |
|||
* @DESC |
|||
*/ |
|||
@Data |
|||
public class GridManagerListFormDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = -7624307754570242679L; |
|||
|
|||
public interface GridManagerListForm{} |
|||
|
|||
@NotBlank(message = "组织ID不能为空",groups = GridManagerListForm.class) |
|||
private String agencyId; |
|||
|
|||
/** |
|||
* 行政区域编码 【平阴传】 |
|||
*/ |
|||
private String areaCode; |
|||
} |
@ -0,0 +1,76 @@ |
|||
package com.epmet.user.result; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
|
|||
/** |
|||
* @Author zxc |
|||
* @DateTime 2021/6/7 2:57 下午 |
|||
* @DESC |
|||
*/ |
|||
@Data |
|||
public class GridManagerListResultDTO implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 3606724812822179356L; |
|||
|
|||
/** |
|||
* 工作人员id |
|||
*/ |
|||
private String staffId; |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
private String longitude; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
private String latitude; |
|||
|
|||
/** |
|||
* 网格ID |
|||
*/ |
|||
private String gridId; |
|||
|
|||
/** |
|||
* 正在巡查:patrolling;否则返回空字符串 |
|||
*/ |
|||
private String status; |
|||
|
|||
/** |
|||
* 网格名称,最多显示上两级 |
|||
*/ |
|||
private String gridName; |
|||
|
|||
/** |
|||
* 姓名 |
|||
*/ |
|||
private String staffName; |
|||
|
|||
/** |
|||
* 中心点位 |
|||
*/ |
|||
@JsonIgnore |
|||
private String centerMark; |
|||
|
|||
/** |
|||
* 经纬度赋值状态 |
|||
*/ |
|||
@JsonIgnore |
|||
private Boolean llStatus; |
|||
|
|||
public GridManagerListResultDTO() { |
|||
this.staffId = ""; |
|||
this.longitude = ""; |
|||
this.latitude = ""; |
|||
this.gridId = ""; |
|||
this.status = ""; |
|||
this.gridName = ""; |
|||
this.staffName = ""; |
|||
this.centerMark = ""; |
|||
this.llStatus = false; |
|||
} |
|||
} |
@ -0,0 +1,20 @@ |
|||
package com.epmet.datareport.constant; |
|||
|
|||
/** |
|||
* @Author zxc |
|||
* @DateTime 2021/6/9 1:49 下午 |
|||
* @DESC |
|||
*/ |
|||
public interface PatrolConstant { |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
String LONGITUDE = "longitude"; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
String LATITUDE = "latitude"; |
|||
|
|||
} |
@ -0,0 +1,66 @@ |
|||
package com.epmet.datareport.controller.user; |
|||
|
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.commons.tools.validator.ValidatorUtils; |
|||
import com.epmet.datareport.service.user.StaffPatrolDetailService; |
|||
import com.epmet.user.form.GridManagerListFormDTO; |
|||
import com.epmet.dto.form.PatrolTrackFormDTO; |
|||
import com.epmet.dto.form.RecordListFormDTO; |
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
import com.epmet.dto.result.PatrolTrackResultDTO; |
|||
import com.epmet.dto.result.RecordListResultDTO; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.*; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("staffpatrol") |
|||
public class StaffPatrolDetailController { |
|||
|
|||
@Autowired |
|||
private StaffPatrolDetailService staffPatrolService; |
|||
|
|||
/** |
|||
* @Description 001、网格员分布 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:06 下午 |
|||
*/ |
|||
@PostMapping("gridmanagerlist") |
|||
public Result<List<GridManagerListResultDTO>> gridManagerList(@RequestBody GridManagerListFormDTO formDTO){ |
|||
ValidatorUtils.validateEntity(formDTO, GridManagerListFormDTO.GridManagerListForm.class); |
|||
return new Result<List<GridManagerListResultDTO>>().ok(staffPatrolService.gridManagerList(formDTO)); |
|||
} |
|||
|
|||
/** |
|||
* @Description 002、查看巡查记录 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:25 下午 |
|||
*/ |
|||
@PostMapping("recordlist") |
|||
public Result<List<RecordListResultDTO>> recordList(@RequestBody RecordListFormDTO formDTO){ |
|||
ValidatorUtils.validateEntity(formDTO, RecordListFormDTO.RecordListForm.class); |
|||
return new Result<List<RecordListResultDTO>>().ok(staffPatrolService.recordList(formDTO)); |
|||
} |
|||
|
|||
/** |
|||
* @Description 003、巡查轨迹 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:35 下午 |
|||
*/ |
|||
@PostMapping("patroltrack") |
|||
public Result<List<PatrolTrackResultDTO>> patrolTrack(@RequestBody PatrolTrackFormDTO formDTO){ |
|||
ValidatorUtils.validateEntity(formDTO, PatrolTrackFormDTO.PatrolTrackForm.class); |
|||
return new Result<List<PatrolTrackResultDTO>>().ok(staffPatrolService.patrolTrack(formDTO)); |
|||
} |
|||
|
|||
} |
@ -0,0 +1,21 @@ |
|||
package com.epmet.datareport.controller.user; |
|||
|
|||
import com.epmet.datareport.service.user.StaffPatrolRecordService; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("staffpatrolrecord") |
|||
public class StaffPatrolRecordController { |
|||
|
|||
@Autowired |
|||
private StaffPatrolRecordService staffPatrolRecordService; |
|||
|
|||
} |
@ -0,0 +1,45 @@ |
|||
/** |
|||
* 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.datareport.dao.user; |
|||
|
|||
import com.epmet.commons.mybatis.dao.BaseDao; |
|||
import com.epmet.datareport.entity.user.StaffPatrolDetailEntity; |
|||
import com.epmet.dto.result.PatrolTrackResultDTO; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
import org.apache.ibatis.annotations.Param; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Mapper |
|||
public interface StaffPatrolDetailDao extends BaseDao<StaffPatrolDetailEntity> { |
|||
|
|||
/** |
|||
* @Description 查询巡查轨迹 |
|||
* @Param staffPatrolRecId |
|||
* @author zxc |
|||
* @date 2021/6/7 5:13 下午 |
|||
*/ |
|||
List<PatrolTrackResultDTO> selectPatrolTrack(@Param("staffPatrolRecId") String staffPatrolRecId); |
|||
|
|||
} |
@ -0,0 +1,55 @@ |
|||
/** |
|||
* 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.datareport.dao.user; |
|||
|
|||
import com.epmet.commons.mybatis.dao.BaseDao; |
|||
import com.epmet.datareport.entity.user.StaffPatrolRecordEntity; |
|||
import com.epmet.dto.form.RecordListFormDTO; |
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
import com.epmet.dto.result.RecordListResultDTO; |
|||
import org.apache.ibatis.annotations.Mapper; |
|||
import org.apache.ibatis.annotations.Param; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Mapper |
|||
public interface StaffPatrolRecordDao extends BaseDao<StaffPatrolRecordEntity> { |
|||
|
|||
/** |
|||
* @Description 巡查记录查询 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 5:29 下午 |
|||
*/ |
|||
List<RecordListResultDTO> recordList(RecordListFormDTO formDTO); |
|||
|
|||
/** |
|||
* @Description 查询经纬度 |
|||
* @Param userIds |
|||
* @author zxc |
|||
* @date 2021/6/9 10:24 上午 |
|||
*/ |
|||
List<GridManagerListResultDTO> selectLL(@Param("userIds")List<String> userIds); |
|||
|
|||
} |
@ -0,0 +1,101 @@ |
|||
/** |
|||
* 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.datareport.entity.user; |
|||
|
|||
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("staff_patrol_detail") |
|||
public class StaffPatrolDetailEntity extends BaseEpmetEntity { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* staff_patrol_record.ID |
|||
*/ |
|||
private String staffPatrolRecId; |
|||
|
|||
/** |
|||
* 前端给的序号 |
|||
*/ |
|||
private Integer serialNum; |
|||
|
|||
/** |
|||
* 上传时间,后台自动插入该时间 |
|||
*/ |
|||
private Date uploadTime; |
|||
|
|||
/** |
|||
* 纬度 |
|||
*/ |
|||
private String latitude; |
|||
|
|||
/** |
|||
* 经度 |
|||
*/ |
|||
private String longitude; |
|||
|
|||
/** |
|||
* 速度,单位m/s;开始和结束时默认0 |
|||
*/ |
|||
private String speed; |
|||
|
|||
/** |
|||
* 位置的精确度 |
|||
*/ |
|||
private String accuracy; |
|||
|
|||
/** |
|||
* 高度,单位米 |
|||
*/ |
|||
private String altitude; |
|||
|
|||
/** |
|||
* 垂直经度,单位m |
|||
*/ |
|||
private String verticalaccuracy; |
|||
|
|||
/** |
|||
* 水平经度,单位m |
|||
*/ |
|||
private String horizontalaccuracy; |
|||
|
|||
/** |
|||
* 地址;暂时不用 |
|||
*/ |
|||
private String address; |
|||
|
|||
} |
@ -0,0 +1,91 @@ |
|||
/** |
|||
* 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.datareport.entity.user; |
|||
|
|||
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("staff_patrol_record") |
|||
public class StaffPatrolRecordEntity extends BaseEpmetEntity { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 客户Id |
|||
*/ |
|||
private String customerId; |
|||
|
|||
/** |
|||
* 网格id |
|||
*/ |
|||
private String grid; |
|||
|
|||
/** |
|||
* 网格所有上级id |
|||
*/ |
|||
private String gridPids; |
|||
|
|||
/** |
|||
* 工作人员用户id |
|||
*/ |
|||
private String staffId; |
|||
|
|||
/** |
|||
* 工作人员所属组织id=网格所属的组织id |
|||
*/ |
|||
private String agencyId; |
|||
|
|||
/** |
|||
* 巡查开始时间 |
|||
*/ |
|||
private Date patrolStartTime; |
|||
|
|||
/** |
|||
* 巡查结束时间,前端传入 |
|||
*/ |
|||
private Date patrolEndTime; |
|||
|
|||
/** |
|||
* 实际结束时间=操作结束巡查的时间 |
|||
*/ |
|||
private Date actrualEndTime; |
|||
|
|||
/** |
|||
* 本次巡查总耗时,单位秒;结束巡查时写入 |
|||
*/ |
|||
private Integer totalTime; |
|||
|
|||
/** |
|||
* 正在巡查中:patrolling;结束:end |
|||
*/ |
|||
private String status; |
|||
|
|||
} |
@ -0,0 +1,23 @@ |
|||
package com.epmet.datareport.service.evaluationindex.screen; |
|||
|
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @Author zxc |
|||
* @DateTime 2021/6/8 10:45 上午 |
|||
* @DESC |
|||
*/ |
|||
public interface ScreenOrgService { |
|||
|
|||
/** |
|||
* @Description 查询组织下的所有网格 |
|||
* @Param agencyId |
|||
* @Param areaCode |
|||
* @author zxc |
|||
* @date 2021/6/8 10:46 上午 |
|||
*/ |
|||
List<GridManagerListResultDTO> selectAllGrid(String agencyId,String areaCode); |
|||
|
|||
} |
@ -0,0 +1,44 @@ |
|||
package com.epmet.datareport.service.evaluationindex.screen.impl; |
|||
|
|||
import com.epmet.commons.dynamic.datasource.annotation.DataSource; |
|||
import com.epmet.constant.DataSourceConstant; |
|||
import com.epmet.datareport.dao.evaluationindex.screen.ScreenCustomerAgencyDao; |
|||
import com.epmet.datareport.service.evaluationindex.screen.ScreenOrgService; |
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.util.CollectionUtils; |
|||
|
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* @Author zxc |
|||
* @DateTime 2021/6/8 10:45 上午 |
|||
* @DESC |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
@DataSource(DataSourceConstant.EVALUATION_INDEX) |
|||
public class ScreenOrgServiceImpl implements ScreenOrgService { |
|||
|
|||
@Autowired |
|||
private ScreenCustomerAgencyDao agencyDao; |
|||
|
|||
/** |
|||
* @Description 查询组织下的所有网格 |
|||
* @Param agencyId |
|||
* @Param areaCode |
|||
* @author zxc |
|||
* @date 2021/6/8 10:46 上午 |
|||
*/ |
|||
@Override |
|||
public List<GridManagerListResultDTO> selectAllGrid(String agencyId,String areaCode) { |
|||
List<GridManagerListResultDTO> result = agencyDao.selectGrid(agencyId, areaCode); |
|||
if (!CollectionUtils.isEmpty(result)){ |
|||
return result; |
|||
} |
|||
return new ArrayList<>(); |
|||
} |
|||
} |
@ -0,0 +1,44 @@ |
|||
package com.epmet.datareport.service.user; |
|||
|
|||
import com.epmet.user.form.GridManagerListFormDTO; |
|||
import com.epmet.dto.form.PatrolTrackFormDTO; |
|||
import com.epmet.dto.form.RecordListFormDTO; |
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
import com.epmet.dto.result.PatrolTrackResultDTO; |
|||
import com.epmet.dto.result.RecordListResultDTO; |
|||
|
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
public interface StaffPatrolDetailService{ |
|||
|
|||
/** |
|||
* @Description 001、网格员分布 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:06 下午 |
|||
*/ |
|||
List<GridManagerListResultDTO> gridManagerList(GridManagerListFormDTO formDTO); |
|||
|
|||
/** |
|||
* @Description 002、查看巡查记录 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:25 下午 |
|||
*/ |
|||
List<RecordListResultDTO> recordList(RecordListFormDTO formDTO); |
|||
|
|||
/** |
|||
* @Description 003、巡查轨迹 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:35 下午 |
|||
*/ |
|||
List<PatrolTrackResultDTO> patrolTrack(PatrolTrackFormDTO formDTO); |
|||
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package com.epmet.datareport.service.user; |
|||
|
|||
import com.epmet.commons.mybatis.service.BaseService; |
|||
import com.epmet.datareport.entity.user.StaffPatrolRecordEntity; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
public interface StaffPatrolRecordService extends BaseService<StaffPatrolRecordEntity> { |
|||
|
|||
} |
@ -0,0 +1,194 @@ |
|||
package com.epmet.datareport.service.user.impl; |
|||
|
|||
import com.epmet.commons.tools.constant.NumConstant; |
|||
import com.epmet.commons.tools.exception.RenException; |
|||
import com.epmet.commons.tools.utils.ConvertUtils; |
|||
import com.epmet.commons.tools.utils.Result; |
|||
import com.epmet.datareport.constant.PatrolConstant; |
|||
import com.epmet.datareport.dao.user.StaffPatrolDetailDao; |
|||
import com.epmet.datareport.dao.user.StaffPatrolRecordDao; |
|||
import com.epmet.datareport.service.evaluationindex.screen.ScreenOrgService; |
|||
import com.epmet.datareport.service.user.StaffPatrolDetailService; |
|||
import com.epmet.dto.result.GridStaffResultDTO; |
|||
import com.epmet.dto.result.UserNameAndLLResultDTO; |
|||
import com.epmet.feign.EpmetUserOpenFeignClient; |
|||
import com.epmet.feign.GovOrgOpenFeignClient; |
|||
import com.epmet.user.form.GridManagerListFormDTO; |
|||
import com.epmet.dto.form.PatrolTrackFormDTO; |
|||
import com.epmet.dto.form.RecordListFormDTO; |
|||
import com.epmet.user.result.GridManagerListResultDTO; |
|||
import com.epmet.dto.result.PatrolTrackResultDTO; |
|||
import com.epmet.dto.result.RecordListResultDTO; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
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.List; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* 工作人员巡查记录明细 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
public class StaffPatrolDetailServiceImpl implements StaffPatrolDetailService { |
|||
|
|||
@Autowired |
|||
private StaffPatrolDetailDao staffPatrolDetailDao; |
|||
|
|||
@Autowired |
|||
private StaffPatrolRecordDao staffPatrolRecordDao; |
|||
|
|||
@Autowired |
|||
private ScreenOrgService screenOrgService; |
|||
|
|||
@Autowired |
|||
private GovOrgOpenFeignClient govOrgOpenFeignClient; |
|||
|
|||
@Autowired |
|||
private EpmetUserOpenFeignClient epmetUserOpenFeignClient; |
|||
|
|||
/** |
|||
* @Description 001、网格员分布 |
|||
* 1.根据agencyId或者areaCode查询出网格 |
|||
* 2.根据查出来的网格ID去查网格下边的人【人只要网格员】 |
|||
* 3.根据userId查询巡查记录表 |
|||
* 4.数据补全 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:06 下午 |
|||
*/ |
|||
@Override |
|||
public List<GridManagerListResultDTO> gridManagerList(GridManagerListFormDTO formDTO) { |
|||
List<GridManagerListResultDTO> grids = new ArrayList<>(); |
|||
if (StringUtils.isEmpty(formDTO.getAreaCode())){ |
|||
// 根据agencyId查询网格
|
|||
grids = screenOrgService.selectAllGrid(formDTO.getAgencyId(), null); |
|||
}else { |
|||
// 根据areaCode查询网格
|
|||
grids = screenOrgService.selectAllGrid(null, formDTO.getAreaCode()); |
|||
} |
|||
if (CollectionUtils.isEmpty(grids)){ |
|||
return new ArrayList<>(); |
|||
} |
|||
List<String> gridIds = grids.stream().map(m -> m.getGridId()).collect(Collectors.toList()); |
|||
// 查询网格下的网格员
|
|||
Result<List<GridStaffResultDTO>> resultData = govOrgOpenFeignClient.selectGridStaffByGridIds(gridIds); |
|||
if(!resultData.success()){ |
|||
throw new RenException("查询网格下的网格员失败【"+resultData.getMsg()+"】"); |
|||
} |
|||
List<GridStaffResultDTO> data = resultData.getData(); |
|||
if (CollectionUtils.isEmpty(data)){ |
|||
return new ArrayList<>(); |
|||
} |
|||
List<GridManagerListResultDTO> result = ConvertUtils.sourceToTarget(data, GridManagerListResultDTO.class); |
|||
// 查询经纬度
|
|||
Result<UserNameAndLLResultDTO> selectll = epmetUserOpenFeignClient.selectll(result.stream().map(m -> m.getStaffId()).collect(Collectors.toList())); |
|||
if (!selectll.success()){ |
|||
throw new RenException("查询经纬度和姓名失败【"+selectll.getMsg()+"】"); |
|||
} |
|||
UserNameAndLLResultDTO llAndNameData = selectll.getData(); |
|||
List<GridManagerListResultDTO> finalGrids = grids; |
|||
result.forEach(r -> { |
|||
// 经纬度赋值 巡查状态赋值
|
|||
if (!CollectionUtils.isEmpty(llAndNameData.getLl())) { |
|||
llAndNameData.getLl().forEach(l -> { |
|||
if (r.getStaffId().equals(l.getStaffId()) && r.getGridId().equals(l.getGridId())) { |
|||
r.setLatitude(l.getLatitude()); |
|||
r.setLongitude(l.getLongitude()); |
|||
r.setStatus(l.getStatus()); |
|||
r.setLlStatus(true); |
|||
} |
|||
}); |
|||
} |
|||
// 姓名赋值
|
|||
if (!CollectionUtils.isEmpty(llAndNameData.getUserNames())){ |
|||
llAndNameData.getUserNames().forEach(n -> { |
|||
if (r.getStaffId().equals(n.getUserId())){ |
|||
r.setStaffName(n.getUserName()); |
|||
} |
|||
}); |
|||
} |
|||
finalGrids.forEach(g -> { |
|||
if (r.getGridId().equals(g.getGridId())){ |
|||
r.setGridName(g.getGridName()); |
|||
} |
|||
}); |
|||
}); |
|||
result.forEach(r -> { |
|||
if (!r.getLlStatus()){ |
|||
finalGrids.forEach(g -> { |
|||
if (StringUtils.isNotBlank(g.getCenterMark())){ |
|||
r.setLongitude(getLL(g.getCenterMark(),PatrolConstant.LONGITUDE)); |
|||
r.setLatitude(getLL(g.getCenterMark(),PatrolConstant.LATITUDE)); |
|||
} |
|||
}); |
|||
} |
|||
}); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* @Description 根据中心点位截取经纬度 |
|||
* @Param centMark |
|||
* @Param ll |
|||
* @author zxc |
|||
* @date 2021/6/9 2:08 下午 |
|||
*/ |
|||
public String getLL(String centMark,String ll){ |
|||
if (ll.equals(PatrolConstant.LONGITUDE)){ |
|||
String longitude = centMark.substring(NumConstant.TWO, centMark.indexOf(",")); |
|||
return longitude; |
|||
}else { |
|||
String s = centMark.substring(NumConstant.ZERO, centMark.indexOf(",")); |
|||
String latitude = centMark.substring(s.length() + NumConstant.ONE, centMark.length() - NumConstant.TWO); |
|||
return latitude; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* @Description 002、查看巡查记录 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:25 下午 |
|||
*/ |
|||
@Override |
|||
public List<RecordListResultDTO> recordList(RecordListFormDTO formDTO) { |
|||
Result<List<RecordListResultDTO>> listResult = epmetUserOpenFeignClient.recordList(formDTO); |
|||
if (!listResult.success()){ |
|||
throw new RenException("查询巡查记录失败【"+listResult.getMsg()+"】"); |
|||
} |
|||
List<RecordListResultDTO> result = listResult.getData(); |
|||
if (!CollectionUtils.isEmpty(result)){ |
|||
return result; |
|||
} |
|||
return new ArrayList<>(); |
|||
} |
|||
|
|||
/** |
|||
* @Description 003、巡查轨迹 |
|||
* @Param formDTO |
|||
* @author zxc |
|||
* @date 2021/6/7 3:35 下午 |
|||
*/ |
|||
@Override |
|||
public List<PatrolTrackResultDTO> patrolTrack(PatrolTrackFormDTO formDTO) { |
|||
Result<List<PatrolTrackResultDTO>> result = epmetUserOpenFeignClient.patrolTrack(formDTO); |
|||
if (!result.success()){ |
|||
throw new RenException("查询 巡查轨迹失败【"+result.getMsg()+"】"); |
|||
} |
|||
List<PatrolTrackResultDTO> results = result.getData(); |
|||
if (!CollectionUtils.isEmpty(results)){ |
|||
return results; |
|||
} |
|||
return new ArrayList<>(); |
|||
} |
|||
|
|||
|
|||
} |
@ -0,0 +1,21 @@ |
|||
package com.epmet.datareport.service.user.impl; |
|||
|
|||
import com.epmet.commons.mybatis.service.impl.BaseServiceImpl; |
|||
import com.epmet.datareport.dao.user.StaffPatrolRecordDao; |
|||
import com.epmet.datareport.entity.user.StaffPatrolRecordEntity; |
|||
import com.epmet.datareport.service.user.StaffPatrolRecordService; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
/** |
|||
* 工作人员巡查主记录 |
|||
* |
|||
* @author generator generator@elink-cn.com |
|||
* @since v1.0.0 2021-06-07 |
|||
*/ |
|||
@Service |
|||
@Slf4j |
|||
public class StaffPatrolRecordServiceImpl extends BaseServiceImpl<StaffPatrolRecordDao, StaffPatrolRecordEntity> implements StaffPatrolRecordService { |
|||
|
|||
|
|||
} |
@ -0,0 +1,18 @@ |
|||
<?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.datareport.dao.user.StaffPatrolDetailDao"> |
|||
|
|||
<!-- 查询巡查轨迹 --> |
|||
<select id="selectPatrolTrack" resultType="com.epmet.dto.result.PatrolTrackResultDTO"> |
|||
SELECT |
|||
LATITUDE, |
|||
LONGITUDE |
|||
FROM |
|||
staff_patrol_detail |
|||
WHERE |
|||
STAFF_PATROL_REC_ID = #{staffPatrolRecId} |
|||
AND DEL_FLAG = 0 |
|||
ORDER BY SERIAL_NUM |
|||
</select> |
|||
</mapper> |
@ -0,0 +1,41 @@ |
|||
<?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.datareport.dao.user.StaffPatrolRecordDao"> |
|||
|
|||
<!-- 巡查记录查询 --> |
|||
<select id="recordList" resultType="com.epmet.dto.result.RecordListResultDTO"> |
|||
SELECT |
|||
ID AS staffPatrolRecId, |
|||
DATE_FORMAT(PATROL_START_TIME,'%Y-%m-%d %H:%i:%s') AS patrolStartTime, |
|||
DATE_FORMAT(PATROL_END_TIME,'%Y-%m-%d %H:%i:%s') AS patrolEndTime, |
|||
`STATUS` |
|||
FROM staff_patrol_record |
|||
WHERE DEL_FLAG = 0 |
|||
AND GRID_ID = #{gridId} |
|||
AND STAFF_ID = #{staffId} |
|||
ORDER BY CREATED_TIME DESC |
|||
</select> |
|||
|
|||
<!-- 查询经纬度 --> |
|||
<select id="selectLL" resultType="com.epmet.user.result.GridManagerListResultDTO"> |
|||
SELECT t.* FROM |
|||
(SELECT |
|||
distinct(pr.ID) AS ID, |
|||
pr.GRID AS gridId, |
|||
pr.STAFF_ID, |
|||
pr.`STATUS`, |
|||
pd.LATITUDE, |
|||
pd.LONGITUDE, |
|||
pd.SERIAL_NUM |
|||
FROM staff_patrol_record pr |
|||
LEFT JOIN staff_patrol_detail pd ON pd.STAFF_PATROL_REC_ID = pr.ID AND pd.DEL_FLAG = 0 |
|||
WHERE pr.DEL_FLAG = 0 |
|||
AND ( |
|||
<foreach collection="userIds" item="userId" separator=" OR "> |
|||
pr.STAFF_ID = #{userId} |
|||
</foreach> |
|||
) |
|||
ORDER BY pd.SERIAL_NUM DESC)t GROUP BY ID |
|||
</select> |
|||
</mapper> |
@ -0,0 +1,29 @@ |
|||
package com.epmet.dto.org.result; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* 返回每个网格、每个组织下,工作人员的userId |
|||
* |
|||
* @author yinzuomei@elink-cn.com |
|||
* @date 2021/6/3 9:49 |
|||
*/ |
|||
@Data |
|||
public class OrgStaffDTO implements Serializable { |
|||
|
|||
/** |
|||
* 组织id或者网格id |
|||
*/ |
|||
private String orgId; |
|||
/** |
|||
* agency or grid |
|||
*/ |
|||
private String orgType; |
|||
/** |
|||
* 当前组织或者当前网格下的: |
|||
*/ |
|||
private List<String> staffIds; |
|||
} |
@ -0,0 +1,18 @@ |
|||
package com.epmet.dto.screen.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* desc:修改组织中心点 |
|||
* @author liujianjun |
|||
*/ |
|||
@Data |
|||
public class CenterPointForm implements Serializable { |
|||
private static final long serialVersionUID = 6425114459278919896L; |
|||
private String title; |
|||
private List<Double> center = new ArrayList<>(); |
|||
} |
@ -0,0 +1,30 @@ |
|||
package com.epmet.dto.screen.form; |
|||
|
|||
import lombok.Data; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
|
|||
/** |
|||
* desc:修改组织中心点 |
|||
* @author liujianjun |
|||
*/ |
|||
@Data |
|||
public class GridCenterPointForm implements Serializable { |
|||
|
|||
private static final long serialVersionUID = -6988009829971668860L; |
|||
|
|||
private String customerId; |
|||
|
|||
private List<CenterPointForm> centerDataList = new ArrayList<>(); |
|||
|
|||
|
|||
/* @Data |
|||
public class CenterData implements Serializable{ |
|||
|
|||
private static final long serialVersionUID = 6425114459278919896L; |
|||
private String title; |
|||
private List<Double> center = new ArrayList<>(); |
|||
}*/ |
|||
} |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue