Commit 29567717 authored by suntao's avatar suntao

通过注解 写入opt操作日志

parent c152ec2b
......@@ -3,8 +3,8 @@ package cn.quantgroup.cashloanflowboss.api.channel.controller;
import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo;
import cn.quantgroup.cashloanflowboss.api.channel.service.ChannelConfService;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -2,6 +2,7 @@ package cn.quantgroup.cashloanflowboss.api.login.model;
import cn.quantgroup.cashloanflowboss.api.role.entity.Role;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserRank;
import cn.quantgroup.cashloanflowboss.api.user.model.UserInfo;
import lombok.Data;
import java.util.List;
......@@ -17,7 +18,7 @@ public class Principal {
/**
* 用户ID
*/
private Long userId;
private UserInfo userInfo;
/**
* 用户级别
......
......@@ -3,6 +3,7 @@ package cn.quantgroup.cashloanflowboss.api.login.service;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.api.user.dictionary.UserStatus;
import cn.quantgroup.cashloanflowboss.api.user.entity.User;
import cn.quantgroup.cashloanflowboss.api.user.model.UserInfo;
import cn.quantgroup.cashloanflowboss.api.user.service.UserServiceImpl;
import cn.quantgroup.cashloanflowboss.core.asserts.Assert;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationDictionary;
......@@ -54,7 +55,12 @@ public class LogService {
// 设置用户主要信息
Principal principal = new Principal();
principal.setUserId(user.getId());
UserInfo userInfo = new UserInfo();
userInfo.setUserId(user.getId());
userInfo.setUsername(user.getUsername());
userInfo.setNickname(user.getNickname());
principal.setUserInfo(userInfo);
principal.setChannelId(user.getChannelId());
principal.setRank(user.getRank());
principal.setRoles(user.getRoles());
......
......@@ -4,11 +4,12 @@ import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel;
import cn.quantgroup.cashloanflowboss.api.order.service.OrderService;
import cn.quantgroup.cashloanflowboss.component.security.annotiation.Security;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.tuple.ThreeTuple;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
......@@ -63,7 +64,7 @@ public class OrderController {
public Result approveOpt(@RequestBody @Valid ApproveVo approveVo) {
if (Application.isDebug()) {
Tuple<Boolean, Boolean> approveOptBooleanAndFundSettingBooleanTuple = orderService.approveOpt(approveVo);
ThreeTuple<Boolean, Boolean, String> approveOptBooleanAndFundSettingBooleanTuple = orderService.approveOpt(approveVo);
Boolean approveResult = approveOptBooleanAndFundSettingBooleanTuple.getKey();
if (approveResult) {
return Result.buildSuccess(approveResult, approveOptBooleanAndFundSettingBooleanTuple.getValue() ? "审批操作成功" : "请检查资产计划配置,审批操作成功");
......
......@@ -5,6 +5,7 @@ import cn.quantgroup.cashloanflowboss.api.order.model.HistoryOrderStatusVoModel;
import cn.quantgroup.cashloanflowboss.api.order.model.LendingFormModel;
import cn.quantgroup.cashloanflowboss.api.order.model.OrderVo;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.tuple.ThreeTuple;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel;
import org.springframework.data.domain.Page;
import org.springframework.transaction.annotation.Transactional;
......@@ -20,7 +21,7 @@ import java.util.List;
public interface OrderService {
Page<OrderVo> orderList(Long channelId, String channelOrderNo, String applyNo, Long loanId, Integer pageNumber, Integer pageSize);
Tuple<Boolean, Boolean> approveOpt(ApproveVo approveVo);
ThreeTuple<Boolean, Boolean, String> approveOpt(ApproveVo approveVo);
/**
*
......
......@@ -2,6 +2,9 @@ package cn.quantgroup.cashloanflowboss.api.order.service;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.tuple.ThreeTuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackFailRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.model.LoanProgress;
......@@ -14,7 +17,6 @@ import cn.quantgroup.cashloanflowboss.api.order.repository.OrderApproveRepositor
import cn.quantgroup.cashloanflowboss.api.order.util.OrderUtil;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.base.ServiceResult;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.CallbackRecord;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.model.CallbackRecordVoModel;
......@@ -180,8 +182,9 @@ public class OrderServiceImpl implements OrderService{
* @return Tuple<Boolean 审批结果 true 审批完成 false 审批操作失败, Boolean 资产计划配置 true 配置没问题 false 配置需要检查>
*/
@OperationAnno(channelNo = "#this[0].channelOrderNumber", opt = OptEnumName.AUDIT, succSPEL = "#this.key", optDetailSPEL = "#this.ex")
@Override
public Tuple<Boolean, Boolean> approveOpt(ApproveVo approveVo) {
public ThreeTuple<Boolean, Boolean, String> approveOpt(ApproveVo approveVo) {
log.info("approveOpt,审批操作入参,approveVo={}", JSONTools.serialize(approveVo));
......@@ -197,24 +200,24 @@ public class OrderServiceImpl implements OrderService{
ClfOrderMapping orderMapping = clfOrderMappingRepository.findByChannelOrderNoLastOne(approveVo.getChannelOrderNumber());
if (orderMapping == null) {
log.info("approveOpt,审批失败,无订单 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
return new ThreeTuple(false, false, "审批失败,无订单");
}
if (Application.getPrincipal().isChannel() && !Application.getPrincipal().isSameChannel(orderMapping.getRegisteredFrom())) {
log.info("approveOpt,审批失败,不是该渠道订单无法审批 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
return new ThreeTuple(false, false, "审批失败,不是该渠道订单无法审批");
}
XUser xUser = xyqbUserService.findXUserById(orderMapping.getQgUserId());
if (xUser == null) {
log.info("approveOpt,审批失败,未找到用户 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
return new ThreeTuple(false, false, "审批失败,未找到用户");
}
ChannelConf channelConf = channelConfRepository.getByChannelId(orderMapping.getRegisteredFrom());
if (channelConf == null) {
log.info("approveOpt,审批失败,boss渠道配置为空 channelOrderNumber={}", approveVo.getChannelOrderNumber());
return new Tuple<>(false, false);
return new ThreeTuple(false, false, "审批失败,boss渠道配置为空");
}
// 额度有效期
......@@ -268,7 +271,7 @@ public class OrderServiceImpl implements OrderService{
corpPolicyValidate = xyqbCenterService.validateCorpPolicy(Long.valueOf(fundId), new Date());
} catch (Exception e) {
log.error("审批,资方校验异常,channelOrderNumber={},fundId={}, e={}", orderMapping.getChannelOrderNo(), fundId, ExceptionUtils.getStackTrace(e));
log.error("[approveOpt]审批,资方校验异常,channelOrderNumber={},fundId={}, e={}", orderMapping.getChannelOrderNo(), fundId, ExceptionUtils.getStackTrace(e));
}
// 操作记录
......@@ -289,17 +292,17 @@ public class OrderServiceImpl implements OrderService{
optHistoryLog.setOptResult(true);
optResult = true;
log.info("审批申请成功,channelOrderNumber={}", orderMapping.getChannelOrderNo());
log.info("[approveOpt]审批申请成功,channelOrderNumber={}", orderMapping.getChannelOrderNo());
} else {
optLogDetail = optLogDetail.concat("审批失败");
optLogDetail = optLogDetail.concat("clotho审批失败");
optHistoryLog.setOptResult(false);
log.info("审批申请失败,channelOrderNumber={},requestParam={}", orderMapping.getChannelOrderNo(), JSONTools.serialize(data));
log.info("[approveOpt]审批申请失败,channelOrderNumber={},requestParam={}", orderMapping.getChannelOrderNo(), JSONTools.serialize(data));
optResult = false;
}
optHistoryLog.setOptLogDetail(optLogDetail);
optHistoryLogService.save(optHistoryLog);
//optHistoryLogService.save(optHistoryLog);
return new Tuple<>(optResult, corpPolicyValidate);
return new ThreeTuple(optResult, corpPolicyValidate, optLogDetail);
}
/**
......
......@@ -4,6 +4,7 @@ import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.order.entity.OrderApprove;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
import cn.quantgroup.cashloanflowboss.core.tuple.ThreeTuple;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ApplyRequestHistory;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.WithdrawRecord;
......@@ -11,7 +12,6 @@ import cn.quantgroup.cashloanflowboss.spi.clf.model.KANoticeType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.awt.font.OpenType;
import java.util.ArrayList;
import java.util.List;
......
......@@ -9,7 +9,6 @@ import com.google.common.collect.Lists;
import lombok.Data;
import java.util.List;
import java.util.Set;
@Data
public class UserDetailInfo {
......@@ -30,21 +29,15 @@ public class UserDetailInfo {
}
}
@Data
public static class UserInfo {
private Long userId;
private String userName;
private String nickname;
}
public static UserDetailInfo valueOf(Principal principal, User user) {
public static UserDetailInfo valueOf(Principal principal) {
Assert.isNull(principal, ApplicationStatus.INVALID_USER);
UserDetailInfo userDetailInfo = new UserDetailInfo();
Long userId = principal.getUserId();
Long userId = principal.getUserInfo().getUserId();
userDetailInfo.setRank(principal.getRank().name());
userDetailInfo.setChannelId(principal.getChannelId());
List<Role> roles = principal.getRoles();
if (null != roles && roles.size() > 0) {
RoleInfo roleInfo = new RoleInfo();
List<RoleInfo.roleView> roleInfos = Lists.newArrayList();
......@@ -60,8 +53,8 @@ public class UserDetailInfo {
UserInfo userInfo = new UserInfo();
userInfo.setUserId(userId);
userInfo.setNickname(user.getNickname());
userInfo.setUserName(user.getUsername());
userInfo.setNickname(principal.getUserInfo().getNickname());
userInfo.setUsername(principal.getUserInfo().getUsername());
userDetailInfo.setUserInfo(userInfo);
return userDetailInfo;
......
package cn.quantgroup.cashloanflowboss.api.user.model;
import lombok.Data;
/**
* function:
* date: 2019/9/23
*
* @author: suntao
*/
@Data
public class UserInfo {
private Long userId;
private String username;
private String nickname;
}
......@@ -148,9 +148,7 @@ public class UserServiceImpl implements UserService{
Principal principal = Application.getPrincipal();
Assert.isNull(principal, ApplicationStatus.INVALID_USER);
User user = userRepository.findById(principal.getUserId());
return UserDetailInfo.valueOf(principal, user);
return UserDetailInfo.valueOf(principal);
}
......
package cn.quantgroup.cashloanflowboss.core.annotation;
package cn.quantgroup.cashloanflowboss.core.annotation.channelrole;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
......
package cn.quantgroup.cashloanflowboss.core.annotation;
package cn.quantgroup.cashloanflowboss.core.annotation.channelrole;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
......
package cn.quantgroup.cashloanflowboss.core.annotation;
package cn.quantgroup.cashloanflowboss.core.annotation.channelrole;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
......
package cn.quantgroup.cashloanflowboss.core.annotation.opt;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import java.lang.annotation.*;
/**
* function:
* date: 2019/9/23
*
* @author: suntao
*/
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationAnno {
/**
* 渠道订单号
* @return
*/
String channelNo();
/**
* 操作名
* @return
*/
OptEnumName opt();
/**
* 是否成功
* 返回表达式
* @return
*/
String succSPEL();
/**
* opt详细表达式
* 返回表达式
* @return
*/
String optDetailSPEL();
}
package cn.quantgroup.cashloanflowboss.core.aspect;
import java.util.Date;
import cn.quantgroup.cashloanflowboss.api.optlog.entity.OptHistoryLog;
import cn.quantgroup.cashloanflowboss.api.optlog.model.OptEnumName;
import cn.quantgroup.cashloanflowboss.api.optlog.service.OptHistoryLogServiceImpl;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import cn.quantgroup.cashloanflowboss.spi.clf.service.CLFCenterService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionException;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* function:
* date: 2019/9/23
*
* @author: suntao
*/
@Slf4j
@Component
@Aspect
public class OperationAspect {
@Autowired
private CLFCenterService clfCenterService;
@Autowired
private OptHistoryLogServiceImpl optHistoryLogService;
@Pointcut("@annotation(cn.quantgroup.cashloanflowboss.core.annotation.opt.OperationAnno)")
private void operationAnno() {}
/**
* @param pjp
* @return
* @throws
*/
@Around("operationAnno()")
private Object operationAnnoAndSave(ProceedingJoinPoint pjp) throws Throwable {
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
Method method = methodSignature.getMethod();
OperationAnno annotation = method.getAnnotation(OperationAnno.class);
Object[] args = pjp.getArgs();
OptEnumName opt = annotation.opt();
String succSPEL = annotation.succSPEL();
String optDetailSPEL = annotation.optDetailSPEL();
String channelOrderNumber = "";
if (StringUtils.isNotBlank(annotation.channelNo())) {
String keySPEL = annotation.channelNo();
try {
if (keySPEL.startsWith("#this")) {//判断是否是spel表达式
Expression expression = new SpelExpressionParser().parseExpression(keySPEL);
String value = expression.getValue(args, String.class);
channelOrderNumber = value;
} else {
log.warn("[operationAnnoAnnSave]channelOrderNumber获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + keySPEL + "”错误:{}", e);
throw e;
}
}
OptHistoryLog optHistoryLog = new OptHistoryLog();
if (StringUtils.isNotEmpty(channelOrderNumber)) {
ClfOrderMapping orderMapping = clfCenterService.findOrderMappingByChannelOrderNo(channelOrderNumber);
if (orderMapping != null) {
// do some
optHistoryLog.setChannelOrderNumber(channelOrderNumber);
optHistoryLog.setCreditNumber(orderMapping.getApplyNo());
optHistoryLog.setLoanId(orderMapping.getLoanId());
optHistoryLog.setChannelId(orderMapping.getRegisteredFrom());
optHistoryLog.setOptEnumName(opt);
optHistoryLog.setOptName(opt.getDesc());
optHistoryLog.setOptUser(Application.getPrincipal().getUserInfo().getNickname());
optHistoryLog.setCreateTime(new Date());
} else {
log.warn("[operationAnnoAnnSave]orderMapping is null, channelOrderNumber={}" , channelOrderNumber );
return pjp.proceed();
}
} else {
log.warn("[operationAnnoAnnSave]channelOrderNumber is empty, channelOrderNumber={}" , channelOrderNumber );
return pjp.proceed();
}
Object proceed = pjp.proceed();
if (StringUtils.isNotEmpty(succSPEL)) {
try {
if (succSPEL.startsWith("#this")) {//判断是否是spel表达式
Expression expression = new SpelExpressionParser().parseExpression(succSPEL);
Boolean isSuccess = expression.getValue(proceed, Boolean.class);
optHistoryLog.setOptResult(isSuccess);
} else {
log.warn("[operationAnnoAnnSave]optResult获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + succSPEL + "”错误:{}", e);
throw e;
}
}
if (StringUtils.isNotEmpty(optDetailSPEL)) {
try {
if (optDetailSPEL.startsWith("#this")) {//判断是否是spel表达式
Expression expression = new SpelExpressionParser().parseExpression(optDetailSPEL);
String optDetail = expression.getValue(proceed, String.class);
optHistoryLog.setOptLogDetail(optDetail);
} else {
log.warn("[operationAnnoAnnSave]optDetail获取失败");
}
} catch (ExpressionException e) {
log.error("[operationAnnoAnnSave]key表达式“" + optDetailSPEL + "”错误:{}", e);
throw e;
}
}
optHistoryLogService.save(optHistoryLog);
return proceed;
}
}
......@@ -4,9 +4,9 @@ import cn.quantgroup.cashloanflowboss.api.channel.model.ChannelConfVo;
import cn.quantgroup.cashloanflowboss.api.channel.util.ChannelConfUtil;
import cn.quantgroup.cashloanflowboss.api.login.model.Principal;
import cn.quantgroup.cashloanflowboss.core.Application;
import cn.quantgroup.cashloanflowboss.core.annotation.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.ChannelIdInit;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRole;
import cn.quantgroup.cashloanflowboss.core.annotation.channelrole.CheckChannelRoleByChannelOrderNumber;
import cn.quantgroup.cashloanflowboss.core.base.Result;
import cn.quantgroup.cashloanflowboss.core.dictionary.ApplicationStatus;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
......
package cn.quantgroup.cashloanflowboss.core.tuple;
import cn.quantgroup.cashloanflowboss.core.base.Tuple;
/**
* function:
* date: 2019/9/23
*
* @author: suntao
*/
public class ThreeTuple<T, V, D> extends Tuple<T, V> {
public final D ex;
public ThreeTuple(T a, V b, D d) {
super(a, b);
ex = d;
}
}
package cn.quantgroup.cashloanflowboss.spi.clf.service;
import cn.quantgroup.cashloanflowboss.spi.clf.entity.ClfOrderMapping;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment