diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageWorkWeChatQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageWorkWeChatQueueReceiver.java index 35cb9d0..5c793c9 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageWorkWeChatQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/MessageWorkWeChatQueueReceiver.java @@ -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'") diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/PojoVersionQueueReceiver.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/PojoVersionQueueReceiver.java index dbca05d..9b6a11d 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/PojoVersionQueueReceiver.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/mq/PojoVersionQueueReceiver.java @@ -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 afterMap = JsonUtilTool.decode(afterVersion.getBean(), Map.class); + Map afterMap = JsonUtilTool.decode(afterVersion.getBean(), Map.class); SysPojoVersionDetail afterVersionDetail = null; + Map mapPropDesc = afterVersion.getPojoPropDesc(); // 已存在数据 SysPojoVersion beforeVersion = null; SysPojoVersionDetail beforeVersionDetail = null; - Map beforeMap = new HashMap<>(); + Map beforeMap = new HashMap<>(); Integer versionNo; // 对象版本 CommonEnumUtil.DAO_OPERATE_TYPE operateType = CommonEnumUtil.DAO_OPERATE_TYPE.INSERT; // 操作类型 - Map> differing; // 版本对比 - String pojoCompare = null; + Map> 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 mapData, Map mapPropDesc) { + if (mapData == null) { + mapData = new HashMap<>(); + } + if (mapPropDesc == null) { + mapData = new HashMap<>(); + } + + StringBuilder stringBuffer = new StringBuilder(); + String key; + for (Map.Entry 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> mapData, Map mapPropDesc) { + if (mapData == null) { + mapData = new HashMap<>(); + } + if (mapPropDesc == null) { + mapData = new HashMap<>(); + } + + StringBuilder stringBuffer = new StringBuilder(); + String key; + MapDifference.ValueDifference valDiff; + for (Map.Entry> 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 orginMap = new HashMap<>(); + orginMap.put("name", "wyh"); + orginMap.put("age", "18"); + orginMap.put("sex", "male"); + Map 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)); } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java index 7ee498a..ed05c58 100644 --- a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/base/SynchronizedService.java @@ -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 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 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; } } diff --git a/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRecordService.java b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRecordService.java new file mode 100644 index 0000000..52a011a --- /dev/null +++ b/modules/i3plus-core-apiservice/src/main/java/cn/estsh/i3plus/core/apiservice/serviceimpl/busi/SysOrderNoRecordService.java @@ -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 implements ISysOrderNoRecordService { +}