package com.vci.web.other;
|
|
import com.vci.web.annotation.BdSelectInput;
|
import com.vci.web.dao.BdSelectInputCharDaoI;
|
import com.vci.web.model.BdSelectInputCharDO;
|
import com.vci.web.util.WebUtil;
|
import org.apache.commons.lang3.StringUtils;
|
import org.aspectj.lang.JoinPoint;
|
import org.aspectj.lang.annotation.After;
|
import org.aspectj.lang.annotation.AfterReturning;
|
import org.aspectj.lang.annotation.Aspect;
|
import org.aspectj.lang.annotation.Pointcut;
|
import org.aspectj.lang.reflect.MethodSignature;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
import org.springframework.core.DefaultParameterNameDiscoverer;
|
import org.springframework.core.ParameterNameDiscoverer;
|
import org.springframework.stereotype.Component;
|
|
|
import javax.annotation.Resource;
|
import java.lang.reflect.Method;
|
import java.util.ArrayList;
|
import java.util.Collection;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
/**
|
* 可以输入也可以选择的切面程序
|
* @author weidy
|
* @date 2022-3-16
|
*/
|
@Aspect
|
@Component
|
public class BdSelectInputCharAspect {
|
|
/**
|
* 当前类的日志输出
|
*/
|
private Logger logger = LoggerFactory.getLogger(getClass());
|
|
/**
|
* 数据操作类
|
*/
|
@Resource
|
private BdSelectInputCharDaoI selectInputCharDao;
|
|
/**
|
* 所有的BdSelectInput注解的
|
*/
|
@Pointcut("execution(public * com.vci..*.*(..)) && @target(com.vci.web.annotation.BdSelectInput) ")
|
public void selectInputChar(){
|
|
}
|
|
/**
|
* 执行完成后记录
|
* @param joinPoint 切入点
|
*/
|
@AfterReturning(pointcut = "selectInputChar()",returning = "returnVal")
|
public void saveChar(JoinPoint joinPoint,Object returnVal){
|
try {
|
Method method = getMethod(joinPoint);
|
//获取方法上的参数
|
BdSelectInput selectInput = method.getAnnotation(BdSelectInput.class);
|
if (selectInput == null) {
|
method.getDeclaredAnnotation(BdSelectInput.class);
|
}
|
if (selectInput != null) {
|
String fieldString = selectInput.value();
|
ParameterNameDiscoverer pnd = new DefaultParameterNameDiscoverer();
|
String[] parameterNames = pnd.getParameterNames(method);
|
Object[] args = joinPoint.getArgs();
|
//从参数里面找到对应的值
|
String value = getValueFromParam(fieldString, parameterNames, args);
|
String flag = selectInput.flag();
|
String namespace = selectInput.namespace();
|
if (flag == null) {
|
flag = "default";
|
}
|
if (namespace == null) {
|
namespace = "default";
|
}
|
if (StringUtils.isNotBlank(value)) {
|
BdSelectInputCharDO sic = new BdSelectInputCharDO();
|
sic.setSourceNameSpace(namespace);
|
sic.setSourceInputFlag(flag);
|
sic.setId(value);
|
if (logger.isInfoEnabled()) {
|
logger.info("本次保存的字符内容,{0}", sic.toString());
|
}
|
selectInputCharDao.insert(sic);
|
}
|
}
|
}catch (Throwable e){
|
logger.error("切面记录可选字符的时候出错",e);
|
}
|
}
|
|
/**
|
* 多个分隔符
|
*/
|
public static final String SEP = "${SEP}";
|
|
/**
|
* 从参数里获取值
|
* @param fieldString 字段的表达式
|
* @param parameterNames 参数的名字
|
* @param args 参数的对象
|
* @return 记录的值
|
*/
|
private String getValueFromParam(String fieldString, String[] parameterNames, Object[] args) {
|
String value = "";
|
String[] split = fieldString.split(".");
|
if(split.length>0) {
|
String paramName = split[0];
|
for (int i = 0; i < parameterNames.length; i++) {
|
if (paramName.equalsIgnoreCase(parameterNames[i])) {
|
Object param = args[i];
|
//在看看里面的内容
|
if (split.length == 1) {
|
//只有一个,那就是这个参数了
|
if(param!=null){
|
value = param.toString();
|
}
|
}else{
|
//第二层
|
Object fieldValue = WebUtil.getValueFromField(split[1],param);
|
if(fieldValue instanceof Collection){
|
List<String> values = new ArrayList<>();
|
((Collection)fieldValue).stream().forEach(fv ->{
|
if (split.length > 2) {
|
//说明还要往下找
|
Object fromField = WebUtil.getValueFromField(split[2], fv);
|
values.add(WebUtil.getStringValueFromObject(fromField));
|
} else {
|
values.add(WebUtil.getStringValueFromObject(fv));
|
}
|
});
|
value = values.stream().collect(Collectors.joining(SEP));
|
}else if(fieldValue instanceof Map){
|
List<String> values = new ArrayList<>();
|
((Map)fieldValue).values().stream().forEach(fv ->{
|
if (split.length > 2) {
|
//说明还要往下找
|
Object fromField = WebUtil.getValueFromField(split[2], fv);
|
values.add(WebUtil.getStringValueFromObject(fromField));
|
} else {
|
values.add(WebUtil.getStringValueFromObject(fv));
|
}
|
});
|
value = values.stream().collect(Collectors.joining(SEP));
|
}else {
|
if (split.length > 2) {
|
//说明还要往下找
|
fieldValue = WebUtil.getValueFromField(split[2], fieldValue);
|
value = WebUtil.getStringValueFromObject(fieldValue);
|
} else {
|
value = WebUtil.getStringValueFromObject(fieldValue);
|
}
|
}
|
}
|
break;
|
}
|
}
|
}
|
return value;
|
}
|
|
|
/**
|
* 获取被调用的方法
|
* @param joinPoint 切入点
|
* @return 调用的方法
|
*/
|
public Method getMethod(JoinPoint joinPoint){
|
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
Method method = signature.getMethod();
|
return method;
|
}
|
}
|