fix:单号生成记录

yun-zuoyi
汪云昊 5 years ago
parent c64d619b0a
commit 954004452b

@ -36,10 +36,10 @@ import java.util.ArrayList;
import java.util.List;
/**
* @Description :
* @Description :
* @Reference :
* @Author : yunhao
* @CreateDate : 2018-11-15 22:15
* @CreateDate : 2020-09-03 11:15
* @Modify:
**/
@ConditionalOnExpression("'${impp.mq.queue.work.we-chat:true}' == 'true'")

@ -3,10 +3,12 @@ package cn.estsh.i3plus.core.apiservice.mq;
import cn.estsh.i3plus.core.api.iservice.busi.ISysPojoVersionDetailService;
import cn.estsh.i3plus.core.api.iservice.busi.ISysPojoVersionService;
import cn.estsh.i3plus.platform.common.convert.ConvertBean;
import cn.estsh.i3plus.platform.common.tool.ExcelTool;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.pojo.base.codemaker.SnowflakeIdMaker;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.platform.bean.SysConfig;
import cn.estsh.i3plus.pojo.platform.bean.SysPojoVersion;
import cn.estsh.i3plus.pojo.platform.bean.SysPojoVersionDetail;
import cn.estsh.i3plus.pojo.platform.bean.SysPojoVersionPlan;
@ -25,7 +27,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.HashMap;
@ -56,16 +57,17 @@ public class PojoVersionQueueReceiver {
@Autowired
private SnowflakeIdMaker snowflakeIdMaker;
@Resource(name= CommonConstWords.IMPP_REDIS_RES)
@Resource(name = CommonConstWords.IMPP_REDIS_RES)
private ImppRedis redisRes;
/**
* QUEUE_SWEB_NOTICE
*
* @return
* @throws Exception
*/
@Bean
public Queue getQueueSwebNoticeQueue(){
public Queue getQueueSwebNoticeQueue() {
return new Queue(QUEUE_IMPP_POJO_VERSION);
}
@ -74,39 +76,39 @@ public class PojoVersionQueueReceiver {
boolean isNack = false;
try {
byte[] messageBody = message.getBody();
if(messageBody != null && messageBody.length > 0){
if (messageBody != null && messageBody.length > 0) {
String msg = new String(messageBody);
if(StringUtils.isNotBlank(msg)){
if (StringUtils.isNotBlank(msg)) {
// 当前操作数据
SysPojoVersion afterVersion = JSON.parseObject(msg, SysPojoVersion.class);
// 是否进行版本控制
Object redisValue = redisRes.getObject(CommonConstWords.REDIS_PREFIX_POJO_VERSION + ":" + afterVersion.getSoftType() + ":" + afterVersion.getRefClass());
if(Objects.nonNull(redisValue)){
if (Objects.nonNull(redisValue)) {
SysPojoVersionPlan versionPlan = JSON.parseObject(redisValue.toString(), SysPojoVersionPlan.class);
Map<String,Object> afterMap = JsonUtilTool.decode(afterVersion.getBean(), Map.class);
Map<String, Object> afterMap = JsonUtilTool.decode(afterVersion.getBean(), Map.class);
SysPojoVersionDetail afterVersionDetail = null;
Map<String, String> mapPropDesc = afterVersion.getPojoPropDesc();
// 已存在数据
SysPojoVersion beforeVersion = null;
SysPojoVersionDetail beforeVersionDetail = null;
Map<String,Object> beforeMap = new HashMap<>();
Map<String, Object> beforeMap = new HashMap<>();
Integer versionNo; // 对象版本
CommonEnumUtil.DAO_OPERATE_TYPE operateType = CommonEnumUtil.DAO_OPERATE_TYPE.INSERT; // 操作类型
Map<String, MapDifference.ValueDifference<Object>> differing; // 版本对比
String pojoCompare = null;
Map<String, MapDifference.ValueDifference<Object>> mapDiff; // 版本对比
String userName = StringUtils.isNotBlank(afterVersion.getModifyUser()) ? afterVersion.getModifyUser() : afterVersion.getCreateUser();
if(!"insert".equals(afterVersion.getVersionMethodName())){ // 不是新增数据的时候则需要查询历史记录
if (!"insert".equals(afterVersion.getVersionMethodName())) { // 不是新增数据的时候则需要查询历史记录
// 已存在数据封装
if(afterVersion != null){
if (afterVersion != null) {
afterVersion.setOrderByParam("createDatetime");
afterVersion.setAscOrDesc(CommonEnumUtil.ASC_OR_DESC.DESC.getValue());
beforeVersion = pojoVersionService.getPojoVersion(afterVersion);
if(Objects.nonNull(beforeVersion)){
if (Objects.nonNull(beforeVersion)) {
beforeVersionDetail = pojoVersionDetailService.get(beforeVersion.getPojoDetailId());
if(Objects.nonNull(beforeVersionDetail)){
if (Objects.nonNull(beforeVersionDetail)) {
beforeMap.putAll(JsonUtilTool.decode(beforeVersionDetail.getPojoAfter(), Map.class));
}
}
@ -119,8 +121,7 @@ public class PojoVersionQueueReceiver {
afterMap.remove(key);
}
differing = Maps.difference(beforeMap, afterMap).entriesDiffering();
mapDiff = Maps.difference(beforeMap, afterMap).entriesDiffering();
// // 忽略版本控制属性
// if(differing != null ){
// for (String key : CommonConstWords.POJO_VERSION_ATTR_INGNORE) {
@ -130,7 +131,7 @@ public class PojoVersionQueueReceiver {
// }
// pojoCompare = differing.toString();
// }
pojoCompare = differing != null && differing.size() > 0 ? differing.toString() : null;
String pojoCompare = mapDiff == null ? null : mapDiff.toString();
versionNo = Objects.nonNull(beforeVersion) ? beforeVersion.getVersionNo() : 0;
afterVersion.setVersionNo(++versionNo);
@ -141,34 +142,121 @@ public class PojoVersionQueueReceiver {
afterVersionDetail = new SysPojoVersionDetail();
afterVersionDetail.setId(snowflakeIdMaker.nextId());
afterVersionDetail.setPojoVersionId(afterVersion.getId());
afterVersionDetail.setPojoBefore(JSON.toJSONString(beforeMap));
afterVersionDetail.setPojoAfter(JSON.toJSONString(afterMap));
afterVersionDetail.setPojoCompare(pojoCompare);
ConvertBean.serviceModelInitialize(afterVersionDetail,userName);
afterVersionDetail.setPojoBeforeTxt(getMapToStr(beforeMap, mapPropDesc));
afterVersionDetail.setPojoAfterTxt(getMapToStr(afterMap, mapPropDesc));
afterVersionDetail.setPojoCompareTxt(getMapDiffToStr(mapDiff, mapPropDesc));
ConvertBean.serviceModelInitialize(afterVersionDetail, userName);
pojoVersionDetailService.insert(afterVersionDetail);
afterVersion.setOperateType(operateType.getValue());
afterVersion.setVersionNo(versionNo);
afterVersion.setPojoCompare(pojoCompare);
afterVersion.setPojoCompareTxt(getMapDiffToStr(mapDiff, mapPropDesc));
afterVersion.setPojoDetailId(afterVersionDetail.getId());
ConvertBean.serviceModelInitialize(afterVersion,userName);
ConvertBean.serviceModelInitialize(afterVersion, userName);
pojoVersionService.insert(afterVersion);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
} finally {
try {
if(isNack){
if (isNack) {
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
}else{
} else {
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false);
}
}catch (Exception e){
LOGGER.error("Pojo Version MQ ACK Error Message :{}",e.getMessage());
} catch (Exception e) {
LOGGER.error("Pojo Version MQ ACK Error Message :{}", e.getMessage());
}
}
}
/**
* Map
*
* @param mapData
* @param mapPropDesc
* @return
*/
private String getMapToStr(Map<String, Object> mapData, Map<String, String> mapPropDesc) {
if (mapData == null) {
mapData = new HashMap<>();
}
if (mapPropDesc == null) {
mapData = new HashMap<>();
}
StringBuilder stringBuffer = new StringBuilder();
String key;
for (Map.Entry<String, Object> entry : mapData.entrySet()) {
key = mapPropDesc.get(entry.getKey());
if (key == null) {
key = entry.getKey();
}
stringBuffer.append(key).append(":").append(entry.getValue()).append(",");
}
return stringBuffer.toString();
}
/**
* MapDifference
*
* @param mapData
* @param mapPropDesc
* @return
*/
private String getMapDiffToStr(Map<String, MapDifference.ValueDifference<Object>> mapData, Map<String, String> mapPropDesc) {
if (mapData == null) {
mapData = new HashMap<>();
}
if (mapPropDesc == null) {
mapData = new HashMap<>();
}
StringBuilder stringBuffer = new StringBuilder();
String key;
MapDifference.ValueDifference<Object> valDiff;
for (Map.Entry<String, MapDifference.ValueDifference<Object>> entry : mapData.entrySet()) {
valDiff = entry.getValue();
if (valDiff == null) {
continue;
}
key = mapPropDesc.get(entry.getKey());
if (key == null) {
key = entry.getKey();
}
stringBuffer.append("修改值 ").append(key)
.append(",旧值为 ").append(valDiff.leftValue())
.append(",新值为 ").append(valDiff.rightValue())
.append("。");
}
return stringBuffer.toString();
}
public static void main(String[] args) {
Map<String, String> orginMap = new HashMap<>();
orginMap.put("name", "wyh");
orginMap.put("age", "18");
orginMap.put("sex", "male");
Map<String, String> newMap = new HashMap<>();
newMap.put("name", "hyw");
newMap.put("age", "81");
MapDifference mapDiff = Maps.difference(orginMap, newMap);
System.out.println(mapDiff.entriesDiffering());
System.out.println(mapDiff.entriesInCommon());
System.out.println(mapDiff.entriesOnlyOnLeft());
System.out.println(mapDiff.entriesOnlyOnRight());
System.out.println(mapDiff.areEqual());
System.out.println(ExcelTool.getColName(SysConfig.class));
}
}

@ -3,13 +3,18 @@ package cn.estsh.i3plus.core.apiservice.serviceimpl.base;
import cn.estsh.i3plus.core.api.iservice.base.ISynchronizedService;
import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRuleService;
import cn.estsh.i3plus.platform.common.exception.ImppExceptionEnum;
import cn.estsh.i3plus.platform.common.tool.JsonUtilTool;
import cn.estsh.i3plus.platform.common.util.CommonConstWords;
import cn.estsh.i3plus.platform.common.util.PlatformConstWords;
import cn.estsh.i3plus.pojo.base.enumutil.CommonEnumUtil;
import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRule;
import cn.estsh.impp.framework.boot.exception.ImppExceptionBuilder;
import cn.estsh.impp.framework.boot.util.ImppRedis;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -27,6 +32,7 @@ import static cn.estsh.i3plus.platform.common.util.CommonConstWords.REDIS_PREFIX
**/
@Service
public class SynchronizedService implements ISynchronizedService {
public static final Logger LOGGER = LoggerFactory.getLogger(SynchronizedService.class);
@Autowired
private ISysOrderNoRuleService sysOrderNoRuleService;
@ -34,6 +40,9 @@ public class SynchronizedService implements ISynchronizedService {
@Resource(name = CommonConstWords.IMPP_REDIS_RES)
private ImppRedis redisRes;
@Autowired
private RabbitTemplate rabbitTemplate;
@Override
public synchronized SysOrderNoRule nextOrderNo(String code) {
List<SysOrderNoRule> list = nextOrderNo(code, NumberUtils.INTEGER_ONE);
@ -84,7 +93,16 @@ public class SynchronizedService implements ISynchronizedService {
codeRole.setSerialNo(redisRes.putObjAdditational(redisKey, codeRole.getSerialNo(), incr)-incr);
// 生成单号更缓存
return sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, num);
List<SysOrderNoRule> orderNoRuleList = sysOrderNoRuleService.doGetSysOrderNoRuleByNum(codeRole, num);
try {
rabbitTemplate.convertAndSend(PlatformConstWords.QUEUE_IMPP_ORDER_NO_RECORD, JsonUtilTool.encode(orderNoRuleList));
} catch (Exception e) {
LOGGER.error("单号记录推送异常", e);
}
// 生成单号更缓存
return orderNoRuleList;
}
}

@ -0,0 +1,17 @@
package cn.estsh.i3plus.core.apiservice.serviceimpl.busi;
import cn.estsh.i3plus.core.api.iservice.busi.ISysOrderNoRecordService;
import cn.estsh.i3plus.pojo.platform.bean.SysOrderNoRecord;
import cn.estsh.impp.framework.base.service.CrudService;
import org.springframework.stereotype.Service;
/**
* @Description :
* @Reference :
* @Author : yunhao
* @CreateDate : 2020-09-03 22:02
* @Modify:
**/
@Service
public class SysOrderNoRecordService extends CrudService<SysOrderNoRecord> implements ISysOrderNoRecordService {
}
Loading…
Cancel
Save