001 | package com.espread.common.aspect; |
003 | import com.espread.common.annotation.SysSeqHelper; |
004 | import com.espread.common.exception.SequenceAspectException; |
005 | import com.espread.common.utils.FormatUtils; |
006 | import com.espread.common.utils.StringUtils; |
007 | import com.espread.sys.mapper.SysSequenceMapper; |
008 | import com.espread.sys.model.SysSequence; |
009 | import org.aspectj.lang.JoinPoint; |
010 | import org.aspectj.lang.annotation.Aspect; |
011 | import org.aspectj.lang.annotation.Before; |
012 | import org.aspectj.lang.annotation.Pointcut; |
013 | import org.slf4j.Logger; |
014 | import org.slf4j.LoggerFactory; |
015 | import org.springframework.beans.factory.annotation.Autowired; |
016 | import org.springframework.stereotype.Component; |
018 | import java.lang.reflect.Field; |
019 | import java.util.UUID; |
020 | import java.util.regex.Matcher; |
021 | import java.util.regex.Pattern; |
025 | * @author itdragons 2016-08-13 23:56:50 |
030 | public class SequenceAspect { |
032 | private Logger LOGGER = LoggerFactory.getLogger(SequenceAspect. class ); |
035 | private SysSequenceMapper sysSequenceMapper; |
036 | private final int maxNum = 5 ; |
041 | @Pointcut ( " execution(* com.espread.*.mapper.**.insert*(..))" ) |
042 | public void aspect(){} |
045 | public void before(JoinPoint point){ |
046 | Object[] args = point.getArgs(); |
047 | if (args.length == 1 ){ |
048 | Object obj = args[ 0 ]; |
049 | Field[] fields = obj.getClass().getDeclaredFields(); |
050 | String newSeq = null ; |
051 | for (Field field : fields){ |
052 | field.setAccessible( true ); |
053 | SysSeqHelper sysSeqHelper = field.getAnnotation(SysSeqHelper. class ); |
054 | if (sysSeqHelper != null ){ |
055 | String seqType = sysSeqHelper.type(); |
056 | String seqCode = sysSeqHelper.value(); |
058 | if (StringUtils.isBlanks(seqType)){ |
059 | if (StringUtils.isBlanks(seqCode)) { |
060 | newSeq = UUID.randomUUID().toString(); |
062 | newSeq = getSequence(seqCode); |
066 | if (sysSeqHelper.UUDI.equals(seqType)) { |
067 | newSeq = UUID.randomUUID().toString(); |
068 | } else if (sysSeqHelper.DB.equals(seqType)){ |
069 | if (StringUtils.isBlanks(seqCode)){ |
070 | newSeq = getSequence(obj.getClass()); |
072 | newSeq = getSequence(seqCode); |
075 | throw new SequenceAspectException( "注入主键序列异常,注解type参数错误(" + obj + ")" ); |
079 | if (field.getType() == Integer. class ) { |
080 | String regEx= "[^0-9]" ; |
081 | Matcher m = Pattern.compile(regEx).matcher(newSeq); |
082 | Integer newSeqInt = Integer.valueOf(m.replaceAll( "" ).trim()); |
083 | field.set(obj, newSeqInt); |
085 | field.set(obj, newSeq); |
087 | } catch (Exception e) { |
088 | throw new SequenceAspectException( "注入主键序列异常:" + obj ); |
102 | public String getSequence(String seqCode) { |
104 | Integer newSeq = null ; |
105 | SysSequence sysSequence = null ; |
109 | while (resultCount == 0 && forNum < maxNum){ |
110 | sysSequence = sysSequenceMapper.selectByPrimaryKey(seqCode); |
111 | if (sysSequence == null ){ |
112 | String errMSg = "序列查询失败,请检查数据库序列表配置:" + seqCode; |
113 | LOGGER.error(errMSg); |
114 | throw new SequenceAspectException(errMSg); |
117 | newSeq = sysSequence.getCurrentSeq() + 1 ; |
118 | resultCount = sysSequenceMapper.updateCurrentSeq( newSeq ,sysSequence.getSeqCode(), sysSequence.getCurrentSeq()); |
122 | if (forNum == maxNum){ |
123 | String errMSg = "序列更新失败,请检查数据库序列表配置:" + seqCode; |
124 | LOGGER.error(errMSg); |
125 | throw new SequenceAspectException(errMSg); |
128 | int currentLength = String.valueOf(newSeq).length(); |
129 | int minLength = sysSequence.getMinLength(); |
130 | StringBuffer bf = new StringBuffer(); |
131 | if (StringUtils.isNotBlank(sysSequence.getFixStart())){ |
132 | bf.append(sysSequence.getFixStart()); |
134 | int zeroLength = minLength - currentLength; |
135 | while (zeroLength > 0 ){ |
140 | if (StringUtils.isNotBlank(sysSequence.getFixEnd())){ |
141 | bf.append(sysSequence.getFixEnd()); |
143 | return bf.toString().trim(); |
151 | public String getSequence(Class dbEntity) { |
152 | String classPath = dbEntity.getName(); |
153 | String className = classPath.substring(classPath.lastIndexOf( "." ) + 1 , classPath.length()); |
154 | String seqCode = FormatUtils.classnameToDbname(className); |
155 | return getSequence(seqCode); |