Commit 8408a007 authored by suhuiguang's avatar suhuiguang

Merge branch 'develop_tzs_jyjc_rule' into develop_tzs_register

parents f0238b27 5b7148e2
......@@ -1893,7 +1893,7 @@ public class CommonServiceImpl implements ICommonService {
* 设备分类
*
* @param type 1,设备种类 2,设备类别 3,设备品种
* @return
* .c@return
*/
@Override
public List<EquipmentCategory> equipmentClassification(String type) {
......
......@@ -172,7 +172,7 @@ public class ReportAnalysisServiceImpl implements IReportAnalysisService {
private Long countDocumentNum(List<JgBizCountDataBO> countDataBOList, int code, JgBizCountDataDto c) {
return countDataBOList.stream().filter(d -> Objects.equals(d.getReceiveCompanyCode(), c.getReceiveCompanyCode()) &&
Objects.equals(d.getEquList(), c.getEquList()) && Objects.equals(d.getEquCategory(), c.getEquCategory()) &&
Objects.equals(d.getEquCategory(), c.getEquCategory()) &&
Objects.equals(d.getEquDefine(), c.getEquDefine()) &&
Objects.equals(d.getBizType(), c.getBizType()) &&
d.getStatus().equals(String.valueOf(code))).mapToLong(JgBizCountDataBO::getNum).sum();
......@@ -181,7 +181,7 @@ public class ReportAnalysisServiceImpl implements IReportAnalysisService {
private Long countDocumentNum(List<JgBizCountDataBO> countDataBOList, List<String> statusList, JgBizCountDataDto c) {
return countDataBOList.stream().filter(d -> Objects.equals(d.getReceiveCompanyCode(), c.getReceiveCompanyCode()) &&
Objects.equals(d.getEquList(), c.getEquList()) && Objects.equals(d.getEquCategory(), c.getEquCategory()) &&
Objects.equals(d.getEquCategory(), c.getEquCategory()) &&
Objects.equals(d.getEquDefine(), c.getEquDefine()) &&
Objects.equals(d.getBizType(), c.getBizType()) &&
statusList.contains(d.getStatus())).mapToLong(JgBizCountDataBO::getNum).sum();
......
......@@ -217,4 +217,10 @@ public class JyjcInspectionApplication extends BaseEntity {
@TableField(value = "plan_data", typeHandler = JacksonTypeHandler.class)
private JSONObject planData;
/**
* 是否必须处理: true-必须处理,false-可不予受理
*/
@TableField(value = "is_must_accept")
private Boolean isMustAccept;
}
package com.yeejoin.amos.boot.module.jyjc.api.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.typroject.tyboot.core.rdbms.orm.entity.BaseEntity;
import java.util.Date;
/**
* @author system_generator
* @date 2024-06-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("tz_jyjc_inspection_application_no_accept_log")
public class JyjcInspectionApplicationNoAcceptLog extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 不予处理的检验检测单位编码
*/
@TableField("inspection_unit_code")
private String inspectionUnitCode;
/**
* 不予处理操作日期
*/
@TableField("no_accept_date")
private Date noAcceptDate;
/**
* 不予处理操作说明
*/
@TableField("remark")
private String remark;
/**
* 操作人
*/
@TableField("no_accept_user_id")
private String noAcceptUserId;
/**
* 报检申请表主键
*/
@TableField("application_seq")
private Long applicationSeq;
}
package com.yeejoin.amos.boot.module.jyjc.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Administrator
*/
@AllArgsConstructor
@Getter
public enum InspectionCompanyType {
/**
* 检验单位分类
*/
LEGAL("legal","法定"),
THIRD("third","第3方");
private String code;
private String name;
}
package com.yeejoin.amos.boot.module.jyjc.api.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author Administrator
*/
@AllArgsConstructor
@Getter
public enum RequestTypeEnum {
/**
* 提交的类型
*/
FIRST_REQUEST("firstRequest", "首次的提交"),
NO_ACCEPT_REQUEST("noAcceptRequest", "不予受理的提交");
private String code;
private String name;
}
\ No newline at end of file
package com.yeejoin.amos.boot.module.jyjc.api.mapper;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationNoAcceptLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* Mapper 接口
*
* @author system_generator
* @date 2024-06-19
*/
public interface JyjcInspectionApplicationNoAcceptLogMapper extends BaseMapper<JyjcInspectionApplicationNoAcceptLog> {
}
......@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* @author LiuLin
* @date 2024年01月02日 16:47
......@@ -18,4 +19,7 @@ public class InspectionEquipInfoModel implements Serializable {
@ApiModelProperty(value = "检验类型(小类)")
private String inspectionType;
@ApiModelProperty(value = "申请表主键")
private String appSeq;
}
......@@ -166,6 +166,11 @@ public class JyjcInspectionApplicationModel extends BaseModel {
@ApiModelProperty(value = "是否已经进行计划排期")
private Boolean isExistPlanData;
/**
* 是否必须处理: true-必须处理,false-可不予受理
*/
private Boolean isMustAccept;
public String getProcessInstanceId() {
return this.instanceId != null ? this.instanceId : this.processInstanceId;
}
......
package com.yeejoin.amos.boot.module.jyjc.api.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.typroject.tyboot.core.rdbms.model.BaseModel;
import java.util.Date;
/**
* @author system_generator
* @date 2024-06-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "JyjcInspectionApplicationNoAcceptLogModel", description = "")
public class JyjcInspectionApplicationNoAcceptLogModel extends BaseModel {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "不予处理的检验检测单位编码")
private String inspectionUnitCode;
@ApiModelProperty(value = "不予处理操作日期")
private Date noAcceptDate;
@ApiModelProperty(value = "不予处理操作说明")
private String remark;
@ApiModelProperty(value = "操作人")
private String noAcceptUserId;
@ApiModelProperty(value = "报检申请表主键")
private Long applicationSeq;
}
package com.yeejoin.amos.boot.module.jyjc.api.service;
/**
* 接口类
*
* @author system_generator
* @date 2024-06-19
*/
public interface IJyjcInspectionApplicationNoAcceptLogService {}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcInspectionApplicationNoAcceptLogMapper">
</mapper>
......@@ -2,27 +2,33 @@ 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.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.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.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.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;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
......@@ -36,80 +42,195 @@ public class RuleActionHandler {
private final EmqKeeper emqKeeper;
private final TzBaseUnitLicenceMapper baseUnitLicenceMapper;
private final TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper;
private final UseInfoMapper useInfoMapper;
private final RedissonClient redissonClient;
private RedisUtils redisUtils;
/**
* 特殊独立的区县
* 省特检院等特殊公司code
*/
private static final String[] EXCLUSION_CITY_REGIONS = {"610403", "610581"};
@Value("${special.inspection.company.code:126100004352004822,12100000400001774F,91340100MA8QN8Q40G}")
private String specialInspectionCompanyCode;
public RuleActionHandler(EmqKeeper emqKeeper, TzBaseUnitLicenceMapper baseUnitLicenceMapper,
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper,
UseInfoMapper useInfoMapper) {
TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper, RedissonClient redissonClient, RedisUtils redisUtils) {
this.emqKeeper = emqKeeper;
this.baseUnitLicenceMapper = baseUnitLicenceMapper;
this.tzBaseEnterpriseInfoMapper = tzBaseEnterpriseInfoMapper;
this.useInfoMapper = useInfoMapper;
this.redissonClient = redissonClient;
this.redisUtils = redisUtils;
}
/**
* 规则回调方法
* 规则回调方法-首次提交的检验机构匹配
*
* @param bizObj 请求变量参数
* @param itemCode 核对项目编码,多个用逗号分割
* @param isMatchArea 是否进行属地过滤(检验检测机构的开通区域包含设备归属地市),true-过滤,false-不过滤
* @param bizObj 请求变量参数
* @param itemCode 核对项目编码,多个用逗号分割
* @param isMatchArea 是否进行属地过滤(检验检测机构的开通区域包含设备归属地市),true-过滤,false-不过滤
* @param defaultInspectionCode 默认的检验机构code,多个用逗号分割,在按照属地匹配不上时,默认的检验机构
* @param legalInspectionCodes 法定的检验机构code,多个用逗号分割,检验机构的最大集合-不为空
* @param inspectionCompanyType 需要显示的单位类型:legal-法定、third-第3方、all-全部,默认都是legal-法定,预留需求变更点
* @param isMatchItem 是否需要匹配核准代码:true-匹配; false-不匹配
* @param isMustAccept true-必须处理,false-可不予受理
*/
public void filterInspectionOrgAction(Object bizObj, String itemCode, Boolean isMatchArea) {
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);
InspectionEquipInfo inspectionEquipInfo = (InspectionEquipInfo) bizObj;
// 规则不支持或者的关系消息会重复故去重处理
RLock lock = redissonClient.getLock(this.buildLockKey("filterInspectionOrgAction", inspectionEquipInfo.getUuid()));
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
if (!isLocked) {
log.warn("规则回填重复丢弃:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 法定的检验机构code: {},是否需要匹配核准代码:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem);
return;
}
if (redisUtils.hasKey(this.buildRedisDataKey("filterInspectionOrgAction", inspectionEquipInfo.getUuid()))) {
log.warn("规则回填重复丢弃:请求变量参数:{},核对项目编码:{},是否进行属地过滤:{},默认的检验机构code:{}, 法定的检验机构code:{}, 法定的检验机构code: {},是否需要匹配核准代码:{}", bizObj, itemCode, isMatchArea, defaultInspectionCode, legalInspectionCodes, inspectionCompanyType, isMatchItem);
return;
}
redisUtils.set(this.buildRedisDataKey("filterInspectionOrgAction", inspectionEquipInfo.getUuid()), inspectionEquipInfo.getUuid(), 3600);
// 1.获取所有的符合资质条件的单位许可信息
List<TzBaseUnitLicence> unitLicenceList = getBaseUnitLicenceList(itemCode);
List<TzBaseUnitLicence> unitLicenceList = getBaseUnitLicenceList(itemCode, isMatchItem);
// 2.匹配过滤机构信息,默认检验机构(目前检测没配置规则,后续检测也需要配置规则时,需要规则那回调方法新增参数,区分检验还是检测)
List<TzBaseEnterpriseInfoDto> tzBaseEnterpriseInfoList = getInspectionUnitList(unitLicenceList, isMatchArea, inspectionEquipInfo.getRecord(), OpenBizTypeEnum.JY.getCode());
List<TzBaseEnterpriseInfoDto> tzBaseEnterpriseInfoList = getInspectionUnitListForFirstCommit(unitLicenceList, isMatchArea, inspectionEquipInfo, OpenBizTypeEnum.JY.getCode(), defaultInspectionCode, legalInspectionCodes, isMustAccept);
publishMqttMessage(inspectionEquipInfo.getComponentKey(), tzBaseEnterpriseInfoList);
} catch (MqttException | InterruptedException e) {
log.error("首次提交的检验机构匹配动作执行失败: {}", e.getMessage());
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
private String buildLockKey(String type, String uuid) {
return String.format("%s-%s", type, uuid);
}
private String buildRedisDataKey(String type, String uuid) {
return String.format("RECEIVED-UUID-RULE:%s-%s", type, uuid);
}
/**
* 规则回调方法-不予受理的检验机构匹配
*
* @param bizObj 请求变量参数
* @param itemCode 核对项目编码,多个用逗号分割
* @param isMatchArea 是否进行属地过滤(检验检测机构的开通区域包含设备归属地市),true-过滤,false-不过滤
* @param defaultInspectionCode 默认的检验机构code
* @param inspectionCompanyType 需要显示的单位类型:legal-法定、third-第3方、all-全部,默认都是legal-法定,预留需求变更点
* @param legalInspectionCodes 法定的检验机构code,多个用逗号分割,检验机构的最大集合-不为空
* @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);
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);
} catch (MqttException e) {
log.error("Error publishing MQTT message: {}", e.getMessage());
}
}
private List<TzBaseUnitLicence> getBaseUnitLicenceList(String itemCode) {
return baseUnitLicenceMapper.selectList(new LambdaQueryWrapper<TzBaseUnitLicence>()
.select(TzBaseUnitLicence::getUnitCode)
.eq(TzBaseUnitLicence::getLicenceType, LicenceTypeEnum.JY_JC.getCode())
.in(TzBaseUnitLicence::getItemCode, Arrays.asList(itemCode.split(","))));
// .ge(TzBaseUnitLicence::getExpiryDate, LocalDate.now()));
private List<TzBaseUnitLicence> getBaseUnitLicenceList(String itemCode, Boolean isMatchItem) {
List<TzBaseUnitLicence> tzBaseUnitLicences;
if (isMatchItem && StringUtils.isNotEmpty(itemCode)) {
tzBaseUnitLicences = baseUnitLicenceMapper.selectList(new LambdaQueryWrapper<TzBaseUnitLicence>()
.select(TzBaseUnitLicence::getUnitCode)
.eq(TzBaseUnitLicence::getLicenceType, LicenceTypeEnum.JY_JC.getCode())
.in(TzBaseUnitLicence::getItemCode, Arrays.asList(itemCode.split(",")))
.ge(TzBaseUnitLicence::getExpiryDate, LocalDate.now()));
} else {
tzBaseUnitLicences = baseUnitLicenceMapper.selectList(new LambdaQueryWrapper<TzBaseUnitLicence>()
.select(TzBaseUnitLicence::getUnitCode)
.eq(TzBaseUnitLicence::getLicenceType, LicenceTypeEnum.JY_JC.getCode())
.ge(TzBaseUnitLicence::getExpiryDate, LocalDate.now()));
}
return tzBaseUnitLicences;
}
public List<TzBaseEnterpriseInfoDto> getInspectionUnitList(List<TzBaseUnitLicence> unitLicenceList, Boolean isMatchArea, String record, String openBizType) {
private List<TzBaseEnterpriseInfoDto> getInspectionUnitListForNoAccept(List<TzBaseUnitLicence> unitLicenceList, Boolean isMatchArea, InspectionEquipInfo inspectionEquipInfo, String openBizType, String defaultInspectionCode, String legalInspectionCodes, String inspectionCompanyType, Boolean isCanNoAccept) {
// 是否进行属地过滤
String areaCode = isMatchArea ? this.getArea(record) : "";
String areaCode = isMatchArea ? inspectionEquipInfo.getAreaCode() : "";
// 所有符合单位的code
List<String> unitCodes = unitLicenceList.stream()
.map(TzBaseUnitLicence::getUnitCode)
.collect(Collectors.toList());
Set<String> unitCodes = unitLicenceList.stream().map(TzBaseUnitLicence::getUnitCode).collect(Collectors.toSet());
List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos = new ArrayList<>();
// 按照资质 + areaCode,进行设备单位的筛选
List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(unitCodes, areaCode, openBizType);
if (unitCodes.size() > 0) {
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(new ArrayList<>(unitCodes), areaCode, openBizType);
// 返回下一步是否可不予返回,供下一节点审核时显示判断是否显示不予受理按钮,在提交时数据会写入到主表:true-必须处理,false-可不予受理
this.setIsCanNoAccept(matchEnterpriseInfos, isCanNoAccept);
}
// 第三方时需要去掉法定机构
if (inspectionCompanyType.equals(InspectionCompanyType.THIRD.getCode())) {
log.info("第三方检验机构开始匹配");
//目前规则配置的法定名单为陕西省内地市的法定机构
matchEnterpriseInfos = matchEnterpriseInfos.stream().filter(e -> !legalInspectionCodes.contains(e.getUseCode())).collect(Collectors.toList());
// 还需要去掉定向的机构:陕西省、国机特种设备检验有限公司、中国特种设备检验检测研究院
matchEnterpriseInfos = matchEnterpriseInfos.stream().filter(c -> !specialInspectionCompanyCode.contains(c.getUseCode())).collect(Collectors.toList());
log.info("匹配到的第三方检验机构:{}", matchEnterpriseInfos);
}
// 法定时,机构为定义的法定机构 defaultInspectionCode
if (inspectionCompanyType.equals(InspectionCompanyType.LEGAL.getCode())) {
log.info("法定检验机构开始匹配");
matchEnterpriseInfos = matchEnterpriseInfos.stream().filter(e -> defaultInspectionCode.contains(e.getUseCode())).collect(Collectors.toList());
log.info("匹配到的法定检验机构:{}", matchEnterpriseInfos);
}
// 代码严谨判断,如前置条件法定机构单位未注册,返回全部的法定机构和第3方机构
if (matchEnterpriseInfos.isEmpty()) {
log.info("按照资质、区域未匹配到对应的单位、按照地市未匹配到单位,将返回全部单位");
return tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(null, null, openBizType);
log.info("指定的默认的检验机构未匹配到,将返回所有的检验机构包括第三方和法定检验机构,省特检院除外");
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(null, null, openBizType);
matchEnterpriseInfos = matchEnterpriseInfos.stream().filter(c -> !specialInspectionCompanyCode.contains(c.getUseCode())).collect(Collectors.toList());
// 返回下一步是否可不予返回,供下一节点审核时显示判断是否显示不予受理按钮,在提交时数据会写入到主表:true-必须处理,false-可不予受理
this.setIsCanNoAccept(matchEnterpriseInfos, false);
log.info("指定的默认的检验机构未匹配到,将返回所有的检验机构包括第三方和法定检验机构,数据为:{}", matchEnterpriseInfos);
}
return matchEnterpriseInfos;
}
private String getArea(String record) {
UseInfo equipUseInfo = useInfoMapper.selectOne(Wrappers.<UseInfo>lambdaQuery().select(UseInfo::getCity,UseInfo::getCounty).eq(UseInfo::getRecord, record));
if (equipUseInfo == null) {
return "";
private List<TzBaseEnterpriseInfoDto> getInspectionUnitListForFirstCommit(List<TzBaseUnitLicence> unitLicenceList, Boolean isMatchArea, InspectionEquipInfo inspectionEquipInfo, String openBizType, String defaultInspectionCode, String legalInspectionCodes, Boolean isCanNoAccept) {
// 是否进行属地过滤
String areaCode = isMatchArea ? inspectionEquipInfo.getAreaCode() : "";
// 所有符合单位的code
Set<String> unitCodes = unitLicenceList.stream()
.map(TzBaseUnitLicence::getUnitCode)
.collect(Collectors.toSet());
// 将法定机构和符合资质要求的机构取交集
List<String> legalUnitCodes = Arrays.stream(legalInspectionCodes.split(",")).filter(unitCodes::contains).collect(Collectors.toList());
List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos = new ArrayList<>();
// 按照资质 + areaCode,进行设备单位的筛选
if (legalUnitCodes.size() > 0) {
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(legalUnitCodes, areaCode, openBizType);
// 返回下一步是否可不予返回,供下一节点审核时显示判断是否显示不予受理按钮,在提交时数据会写入
this.setIsCanNoAccept(matchEnterpriseInfos, isCanNoAccept);
}
// 特殊地区特殊处理,目前有韩城、杨凌,原因行政区划上是有层级的,但是业务办理时,他们与所在地市是同级别的
if (StringUtils.isEmpty(equipUseInfo.getCity()) || StringUtils.isEmpty(equipUseInfo.getCounty())) {
return "";
// 未匹配到法定机构时,返回指定的默认的法定机构, 默认及法定机构不进行开通区域的匹配
if (matchEnterpriseInfos.isEmpty()) {
log.info("按照资质、区域未匹配到法定检验机构");
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(new ArrayList<>(Arrays.asList(defaultInspectionCode.split(","))), "", openBizType);
// 返回下一步是否可不予返回,供下一节点审核时显示判断是否显示不予受理按钮,在提交时数据会写入到主表:true-必须处理,false-可不予受理
this.setIsCanNoAccept(matchEnterpriseInfos, isCanNoAccept);
}
if (Arrays.asList(EXCLUSION_CITY_REGIONS).contains(equipUseInfo.getCounty())) {
return equipUseInfo.getCounty();
// 代码严谨判断,如前置条件法定机构单位未注册,返回全部的法定机构和第3方机构
if (matchEnterpriseInfos.isEmpty()) {
log.info("指定的默认的检验机构未匹配到,将返回所有的检验机构包括第三方和法定检验机构,省特检院除外");
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(null, null, openBizType);
matchEnterpriseInfos = matchEnterpriseInfos.stream().filter(c -> !specialInspectionCompanyCode.contains(c.getUseCode())).collect(Collectors.toList());
// 返回下一步是否可不予返回,供下一节点审核时显示判断是否显示不予受理按钮,在提交时数据会写入到主表:true-必须处理,false-可不予受理
this.setIsCanNoAccept(matchEnterpriseInfos, false);
}
return equipUseInfo.getCity();
return matchEnterpriseInfos;
}
private void setIsCanNoAccept(List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos, Boolean isCanNoAccept) {
matchEnterpriseInfos.forEach(m -> {
m.setUseCodeAndName(m.getUseCode() + "_" + isCanNoAccept);
});
}
private void publishMqttMessage(String componentKey, Object message) throws MqttException {
......@@ -122,5 +243,6 @@ public class RuleActionHandler {
throw e;
}
}
}
......@@ -12,6 +12,7 @@ import com.yeejoin.amos.boot.module.jyjc.api.model.JyjcInspectionApplicationMode
import com.yeejoin.amos.boot.module.jyjc.biz.event.InspectionApplicationPushEvent;
import com.yeejoin.amos.boot.module.jyjc.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.jyjc.biz.service.impl.JyjcInspectionApplicationServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -37,17 +38,25 @@ import java.util.Map;
public class JyjcInspectionApplicationController extends BaseController {
@Autowired
JyjcInspectionApplicationServiceImpl jyjcInspectionApplicationServiceImpl;
private JyjcInspectionApplicationServiceImpl jyjcInspectionApplicationServiceImpl;
// 业务通用发起——基本信息
private static final String basic = "basic";
// 业务通用发起——设备信息
private static final String equipPageInfo = "equipPageInfo";
// 业务通用发起——技术参数-
private static final String filePageData = "filePageData";
/**
* 业务通用发起——基本信息
*/
private static final String BASIC = "basic";
/**
* 业务通用发起——设备信息
*/
private static final String EQUIP_PAGE_INFO = "equipPageInfo";
/**
* 业务通用发起——技术参数
*/
private static final String FILE_PAGE_DATA = "filePageData";
@Autowired
EventPublisher eventPublisher;
private EventPublisher eventPublisher;
/**
* 新增
......@@ -58,11 +67,11 @@ public class JyjcInspectionApplicationController extends BaseController {
@PostMapping(value = "/save")
@ApiOperation(httpMethod = "POST", value = "暂存、提交", notes = "新增")
public ResponseModel<List<JyjcInspectionApplicationModel>> save(@RequestBody JSONObject model) {
if (model.containsKey(basic)) {
if (model.containsKey(BASIC)) {
JSONObject finallyJson = new JSONObject();
Map<String, Object> basicObj = (Map<String, Object>) model.get(basic);
Map<String, Object> equipPageInfoObj = (Map<String, Object>) model.get(equipPageInfo);
Map<String, Object> filePageDataObj = (Map<String, Object>) model.get(filePageData);
Map<String, Object> basicObj = (Map<String, Object>) model.get(BASIC);
Map<String, Object> equipPageInfoObj = (Map<String, Object>) model.get(EQUIP_PAGE_INFO);
Map<String, Object> filePageDataObj = (Map<String, Object>) model.get(FILE_PAGE_DATA);
finallyJson.putAll(model);
finallyJson.putAll(basicObj);
finallyJson.putAll(equipPageInfoObj);
......@@ -121,7 +130,7 @@ public class JyjcInspectionApplicationController extends BaseController {
@GetMapping(value = "/{sequenceNbr}")
@ApiOperation(httpMethod = "GET", value = "根据sequenceNbr查询单个", notes = "根据sequenceNbr查询单个")
public ResponseModel<Map<String, Object>> selectOne(@PathVariable Long sequenceNbr) {
return ResponseHelper.buildResponse(jyjcInspectionApplicationServiceImpl.selectBySeq(sequenceNbr));
return ResponseHelper.buildResponse(jyjcInspectionApplicationServiceImpl.selectBySeq(sequenceNbr, getSelectedOrgInfo().getCompany().getCompanyType()));
}
......@@ -188,6 +197,21 @@ public class JyjcInspectionApplicationController extends BaseController {
}
/**
* 不予受理接口(监督检验、定(首)检、检测)-通用
*
* @param params params
* @return {@link }
* @author shg
* @date 2023/12/15 13:44
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@ApiOperation(httpMethod = "GET", value = "不予受理", notes = "不予受理")
@PostMapping(value = "/flow/noAccept")
public ResponseModel<Boolean> doNoAcceptFlow(@RequestBody Map<String, Object> params) {
return ResponseHelper.buildResponse(jyjcInspectionApplicationServiceImpl.doNoAccept(params));
}
/**
* 撤回接口(监督检验、定(首)检、检测)-通用
*
* @param sequenceNbr sequenceNbr
......@@ -238,4 +262,16 @@ public class JyjcInspectionApplicationController extends BaseController {
JSONObject jsonObject = new JSONObject(map);
return ResponseHelper.buildResponse(jyjcInspectionApplicationServiceImpl.queryForEquipmentRegisterPage(jsonObject));
}
/**
* 查询检验检测机构列表(基本信息及联系人)-工作台专用
*
* @return
*/
@TycloudOperation(ApiLevel = UserType.AGENCY)
@GetMapping(value = "/workbench/getInspectionUnitList")
@ApiOperation(httpMethod = "GET", value = "查询检验检测机构列表所有已注册开通的", notes = "查询检验检测机构列表所有已注册开通的")
public ResponseModel<List<TzBaseEnterpriseInfoDto>> getInspectionUnitListForWorkbench(@RequestParam String openBizType) {
return ResponseHelper.buildResponse(jyjcInspectionApplicationServiceImpl.getInspectionUnitListForWorkbench(openBizType));
}
}
......@@ -204,7 +204,7 @@ public class InspectionApplicationPushEventListener implements ApplicationListen
equipData.setTechParams(this.populateEquipInfoWithTechParams(equipData.getEquList(), equipUnicode));
}
private Map<String, Object> populateEquipInfoWithTechParams(String equList, String record) {
public Map<String, Object> populateEquipInfoWithTechParams(String equList, String record) {
EquipCategoryEnum productType = EquipCategoryEnum.of(Integer.parseInt(equList));
Map<String, Object> echParamMap = new HashMap<>();
switch (Objects.requireNonNull(productType)) {
......
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.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.component.rule.RuleTrigger;
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;
......@@ -27,6 +35,7 @@ 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;
......@@ -45,23 +54,36 @@ public class InspectionOrgRefreshListener extends EmqxListener {
@Value("${inspection.rule.project-name:报检规则}")
private String ruleName;
@Autowired
private EmqKeeper emqKeeper;
@Autowired
private RuleTrigger ruleTrigger;
@Autowired
private AmosRequestContext amosRequestContext;
@Autowired
private RegistrationInfoMapper registrationInfoMapper;
@Autowired
private JyjcInspectionApplicationNoAcceptLogMapper inspectionApplicationNoAcceptLogMapper;
@Autowired
InspectionApplicationPushEventListener applicationPushEventListener;
@Value("${spring.application.name}")
private String applicationName;
private static final int repeatTime = 2;
@Autowired
Sequence sequence;
private static final int REPEAT_TIME = 2;
@Autowired
RedisUtils redisUtils;
@Autowired
RuleCommonServiceImpl ruleCommonService;
@Override
public void processMessage(String topic, MqttMessage message) {
if (log.isInfoEnabled()) {
......@@ -86,10 +108,10 @@ public class InspectionOrgRefreshListener extends EmqxListener {
BizMessage bizMessage = BLOCKING_QUEUE.take();
// 解决前端组件在属性变化时重复发送两次问题
if (!redisUtils.hasKey(bizMessage.getTopic())) {
redisUtils.set(bizMessage.getTopic(), true, repeatTime);
redisUtils.set(bizMessage.getTopic(), true, REPEAT_TIME);
processBizMessage(bizMessage);
} else {
log.warn("消息在{}秒内重复,", repeatTime);
log.warn("消息在{}秒内重复,", REPEAT_TIME);
}
} catch (Exception e) {
log.error("数据处理失败", e);
......@@ -99,7 +121,6 @@ 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();
......@@ -114,30 +135,64 @@ public class InspectionOrgRefreshListener extends EmqxListener {
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 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 setReginInfo(InspectionEquipInfo inspectionEquipInfo, String record) {
UseInfo useInfo = ruleCommonService.getUseInfo(record);
// 地市
inspectionEquipInfo.setAreaCode(ruleCommonService.getArea(useInfo));
// 区县
inspectionEquipInfo.setDistrictOrCountyCode(ruleCommonService.getCounty(useInfo));
}
private void touchRuleWithMsg(InspectionEquipInfo inspectionEquipInfo) {
if (log.isInfoEnabled()) {
log.info("发送规则的消息对象:{}", toJSONString(inspectionEquipInfo));
private String buildLastNoAcceptInspectionCode(JyjcInspectionApplicationNoAcceptLog jyjcInspectionApplicationNoAcceptLog) {
if (jyjcInspectionApplicationNoAcceptLog != null) {
return jyjcInspectionApplicationNoAcceptLog.getInspectionUnitCode();
}
return "";
}
RequestContext.setToken(amosRequestContext.getToken());
RequestContext.setAppKey(amosRequestContext.getAppKey());
RequestContext.setProduct(amosRequestContext.getProduct());
// 2.调用规则
try {
ruleTrigger.publish(inspectionEquipInfo, ruleName + "/" + inspectionEquipInfo.getBizType(), null);
} catch (Exception e) {
log.error("调用规则触发获取报检规则失败", e);
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) {
......
......@@ -3,6 +3,7 @@ package com.yeejoin.amos.boot.module.jyjc.biz.rule;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
......@@ -40,4 +41,23 @@ public class InspectionEquipInfo implements Serializable {
@ApiModelProperty(value = "检验类型(小类)")
private String inspectionType;
@ApiModelProperty(value = "请求类型:firstRequest-首次的提交,noAcceptRequest-不予受理的提交")
private String requestType;
@ApiModelProperty(value = "消息唯一标识用来判断消息重复")
private String uuid;
@ApiModelProperty(value = "最近不受理检验机构code")
private String lastNoAcceptInspectionCode;
@ApiModelProperty(value = "所在区域")
private String areaCode;
@ApiModelProperty(value = "设备所在区/县行政编码")
private String districtOrCountyCode;
@ApiModelProperty(value = "是否是球阀,压力容器定向规则使用")
private Boolean isBallValve = false;
}
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.yeejoin.amos.boot.module.jyjc.api.entity.JyjcInspectionApplicationNoAcceptLog;
import com.yeejoin.amos.boot.module.jyjc.api.mapper.JyjcInspectionApplicationNoAcceptLogMapper;
import com.yeejoin.amos.boot.module.jyjc.api.service.IJyjcInspectionApplicationNoAcceptLogService;
import com.yeejoin.amos.boot.module.jyjc.api.model.JyjcInspectionApplicationNoAcceptLogModel;
import org.typroject.tyboot.core.rdbms.service.BaseService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
/**
* 服务实现类
*
* @author system_generator
* @date 2024-06-19
*/
@Service
public class JyjcInspectionApplicationNoAcceptLogServiceImpl extends BaseService<JyjcInspectionApplicationNoAcceptLogModel,JyjcInspectionApplicationNoAcceptLog,JyjcInspectionApplicationNoAcceptLogMapper> implements IJyjcInspectionApplicationNoAcceptLogService {
/**
* 分页查询
*/
public Page<JyjcInspectionApplicationNoAcceptLogModel> queryForJyjcInspectionApplicationNoAcceptLogPage(Page<JyjcInspectionApplicationNoAcceptLogModel> page) {
return this.queryForPage(page, null, false);
}
/**
* 列表查询 示例
*/
public List<JyjcInspectionApplicationNoAcceptLogModel> queryForJyjcInspectionApplicationNoAcceptLogList() {
return this.queryForList("" , false);
}
}
\ No newline at end of file
......@@ -30,6 +30,7 @@ import com.yeejoin.amos.boot.module.jyjc.biz.event.publisher.EventPublisher;
import com.yeejoin.amos.boot.module.jyjc.biz.feign.JgFeignClient;
import com.yeejoin.amos.boot.module.jyjc.biz.feign.TzsServiceFeignClient;
import com.yeejoin.amos.boot.module.jyjc.biz.service.TaskModelServiceImpl;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.IdxBizJgUseInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.EquimentEnum;
......@@ -159,6 +160,9 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
@Autowired
IdxBizJgUseInfoMapper jgUseInfoMapper;
@Autowired
JyjcInspectionApplicationNoAcceptLogServiceImpl noAcceptLogService;
private static final String EQU_STATE = "EQU_STATE";
private static final String EQU_CODE = "EQU_CODE";
......@@ -167,6 +171,12 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
private static final String SUMMIT_TYPE = "0";
/**
* 省特检院等特殊公司code
*/
@Value("${shanxi.tjy.code:126100004352004822}")
private String shanxiCompanyCode;
@Autowired
RestHighLevelClient restHighLevelClient;
......@@ -179,6 +189,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
// 校验流程中的不能再次提交
this.checkForFlowingEquip(model);
if (CharSequenceUtil.isNotEmpty(model.getProcessInstanceId()) && model.getOperationType().equals("0")) {
// 之前有工作流,再次提交
model.setOperationType("2");
}
......@@ -196,13 +207,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
dto.setCompleteFirstTask(true);
list.add(dto);
actWorkflowBatchDTO.setProcess(list);
String[] inspectionUnit = model.getInspectionUnitCode().split("_");
if (inspectionUnit.length == 2) {
model.setInspectionUnitCode(inspectionUnit[0]);
model.setInspectionUnitName(inspectionUnit[1]);
} else {
this.setInspectionUnitNameAfterSave(model);
}
setNameAndIsMustAccept(model);
dto.setNextExecuteUserCompanyCode(model.getInspectionUnitCode());
processTasks = cmWorkflowService.startBatch(actWorkflowBatchDTO);
String instanceId = processTasks.get(0).getProcessInstance().getId();
......@@ -227,13 +232,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
model.setStatus(String.valueOf(FlowStatusEnum.TO_SUBMITTED.getCode())); //6611 对应数据字典 检验流程状态 待受理
commonService.saveExecuteFlowData2Redis(model.getProcessInstanceId(), this.buildInstanceRuntimeData(model));
} else if ("1".equals(model.getOperationType())) { // 工作台暂存、详情保存逻辑
String[] inspectionUnit = model.getInspectionUnitCode().split("_");
if (inspectionUnit.length == 2) {
model.setInspectionUnitCode(inspectionUnit[0]);
model.setInspectionUnitName(inspectionUnit[1]);
} else {
this.setInspectionUnitNameAfterSave(model);
}
setNameAndIsMustAccept(model);
model.setStatus(String.valueOf(FlowStatusEnum.TO_BE_SUBMITTED.getCode()));
}
......@@ -342,8 +341,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
model.setDockingUnitCode(jyjcOpeningApplications.get(0).getDockingUnitCode());
}
}
this.setInspectionUnitNameAfterSave(model);
this.setNameAndIsMustAccept(model);
//更新报检装备监管码
jyjcInspectionApplicationEquipService.getBaseMapper().deleteByApplicationSeq(model.getSequenceNbr());
if (model.getEquip().size() > 0) {
......@@ -422,6 +420,17 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
return this.buildRedundancyField(model);
}
private void setNameAndIsMustAccept(JyjcInspectionApplicationModel model) {
String[] inspectionUnit = model.getInspectionUnitCode().split("_");
if (inspectionUnit.length == 2) {
model.setInspectionUnitCode(inspectionUnit[0]);
model.setIsMustAccept(Boolean.parseBoolean(inspectionUnit[1]));
this.setInspectionUnitNameAfterSave(model);
} else {
this.setInspectionUnitNameAfterSave(model);
}
}
/**
* 提交时校验是否有在流程中(流程状态待受理)的设备
*
......@@ -553,7 +562,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
return this.queryForList("", false);
}
public Map<String, Object> selectBySeq(Long sequenceNbr) {
public Map<String, Object> selectBySeq(Long sequenceNbr, String companyType) {
JyjcInspectionApplicationModel model = this.getBaseMapper().selectDataBySeq(sequenceNbr);
Map<String, Object> map = BeanUtil.beanToMap(model);
List<Map<String, Object>> dataByApplicationSeq = jyjcInspectionApplicationAttachmentService.getBaseMapper().getDataByApplicationSeq(sequenceNbr);
......@@ -589,6 +598,7 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
map.put("equip", arrayList);
}
map.putAll(attMap);
map.put("companyType", companyType);
this.setPlanData(sequenceNbr, map);
return map;
}
......@@ -834,6 +844,86 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
}
@Transactional(rollbackFor = Exception.class)
public Boolean doNoAccept(Map<String, Object> params) {
String instanceId = params.get("instanceId").toString();
String nextTaskId = params.get("nextTaskId").toString();
String lockKey = CommonServiceImpl.buildJcExecuteLockKey(instanceId);
RLock lock = redissonClient.getLock(lockKey);
try {
boolean isLocked = lock.tryLock(0, 180, TimeUnit.SECONDS);
// 解决并发问题:多个人同时操作一个流程(并发执行通过、驳回、撤回)
if (!isLocked) {
throw new BadRequest("当前流程已经被执行!请重新打开页面查看并执行!");
}
// 流程执行时,状态及权限校验
commonService.checkForExecuteFlow(nextTaskId, instanceId);
Long sequenceNbr = Long.parseLong(params.get("sequenceNbr") + "");
JyjcInspectionApplicationModel model = this.queryBySeq(sequenceNbr);
ArrayList<String> roleListAll = new ArrayList<>();
ArrayList<String> roleList = new ArrayList<>();
String taskId = model.getNextTaskId();
//组装信息
TaskResultDTO task = new TaskResultDTO();
task.setResultCode("approvalStatus");
task.setTaskId(taskId);
task.setComment(params.getOrDefault("comments", "").toString());
HashMap<String, Object> map = new HashMap<>();
map.put("approvalStatus", "8");
task.setVariable(map);
//执行流程
task.setNextExecuteUserCompanyCode(model.getInspectionUnitCode());
ProcessTaskDTO processTaskDTO = cmWorkflowService.reject(taskId, task);
String nextTaskName = "";
this.buildRoleList(Collections.singletonList(processTaskDTO), roleList, roleListAll);
List<WorkflowResultDto> workflowResultDtos = taskModelService.buildWorkFlowInfo(Collections.singletonList(processTaskDTO));
model.setStatus(String.valueOf(FlowStatusEnum.NO_ACCEPT.getCode()));
model.setStatusName(FlowStatusEnum.NO_ACCEPT.getName());
String processDescription = (String) params.get("comments");
if (StringUtils.isNotBlank(processDescription)) {
model.setProcessDescription(processDescription);
}
String nextUserIds = workflowResultDtos.get(0).getNextExecutorUserIds();
String executorRoleIds = workflowResultDtos.get(0).getExecutorRoleIds();
nextTaskName = workflowResultDtos.get(0).getNextTaskName();
nextTaskId = workflowResultDtos.get(0).getNextTaskId();
model.setNextExecuteIds(String.join(",", roleList));
if (!org.springframework.util.ObjectUtils.isEmpty(model.getWorkflowRole())) {
model.setWorkflowRole(model.getWorkflowRole() + "," + String.join(",", roleList));
} else {
model.setWorkflowRole(String.join(",", roleList));
}
model.setNextTaskId(nextTaskId);
model.setPromoter(RequestContext.getExeUserId());
model.setNextTaskName(nextTaskName);
model.setNextExecuteIds(executorRoleIds);
model.setNextExecuteUserIds(nextUserIds);
createNextTask(model, nextTaskName, nextUserIds);
this.updateWithModel(model);
this.createNoAcceptLog(model);
// 更新流程中的流程数据
commonService.saveExecuteFlowData2Redis(model.getProcessInstanceId(), this.buildInstanceRuntimeData(model));
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
return true;
}
private void createNoAcceptLog(JyjcInspectionApplicationModel model) {
JyjcInspectionApplicationNoAcceptLogModel noAcceptLogModel = new JyjcInspectionApplicationNoAcceptLogModel();
noAcceptLogModel.setApplicationSeq(model.getSequenceNbr());
noAcceptLogModel.setInspectionUnitCode(model.getInspectionUnitCode());
noAcceptLogModel.setNoAcceptUserId(RequestContext.getExeUserId());
noAcceptLogModel.setRemark(model.getProcessDescription());
noAcceptLogService.createWithModel(noAcceptLogModel);
}
/**
* 撤回流程办理单
*/
......@@ -1254,4 +1344,8 @@ public class JyjcInspectionApplicationServiceImpl extends BaseService<JyjcInspec
queryWrapper.lambda().in(IdxBizJgUseInfo::getRecord, equIds);
return jgUseInfoMapper.selectList(queryWrapper);
}
public List<TzBaseEnterpriseInfoDto> getInspectionUnitListForWorkbench(String openBizType) {
return commonService.getInspectionUnitList(openBizType);
}
}
\ No newline at end of file
......@@ -32,6 +32,7 @@ import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseEnterpriseInfoDto;
import com.yeejoin.amos.boot.module.ymt.api.dto.TzBaseUnitLicenceDto;
import com.yeejoin.amos.boot.module.ymt.api.entity.BaseUnitLicence;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseEnterpriseInfo;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzBaseUnitLicence;
import com.yeejoin.amos.boot.module.ymt.api.entity.TzsUserInfo;
import com.yeejoin.amos.boot.module.ymt.api.enums.ApplicationFormTypeEnum;
import com.yeejoin.amos.boot.module.ymt.api.enums.FlowStatusEnum;
......@@ -130,6 +131,12 @@ public class JyjcOpeningApplicationServiceImpl extends BaseService<JyjcOpeningAp
@Autowired
RedissonClient redissonClient;
@Autowired
private RuleCommonServiceImpl ruleCommonService;
@Autowired
private TzBaseEnterpriseInfoMapper tzBaseEnterpriseInfoMapper;
private static Map<String, DictionarieValueModel> permissionLevelMap;
private static List<DictionarieValueModel> permissionItemList;
......@@ -902,7 +909,24 @@ public class JyjcOpeningApplicationServiceImpl extends BaseService<JyjcOpeningAp
@Override
public List<TzBaseEnterpriseInfoDto> getUnitListByRecord(String record) {
return ruleActionHandler.getInspectionUnitList(new ArrayList<>(), true, record, OpenBizTypeEnum.JC.getCode());
return this.getInspectionUnitList(new ArrayList<>(), true, record, OpenBizTypeEnum.JC.getCode());
}
private List<TzBaseEnterpriseInfoDto> getInspectionUnitList(List<TzBaseUnitLicence> unitLicenceList, Boolean isMatchArea, String record, String openBizType) {
// 是否进行属地过滤
String areaCode = isMatchArea ? ruleCommonService.getArea(record) : "";
// 所有符合单位的code
Set<String> unitCodes = unitLicenceList.stream().map(TzBaseUnitLicence::getUnitCode).collect(Collectors.toSet());
List<TzBaseEnterpriseInfoDto> matchEnterpriseInfos = new ArrayList<>();
// 按照资质 + areaCode,进行设备单位的筛选
if (unitCodes.size() > 0) {
matchEnterpriseInfos = tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(new ArrayList<>(unitCodes), areaCode, openBizType);
}
if (matchEnterpriseInfos.isEmpty()) {
log.info("按照资质、区域未匹配到对应的单位、按照地市未匹配到单位,将返回全部单位");
return tzBaseEnterpriseInfoMapper.getInspectionUnitListByCode(null, null, openBizType);
}
return matchEnterpriseInfos;
}
/**
......
package com.yeejoin.amos.boot.module.jyjc.biz.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.sun.org.apache.regexp.internal.RE;
import com.yeejoin.amos.boot.module.ymt.api.entity.UseInfo;
import com.yeejoin.amos.boot.module.ymt.api.mapper.UseInfoMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* @author Administrator
*/
@Component
public class RuleCommonServiceImpl {
private UseInfoMapper useInfoMapper;
/**
* 特殊独立的区县
*/
private static final String[] EXCLUSION_CITY_REGIONS = {"610403", "610581"};
public RuleCommonServiceImpl(UseInfoMapper useInfoMapper) {
this.useInfoMapper = useInfoMapper;
}
public String getArea(String record) {
UseInfo equipUseInfo = useInfoMapper.selectOne(Wrappers.<UseInfo>lambdaQuery().select(UseInfo::getCity, UseInfo::getCounty).eq(UseInfo::getRecord, record));
if (equipUseInfo == null) {
return "";
}
// 特殊地区特殊处理,目前有韩城、杨凌,原因行政区划上是有层级的,但是业务办理时,他们与所在地市是同级别的
if (StringUtils.isEmpty(equipUseInfo.getCity()) || StringUtils.isEmpty(equipUseInfo.getCounty())) {
return "";
}
if (Arrays.asList(EXCLUSION_CITY_REGIONS).contains(equipUseInfo.getCounty())) {
return equipUseInfo.getCounty();
}
return equipUseInfo.getCity();
}
public UseInfo getUseInfo(String record) {
return useInfoMapper.selectOne(Wrappers.<UseInfo>lambdaQuery().select(UseInfo::getCity, UseInfo::getCounty).eq(UseInfo::getRecord, record));
}
public String getArea(UseInfo equipUseInfo) {
if (equipUseInfo == null) {
return "";
}
// 特殊地区特殊处理,目前有韩城、杨凌,原因行政区划上是有层级的,但是业务办理时,他们与所在地市是同级别的
if (StringUtils.isEmpty(equipUseInfo.getCity()) || StringUtils.isEmpty(equipUseInfo.getCounty())) {
return "";
}
if (Arrays.asList(EXCLUSION_CITY_REGIONS).contains(equipUseInfo.getCounty())) {
return equipUseInfo.getCounty();
}
return equipUseInfo.getCity();
}
public String getCounty(UseInfo equipUseInfo) {
if (equipUseInfo == null) {
return "";
}
return equipUseInfo.getCounty();
}
}
......@@ -37,8 +37,8 @@ spring.security.user.name=admin
spring.security.user.password=a1234560
spring.security.user.roles=SBA_ADMIN
amos.system.user.user-name=robot_admin
amos.system.user.password=a1234567
amos.system.user.user-name=tzs_shg
amos.system.user.password=a1234560
amos.system.user.app-key=AMOS_STUDIO
amos.system.user.product=AMOS_STUDIO_WEB
......
......@@ -185,4 +185,13 @@ public class RegistrationInfo extends AbstractEquipBaseEntity {
@TableField("\"LAST_USE_CERT_FILE_PATH\"")
private String lastUseCertFilePath;
/**
* 是否球罐
* 1:是
* 0:不是
*/
@TableField("\"WHETHER_SPHERICAL_TANK\"")
private String whetherSphericalTank;
}
......@@ -43,7 +43,12 @@ public enum FlowStatusEnum {
/**
* 已作废
*/
TO_BE_DISCARD(6617, "已作废");
TO_BE_DISCARD(6617, "已作废"),
/**
* 不予受理
*/
NO_ACCEPT(6618, "不予受理");
private final int code;
......
......@@ -5,8 +5,8 @@
resultType="com.yeejoin.amos.boot.module.ymt.api.entity.EquipTechParamBoiler">
select
"DEVICE_LEVEL",
"RATED_EVAPORATION_CAPACITY_THERMAL_POWER",
"RATED_WORKING_PRESSURE",
COALESCE("RATED_EVAPORATION_CAPACITY_THERMAL_POWER", 0) as RATED_EVAPORATION_CAPACITY_THERMAL_POWER,
COALESCE("RATED_WORKING_PRESSURE", 0) as RATED_WORKING_PRESSURE,
"RATED_OPERATING_TEMPERATURE",
"DESIGN_THERMAL_EFFICIENCY",
"FEEDWATER_TEMPERATURE",
......
......@@ -3,17 +3,17 @@
<mapper namespace="com.yeejoin.amos.boot.module.ymt.api.mapper.EquipTechParamRidesMapper">
<select id="queryTechParamInUse" resultType="com.yeejoin.amos.boot.module.ymt.api.entity.EquipTechParamRides">
SELECT
"TRACK_HEIGHT",
"RUNNING_SPEED",
"NUMBER_OF_PASSENGERS",
"SLIDE_LENGTH",
COALESCE("TRACK_HEIGHT", 0) as TRACK_HEIGHT,
COALESCE("RUNNING_SPEED", 0) as RUNNING_SPEED,
COALESCE("NUMBER_OF_PASSENGERS", 0) as NUMBER_OF_PASSENGERS,
COALESCE("SLIDE_LENGTH", 0) as SLIDE_LENGTH,
"NUMBER_OF_VEHICLES",
"OPERATING_HEIGHT",
"ROTARY_DIAMETER",
COALESCE("OPERATING_HEIGHT", 0) as OPERATING_HEIGHT,
COALESCE("ROTARY_DIAMETER", 0) as ROTARY_DIAMETER,
"UNILATERAL_SWING_ANGLE",
"DIP",
COALESCE("DIP", 0) as DIP,
"SLEWING_SPEED",
"EQUIPMENT_HEIGHT"
COALESCE("EQUIPMENT_HEIGHT", 0) as EQUIPMENT_HEIGHT
FROM
idx_biz_jg_tech_params_rides
WHERE RECORD = #{record}
......
......@@ -33,7 +33,7 @@
heat_treatment_method,
qp_heat_treatment_temperature,
installation_position,
container_volume,
COALESCE(container_volume, 0) as container_volume,
pressure_vessel_diameter,
height,
material_cylinder_shell,
......
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