Commit 2937bad6 authored by LiuLin's avatar LiuLin

fix(jyjc):报检规则触发规则功能开发

parent f9867c66
package com.yeejoin.amos.boot.module.jyjc.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
/**
* @author LiuLin
* @date 2024年01月03日 18:05
*/
@Getter
@AllArgsConstructor
public enum CategoryEnum {
SUPERVISE("supervise", JYJCTypeEnum.AQFJY, JYJCTypeEnum.DTJC),
FIRST_INSPECTION("firstinspect", JYJCTypeEnum.DQJY, JYJCTypeEnum.SCJY),
DETECTION("detection", JYJCTypeEnum.WXJDJY, JYJCTypeEnum.GZJDJY, JYJCTypeEnum.AZJDJY);
private final String category;
private final Set<JYJCTypeEnum> associatedTypes;
CategoryEnum(String category, JYJCTypeEnum... types) {
this.category = category;
this.associatedTypes = new HashSet<>(Arrays.asList(types));
}
public static String getCategoryByType(JYJCTypeEnum type) {
for (CategoryEnum ce : values()) {
if (ce.associatedTypes.contains(type)) {
return ce.category;
}
}
return null;
}
}
package com.yeejoin.amos.boot.module.jyjc.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 八大类对应code枚举
* @author LiuLin
* @date 2024年01月03日 18:05
*/
@Getter
@AllArgsConstructor
public enum EquipCategoryEnum {
IDX_BIZ_JG_TECH_PARAMS_BOILER(1000),
IDX_BIZ_JG_TECH_PARAMS_VESSEL(2000),
IDX_BIZ_JG_TECH_PARAMS_ELEVATOR(3000),
IDX_BIZ_JG_TECH_PARAMS_LIFTING(4000),
IDX_BIZ_JG_TECH_PARAMS_VEHICLE(5000),
IDX_BIZ_JG_TECH_PARAMS_RIDES(6000),
IDX_BIZ_JG_TECH_PARAMS_PIPELINE(8000),
IDX_BIZ_JG_TECH_PARAMS_ROPEWAY(9000);
private final int equList;
public static EquipCategoryEnum of(int equList) {
for (EquipCategoryEnum ec : values()) {
if (ec.equList == equList) {
return ec;
}
}
return null;
}
}
package com.yeejoin.amos.boot.module.jyjc.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author LiuLin
*/
@AllArgsConstructor
@Getter
public enum JYJCTypeEnum {
/**
* 检验检验类型
*/
AQFJY("AQFJY", "安全阀校验"),
DTJC("DTJC", "电梯检测"),
DQJY("DQJY", "定期检验"),
SCJY("SCJY", "首次检验"),
WXJDJY("WXJDJY", "维修监督检验"),
GZJDJY("GZJDJY", "改造监督检验"),
AZJDJY("AZJDJY", "安装监督检验");
private final String code;
private final String name;
public static JYJCTypeEnum of(String code) {
for (JYJCTypeEnum e : JYJCTypeEnum.values()) {
if (e.getCode().equals(code)) {
return e;
}
}
return null;
}
}
......@@ -15,7 +15,7 @@ public enum TopicEnum {
* 检验检验报检机构刷新相关主题
*/
INSPECTION_LIST_PUSH("检验检测报检机构数据推送主题","%s/inspection-list/push"),
INSPECTION_LIST_REFRESH("检验检测报检机构刷新请求主题","%s/inspection-list/refresh");
INSPECTION_LIST_REFRESH("检验检测报检机构刷新请求主题","+/inspection-list/refresh");
private final String name;
......
......@@ -2,14 +2,17 @@ package com.yeejoin.amos.boot.module.jyjc.biz.action;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yeejoin.amos.boot.module.jyjc.api.enums.LicenceTypeEnum;
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.CommonserviceImpl;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseUnitLicence;
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.TzBaseUnitLicenceMapper;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo;
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.eclipse.paho.client.mqttv3.MqttException;
......@@ -20,6 +23,7 @@ import org.typroject.tyboot.core.foundation.utils.ValidationUtil;
import java.time.LocalDate;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
/**
......@@ -34,14 +38,17 @@ public class RuleActionHandler {
private final TzBaseUnitLicenceMapper baseUnitLicenceMapper;
private final TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper;
private final CommonserviceImpl commonserviceImpl;
private final UseInfoMapper useInfoMapper;
@Autowired
public RuleActionHandler(EmqKeeper emqKeeper, TzBaseUnitLicenceMapper baseUnitLicenceMapper,
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper, CommonserviceImpl commonserviceImpl) {
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper, CommonserviceImpl commonserviceImpl,
UseInfoMapper useInfoMapper) {
this.emqKeeper = emqKeeper;
this.baseUnitLicenceMapper = baseUnitLicenceMapper;
this.tzBaseEnterpriseInfoMapper = tzBaseEnterpriseInfoMapper;
this.commonserviceImpl = commonserviceImpl;
this.useInfoMapper = useInfoMapper;
}
/**
......@@ -53,8 +60,9 @@ public class RuleActionHandler {
public void filterInspectionOrgAction(Object bizObj, String itemCode, Boolean isMatchArea) {
InspectionEquipInfo inspectionEquipInfo = (InspectionEquipInfo) bizObj;
try {
//获取单位许可信息
List<TzBaseUnitLicence> unitLicenceList = getBaseUnitLicenceList(itemCode);
List<TzBaseEnterpriseInfo> tzBaseEnterpriseInfoList = getInspectionUnitList(unitLicenceList);
List<TzBaseEnterpriseInfo> tzBaseEnterpriseInfoList = getInspectionUnitList(unitLicenceList, isMatchArea, inspectionEquipInfo.getRecord());
publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
} catch (MqttException e) {
......@@ -70,14 +78,21 @@ public class RuleActionHandler {
.ge(TzBaseUnitLicence::getExpiryDate, LocalDate.now()));
}
private List<TzBaseEnterpriseInfo> getInspectionUnitList(List<TzBaseUnitLicence> unitLicenceList) {
if (!ValidationUtil.isEmpty(unitLicenceList)) {
return tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(unitLicenceList.stream()
.map(TzBaseUnitLicence::getUnitCode)
.collect(Collectors.toList()));
} else {
private List<TzBaseEnterpriseInfo> getInspectionUnitList(List<TzBaseUnitLicence> unitLicenceList, Boolean isMatchArea, String record) {
if (ValidationUtil.isEmpty(unitLicenceList)) {
return commonserviceImpl.getInspectionUnitList();
}
//是否进行属地过滤
String city = isMatchArea ? Optional.ofNullable(useInfoMapper.selectOne(
Wrappers.<UseInfo>lambdaQuery().select(UseInfo::getCity)
.eq(UseInfo::getRecord, record))).map(UseInfo::getCity).orElse(null) : "";
List<String> unitCodes = unitLicenceList.stream()
.map(TzBaseUnitLicence::getUnitCode)
.collect(Collectors.toList());
return tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(unitCodes, city);
}
private void publishMqttMessage(String componentKey, Object message) throws MqttException {
......
package com.yeejoin.amos.boot.module.jyjc.biz.listener;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.yeejoin.amos.boot.module.jyjc.api.enums.EquipCategoryEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.JYJCTypeEnum;
import com.yeejoin.amos.boot.module.jyjc.api.enums.TopicEnum;
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.ymt.api.entity.*;
import com.yeejoin.amos.boot.module.ymt.api.mapper.*;
import com.yeejoin.amos.feign.rule.Rule;
import com.yeejoin.amos.feign.rule.client.RuleClient;
import com.yeejoin.amos.feign.rule.model.FactBaseModel;
import lombok.extern.slf4j.Slf4j;
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 javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.*;
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
......@@ -20,33 +36,147 @@ import java.util.concurrent.LinkedBlockingQueue;
@Slf4j
public class InspectionOrgRefreshListener extends EmqxListener {
private static final BlockingQueue<BizMessage> BLOCKING_QUEUE = new LinkedBlockingQueue<>();
@Autowired
EquipTechParamBoilerMapper equipTechParamBoilerMapper;
@Value("${rule.definition.name:报检规则}")
private String ruleName;
@Autowired
private EmqKeeper emqKeeper;
private static final BlockingQueue<BizMessage> BLOCKING_QUEUE = new LinkedBlockingQueue<>();
@Autowired
private RegistrationInfoMapper registrationInfoMapper;
@Autowired
private EquipTechParamVesselMapper equipTechParamVesselMapper;
@Autowired
private EquipTechParamElevatorMapper equipTechParamElevatorMapper;
@Autowired
private EquipTechParamLiftingMapper equipTechParamLiftingMapper;
@Autowired
private EquipTechParamVehicleMapper equipTechParamVehicleMapper;
@Autowired
private EquipTechParamRidesMapper equipTechParamRidesMapper;
@Autowired
private EquipTechParamPipelineMapper equipTechParamPipelineMapper;
@Autowired
private EquipTechParamRopewayMapper equipTechParamRopewayMapper;
@Override
public void processMessage(String topic, MqttMessage message) {
if (log.isInfoEnabled()) {
log.info("收到消息主题:{},消息内容:{}", topic, message.toString());
}
BLOCKING_QUEUE.add(new BizMessage(topic,message));
BLOCKING_QUEUE.add(new BizMessage(topic, message));
}
@PostConstruct
public void init() throws Exception {
emqKeeper.subscript(TopicEnum.INSPECTION_LIST_REFRESH.getTopic(), 2, this);
new Thread(()->{
while (true) {
try {
BizMessage bizMessage = BLOCKING_QUEUE.take();
// 解析数据(前端对象未定义(componentKey【消息解析】、record、inspectionType)
// 组织规则数据
// 触发规则
} catch (Exception e) {
log.error("数据处理失败",e);
}
}
}).start();
Executors.newSingleThreadExecutor().submit(this::processMessages);
}
private void processMessages() {
while (true) {
try {
BizMessage bizMessage = BLOCKING_QUEUE.take();
processBizMessage(bizMessage);
} catch (Exception e) {
log.error("数据处理失败", e);
}
}
}
private void processBizMessage(BizMessage bizMessage) {
byte[] payload = bizMessage.getMessage().getPayload();
String str = new String(payload, StandardCharsets.UTF_8);
InspectionEquipInfo inspectionEquipInfo = parseObject(str, InspectionEquipInfo.class);
RegistrationInfo registrationInfo = fetchRegistrationInfo(inspectionEquipInfo.getRecord());
if (registrationInfo != null) {
populateEquipInfoWithTechParams(inspectionEquipInfo, registrationInfo);
inspectionEquipInfo.setEquCategory(registrationInfo.getEquCategory());
inspectionEquipInfo.setEquList(registrationInfo.getEquList());
inspectionEquipInfo.setEquDefine(registrationInfo.getEquDefine());
}
inspectionEquipInfo.setBizType(getCategoryByType(JYJCTypeEnum.of(inspectionEquipInfo.getInspectionType())));
touchRule(inspectionEquipInfo);
}
private RegistrationInfo fetchRegistrationInfo(String record) {
return registrationInfoMapper.selectOne(
Wrappers.<RegistrationInfo>lambdaQuery().select(RegistrationInfo::getRecord, RegistrationInfo::getEquCategory,
RegistrationInfo::getEquDefine, RegistrationInfo::getEquList)
.eq(RegistrationInfo::getRecord, record));
}
private void populateEquipInfoWithTechParams(InspectionEquipInfo inspectionEquipInfo, RegistrationInfo registrationInfo) {
EquipCategoryEnum productType = EquipCategoryEnum.of(Integer.parseInt(registrationInfo.getEquList()));
switch (Objects.requireNonNull(productType)) {
case IDX_BIZ_JG_TECH_PARAMS_BOILER:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamBoilerMapper.selectOne(
Wrappers.<EquipTechParamBoiler>lambdaQuery()
.eq(EquipTechParamBoiler::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_VESSEL:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamVesselMapper.selectOne(
Wrappers.<EquipTechParamVessel>lambdaQuery()
.eq(EquipTechParamVessel::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_ELEVATOR:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamElevatorMapper.selectOne(
Wrappers.<EquipTechParamElevator>lambdaQuery()
.eq(EquipTechParamElevator::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_LIFTING:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamLiftingMapper.selectOne(
Wrappers.<EquipTechParamLifting>lambdaQuery()
.eq(EquipTechParamLifting::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_VEHICLE:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamVehicleMapper.selectOne(
Wrappers.<EquipTechParamVehicle>lambdaQuery()
.eq(EquipTechParamVehicle::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_RIDES:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamRidesMapper.selectOne(
Wrappers.<EquipTechParamRides>lambdaQuery()
.eq(EquipTechParamRides::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_PIPELINE:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamPipelineMapper.selectOne(
Wrappers.<EquipTechParamPipeline>lambdaQuery()
.eq(EquipTechParamPipeline::getRecord, registrationInfo.getRecord()))));
break;
case IDX_BIZ_JG_TECH_PARAMS_ROPEWAY:
inspectionEquipInfo.setTechParams(BeanUtil.beanToMap(equipTechParamRopewayMapper.selectOne(
Wrappers.<EquipTechParamRopeway>lambdaQuery()
.eq(EquipTechParamRopeway::getRecord, registrationInfo.getRecord()))));
break;
default:
break;
}
}
private void touchRule(InspectionEquipInfo inspectionEquipInfo) {
try {
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);
log.info("发送规则的消息对象:{},\n变量对象:{}", toJSONString(factBaseModel), toJSONString(inspectionEquipInfo));
RuleClient ruleClient = Rule.ruleClient;
ruleClient.fireRule(factBaseModel);
} catch (Exception e) {
log.error("调用规则触发风险模型失败", e);
}
}
}
......@@ -54,4 +54,5 @@ process-definition-key.jyjc.openapplication=inspectionBusinessOpened
tzsJg.feign.name=TZS-JG
# rule config
rule.definition.local-ip=172.16.10.243
\ No newline at end of file
rule.definition.local-ip=172.16.10.243
rule.definition.name=
\ No newline at end of file
......@@ -53,7 +53,7 @@ public interface TzBaseEnterpriseInfoMapper extends BaseMapper<TzBaseEnterpriseI
*/
List<TzBaseEnterpriseInfo> getInspectionUnitList(@Param("unitType") String unitType);
List<TzBaseEnterpriseInfo> getInspectionUnitListByCode(List<String> codes);
List<TzBaseEnterpriseInfo> getInspectionUnitListByCode(List<String> codes, @Param("city") String city);
/**
* 根据ID查找企业详情信息
......
......@@ -185,6 +185,9 @@
#{item}
</foreach>
</if>
<if test=" city != null and city != ''">
and 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">
......
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