Commit 58f2f538 authored by suhuiguang's avatar suhuiguang

1.报检规则3.0优化增加开关可控制是否启用报检规则

2.代码优化
parent 01fb0bc7
......@@ -13,7 +13,7 @@ import java.util.Set;
@Getter
@AllArgsConstructor
public enum CategoryEnum {
DETECTION("detection", JYJCTypeEnum.AQFJY, JYJCTypeEnum.DTJC),
DETECTION("detection", JYJCTypeEnum.DTJC),
FIRST_INSPECTION("firstinspect", JYJCTypeEnum.DQJY, JYJCTypeEnum.SCJY),
SUPERVISE("supervise", JYJCTypeEnum.WXJDJY, JYJCTypeEnum.GZJDJY, JYJCTypeEnum.AZJDJY);
......
......@@ -14,17 +14,18 @@ public enum JYJCTypeEnum {
/**
* 检验检测类型
*/
AQFJY("AQFJY", "安全阀校验"),
DTJC("DTJC", "电梯检测"),
DQJY("DQJY", "定期检验"),
SCJY("SCJY", "首次检验"),
WXJDJY("WXJDJY", "维修监督检验"),
GZJDJY("GZJDJY", "改造监督检验"),
AZJDJY("AZJDJY", "安装监督检验");
DTJC("DTJC", "电梯检测","jc"),
DQJY("DQJY", "定期检验", "jy"),
SCJY("SCJY", "首次检验", "jy"),
WXJDJY("WXJDJY", "维修监督检验", "jy"),
GZJDJY("GZJDJY", "改造监督检验", "jy"),
AZJDJY("AZJDJY", "安装监督检验", "jy");
private final String code;
private final String name;
private final String bizType;
public static JYJCTypeEnum of(String code) {
for (JYJCTypeEnum e : JYJCTypeEnum.values()) {
if (e.getCode().equals(code)) {
......
......@@ -22,4 +22,7 @@ public class InspectionEquipInfoModel implements Serializable {
@ApiModelProperty(value = "申请表主键")
private String appSeq;
@ApiModelProperty(value = "主题,无需上送,由topic解析出来")
private String componentKey;
}
package com.yeejoin.amos.boot.module.jyjc.biz.action;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jyjc.api.enums.InspectionCompanyType;
import com.yeejoin.amos.boot.module.jyjc.api.enums.LicenceTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.OpenBizTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.TopicEnum;
import com.yeejoin.amos.boot.module.jyjc.biz.rule.InspectionEquipInfo;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.RuleCommonServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseUnitLicence;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseUnitLicenceMapper;
import com.yeejoin.amos.component.rule.config.RuleConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttException;
......@@ -21,7 +18,6 @@ import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.component.emq.EmqKeeper;
import java.time.LocalDate;
import java.util.ArrayList;
......@@ -39,11 +35,11 @@ import java.util.stream.Collectors;
@Slf4j
public class RuleActionHandler {
private final EmqKeeper emqKeeper;
private final TzBaseUnitLicenceMapper baseUnitLicenceMapper;
private final TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper;
private final RedissonClient redissonClient;
private RedisUtils redisUtils;
private RuleCommonServiceImpl ruleCommonService;
/**
* 省特检院等特殊公司code
......@@ -52,13 +48,15 @@ public class RuleActionHandler {
private String specialInspectionCompanyCode;
public RuleActionHandler(EmqKeeper emqKeeper, TzBaseUnitLicenceMapper baseUnitLicenceMapper,
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper, RedissonClient redissonClient, RedisUtils redisUtils) {
this.emqKeeper = emqKeeper;
public RuleActionHandler(TzBaseUnitLicenceMapper baseUnitLicenceMapper,
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper,
RedissonClient redissonClient, RedisUtils redisUtils,
RuleCommonServiceImpl ruleCommonService) {
this.baseUnitLicenceMapper = baseUnitLicenceMapper;
this.tzBaseEnterpriseInfoMapper = tzBaseEnterpriseInfoMapper;
this.redissonClient = redissonClient;
this.redisUtils = redisUtils;
this.ruleCommonService = ruleCommonService;
}
/**
......@@ -71,10 +69,10 @@ public class RuleActionHandler {
* @param legalInspectionCodes 法定的检验机构code,多个用逗号分割,检验机构的最大集合-不为空
* @param inspectionCompanyType 需要显示的单位类型:legal-法定、third-第3方、all-全部,默认都是legal-法定,预留需求变更点
* @param isMatchItem 是否需要匹配核准代码:true-匹配; false-不匹配
* @param isMustAccept true-必须处理,false-可不予受理
* @param isMustAccept true-必须处理,false-可不予受理
*/
public void filterInspectionOrgAction(Object bizObj, String itemCode, Boolean isMatchArea, String defaultInspectionCode, String legalInspectionCodes, String inspectionCompanyType, Boolean isMatchItem, Boolean isMustAccept) {
log.info("收到首次提交的检验机构匹配规则回调:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 法定的检验机构code: {},是否需要匹配核准代码:{},是否必须处理:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem, isMustAccept);
log.info("收到首次提交的检验机构匹配规则回调:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 检验机构类型: {},是否需要匹配核准代码:{},是否必须处理:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem, isMustAccept);
InspectionEquipInfo inspectionEquipInfo = (InspectionEquipInfo) bizObj;
// 规则不支持或者的关系消息会重复故去重处理
RLock lock = redissonClient.getLock(this.buildLockKey("filterInspectionOrgAction", inspectionEquipInfo.getUuid()));
......@@ -93,7 +91,7 @@ public class RuleActionHandler {
List<TzBaseUnitLicence> unitLicenceList = getBaseUnitLicenceList(itemCode, isMatchItem);
// 2.匹配过滤机构信息,默认检验机构(目前检测没配置规则,后续检测也需要配置规则时,需要规则那回调方法新增参数,区分检验还是检测)
List<TzBaseEnterpriseInfoDto> tzBaseEnterpriseInfoList = getInspectionUnitListForFirstCommit(unitLicenceList, isMatchArea, inspectionEquipInfo, OpenBizTypeEnum.JY.getCode(), defaultInspectionCode, legalInspectionCodes, isMustAccept);
publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
ruleCommonService.publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
} catch (MqttException | InterruptedException e) {
log.error("首次提交的检验机构匹配动作执行失败: {}", e.getMessage());
} finally {
......@@ -121,17 +119,17 @@ public class RuleActionHandler {
* @param defaultInspectionCode 默认的检验机构code
* @param inspectionCompanyType 需要显示的单位类型:legal-法定、third-第3方、all-全部,默认都是legal-法定,预留需求变更点
* @param legalInspectionCodes 法定的检验机构code,多个用逗号分割,检验机构的最大集合-不为空
* @param isMustAccept true-必须处理,false-可不予受理
* @param isMustAccept true-必须处理,false-可不予受理
*/
public void noAcceptInspectionOrgMatchAction(Object bizObj, String itemCode, Boolean isMatchArea, String defaultInspectionCode, String inspectionCompanyType, Boolean isMatchItem, String legalInspectionCodes, Boolean isMustAccept) {
log.info("收到不予受理的检验机构匹配规则回调:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 法定的检验机构code: {},是否需要匹配核准代码:{},是否必须处理:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem, isMustAccept);
log.info("收到不予受理的检验机构匹配规则回调:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 检验机构类型: {},是否需要匹配核准代码:{},是否必须处理:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem, isMustAccept);
InspectionEquipInfo inspectionEquipInfo = (InspectionEquipInfo) bizObj;
try {
// 1.获取所有的符合资质条件的单位许可信息
List<TzBaseUnitLicence> unitLicenceList = getBaseUnitLicenceList(itemCode, isMatchItem);
// 2.匹配过滤机构信息,默认检验机构(目前检测没配置规则,后续检测也需要配置规则时,需要规则那回调方法新增参数,区分检验还是检测)
List<TzBaseEnterpriseInfoDto> tzBaseEnterpriseInfoList = getInspectionUnitListForNoAccept(unitLicenceList, isMatchArea, inspectionEquipInfo, OpenBizTypeEnum.JY.getCode(), defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMustAccept);
publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
ruleCommonService.publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
} catch (MqttException e) {
log.error("Error publishing MQTT message: {}", e.getMessage());
}
......@@ -218,21 +216,9 @@ public class RuleActionHandler {
}
private void setIsCanNoAccept(List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos, Boolean isCanNoAccept) {
matchEnterpriseInfos.forEach(m -> {
m.setUseCodeAndName(m.getUseCode() + "_" + isCanNoAccept);
});
matchEnterpriseInfos.forEach(m -> m.setUseCodeAndName(m.getUseCode() + "_" + isCanNoAccept));
}
private void publishMqttMessage(String componentKey, Object message) throws MqttException {
log.info("报检规则推送到web主题:{}:,消息内容为:{}", String.format(TopicEnum.INSPECTION_LIST_PUSH.getTopic(), componentKey), JSON.toJSONString(message));
try {
emqKeeper.getMqttClient().publish(String.format(TopicEnum.INSPECTION_LIST_PUSH.getTopic(), componentKey),
JSON.toJSONString(message).getBytes(), RuleConfig.DEFAULT_QOS, false);
} catch (MqttException e) {
log.error("Error publishing MQTT message: {}", e.getMessage());
throw e;
}
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
/**
* 各检验检测类型是否启用规则,默认不启用
* @author Administrator
*/
@Component
@ConfigurationProperties(prefix = "inspection.rule.enabled")
@Data
public class InspectionRuleEnableConfig {
/**
* 定期检验是否启用规则:true-启用,false-不启用
*/
private Boolean DQJY;
/**
* 首次检验是否启用规则:true-启用,false-不启用
*/
private Boolean SCJY;
/**
* 维修监督检验是否启用规则:true-启用,false-不启用
*/
private Boolean WXJDJY;
/**
* 改造监督检验是否启用规则:true-启用,false-不启用
*/
private Boolean GZJDJY;
/**
* 安装监督检验是否启用规则:true-启用,false-不启用
*/
private Boolean AZJDJY;
/**
* 电梯检测是否启用规则:true-启用,false-不启用
*/
private Boolean DTJC;
public Object getValueByFieldName(String fieldName){
Field field = null;
try {
field = this.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(this);
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
return false;
}
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.jyjc.biz.event;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionEquipInfoModel;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* @author Administrator
*/
@Getter
public class InspectionOrgRefreshEvent extends ApplicationEvent {
private InspectionEquipInfoModel inspectionEquipInfoModel;
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public InspectionOrgRefreshEvent(Object source, InspectionEquipInfoModel inspectionEquipInfoModel) {
super(source);
this.inspectionEquipInfoModel = inspectionEquipInfoModel;
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.event;
import com.yeejoin.amos.boot.module.jyjc.biz.rule.InspectionEquipInfo;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* @author Administrator
*/
@Getter
public class TouchRuleEvent extends ApplicationEvent {
private InspectionEquipInfo inspectionEquipInfo;
/**
* Create a new {@code ApplicationEvent}.
*
* @param source the object on which the event initially occurred or with
* which the event is associated (never {@code null})
*/
public TouchRuleEvent(Object source, InspectionEquipInfo inspectionEquipInfo) {
super(source);
this.inspectionEquipInfo = inspectionEquipInfo;
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.event.listener;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jyjc.api.enums.JYJCTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.OpenBizTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionEquipInfoModel;
import com.yeejoin.amos.boot.module.jyjc.biz.config.InspectionRuleEnableConfig;
import com.yeejoin.amos.boot.module.jyjc.biz.event.InspectionOrgRefreshEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.RuleCommonServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 不启用规则时,业务处理
* @author Administrator
*/
@Component
@Slf4j
public class DisableRuleDataPreparationListener implements ApplicationListener<InspectionOrgRefreshEvent> {
private InspectionRuleEnableConfig inspectionRuleEnableConfig;
private RuleCommonServiceImpl ruleCommonService;
private RedisUtils redisUtils;
public DisableRuleDataPreparationListener(InspectionRuleEnableConfig inspectionRuleEnableConfig, RuleCommonServiceImpl ruleCommonService, RedisUtils redisUtils) {
this.inspectionRuleEnableConfig = inspectionRuleEnableConfig;
this.ruleCommonService = ruleCommonService;
this.redisUtils = redisUtils;
}
@Override
public void onApplicationEvent(InspectionOrgRefreshEvent event) {
InspectionEquipInfoModel equipInfoModel = event.getInspectionEquipInfoModel();
String componentKey = equipInfoModel.getComponentKey();
// 规则不启用时业务处理
if (!this.getEnableConfig(equipInfoModel.getInspectionType())) {
log.warn("检验类型:{},未启用规则,将返回全部数据", equipInfoModel.getInspectionType());
this.responseForPublisher(componentKey, this.getAllInspectionOrgList(equipInfoModel));
}
}
/**
* 按照检验类型判断是否启用, 不配置时默认不启用
*
* @param inspectionType 检验类型枚举 @see JYJCTypeEnum
* @return true-启用规则,false-不启用
*/
private boolean getEnableConfig(String inspectionType) {
return inspectionRuleEnableConfig.getValueByFieldName(inspectionType) == null ? false : (Boolean) inspectionRuleEnableConfig.getValueByFieldName(inspectionType);
}
private void responseForPublisher(String componentKey, List<TzBaseEnterpriseInfoDto> allInspectionOrgList) {
try {
ruleCommonService.publishMqttMessage(componentKey, allInspectionOrgList);
} catch (MqttException e) {
log.error("规则不启用时,推送订阅者全部检验检测或者检验机构时失败:{}", e.getMessage());
}
}
private List<TzBaseEnterpriseInfoDto> getAllInspectionOrgList(InspectionEquipInfoModel equipInfoModel) {
// 提升性能,数据缓存1分钟
String redisKey = this.getInspectionOrgListRedisKey(equipInfoModel.getInspectionType());
if (redisUtils.hasKey(redisKey)) {
return (List<TzBaseEnterpriseInfoDto>) redisUtils.get(redisKey);
} else {
List<TzBaseEnterpriseInfoDto> allInspectionOrgList = ruleCommonService.getInspectionUnitList(this.getBizTypeByInspectionType(equipInfoModel.getInspectionType()));
// 设置为必须处理,前端不再显示《不予处理》按钮
ruleCommonService.setIsCanNoAccept(allInspectionOrgList, true);
// 将对象直接存储到缓存,避免 JSON 序列化和反序列化
redisUtils.set(redisKey, allInspectionOrgList, 60);
return allInspectionOrgList;
}
}
private String getInspectionOrgListRedisKey(String inspectionType) {
return String.format("%s:%s", "inspection.rule.org.data", inspectionType);
}
private String getBizTypeByInspectionType(String inspectionType) {
JYJCTypeEnum jyjcTypeEnum = JYJCTypeEnum.of(inspectionType);
if (jyjcTypeEnum != null) {
return jyjcTypeEnum.getBizType();
}
return OpenBizTypeEnum.JY.getCode();
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.event.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationNoAcceptLog;
import com.yeejoin.amos.boot.module.jyjc.api.enums.JYJCTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.RequestTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcInspectionApplicationNoAcceptLogMapper;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionEquipInfoModel;
import com.yeejoin.amos.boot.module.jyjc.biz.config.InspectionRuleEnableConfig;
import com.yeejoin.amos.boot.module.jyjc.biz.event.InspectionOrgRefreshEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.event.TouchRuleEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.jyjc.biz.rule.InspectionEquipInfo;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.RuleCommonServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.UseInfo;
import com.yeejoin.amos.boot.module.ymt.api.mapper.RegistrationInfoMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import static com.yeejoin.amos.boot.module.jyjc.api.enums.CategoryEnum.getCategoryByType;
/**
* 启用规则时业务处理
*
* @author Administrator
*/
@Component
@Slf4j
public class EnableRuleDataPreparationListener implements ApplicationListener<InspectionOrgRefreshEvent> {
private Sequence sequence;
private RegistrationInfoMapper registrationInfoMapper;
private RuleCommonServiceImpl ruleCommonService;
private InspectionRuleEnableConfig inspectionRuleEnableConfig;
private InspectionApplicationPushEventListener applicationPushEventListener;
private JyjcInspectionApplicationNoAcceptLogMapper inspectionApplicationNoAcceptLogMapper;
private EventPublisher publisher;
private List<BlockingQueue<InspectionEquipInfoModel>> hashCodeBlockingQueues = new ArrayList<>();
@Value("${rule.data.preparation.thread.number:2}")
private int threadNumber;
public EnableRuleDataPreparationListener(Sequence sequence,
RegistrationInfoMapper registrationInfoMapper,
RuleCommonServiceImpl ruleCommonService,
InspectionRuleEnableConfig inspectionRuleEnableConfig, InspectionApplicationPushEventListener applicationPushEventListener,
JyjcInspectionApplicationNoAcceptLogMapper inspectionApplicationNoAcceptLogMapper, EventPublisher publisher) {
this.sequence = sequence;
this.registrationInfoMapper = registrationInfoMapper;
this.ruleCommonService = ruleCommonService;
this.inspectionRuleEnableConfig = inspectionRuleEnableConfig;
this.applicationPushEventListener = applicationPushEventListener;
this.inspectionApplicationNoAcceptLogMapper = inspectionApplicationNoAcceptLogMapper;
this.publisher = publisher;
}
@Override
public void onApplicationEvent(InspectionOrgRefreshEvent event) {
int queueIndex = Math.abs(event.getInspectionEquipInfoModel().getRecord().hashCode()) % threadNumber;
hashCodeBlockingQueues.get(queueIndex).add(event.getInspectionEquipInfoModel());
}
@PostConstruct
public void init() {
// 1.初始化队列,按照线程数动态创建队列
initQueue();
// 2.初始化多线程消费线程
ExecutorService executorService = Executors.newFixedThreadPool(threadNumber);
for (int i = 0; i < threadNumber; i++) {
BlockingQueue<InspectionEquipInfoModel> queue = hashCodeBlockingQueues.get(i);
executorService.execute(() -> {
while (true) {
try {
InspectionEquipInfoModel fillingRecordStatisticsUnitDayDto = queue.take();
this.dealData(fillingRecordStatisticsUnitDayDto);
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
});
}
}
private void initQueue() {
for (int i = 0; i < threadNumber; i++) {
hashCodeBlockingQueues.add(new LinkedBlockingQueue<>());
}
}
private void dealData(InspectionEquipInfoModel equipInfoModel) {
// 判断规则是否启用,不启用时直接丢弃
if (!this.getEnableConfig(equipInfoModel.getInspectionType())) {
return;
}
RegistrationInfo registrationInfo = fetchRegistrationInfo(equipInfoModel.getRecord());
InspectionEquipInfo inspectionEquipInfo = new InspectionEquipInfo();
if (registrationInfo == null) {
log.error("未找到设备,报检规则匹配流程结束!");
return;
}
inspectionEquipInfo.setEquCategory(registrationInfo.getEquCategory());
inspectionEquipInfo.setEquList(registrationInfo.getEquList());
inspectionEquipInfo.setEquDefine(registrationInfo.getEquDefine());
inspectionEquipInfo.setComponentKey(equipInfoModel.getComponentKey());
inspectionEquipInfo.setInspectionType(equipInfoModel.getInspectionType());
inspectionEquipInfo.setRecord(equipInfoModel.getRecord());
inspectionEquipInfo.setBizType(getCategoryByType(JYJCTypeEnum.of(inspectionEquipInfo.getInspectionType())));
inspectionEquipInfo.setUuid(sequence.nextId() + "");
inspectionEquipInfo.setTechParams(this.getTechParams(registrationInfo));
this.setReginInfo(inspectionEquipInfo, equipInfoModel.getRecord());
JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog = getLastNoAcceptLog(equipInfoModel);
inspectionEquipInfo.setRequestType(this.buildRequestType(equipInfoModel, jyjcInspectionApplicationNoAcceptLog));
inspectionEquipInfo.setLastNoAcceptInspectionCode(this.buildLastNoAcceptInspectionCode(jyjcInspectionApplicationNoAcceptLog));
// 是否球罐 0 1 转 boolean
inspectionEquipInfo.setIsBallValve(!"0".equals(registrationInfo.getWhetherSphericalTank()));
// 触发规则
publisher.publish(new TouchRuleEvent(this, inspectionEquipInfo));
}
/**
* 按照检验类型判断是否启用, 不配置时默认不启用
*
* @param inspectionType 检验类型枚举 @see JYJCTypeEnum
* @return true-启用规则,false-不启用
*/
private boolean getEnableConfig(String inspectionType) {
return inspectionRuleEnableConfig.getValueByFieldName(inspectionType) == null ? false : (Boolean) inspectionRuleEnableConfig.getValueByFieldName(inspectionType);
}
private void setReginInfo(InspectionEquipInfo inspectionEquipInfo, String record) {
UseInfo useInfo = ruleCommonService.getUseInfo(record);
// 地市
inspectionEquipInfo.setAreaCode(ruleCommonService.getArea(useInfo));
// 区县
inspectionEquipInfo.setDistrictOrCountyCode(ruleCommonService.getCounty(useInfo));
}
private String buildLastNoAcceptInspectionCode(JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog) {
if (jyjcInspectionApplicationNoAcceptLog != null) {
return jyjcInspectionApplicationNoAcceptLog.getInspectionUnitCode();
}
return "";
}
private Map<String, Object> getTechParams(RegistrationInfo registrationInfo) {
return applicationPushEventListener.populateEquipInfoWithTechParams(registrationInfo.getEquList(), registrationInfo.getRecord());
}
private String buildRequestType(InspectionEquipInfoModel equipInfoModel, JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog) {
// 工作台发起申请
if (StringUtils.isEmpty(equipInfoModel.getAppSeq())) {
return RequestTypeEnum.FIRST_REQUEST.getCode();
}
// 没有不予受理请求记录
if (jyjcInspectionApplicationNoAcceptLog == null) {
return RequestTypeEnum.FIRST_REQUEST.getCode();
}
// 有记录
return RequestTypeEnum.NO_ACCEPT_REQUEST.getCode();
}
private JyjcInspectionApplicationNoAcceptLog getLastNoAcceptLog(InspectionEquipInfoModel equipInfoModel) {
LambdaQueryWrapper<JyjcInspectionApplicationNoAcceptLog> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(JyjcInspectionApplicationNoAcceptLog::getApplicationSeq, equipInfoModel.getAppSeq());
wrapper.orderByDesc(JyjcInspectionApplicationNoAcceptLog::getRecDate);
wrapper.last("limit 1");
wrapper.select(JyjcInspectionApplicationNoAcceptLog::getApplicationSeq, JyjcInspectionApplicationNoAcceptLog::getInspectionUnitCode);
return inspectionApplicationNoAcceptLogMapper.selectOne(wrapper);
}
private RegistrationInfo fetchRegistrationInfo(String record) {
return registrationInfoMapper.selectOne(
Wrappers.<RegistrationInfo>lambdaQuery().select(RegistrationInfo::getRecord, RegistrationInfo::getEquCategory,
RegistrationInfo::getEquDefine, RegistrationInfo::getEquList, RegistrationInfo::getWhetherSphericalTank)
.eq(RegistrationInfo::getRecord, record));
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.event.listener;
import com.yeejoin.amos.boot.module.jyjc.biz.event.TouchRuleEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.rule.InspectionEquipInfo;
import com.yeejoin.amos.component.robot.AmosRequestContext;
import com.yeejoin.amos.feign.rule.Rule;
import com.yeejoin.amos.feign.rule.model.FactBaseModel;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static com.alibaba.fastjson.JSON.toJSONString;
/**
* @author Administrator
*/
@Component
@Slf4j
public class TouchRuleEventListener implements ApplicationListener<TouchRuleEvent> {
private AmosRequestContext amosRequestContext;
@Value("${inspection.rule.project-name:报检规则}")
private String ruleName;
public TouchRuleEventListener(AmosRequestContext amosRequestContext) {
this.amosRequestContext = amosRequestContext;
}
@Override
public void onApplicationEvent(TouchRuleEvent event) {
this.touchRuleWithApi(event.getInspectionEquipInfo());
}
private void touchRuleWithApi(InspectionEquipInfo inspectionEquipInfo) {
if (log.isInfoEnabled()) {
log.info("发送规则的消息对象:{}", toJSONString(inspectionEquipInfo));
}
try {
RequestContext.setToken(amosRequestContext.getToken());
RequestContext.setAppKey(amosRequestContext.getAppKey());
RequestContext.setProduct(amosRequestContext.getProduct());
HashMap<String, byte[]> factMap = new HashMap<>();
List<Object> factList = new ArrayList<>();
factList.add(inspectionEquipInfo);
for (Object fact : factList) {
factMap.put(fact.getClass().getName(), toJSONString(fact).getBytes());
}
FactBaseModel factBaseModel = new FactBaseModel();
factBaseModel.setFactMap(factMap);
factBaseModel.setPackageId(ruleName + "/" + inspectionEquipInfo.getBizType());
factBaseModel.setProcessIds(null);
if (log.isInfoEnabled()) {
log.info("发送规则的消息对象:{},\n变量对象:{}", toJSONString(factBaseModel), toJSONString(factBaseModel));
}
Rule.ruleClient.fireRule(factBaseModel);
} catch (Exception e) {
log.error("调用规则触发获取报检规则失败", e);
}
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Sequence;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yeejoin.amos.boot.biz.common.utils.RedisUtils;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationNoAcceptLog;
import com.yeejoin.amos.boot.module.jyjc.api.enums.JYJCTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.RequestTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.TopicEnum;
import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcInspectionApplicationNoAcceptLogMapper;
import com.yeejoin.amos.boot.module.jyjc.api.model.InspectionEquipInfoModel;
import com.yeejoin.amos.boot.module.jyjc.biz.event.listener.InspectionApplicationPushEventListener;
import com.yeejoin.amos.boot.module.jyjc.biz.event.InspectionOrgRefreshEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.jyjc.biz.listener.message.BizMessage;
import com.yeejoin.amos.boot.module.jyjc.biz.rule.InspectionEquipInfo;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.RuleCommonServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.entity.RegistrationInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.UseInfo;
import com.yeejoin.amos.boot.module.ymt.api.mapper.RegistrationInfoMapper;
import com.yeejoin.amos.component.robot.AmosRequestContext;
import com.yeejoin.amos.feign.rule.Rule;
import com.yeejoin.amos.feign.rule.model.FactBaseModel;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.component.emq.EmqKeeper;
import org.typroject.tyboot.component.emq.EmqxListener;
import org.typroject.tyboot.core.foundation.context.RequestContext;
import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import static com.alibaba.fastjson.JSON.parseObject;
import static com.alibaba.fastjson.JSON.toJSONString;
import static com.yeejoin.amos.boot.module.jyjc.api.enums.CategoryEnum.getCategoryByType;
/**
* @author Administrator
......@@ -50,39 +27,26 @@ import static com.yeejoin.amos.boot.module.jyjc.api.enums.CategoryEnum.getCatego
@Component
@Slf4j
public class InspectionOrgRefreshListener extends EmqxListener {
private static final BlockingQueue<BizMessage> BLOCKING_QUEUE = new LinkedBlockingQueue<>();
@Value("${inspection.rule.project-name:报检规则}")
private String ruleName;
@Autowired
private EmqKeeper emqKeeper;
@Autowired
private AmosRequestContext amosRequestContext;
@Autowired
private RegistrationInfoMapper registrationInfoMapper;
private static final int REPEAT_TIME = 2;
@Autowired
private JyjcInspectionApplicationNoAcceptLogMapper inspectionApplicationNoAcceptLogMapper;
private static final BlockingQueue<BizMessage> BLOCKING_QUEUE = new LinkedBlockingQueue<>();
@Autowired
InspectionApplicationPushEventListener applicationPushEventListener;
private EmqKeeper emqKeeper;
@Value("${spring.application.name}")
private String applicationName;
@Autowired
Sequence sequence;
private RedisUtils redisUtils;
private static final int REPEAT_TIME = 2;
private EventPublisher publisher;
@Autowired
RedisUtils redisUtils;
public InspectionOrgRefreshListener(EmqKeeper emqKeeper, RedisUtils redisUtils, EventPublisher publisher) {
this.emqKeeper = emqKeeper;
this.redisUtils = redisUtils;
this.publisher = publisher;
}
@Autowired
RuleCommonServiceImpl ruleCommonService;
@Override
public void processMessage(String topic, MqttMessage message) {
......@@ -122,103 +86,9 @@ public class InspectionOrgRefreshListener extends EmqxListener {
private void processBizMessage(BizMessage bizMessage) {
byte[] payload = bizMessage.getMessage().getPayload();
InspectionEquipInfoModel equipInfoModel = parseObject(new String(payload, StandardCharsets.UTF_8), InspectionEquipInfoModel.class);
RegistrationInfo registrationInfo = fetchRegistrationInfo(equipInfoModel.getRecord());
InspectionEquipInfo inspectionEquipInfo = new InspectionEquipInfo();
if (registrationInfo == null) {
log.warn("未找到设备,报检规则匹配流程结束!");
return;
}
inspectionEquipInfo.setEquCategory(registrationInfo.getEquCategory());
inspectionEquipInfo.setEquList(registrationInfo.getEquList());
inspectionEquipInfo.setEquDefine(registrationInfo.getEquDefine());
inspectionEquipInfo.setComponentKey(bizMessage.getTopic().split("/")[0]);
inspectionEquipInfo.setInspectionType(equipInfoModel.getInspectionType());
inspectionEquipInfo.setRecord(equipInfoModel.getRecord());
inspectionEquipInfo.setBizType(getCategoryByType(JYJCTypeEnum.of(inspectionEquipInfo.getInspectionType())));
inspectionEquipInfo.setUuid(sequence.nextId() + "");
inspectionEquipInfo.setTechParams(this.getTechParams(registrationInfo));
this.setReginInfo(inspectionEquipInfo, equipInfoModel.getRecord());
JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog = getLastNoAcceptLog(equipInfoModel);
inspectionEquipInfo.setRequestType(this.buildRequestType(equipInfoModel, jyjcInspectionApplicationNoAcceptLog));
inspectionEquipInfo.setLastNoAcceptInspectionCode(this.buildLastNoAcceptInspectionCode(jyjcInspectionApplicationNoAcceptLog));
// 是否球罐 0 1 转 boolean
inspectionEquipInfo.setIsBallValve(!"0".equals(registrationInfo.getWhetherSphericalTank()));
touchRuleWithApi(inspectionEquipInfo);
}
private void setReginInfo(InspectionEquipInfo inspectionEquipInfo, String record) {
UseInfo useInfo = ruleCommonService.getUseInfo(record);
// 地市
inspectionEquipInfo.setAreaCode(ruleCommonService.getArea(useInfo));
// 区县
inspectionEquipInfo.setDistrictOrCountyCode(ruleCommonService.getCounty(useInfo));
String componentKey = bizMessage.getTopic().split("/")[0];
equipInfoModel.setComponentKey(componentKey);
publisher.publish(new InspectionOrgRefreshEvent(this, equipInfoModel));
}
private String buildLastNoAcceptInspectionCode(JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog) {
if (jyjcInspectionApplicationNoAcceptLog != null) {
return jyjcInspectionApplicationNoAcceptLog.getInspectionUnitCode();
}
return "";
}
private Map<String, Object> getTechParams(RegistrationInfo registrationInfo) {
return applicationPushEventListener.populateEquipInfoWithTechParams(registrationInfo.getEquList(), registrationInfo.getRecord());
}
private String buildRequestType(InspectionEquipInfoModel equipInfoModel, JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog) {
// 工作台发起申请
if (StringUtils.isEmpty(equipInfoModel.getAppSeq())) {
return RequestTypeEnum.FIRST_REQUEST.getCode();
}
// 没有不予受理请求记录
if (jyjcInspectionApplicationNoAcceptLog == null) {
return RequestTypeEnum.FIRST_REQUEST.getCode();
}
// 有记录
return RequestTypeEnum.NO_ACCEPT_REQUEST.getCode();
}
private JyjcInspectionApplicationNoAcceptLog getLastNoAcceptLog(InspectionEquipInfoModel equipInfoModel) {
LambdaQueryWrapper<JyjcInspectionApplicationNoAcceptLog> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(JyjcInspectionApplicationNoAcceptLog::getApplicationSeq, equipInfoModel.getAppSeq());
wrapper.orderByDesc(JyjcInspectionApplicationNoAcceptLog::getRecDate);
wrapper.last("limit 1");
wrapper.select(JyjcInspectionApplicationNoAcceptLog::getApplicationSeq, JyjcInspectionApplicationNoAcceptLog::getInspectionUnitCode);
return inspectionApplicationNoAcceptLogMapper.selectOne(wrapper);
}
private RegistrationInfo fetchRegistrationInfo(String record) {
return registrationInfoMapper.selectOne(
Wrappers.<RegistrationInfo>lambdaQuery().select(RegistrationInfo::getRecord, RegistrationInfo::getEquCategory,
RegistrationInfo::getEquDefine, RegistrationInfo::getEquList, RegistrationInfo::getWhetherSphericalTank)
.eq(RegistrationInfo::getRecord, record));
}
private void touchRuleWithApi(InspectionEquipInfo inspectionEquipInfo) {
if (log.isInfoEnabled()) {
log.info("发送规则的消息对象:{}", toJSONString(inspectionEquipInfo));
}
try {
RequestContext.setToken(amosRequestContext.getToken());
RequestContext.setAppKey(amosRequestContext.getAppKey());
RequestContext.setProduct(amosRequestContext.getProduct());
HashMap<String, byte[]> factMap = new HashMap<>();
List<Object> factList = new ArrayList<>();
factList.add(inspectionEquipInfo);
for (Object fact : factList) {
factMap.put(fact.getClass().getName(), toJSONString(fact).getBytes());
}
FactBaseModel factBaseModel = new FactBaseModel();
factBaseModel.setFactMap(factMap);
factBaseModel.setPackageId(ruleName + "/" + inspectionEquipInfo.getBizType());
factBaseModel.setProcessIds(null);
if (log.isInfoEnabled()) {
log.info("发送规则的消息对象:{},\n变量对象:{}", toJSONString(factBaseModel), toJSONString(factBaseModel));
}
Rule.ruleClient.fireRule(factBaseModel);
} catch (Exception e) {
log.error("调用规则触发获取报检规则失败", e);
}
}
}
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sun.org.apache.regexp.internal.RE;
import com.yeejoin.amos.boot.module.jyjc.api.enums.TopicEnum;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.UseInfo;
import com.yeejoin.amos.boot.module.ymt.api.mapper.TzBaseEnterpriseInfoMapper;
import com.yeejoin.amos.boot.module.ymt.api.mapper.UseInfoMapper;
import com.yeejoin.amos.component.rule.config.RuleConfig;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.springframework.stereotype.Component;
import org.typroject.tyboot.component.emq.EmqKeeper;
import java.util.Arrays;
import java.util.List;
/**
* @author Administrator
*/
@Component
@Slf4j
public class RuleCommonServiceImpl {
private UseInfoMapper useInfoMapper;
private TzBaseEnterpriseInfoMapper enterpriseInfoMapper;
private final EmqKeeper emqKeeper;
/**
* 特殊独立的区县
*/
private static final String[] EXCLUSION_CITY_REGIONS = {"610403", "610581"};
public RuleCommonServiceImpl(UseInfoMapper useInfoMapper) {
public RuleCommonServiceImpl(UseInfoMapper useInfoMapper, TzBaseEnterpriseInfoMapper enterpriseInfoMapper, EmqKeeper emqKeeper) {
this.useInfoMapper = useInfoMapper;
this.enterpriseInfoMapper = enterpriseInfoMapper;
this.emqKeeper = emqKeeper;
}
public String getArea(String record) {
String getArea(String record) {
UseInfo equipUseInfo = useInfoMapper.selectOne(Wrappers.<UseInfo>lambdaQuery().select(UseInfo::getCity, UseInfo::getCounty).eq(UseInfo::getRecord, record));
if (equipUseInfo == null) {
return "";
......@@ -68,4 +84,25 @@ public class RuleCommonServiceImpl {
return equipUseInfo.getCounty();
}
public List<TzBaseEnterpriseInfoDto> getInspectionUnitList(String openBizType) {
return enterpriseInfoMapper.getInspectionUnitList(openBizType);
}
public void publishMqttMessage(String componentKey, Object message) throws MqttException {
log.info("报检规则推送到web主题:{}:,消息内容为:{}", String.format(TopicEnum.INSPECTION_LIST_PUSH.getTopic(), componentKey), JSON.toJSONString(message));
try {
emqKeeper.getMqttClient().publish(String.format(TopicEnum.INSPECTION_LIST_PUSH.getTopic(), componentKey),
JSON.toJSONString(message).getBytes(), RuleConfig.DEFAULT_QOS, false);
} catch (MqttException e) {
log.error("Error publishing MQTT message: {}", e.getMessage());
throw e;
}
}
public void setIsCanNoAccept(List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos, Boolean isCanNoAccept) {
matchEnterpriseInfos.forEach(m -> {
m.setUseCodeAndName(m.getUseCode() + "_" + isCanNoAccept);
});
}
}
......@@ -58,4 +58,13 @@ rule.definition.local-ip=172.16.3.20
spring.kafka.bootstrap-servers=172.16.10.243:9092
spring.kafka.security.protocol=SASL_PLAINTEXT
spring.kafka.properties.sasl.mechanism=PLAIN
\ No newline at end of file
spring.kafka.properties.sasl.mechanism=PLAIN
#定期检验是否启用规则:true-启用,false-不启用
inspection.rule.enabled.DQJY=true
#安装监督检验是否启用规则:true-启用,false-不启用
inspection.rule.enabled.AZJDJY=true
#改造监督检验是否启用规则:true-启用,false-不启用
inspection.rule.enabled.GZJDJY=true
#维修监督检验是否启用规则:true-启用,false-不启用
inspection.rule.enabled.WXJDJY=true
\ No newline at end of file
......@@ -177,9 +177,7 @@
info.sequence_nbr,
info.use_code,
info.use_unit,
concat(info.use_code,'_',info.use_unit) as useCodeAndName,
info.use_contact,
info.contact_phone
concat(info.use_code,'_',info.use_unit) as useCodeAndName
FROM
tz_base_enterprise_info info
INNER JOIN tz_jyjc_opening_application tjoa ON info.use_code = tjoa.unit_code
......@@ -194,7 +192,6 @@
<if test="city != null and city != ''">
and tjoa.detection_region like concat('%',#{city},'%')
</if>
group by info.use_code
</select>
<select id="selectBySeq" resultType="com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo">
select * from tz_base_enterprise_info where sequence_nbr = #{sequenceNbr}
......
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