新增执法检查、执法信息、企业信息、企业分级分类、企业上报审核等接口

This commit is contained in:
renhao02 2025-03-07 17:32:19 +08:00
parent a7420da684
commit 133ef6a2de
9 changed files with 3877 additions and 0 deletions

View File

@ -0,0 +1,680 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.common.model.enums.IndustryCategoryForFile;
import com.aisino.iles.common.service.FtpService;
import com.aisino.iles.common.util.KmsServer;
import com.aisino.iles.common.util.PageableHelper;
import com.aisino.iles.core.exception.BusinessError;
import com.aisino.iles.core.repository.DictItemRepo;
import com.aisino.iles.lawenforcement.event.DataChangeAction;
import com.aisino.iles.lawenforcement.event.aop.PublishDataChange;
import com.aisino.iles.lawenforcement.model.*;
import com.aisino.iles.lawenforcement.model.dto.EnforceCheckDto;
import com.aisino.iles.lawenforcement.model.dto.EnforceCheckResDto;
import com.aisino.iles.lawenforcement.model.dto.EnforceCheckScenePicDto;
import com.aisino.iles.lawenforcement.model.dto.FormDataDto;
import com.aisino.iles.lawenforcement.model.enums.FlowNode;
import com.aisino.iles.lawenforcement.model.query.EnforceCheckQuery;
import com.aisino.iles.lawenforcement.repository.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.f4b6a3.ulid.Ulid;
import com.smartlx.sso.client.model.RemoteUserInfo;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* 执法检查记录服务类
*/
@Service
@Slf4j
public class EnforceCheckService {
private final EnforceCheckRepository enforceCheckRepo;
private final CheckItemRepository checkItemRepo;
private final MaterialsRepository materialsRepo;
private final EnforcementInfoRepository enforcementInfoRepo;
private final SpotCheckRepository spotCheckRepo;
private final SpotCheckListRepository spotCheckListRepo;
private final ObjectMapper objectMapper;
private final FtpService ftpService;
private final AgencyRepository agencyRepository;
private final OfficerRepository officerRepo;
private final DictItemRepo dictItemRepo;
private final CaseRepository caseRepo;
public EnforceCheckService(EnforceCheckRepository enforceCheckRepo,
CheckItemRepository checkItemRepo,
MaterialsRepository materialsRepo,
ObjectMapper objectMapper,
FtpService ftpService,
EnforcementInfoRepository enforcementInfoRepo,
AgencyRepository agencyRepository,
SpotCheckRepository spotCheckRepo,
SpotCheckListRepository spotCheckListRepo,
OfficerRepository officerRepo,
DictItemRepo dictItemRepo,
CaseRepository caseRepo) {
this.enforceCheckRepo = enforceCheckRepo;
this.checkItemRepo = checkItemRepo;
this.materialsRepo = materialsRepo;
this.objectMapper = objectMapper;
this.ftpService = ftpService;
this.enforcementInfoRepo = enforcementInfoRepo;
this.agencyRepository = agencyRepository;
this.spotCheckRepo = spotCheckRepo;
this.spotCheckListRepo = spotCheckListRepo;
this.officerRepo = officerRepo;
this.dictItemRepo = dictItemRepo;
this.caseRepo = caseRepo;
}
/**
* 保存执法检查记录
*
* @param enforceCheck 执法检查记录
* @return 保存后的执法检查记录
*/
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public List<Object> saveEnforceCheck(EnforceCheck enforceCheck, RemoteUserInfo user, String type) {
LocalDateTime now = LocalDateTime.now();
List<Object> publishData = new ArrayList<>();
publishData.add(enforceCheck);
if ("add".equals(type)) {
enforceCheck.setCreateTime(now);
if (null != user) {
enforceCheck.setCreatedBy(user.getXm());
enforceCheck.setCreatedAccountBy(user.getYhwybs());
}
}
String tag = enforceCheck.getTag();
if ("check".equals(tag) || "rechecked".equals(tag)) {
if (!enforceCheck.getItems().isEmpty()) {
if ("check".equals(tag)) {
enforceCheckRepo.findById(enforceCheck.getEnforceCheckId()).ifPresent(e -> {
Map<String, Object> result = e.getCheckItemResult();
for (CheckItem item : enforceCheck.getItems()) {
String itemId = item.getItemId();
if (null != result && result.containsKey(itemId)) {
EnforceCheckScenePicDto scenePicDto = objectMapper.convertValue(result.get(itemId), EnforceCheckScenePicDto.class);
scenePicDto.setItemId(itemId);
scenePicDto.setCheckNote(item.getCheckNote());
scenePicDto.setEligibility(item.getEligibility());
scenePicDto.setCheckResultCode(item.getCheckResultCode());
result.put(itemId, scenePicDto);
} else {
if (null == result)
result = new HashMap<>();
EnforceCheckScenePicDto dto = new EnforceCheckScenePicDto();
dto.setItemId(itemId);
dto.setEligibility(item.getEligibility());
dto.setCheckNote(item.getCheckNote());
// 适配app保存接口
List<String> urls =new ArrayList<>();
item.getPaths().forEach(url -> {
urls.add(url);
});
if(urls.size()>0){
dto.setUrls(urls);
}
dto.setCheckResultCode(item.getCheckResultCode());
result.put(itemId, dto);
}
}
enforceCheck.setCheckItemResult(result);
});
}
}
//修改执法信息状态
enforcementInfoRepo.findById(enforceCheck.getEnforcementId()).ifPresent(enforcementInfo -> {
if ("check".equals(tag)) {
enforcementInfo.setCurrentNodeCode(FlowNode.fromString(enforceCheck.getCurrentNodeCode()));
enforcementInfo.setCurrentNode(enforceCheck.getCurrentNode());
if ("2".equals(enforceCheck.getCheckResult())) { //2-责令当场整改
enforcementInfo.setRechecked("2");
} else if ("3".equals(enforceCheck.getCheckResult())) { //3-责令限期整改
enforcementInfo.setRechecked("1");
} else if ("4".equals(enforceCheck.getCheckResult())) { //4-其他
enforcementInfo.setRechecked("3");
} else {
enforcementInfo.setRechecked("0");
}
if ("1".equals(enforceCheck.getEnforcementInfo().getFillingFlag())) {//1-正常
enforcementInfo.setFillingFlag("1");
enforcementInfo.setFillingTime(now);
} else {
enforcementInfo.setFillingFlag("0");
}
} else {
enforcementInfo.setRechecked("11");
}
enforcementInfo.setUpdateTime(now);
enforcementInfoRepo.save(enforcementInfo);
publishData.add(enforcementInfo);
});
}
enforceCheck.setUpdateTime(now);
enforceCheckRepo.save(enforceCheck);
return publishData;
}
/**
* 根据ID查询执法检查记录
*
* @param enforceCheckId 检查项ID
* @return 执法检查记录
*/
public Optional<EnforceCheck> findEnforceCheckById(String enforceCheckId) {
if (!StringUtils.hasText(enforceCheckId)) {
throw new BusinessError("法检查记录ID不能为空");
}
return enforceCheckRepo.findById(enforceCheckId).map(enforceCheck -> {
String itemIds = enforceCheck.getCheckItemIds();
if (StringUtils.hasText(itemIds)) {
String[] arr = itemIds.split(",");
List<CheckItem> items = checkItemRepo.findAllById(List.of(arr));
Map<String, Object> result = enforceCheck.getCheckItemResult();
if (null != result) {
items.forEach(item -> {
EnforceCheckScenePicDto dto = objectMapper.convertValue(result.get(item.getItemId()), EnforceCheckScenePicDto.class);
if (null != dto) {
item.setEligibility(dto.getEligibility());
item.setCheckNote(dto.getCheckNote());
List<String> urls = dto.getUrls();
if (null != urls && !urls.isEmpty()) {
List<Map<String, String>> list = urls.stream().map(u -> {
Map<String, String> m = new HashMap<>();
m.put("path", u);
m.put("url", ftpService.getFileUrl(u));
m.put("id", Ulid.fast().toLowerCase());
return m;
}).collect(Collectors.toList());
item.setUrls(list);
}
item.setCheckResultCode(dto.getCheckResultCode());
}
});
}
enforceCheck.setItems(items);
}
enforceCheck.setDzcls(materialsRepo.findByLinkId(enforceCheck.getEnforceCheckId()).stream().peek(dzcl -> {
String dzclUrl = dzcl.getSavePath();
if (StringUtils.hasText(dzclUrl)) {
dzcl.setUrl(ftpService.getFileUrl(dzclUrl));
dzcl.setDownloadUrl(ftpService.getFileDownloadUrl(dzclUrl));
}
}).collect(Collectors.toList()));
return enforceCheck;
});
}
/**
* 根据查询条件分页查询执法检查记录
*
* @param query 查询条件
* @return 分页执法检查记录
*/
@Transactional(readOnly = true)
public Page<EnforceCheck> findEnforceCheckPage(EnforceCheckQuery query, RemoteUserInfo user) {
return enforceCheckRepo.findAll(build(query, user), PageableHelper.buildPageRequest(query.page(), query.pageSize(), query.sort(), query.dir())).map(this::handleResult);
}
private EnforceCheck handleResult(EnforceCheck check) {
Optional.ofNullable(check.getEnforcementInfo().getAgency()).ifPresent(agency -> agency.getAgencyName());
// check.getEnforcementInfo().getAgency().getAgencyName();
check.getEnforcementInfo().getEnterprise().getUnitName();
check.getEnforcementInfo().getEnterprise().getUnifiedSocialCode();
return check;
}
/**
* 构建查询条件
*
* @param query 查询条件
* @return 规格
*/
private Specification<EnforceCheck> build(EnforceCheckQuery query, RemoteUserInfo user) {
Agency currentAgency = agencyRepository.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!"));
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.enterpriseId), o)));
if (currentAgency.getAgencyLevel() == 3) {
Join<EnforceCheck, EnforcementInfo> enforcementInfoEnforceCheckRoot = root.join("enforcementInfo", JoinType.LEFT);
predicates.add(criteriaBuilder.equal((enforcementInfoEnforceCheckRoot.get(EnforcementInfo_.agency).get(Agency_.agencyCode)), currentAgency.getAgencyCode()));
}
Optional.ofNullable(query.getSupplementVerifyResult()).ifPresent(o -> {
// 填报内容查询
if ("tb".equals(o)) {
predicates.add(criteriaBuilder.or(
criteriaBuilder.notEqual(root.get("supplementVerifyResult"), "1"),
criteriaBuilder.isNull(root.get("supplementVerifyResult"))
));
}
//审批内容查询
else if ("sp".equals(o)) {
predicates.add(criteriaBuilder.equal(root.get("supplementVerifyResult"), "2"));
} else {
predicates.add(criteriaBuilder.equal(root.get("supplementVerifyResult"), o));
}
});
Optional.ofNullable(query.getCreateTime()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("createTime"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("createTime"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
Optional.ofNullable(query.getCheckDate()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("checkDate"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("checkDate"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
Optional.ofNullable(query.getSupplementVerifyTime()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("supplementVerifyTime"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("supplementVerifyTime"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
if ("dc".equals(query.getTag())) {
Arrays.stream("plan_approval,plan_approval_failed".split(","))
.map(FlowNode::fromString)
.forEach(flowNode -> predicates.add(criteriaBuilder.notEqual(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.currentNodeCode), flowNode)));
Optional.ofNullable(query.getAgency())
.map(Agency::getAgencyCode)
.ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.agency).get(Agency_.agencyCode), com.aisino.iles.common.util.StringUtils.trimEven0(o) + "%")));
}
if ("jcs".equals(query.getTag())) {
predicates.add(criteriaBuilder.notEqual(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.currentNodeCode), FlowNode.plan_approval));
predicates.add(criteriaBuilder.notEqual(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.currentNodeCode), FlowNode.plan_approval_failed));
predicates.add(criteriaBuilder.notEqual(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.currentNodeCode), FlowNode.plan_approved));
Optional.ofNullable(query.getAgency())
.map(Agency::getAgencyCode)
.ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnforceCheck_.enforcementInfo).get(EnforcementInfo_.agency).get(Agency_.agencyCode), com.aisino.iles.common.util.StringUtils.trimEven0(o) + "%")));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
/**
* 根据ID删除执法检查记录
*
* @param enforceCheckId 检查项ID
*/
@Transactional
public void deleteEnforceCheckById(String enforceCheckId) {
enforceCheckRepo.deleteById(enforceCheckId);
}
/**
* 检查项是否存在
*
* @param enforceCheckId 检查项ID
* @return 是否存在
*/
public Boolean existsEnforceCheckById(String enforceCheckId) {
return enforceCheckRepo.existsById(enforceCheckId);
}
/**
* 添加现场图片
*
* @param formData 图片信息
* @return 执行检查信息
*/
@Transactional
public EnforceCheck addScenePicOrFile(FormDataDto formData) {
MultipartFile file = formData.getFile1();
EnforceCheck enforceCheck = new EnforceCheck();
try {
enforceCheck = objectMapper.readValue(formData.getFormDataJson(), EnforceCheck.class);
if (null != file) {
String url;
String tag = enforceCheck.getTag();
try {
url = ftpService.uploadTempFile(IndustryCategoryForFile.pub, file.getOriginalFilename(), file.getInputStream());
if (!StringUtils.hasText(url)) {
throw new BusinessError(("file".equals(tag) ? "执行检查材料" : "执行检查现场图") + "返回失败:上传时异常");
}
} catch (Exception e) {
throw new BusinessError(("file".equals(tag) ? "执行检查材料" : "执行检查现场图") + "上传失败:" + e);
}
if ("file".equals(tag)) {
String fileName = file.getOriginalFilename();
Materials materials = new Materials();
materials.setLrsj(LocalDateTime.now());
materials.setFileType(StringUtils.hasText(fileName) ? fileName.split("\\.")[1] : null);
materials.setName(fileName);
materials.setLinkId(enforceCheck.getEnforceCheckId());
materials.setSavePath(url);
materials.setIsOriginal("1");
materials.setMaterialsTypeCode("2");
materials.setMaterialsTypeName("执法现场检查材料");
materialsRepo.save(materials);
} else {
Optional<EnforceCheck> optional = enforceCheckRepo.findById(enforceCheck.getEnforceCheckId());
if (optional.isPresent()) {
EnforceCheck e = optional.get();
Map<String, Object> result = e.getCheckItemResult();
String itemId = enforceCheck.getItemId();
if (null != result && result.containsKey(itemId)) {
EnforceCheckScenePicDto dto = objectMapper.convertValue(result.get(itemId), EnforceCheckScenePicDto.class);
List<String> urls = dto.getUrls();
if (null == urls)
urls = new ArrayList<>();
urls.add(url);
dto.setUrls(urls);
result.put(itemId, dto);
} else {
if (null == result)
result = new HashMap<>();
EnforceCheckScenePicDto dto = new EnforceCheckScenePicDto();
dto.setItemId(itemId);
dto.setEligibility(enforceCheck.getEligibility());
dto.setCheckNote(enforceCheck.getCheckNote());
dto.setUrls(List.of(url));
result.put(itemId, dto);
}
e.setCheckItemResult(result);
List<Object> publishData = saveEnforceCheck(e, null, "update");
if (!publishData.isEmpty()) {
enforceCheck = (EnforceCheck) publishData.get(0);
}
}
}
}
} catch (JsonProcessingException e) {
log.error(e.getMessage(), e);
}
return enforceCheck;
}
@Transactional(readOnly = true)
public Optional<EnforceCheck> getEnforceCheckByEnforcementId(String enforcementId) {
if (!StringUtils.hasText(enforcementId)) {
throw new BusinessError("执法信息ID不能为空");
}
return enforceCheckRepo.findFirstByEnforcementIdOrderByCreateTimeDesc(enforcementId).map(o -> {
Optional.ofNullable(o.getEnforcementInfo()).ifPresent(enforcement -> enforcement.getAgency().getAgencyCode());
String itemIds = o.getCheckItemIds();
if (StringUtils.hasText(itemIds)) {
String[] arr = itemIds.split(",");
List<CheckItem> items = checkItemRepo.findAllById(List.of(arr));
Map<String, Object> result = o.getCheckItemResult();
if (null != result) {
items.forEach(item -> {
EnforceCheckScenePicDto dto = objectMapper.convertValue(result.get(item.getItemId()), EnforceCheckScenePicDto.class);
if (null != dto) {
item.setEligibility(dto.getEligibility());
item.setCheckNote(dto.getCheckNote());
List<String> urls = dto.getUrls();
if (null != urls && !urls.isEmpty()) {
List<Map<String, String>> list = urls.stream().map(u -> {
Map<String, String> m = new HashMap<>();
m.put("path", u);
m.put("url", ftpService.getFileUrl(u));
m.put("id", Ulid.fast().toLowerCase());
return m;
}).collect(Collectors.toList());
item.setUrls(list);
}
item.setCheckResultCode(dto.getCheckResultCode());
}
});
}
o.setItems(items);
}
o.setDzcls(materialsRepo.findByLinkId(o.getEnforceCheckId()).stream().peek(dzcl -> {
String dzclUrl = dzcl.getSavePath();
if (StringUtils.hasText(dzclUrl)) {
dzcl.setUrl(ftpService.getFileUrl(dzclUrl));
dzcl.setDownloadUrl(ftpService.getFileDownloadUrl(dzclUrl));
}
}).collect(Collectors.toList()));
AtomicReference<String> officerNames = new AtomicReference<>("");
AtomicReference<String> agencyCodes = new AtomicReference<>("");
List<Officer> officerList = new ArrayList<>();
Optional.ofNullable(o.getOfficerIds()).filter(StringUtils::hasText).ifPresent(officers -> {
Arrays.stream(officers.split(",")).forEach(officerId -> {
officerRepo.findById(officerId).ifPresent(officer -> {
officerNames.set(officerNames + officer.getOfficerName() + ",");
agencyCodes.set(agencyCodes + officer.getCertificateNo() + ",");
officerList.add(officer);
});
});
});
o.setAgencyNames(officerNames.get());
o.setAgencyCodes(agencyCodes.get());
o.setOfficerList(officerList);
return o;
});
}
/**
* 删除现场图或者检查文件
*
* @param resDto 删除对象
*/
@Transactional
public void deleteByIdScenePicFile(EnforceCheckResDto resDto) {
if ("file".equals(resDto.getTag())) {
materialsRepo.findById(resDto.getMaterialsId()).ifPresent(materials -> {
String savePath = materials.getSavePath();
if (StringUtils.hasText(savePath)) ftpService.deletePathFile(savePath);
materialsRepo.delete(materials);
});
} else {
enforceCheckRepo.findById(resDto.getEnforceCheckId()).ifPresent(enforceCheck -> {
Map<String, Object> result = enforceCheck.getCheckItemResult();
EnforceCheckScenePicDto dto = objectMapper.convertValue(result.get(resDto.getItemId()), EnforceCheckScenePicDto.class);
if (null != dto) {
String url = resDto.getUrl();
dto.getUrls().removeIf(v -> Objects.equals(v, url));
if (StringUtils.hasText(url)) ftpService.deletePathFile(url);
result.put(resDto.getItemId(), dto);
enforceCheck.setCheckItemResult(result);
}
enforceCheck.setUpdateTime(LocalDateTime.now());
enforceCheckRepo.save(enforceCheck);
});
}
}
/**
* 添加抽样数据
*
* @param spotCheck 抽样数据
* @return 抽样数据
*/
@Transactional
public SpotCheck addSpotCheck(SpotCheck spotCheck) {
LocalDateTime now = LocalDateTime.now();
spotCheck.setCreateTime(now);
spotCheck.setUpdateTime(now);
// 检验加密签名保存
Optional.ofNullable(spotCheck.getContact()).filter(StringUtils::hasText).ifPresent(s -> spotCheck.setSginData(KmsServer.kmsSign(s)));
SpotCheck save = spotCheckRepo.save(spotCheck);
List<SpotCheckList> spotCheckList = spotCheck.getSpotCheckList();
if (null != spotCheckList && !spotCheckList.isEmpty()) {
spotCheckList.forEach(item -> {
item.setSpotId(spotCheck.getSpotId());
item.setCreateTime(now);
item.setUpdateTime(now);
item.setSpotId(save.getSpotId());
spotCheckListRepo.save(item);
});
}
return save;
}
/**
* 根据执法信息ID查询抽样数据
*
* @param enforcementId 执法信息ID
* @return 抽样数据
*/
public Optional<SpotCheck> getSpotCheck(String enforcementId) {
return spotCheckRepo.findByEnforcementId(enforcementId).map(o -> {
o.setSpotCheckList(spotCheckListRepo.findBySpotId(o.getSpotId()));
return o;
});
}
/**
* 修改抽样数据
*
* @param enforcementId 执法信息ID
*/
@Transactional
public void modifySpotCheck(String enforcementId, SpotCheck spotCheck) {
spotCheckRepo.findByEnforcementId(enforcementId).map(o -> {
List<SpotCheckList> list = spotCheckListRepo.findBySpotId(o.getSpotId());
List<SpotCheckList> spotCheckList = spotCheck.getSpotCheckList();
LocalDateTime now = LocalDateTime.now();
Stream.concat(list.stream(), spotCheckList.stream()).forEach(item -> {
if (spotCheckList.contains(item)) {
if (list.contains(item)) {// 两边都有的 spotCheckList 为主
item.setUpdateTime(now);
spotCheckListRepo.save(item);
} else {// spotCheckList 中存在但 list 中不存在的
item.setCreateTime(now);
item.setUpdateTime(now);
item.setSpotId(o.getSpotId());
spotCheckListRepo.save(item);
}
} else { // list 中存在但 spotCheckList 中不存在的
spotCheckListRepo.delete(item);
}
});
spotCheck.setUpdateTime(now);
// 检验加密签名保存
Optional.ofNullable(spotCheck.getContact()).filter(StringUtils::hasText).ifPresent(s -> spotCheck.setSginData(KmsServer.kmsSign(s)));
return spotCheckRepo.save(spotCheck);
});
}
@Transactional(readOnly = true)
public Page<EnforceCheckDto> findEnforceCheckDtoPage(EnforceCheckQuery query, RemoteUserInfo user) {
return enforceCheckRepo.findAll(build(query, user), PageableHelper.buildPageRequest(query.page(), query.pageSize(), "checkDate", "desc"), "enforcementInfo")
.map(enforceCheck -> {
EnforceCheckDto dto = new EnforceCheckDto();
dto.setCheckDate(enforceCheck.getCheckDate());
if (StringUtils.hasText(enforceCheck.getCheckTimeStart()) || StringUtils.hasText(enforceCheck.getCheckTimeEnd()))
dto.setCheckTime(enforceCheck.getCheckTimeStart() + " - " + enforceCheck.getCheckTimeEnd());
String officerIds = enforceCheck.getOfficerIds();
if (StringUtils.hasText(officerIds)) {
String[] array = officerIds.split(",");
String s = officerRepo.findAllById(Arrays.asList(array)).stream().map(Officer::getOfficerName).collect(Collectors.joining(","));
dto.setOfficers(s);
}
dto.setAgencyName(Optional.ofNullable(enforceCheck.getEnforcementInfo())
.map(EnforcementInfo::getAgency)
.map(Agency::getAgencyName)
.orElse(null));
dictItemRepo.findByDictDictCodeAndValue("dm_cljg", enforceCheck.getCheckResult()).ifPresent(o -> dto.setCheckResult(o.getDisplay()));
return dto;
});
}
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public EnforceCheck saveSupplement(EnforceCheck ec, RemoteUserInfo user) {
return enforceCheckRepo.findById(ec.getEnforceCheckId()).map(oldCheck -> {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
ec.getSupplement().put("tbr", user.getXm());
ec.getSupplement().put("tbsj", LocalDateTime.now().format(formatter));
oldCheck.setSupplement(ec.getSupplement());
oldCheck.setSupplementVerifyResult("2");
return enforceCheckRepo.save(oldCheck);
}).get();
}
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public EnforceCheck updateSupplementVerify(EnforceCheck ec, RemoteUserInfo user) {
return enforceCheckRepo.findById(ec.getEnforceCheckId()).map(oldCheck -> {
oldCheck.setSupplementVerifyResult(ec.getSupplementVerifyResult());
oldCheck.setSupplementVerifyDesc(ec.getSupplementVerifyDesc());
oldCheck.setSupplementVerifyUserName(user.getXm());
oldCheck.setSupplementVerifyTime(LocalDateTime.now());
return enforceCheckRepo.save(oldCheck);
}).get();
}
/**
* 修改检查项id
*
* @param enforceCheck 执法检查实体
* @param user 用户信息
* @return 执法检查实体
*/
public Optional<EnforceCheck> updateCheckItem(EnforceCheck enforceCheck, RemoteUserInfo user) {
return enforceCheckRepo.findById(enforceCheck.getEnforceCheckId()).map(oldCheck -> {
oldCheck.setCheckItemIds(enforceCheck.getCheckItemIds());
oldCheck.setUpdateTime(LocalDateTime.now());
return enforceCheckRepo.save(oldCheck);
});
}
/**
* 保存现场处理措施
*
* @param ec
* @param user
* @return
*/
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public EnforceCheck updateXcclcs(EnforceCheck ec, RemoteUserInfo user) {
return enforceCheckRepo.findById(ec.getEnforceCheckId()).map(oldCheck -> {
oldCheck.setXcclcstable(ec.getXcclcstable());
oldCheck.setXcclcscljd(ec.getXcclcscljd());
enforcementInfoRepo.findById(ec.getEnforcementId()).ifPresent(enforcementInfo -> enforcementInfo.setRechecked("21"));
// enforcementInfoRepo.findById(oldCheck.getEnforcementId()).ifPresent(is -> {
// is.setRechecked("3"); // 是否重新检查 0: 初始状态 1 2已复查 3:现场处理
// });
return enforceCheckRepo.save(oldCheck);
}).get();
}
/**
* 多条执法检查查询
*
* @param query 查询条件
* @param user 用户信息
* @return 多条执法检查
*/
@Transactional(readOnly = true)
public List<EnforceCheck> list(EnforceCheckQuery query, RemoteUserInfo user) {
return enforceCheckRepo.findAll(build(query, user)).stream().map(o -> {
if ("1".equals(o.getCheckResult())) o.setCheckResultMsg("正常");
else if ("2".equals(o.getCheckResult())) o.setCheckResultMsg("责令当场整改");
else if ("3".equals(o.getCheckResult())) o.setCheckResultMsg("责令限期整改");
else if ("9".equals(o.getCheckResult())) o.setCheckResultMsg("其他");
Optional.ofNullable(o.getEnforcementInfo()).ifPresent(EnforcementInfo::getEnforcementName);
Optional.ofNullable(o.getEnforcementInfo()).flatMap(oo -> Optional.ofNullable(oo.getEnterprise())).ifPresent(Enterprise::getUnitName);
Optional.ofNullable(o.getEnforcementInfo()).flatMap(oo -> Optional.ofNullable(oo.getAgency())).ifPresent(Agency::getAgencyName);
return o;
}).toList();
}
}

View File

@ -0,0 +1,377 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.common.util.Constants;
import com.aisino.iles.common.util.PageableHelper;
import com.aisino.iles.lawenforcement.event.DataChangeAction;
import com.aisino.iles.lawenforcement.event.aop.PublishDataChange;
import com.aisino.iles.lawenforcement.model.*;
import com.aisino.iles.lawenforcement.model.enums.FlowNode;
import com.aisino.iles.lawenforcement.model.query.CaseQuery;
import com.aisino.iles.lawenforcement.repository.*;
import com.smartlx.sso.client.model.RemoteUserInfo;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Join;
import jakarta.persistence.criteria.JoinType;
import jakarta.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Service
@Slf4j
public class EnforcementInfoHistoryService {
private final EnforcementInfoHistoryRepository enforcementInfoHistoryRepository;
private final CaseRepository caseRepository;
private final EnforceCheckService enforceCheckService;
private final AgencyRepository agencyRepo;
public EnforcementInfoHistoryService( EnforcementInfoHistoryRepository enforcementInfoHistoryRepository,AgencyRepository agencyRepo,
CaseRepository caseRepository,EnforceCheckService enforceCheckService) {
this.enforcementInfoHistoryRepository = enforcementInfoHistoryRepository;
this.agencyRepo = agencyRepo;
this.caseRepository = caseRepository;
this.enforceCheckService = enforceCheckService;
}
/**
* 历史执法信息
*
* @param query@return 分页历史执法信息
*/
@Transactional(readOnly = true)
public Page<EnforcementInfoHistory> findCasesPage(CaseQuery query, RemoteUserInfo user) {
return enforcementInfoHistoryRepository.findAll(buildSpec(query, user), PageableHelper.buildPageRequest(query.page(), query.pageSize(), query.sort(), query.dir())).map(this::getDetailInfo);
}
private Specification<EnforcementInfoHistory> buildSpec(CaseQuery query, RemoteUserInfo user) {
Agency currentAgency = agencyRepo.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!"));
return Specification.where((root, q, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
predicates.add(criteriaBuilder.equal((root.get(EnforcementInfoHistory_.agency).get(Agency_.agencyCode)), currentAgency.getAgencyCode()));
Optional.ofNullable(query.getFillingDate()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("fillingDate"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("fillingDate"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
Optional.ofNullable(query.getCaseName()).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get("caseName"), "%" + o + "%")));
Optional.ofNullable(query.getUnitName()).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get("unitName"), "%" + o + "%")));
Optional.ofNullable(query.getCreatedTime()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("createdTime"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("createdTime"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
Optional.ofNullable(query.getSupplementVerifyResult()).ifPresent(o -> {
// 填报内容查询
if("tb".equals(o)){
predicates.add(criteriaBuilder.or(
criteriaBuilder.notEqual(root.get("supplementVerifyResult"), "1" ),
criteriaBuilder.isNull(root.get("supplementVerifyResult"))
));
}
//审批内容查询
else if ("sp".equals(o)) {
predicates.add(criteriaBuilder.equal(root.get("supplementVerifyResult"), "2"));
}
else{
predicates.add(criteriaBuilder.equal(root.get("supplementVerifyResult"), o ));
}
});
Optional.ofNullable(query.getSupplementVerifyTime()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("supplementVerifyTime"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("supplementVerifyTime"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
// if(currentAgency.getAgencyLevel()==3){
// predicates.add(criteriaBuilder.equal((enforcementInfoCaseRoot.get(EnforcementInfo_.agency).get(Agency_.agencyCode)), currentAgency.getAgencyCode()));
// }
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
});
}
/**
* 保存填报历史执法记录
*
* @param o 历史执法记录
* @return 保存后历史执法记录
*/
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public EnforcementInfoHistory saveEnforcementInfoHistory(EnforcementInfoHistory o, RemoteUserInfo user) {
o.setSupplementVerifyResult("2");
Agency currentAgency = agencyRepo.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!"));
o.setAgencyId(currentAgency.getAgencyId());
return enforcementInfoHistoryRepository.save(o);
}
private EnforcementInfoHistory getDetailInfo(EnforcementInfoHistory c) {
c.getAgency().getAgencyName();
c.getAgency().getAgencyCode();
c.getAgency().getAgencyLevel();
return c;
}
@PublishDataChange(action = DataChangeAction.SAVE)
@Transactional
public EnforcementInfoHistory updateSupplementVerify(EnforcementInfoHistory c, RemoteUserInfo user) {
return enforcementInfoHistoryRepository.findById(c.getHistoryId()).map(oldCase -> {
oldCase.setSupplementVerifyResult(c.getSupplementVerifyResult());
oldCase.setSupplementVerifyDesc(c.getSupplementVerifyDesc());
oldCase.setSupplementVerifyUserName(user.getXm());
oldCase.setSupplementVerifyTime(LocalDateTime.now());
return enforcementInfoHistoryRepository.save(oldCase);
}).get();
}
/**
* 查询案件集合
* @param query 查询条件
* @return 查询结果
*/
@Transactional(readOnly = true)
public List<EnforcementInfoHistory> listLsZflatj(CaseQuery query, RemoteUserInfo user) {
// Sort sort = Sort.by(Sort.Direction.DESC, "supplementVerifyTime");
// query.setSort(sort.toString());
//判断周期类型组装日期条件
Optional.ofNullable(query.getPeriod()).ifPresent(o -> {
if ("month".equals(o)) {
LocalDate[] fillingDate = new LocalDate[]{query.getYd(), query.getYd().with(TemporalAdjusters.lastDayOfMonth())};
query.setFillingDate(fillingDate);
} else if ("quarter".equals(o)) {
if (query.getJd() == 1) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 1, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 3, 31);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 2) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 4, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 6, 30);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 3) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 7, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 9, 30);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 4) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 10, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 12, 31);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
}
}
});
List<EnforcementInfoHistory> historyList = enforcementInfoHistoryRepository.findAll(buildSpec(query,user)).stream().map(this::transferHistoryInfo).toList();
List<EnforcementInfoHistory> casetoHistoryList = listZflatj(query,user);
List<EnforcementInfoHistory> mergedList = Stream.of(historyList, casetoHistoryList)
.flatMap(List::stream)
.collect(Collectors.toList());
return mergedList;
}
private EnforcementInfoHistory transferHistoryInfo(EnforcementInfoHistory c){
c.getAgency().getAgencyName();
String industryTypeName = Constants.DictDisplay.hylbMap.get(c.getIndustryType());
c.setIndustryType(industryTypeName);
return c;
}
/**
* 查询案件上报集合
* @param query 查询条件
* @return 查询结果
*/
@Transactional(readOnly = true)
public List<EnforcementInfoHistory> listZflatj(CaseQuery query, RemoteUserInfo user) {
//判断周期类型组装日期条件
Optional.ofNullable(query.getPeriod()).ifPresent(o -> {
if ("month".equals(o)) {
LocalDate[] fillingDate = new LocalDate[]{query.getYd(), query.getYd().with(TemporalAdjusters.lastDayOfMonth())};
query.setFillingDate(fillingDate);
} else if ("quarter".equals(o)) {
if (query.getJd() == 1) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 1, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 3, 31);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 2) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 4, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 6, 30);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 3) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 7, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 9, 30);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
} else if (query.getJd() == 4) {
LocalDate start = LocalDate.of(LocalDate.now().getYear(), 10, 1);
LocalDate end = LocalDate.of(LocalDate.now().getYear(), 12, 31);
LocalDate[] fillingDate = new LocalDate[]{start, end};
query.setFillingDate(fillingDate);
}
}
});
return caseRepository.findAll(buildcaseSpec(query,user)).stream().map(this::transferInfo).toList();
}
private Specification<Case> buildcaseSpec(CaseQuery query, RemoteUserInfo user) {
// Agency currentAgency = agencyRepo.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!"));
return Specification.where((root, q, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getFillingDate()).filter(f -> f.length == 2).map(f -> {
List<Predicate> timePredicates = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get("fillingDate"), from)).ifPresent(timePredicates::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get("fillingDate"), to)).ifPresent(timePredicates::add);
return timePredicates;
}).ifPresent(predicates::addAll);
// if(currentAgency.getAgencyLevel()==3){
// predicates.add(criteriaBuilder.equal((enforcementInfoCaseRoot.get(EnforcementInfo_.agency).get(Agency_.agencyCode)), currentAgency.getAgencyCode()));
// }
predicates.add(criteriaBuilder.equal(root.get("supplementVerifyResult"), "1"));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
});
}
private EnforcementInfoHistory transferInfo(Case c){
c.getEnforcementInfo().getAgency().getAgencyName();
String industryType = c.getEnforcementInfo().getEnterprise().getIndustryType();
String industryTypeName = Constants.DictDisplay.hylbMap.get( industryType);
EnforcementInfoHistory o = new EnforcementInfoHistory();
//获取 执法检查信息
enforceCheckService.getEnforceCheckByEnforcementId(c.getEnforcementInfo().getEnforcementId()).ifPresent(check -> {
o.setCheckDate(check.getCheckDate());
});
o.setAgency(c.getEnforcementInfo().getAgency());
o.setUnitName(c.getEnforcementInfo().getEnterprise().getUnitName());
o.setUnifiedSocialCode(c.getEnforcementInfo().getEnterprise().getUnifiedSocialCode());
o.setIndustryType(industryTypeName);
o.setLegalRepresentative(c.getEnforcementInfo().getEnterprise().getLegalRepresentative());
o.setOpLocAddress(c.getEnforcementInfo().getEnterprise().getOpLocAddress());
Optional.ofNullable(c.getCaseSourceCode()).ifPresent(caseSourseCode -> {
switch (caseSourseCode) {
case "1" -> o.setCaseSourceCode("日常检查发现");
case "2" -> o.setCaseSourceCode("机构监测报告");
case "3" -> o.setCaseSourceCode("举报投诉");
case "4" -> o.setCaseSourceCode("上级交办");
case "5" -> o.setCaseSourceCode("下级情报");
case "6" -> o.setCaseSourceCode("有关部门移送");
case "7" -> o.setCaseSourceCode("其他");
}
});
Optional.ofNullable(c.getCaseCause()).ifPresent(caseCause -> {
switch (caseCause) {
case "1" -> o.setCaseCause("安全生产行政许可类违法");
case "2" -> o.setCaseCause("安全生产管理机构和管理人员类违法");
case "3" -> o.setCaseCause("安全生产建设工程项目类违法");
case "4" -> o.setCaseCause("安全生产规章制度类违法");
case "5" -> o.setCaseCause("安全生产培训教育类违法");
case "6" -> o.setCaseCause("安全生产资金投入类违法");
case "7" -> o.setCaseCause("安全生产隐患管理类违法");
case "8" -> o.setCaseCause("生产安全事故应急救援类违法");
case "9" -> o.setCaseCause("安全生产承包租赁类违法");
case "10" -> o.setCaseCause("安全生产警示标志类违法");
case "11" -> o.setCaseCause("安全生产中介机构类违法");
case "12" -> o.setCaseCause("安全设备使用维护类违法");
case "13" -> o.setCaseCause("重大危险源管理类违法");
case "14" -> o.setCaseCause("生产经营单位作业现场管理类违法");
case "15" -> o.setCaseCause("生产安全事故报告类违法");
case "16" -> o.setCaseCause("生产安全事故责任类违法");
case "17" -> o.setCaseCause("其他");
}
});
o.setCaseName(c.getCaseName());
o.setCaseNum(c.getCaseNum());
o.setCaseSourceCode(c.getCaseSourceCode());
o.setCaseHandler(c.getCaseHandler());
o.setFillingDate(c.getFillingDate());
o.setAuditTime(c.getEnforcementInfo().getAuditTime());
o.setCaseClosingDate(c.getCaseClosingDate());
// Optional.ofNullable(value).orElse(0)
Optional.ofNullable(c.getSupplement()).ifPresent(supplement -> {
Optional.ofNullable(supplement.get("wfxwsl")).ifPresent(v-> o.setWfxwsl(Integer.parseInt(String.valueOf(v))));
Optional.ofNullable(supplement.get("sfyasf")).ifPresent(v-> o.setSfyasf((Integer)v));
Optional.ofNullable(supplement.get("fkze")).ifPresent(v-> o.setFkze(Float.parseFloat(String.valueOf(v))));
Optional.ofNullable(supplement.get("cfqy")).ifPresent(v-> o.setCfqy(Float.parseFloat(String.valueOf(v))));
Optional.ofNullable(supplement.get("cfgr")).ifPresent(v-> o.setCfgr(Float.parseFloat(String.valueOf(v))));
Optional.ofNullable(supplement.get("sfyj")).ifPresent(v-> o.setSfyj((Integer)v));
Optional.ofNullable(supplement.get("sjrys")).ifPresent(v-> o.setSjrys(Integer.parseInt(String.valueOf(v))));
Optional.ofNullable(supplement.get("yttbzzrs")).ifPresent(v-> o.setYttbzzrs(Integer.parseInt(String.valueOf(v))));
Optional.ofNullable(supplement.get("yttbzzrrlx")).ifPresent(v-> o.setYttbzzrrlx(String.valueOf(v)));
o.setSfzltczd((Integer)supplement.get("sfzltczd"));
o.setSfzkzz((Integer)supplement.get("sfzkzz"));
o.setSfgb((Integer)supplement.get("sfgb"));
o.setSffy((Integer)supplement.get("sffy"));
Optional.ofNullable(supplement.get("fyjg")).ifPresent(v-> o.setFyjg(String.valueOf(v)));
o.setSfss((Integer)supplement.get("sfss"));
Optional.ofNullable(supplement.get("ssjg")).ifPresent(v-> o.setSsjg(String.valueOf(v)));
});
// Optional.ofNullable(c.getSupplement().get("wfxwsl")).ifPresent(v-> o.setWfxwsl(Integer.parseInt(String.valueOf(v))));
// Optional.ofNullable(c.getSupplement().get("sfyasf")).ifPresent(v-> o.setSfyasf((Integer)v));
// Optional.ofNullable(c.getSupplement().get("fkze")).ifPresent(v-> o.setFkze(Float.parseFloat(String.valueOf(v))));
//
// Optional.ofNullable(c.getSupplement().get("cfqy")).ifPresent(v-> o.setCfqy(Float.parseFloat(String.valueOf(v))));
// Optional.ofNullable(c.getSupplement().get("cfgr")).ifPresent(v-> o.setCfgr(Float.parseFloat(String.valueOf(v))));
//
//
// Optional.ofNullable(c.getSupplement().get("sfyj")).ifPresent(v-> o.setSfyj((Integer)v));
// Optional.ofNullable(c.getSupplement().get("sjrys")).ifPresent(v-> o.setSjrys(Integer.parseInt(String.valueOf(v))));
// Optional.ofNullable(c.getSupplement().get("yttbzzrs")).ifPresent(v-> o.setYttbzzrs(Integer.parseInt(String.valueOf(v))));
// Optional.ofNullable(c.getSupplement().get("yttbzzrrlx")).ifPresent(v-> o.setYttbzzrrlx(String.valueOf(v)));
//
//
// o.setSfzltczd((Integer)c.getSupplement().get("sfzltczd"));
// o.setSfzkzz((Integer)c.getSupplement().get("sfzkzz"));
// o.setSfgb((Integer)c.getSupplement().get("sfgb"));
// o.setSffy((Integer)c.getSupplement().get("sffy"));
// Optional.ofNullable(c.getSupplement().get("fyjg")).ifPresent(v-> o.setFyjg(String.valueOf(v)));
//
// o.setSfss((Integer)c.getSupplement().get("sfss"));
// Optional.ofNullable(c.getSupplement().get("ssjg")).ifPresent(v-> o.setSsjg(String.valueOf(v)));
o.setSupplementVerifyTime(c.getSupplementVerifyTime());
return o;
}
}

View File

@ -0,0 +1,606 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.common.model.enums.IndustryCategoryForFile;
import com.aisino.iles.common.service.FtpService;
import com.aisino.iles.common.util.PageableHelper;
import com.aisino.iles.common.util.StringUtils;
import com.aisino.iles.core.exception.BusinessError;
import com.aisino.iles.core.repository.DictItemRepo;
import com.aisino.iles.core.service.GenerateCodeService;
import com.aisino.iles.lawenforcement.event.DataChangeAction;
import com.aisino.iles.lawenforcement.event.aop.PublishDataChange;
import com.aisino.iles.lawenforcement.model.*;
import com.aisino.iles.lawenforcement.model.dto.CaseInfoDto;
import com.aisino.iles.lawenforcement.model.dto.EnforcementInfoDto;
import com.aisino.iles.lawenforcement.model.enums.FlowNode;
import com.aisino.iles.lawenforcement.model.query.EnforcementInfoQuery;
import com.aisino.iles.lawenforcement.repository.*;
import com.smartlx.sso.client.model.RemoteUserInfo;
import jakarta.persistence.criteria.CriteriaBuilder;
import jakarta.persistence.criteria.Predicate;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
/**
* 执法信息服务类
*/
@Service
public class EnforcementInfoService {
private final EnforcementInfoRepository enforcementInfoRepository;
private final EnterpriseRepository enterpriseRepository;
private final OfficerRepository officerRepository;
private final EnforceCheckRepository enforceCheckRepository;
private final CheckItemRepository checkItemRepository;
private final CaseRepository caseRepository;
private final AgencyRepository agencyRepository;
private final DictItemRepo dictItemRepo;
private final GenerateCodeService generateCodeService;
private final FtpService ftpService;
private final ExecutorService fileUploadExecutor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() * 2);
public EnforcementInfoService(EnforcementInfoRepository enforcementInfoRepository,
EnterpriseRepository enterpriseRepository,
OfficerRepository officerRepository,
EnforceCheckRepository enforceCheckRepository,
CheckItemRepository checkItemRepository,
CaseRepository caseRepository,
GenerateCodeService generateCodeService,
AgencyRepository agencyRepository,
DictItemRepo dictItemRepo,
FtpService ftpService) {
this.enforcementInfoRepository = enforcementInfoRepository;
this.enterpriseRepository = enterpriseRepository;
this.officerRepository = officerRepository;
this.enforceCheckRepository = enforceCheckRepository;
this.checkItemRepository = checkItemRepository;
this.caseRepository = caseRepository;
this.agencyRepository = agencyRepository;
this.dictItemRepo = dictItemRepo;
this.generateCodeService = generateCodeService;
this.ftpService = ftpService;
}
/**
* 保存执法信息
*
* @param enforcementInfoDto 执法信息
* @param user 用户信息
* @return 保存结果列表
*/
@Transactional
@PublishDataChange(action = DataChangeAction.SAVE)
public List<Object> saveEnforcementInfo(EnforcementInfoDto enforcementInfoDto, RemoteUserInfo user) {
// 1. 校验企业ID列表是否为空
List<String> enterpriseIds = enforcementInfoDto.getEnterpriseIds();
if (CollectionUtils.isEmpty(enterpriseIds)) {
throw new BusinessError("企业信息不能为空!");
}
List<Object> result = new ArrayList<>();
// 2. 处理每个企业ID
enterpriseIds.forEach(enterpriseId -> {
// 2.1 查询企业信息
Enterprise enterprise = enterpriseRepository.findById(enterpriseId).orElseThrow(() -> new BusinessError("企业ID不存在" + enterpriseId));
// 2.2 构建 EnforcementInfo 对象
EnforcementInfo enforcementInfo = buildEnforcementInfo(enforcementInfoDto, enterprise);
enforcementInfoRepository.save(enforcementInfo);
result.add(enforcementInfo);
// 2.3 构建 EnforceCheck 对象每个企业共用相同的检查项
EnforceCheck enforceCheck = buildEnforceCheck(enforcementInfoDto, enforcementInfo, user);
enforceCheckRepository.save(enforceCheck);
result.add(enforceCheck);
});
return result;
}
private EnforcementInfo buildEnforcementInfo(EnforcementInfoDto enforcementInfoDto, Enterprise enterprise) {
EnforcementInfo enforcementInfo = new EnforcementInfo();
// 方案名称
enforcementInfo.setEnforcementName(enforcementInfoDto.getEnforcementName());
// 设置执法时间
LocalDate[] enforcementTime = enforcementInfoDto.getEnforcementTime();
if (enforcementTime == null || enforcementTime.length < 2) {
throw new BusinessError("执法时间不能为空!");
}
enforcementInfo.setEnforcementStartTime(enforcementTime[0]);
enforcementInfo.setEnforcementEndTime(enforcementTime[1]);
// 方案内容
enforcementInfo.setEnforcementContent(enforcementInfoDto.getEnforcementContent());
// 方案依据
enforcementInfo.setEnforcementBasis(enforcementInfoDto.getEnforcementBasis());
// 附件
MultipartFile[] files = enforcementInfoDto.getAnnexs();
if (ArrayUtils.isNotEmpty(files)) {
List<Map<String, Object>> annexs = uploadAllFiles(files);
enforcementInfo.setAnnexs(annexs);
}
// 企业id
enforcementInfo.setEnterpriseId(enterprise.getEnterpriseId());
// 机构id
enforcementInfo.setAgencyId(enforcementInfoDto.getAgencyId());
// 设置数据来源默认"1"
String dataFrom = StringUtils.defaultIfEmpty(enforcementInfoDto.getDataFrom(), "1");
enforcementInfo.setDataFrom(dataFrom);
// 设置流程节点根据 dataFrom 判断
if ("34".contains(dataFrom)) { // 举报核查转交/自动执法计划派发
enforcementInfo.setAgencyId(enterprise.getAgency().getAgencyId());
enforcementInfo.setCurrentNodeCode(FlowNode.plan_approved);
enforcementInfo.setCurrentNode("方案审批通过");
} else {
enforcementInfo.setCurrentNodeCode(FlowNode.plan_approval);
enforcementInfo.setCurrentNode("方案待审批");
}
// 设置创建信息
enforcementInfo.setCreateTime(LocalDateTime.now());
return enforcementInfo;
}
private EnforceCheck buildEnforceCheck(EnforcementInfoDto enforcementInfoDto, EnforcementInfo enforcementInfo, RemoteUserInfo user) {
EnforceCheck enforceCheck = new EnforceCheck();
enforceCheck.setEnforcementId(enforcementInfo.getEnforcementId());
Optional.ofNullable(enforcementInfoDto.getCheckItemIds()).ifPresent(ids -> enforceCheck.setCheckItemIds(String.join(",", ids)));
// 1.日常检查 2.专项检查 3.举报核查举报核查转交4.随机抽查 5.督导检查专项检查6.交叉互查投诉举报7.重点企业检查自动执法计划8.双随机检查自动执法计划
if ("3".equals(enforcementInfo.getDataFrom())) {
enforceCheck.setCheckType("3");
} else if ("4".equals(enforcementInfo.getDataFrom())) {
enforceCheck.setPlanId(enforcementInfoDto.getPlanId());
if ("1".equals(enforcementInfoDto.getPlanType())) { // 1重点检查企业清单
enforceCheck.setCheckType("7");
} else if ("2".equals(enforcementInfoDto.getPlanType())) { // 2双重双随机一公开清单
enforceCheck.setCheckType("8");
}
} else {
enforceCheck.setCheckType(enforcementInfoDto.getCheckType());
}
enforceCheck.setCheckStatus("1");
enforceCheck.setCheckFlag("1");
enforceCheck.setCreateTime(LocalDateTime.now());
enforceCheck.setWriterId(user.getYhwybs());
enforceCheck.setCreatedBy(user.getXm());
enforceCheck.setCreatedAccountBy(user.getYhwybs());
return enforceCheck;
}
// 上传所有文件并返回结果
private List<Map<String, Object>> uploadAllFiles(MultipartFile[] files) {
// 1. 转换为List并过滤空文件
List<MultipartFile> validFiles = Arrays.stream(files).filter(file -> !file.isEmpty()).collect(Collectors.toList());
// 2. 创建上传任务
List<CompletableFuture<Map<String, Object>>> uploadFutures = validFiles.stream().map(this::uploadFile).collect(Collectors.toList());
// 3. 合并所有Future
CompletableFuture<Void> allFutures = CompletableFuture.allOf(uploadFutures.toArray(new CompletableFuture[0]));
// 4. 获取所有结果
return allFutures.thenApply(v -> uploadFutures.stream().map(CompletableFuture::join).collect(Collectors.toList())).join(); // 在当前线程等待完成
}
// 单个文件上传方法
private CompletableFuture<Map<String, Object>> uploadFile(MultipartFile file) {
return CompletableFuture.supplyAsync(() -> {
try {
String originalFilename = file.getOriginalFilename();
String fileExtension = getFileExtension(originalFilename);
// 上传文件
String url = ftpService.uploadTempFile(IndustryCategoryForFile.pub, originalFilename, file.getInputStream());
if (!org.springframework.util.StringUtils.hasText(url)) {
throw new BusinessError("文件上传失败: " + originalFilename);
}
// 构建返回结果
Map<String, Object> result = new HashMap<>();
result.put("name", originalFilename);
result.put("type", fileExtension);
result.put("savePathName", url);
result.put("downloadUrl", ftpService.getFileUrl(url));
result.put("size", file.getSize());
return result;
} catch (Exception e) {
throw new BusinessError("文件上传异常: " + file.getOriginalFilename(), e);
}
}, fileUploadExecutor); // 使用专用线程池
}
// 获取文件扩展名
private String getFileExtension(String filename) {
if (filename == null) {
return "";
}
int lastDotIndex = filename.lastIndexOf('.');
return lastDotIndex == -1 ? "" : filename.substring(lastDotIndex + 1);
}
/**
* 分页查询执法信息
*
* @param query@return 分页执法信息
*/
@Transactional(readOnly = true)
public Page<EnforcementInfo> findEnforcementInfosPage(EnforcementInfoQuery query) {
return enforcementInfoRepository
.findAll(buildSpecification(query), PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createTime", "desc"))
.map(this::handleResult);
}
private Specification<EnforcementInfo> buildSpecification(EnforcementInfoQuery query) {
return Specification.where((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getAgencyCode()).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get("agency").get("agencyCode"), StringUtils.trimEven0(o) + "%")));
Optional.ofNullable(query.getUnitName()).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get("enterprise").get("unitName"), "%" + o + "%")));
Optional.ofNullable(query.getFillingFlag()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnforcementInfo_.fillingFlag), o)));
Optional.ofNullable(query.getCurrentNodeCode()).filter(StringUtils::isNotEmpty).ifPresent(o -> {
List<Predicate> orPredicates = Arrays.stream(o.split(","))
.map(code -> criteriaBuilder.equal(root.get(EnforcementInfo_.currentNodeCode), FlowNode.fromString(code)))
.toList();
predicates.add(orPredicates.size() == 1 ? orPredicates.get(0) : criteriaBuilder.or(orPredicates.toArray(new Predicate[0])));
});
Optional.ofNullable(query.getNotCurrentNodeCode()).filter(StringUtils::isNotEmpty).ifPresent(o -> {
Arrays.stream(o.split(","))
.map(FlowNode::fromString)
.forEach(flowNode -> predicates.add(criteriaBuilder.notEqual(root.get(EnforcementInfo_.currentNodeCode), flowNode)));
});
Optional.ofNullable(query.getStartTime()).ifPresent(o -> predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createTime"), o)));
Optional.ofNullable(query.getEndTime()).ifPresent(o -> predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("createTime"), o)));
Optional.ofNullable(query.getEnterpriseId()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnforcementInfo_.enterpriseId), o)));
Optional.ofNullable(query.getAgency())
.map(Agency::getAgencyCode)
.ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnforcementInfo_.agency).get(Agency_.agencyCode), StringUtils.trimEven0(o) + "%")));
Optional.ofNullable(query.getCreateTimeArr()).filter(f -> f.length == 2).map(f -> {
List<Predicate> ts = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get(EnforcementInfo_.createTime), from)).ifPresent(ts::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get(EnforcementInfo_.createTime), to)).ifPresent(ts::add);
return ts;
}).ifPresent(predicates::addAll);
Optional.ofNullable(query.getRechecked()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get("rechecked"), o)));
String[] recheckedArr = query.getRecheckedArr();
if (recheckedArr != null && recheckedArr.length > 0) {
CriteriaBuilder.In<String> in = criteriaBuilder.in(root.get("rechecked"));
Arrays.stream(recheckedArr).forEach(in::value);
predicates.add(in);
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
});
}
private EnforcementInfo handleResult(EnforcementInfo enforcementInfoDto) {
Optional.ofNullable(enforcementInfoDto.getEnterprise()).ifPresent(enterprise -> enterprise.getUnitName());
Optional.ofNullable(enforcementInfoDto.getAgency()).ifPresent(agency -> agency.getAgencyName());
// 案件信息
caseRepository.findByEnforcementInfoEnforcementId(enforcementInfoDto.getEnforcementId()).ifPresent(caseInfo -> enforcementInfoDto.setCaseInfo(caseInfo));
return enforcementInfoDto;
}
/**
* 根据ID查询执法信息
*
* @param enforcementId 执法信息ID
* @return 执法信息
*/
@Transactional(readOnly = true)
public Optional<EnforcementInfo> findEnforcementInfoById(String enforcementId) {
return enforcementInfoRepository.findById(enforcementId).map(enforcementInfo -> {
// 机构信息
Optional.ofNullable(enforcementInfo.getAgency()).ifPresent(agency -> agency.getAgencyName());
// 企业信息
Optional.ofNullable(enforcementInfo.getEnterprise()).ifPresent(enterprise -> enterprise.getUnitName());
// 附件
List<Map<String, Object>> annexs = enforcementInfo.getAnnexs();
if (annexs != null) {
annexs.forEach(annex -> {
String savePathName = annex.get("savePathName").toString();
String fileUrl = ftpService.getFileUrl(savePathName);
annex.put("downloadUrl", fileUrl);
});
enforcementInfo.setAnnexs(annexs);
}
// 检查记录信息
List<EnforceCheck> enforceChecks = enforceCheckRepository.findByEnforcementId(enforcementInfo.getEnforcementId());
enforceChecks.forEach(enforceCheck -> {
String officerIds = enforceCheck.getOfficerIds();
if (StringUtils.isNotEmpty(officerIds)) {
List<Officer> officerList = new ArrayList<>();
Arrays.stream(officerIds.split(",")).forEach(id -> officerRepository.findById(id).ifPresent(officerList::add));
enforceCheck.setOfficerList(officerList);
}
// String checkStatusMsg = "1".equals(enforceCheck.getCheckStatus()) ? "待检查" : "已检查";
// enforceCheck.setCheckStatusMsg(checkStatusMsg);
dictItemRepo.findByDictDictCodeAndValue("dm_cljg", enforceCheck.getCheckResult()).ifPresent(o -> enforceCheck.setCheckResultMsg(o.getDisplay()));
});
// 排序
enforceChecks.stream().sorted((a, b) -> b.getCheckDate().compareTo(a.getCheckDate())).collect(Collectors.toList());
enforcementInfo.setEnforceChecks(enforceChecks);
// 检查项信息
if (enforceChecks.size() > 0 && StringUtils.isNotEmpty(enforceChecks.get(0).getCheckItemIds())) {
enforcementInfo.setCheckItems(checkItemRepository.findByItemIdIn(enforceChecks.get(0).getCheckItemIds().split(",")));
}
// 案件信息
caseRepository.findByEnforcementInfoEnforcementId(enforcementInfo.getEnforcementId()).ifPresent(caseInfo -> {
agencyRepository.findById(caseInfo.getAgencyId()).ifPresent(agency -> caseInfo.setAgency(agency));
enforcementInfo.setCaseInfo(caseInfo);
});
return enforcementInfo;
});
}
/**
* 检查执法信息是否存在
*
* @param enforcementId 执法信息ID
* @return 是否存在
*/
public boolean existsEnforcementInfoById(String enforcementId) {
return enforcementInfoRepository.existsById(enforcementId);
}
/**
* 修改执法信息
*
* @param enforcementInfoDto 执法信息
*/
@Transactional
public void updateEnforcementInfo(EnforcementInfoDto enforcementInfoDto) {
if (StringUtils.isEmpty(enforcementInfoDto.getEnterpriseId())) throw new BusinessError("企业信息不能为空!");
enforcementInfoRepository.findById(enforcementInfoDto.getEnforcementId()).ifPresent(enforcementInfo -> {
enterpriseRepository.findById(enforcementInfoDto.getEnterpriseIds().get(0)).ifPresent(enterprise -> {
// 方案名称
enforcementInfo.setEnforcementName(enforcementInfoDto.getEnforcementName());
// 方案内容
enforcementInfo.setEnforcementContent(enforcementInfoDto.getEnforcementContent());
// 方案依据
enforcementInfo.setEnforcementBasis(enforcementInfoDto.getEnforcementBasis());
// 设置执法时间
LocalDate[] enforcementTime = enforcementInfoDto.getEnforcementTime();
if (enforcementTime == null || enforcementTime.length < 2) {
throw new BusinessError("执法时间不能为空!");
}
enforcementInfo.setEnforcementStartTime(enforcementTime[0]);
enforcementInfo.setEnforcementEndTime(enforcementTime[1]);
enforcementInfo.setAgencyId(enforcementInfoDto.getAgencyId());
enforcementInfo.setEnterpriseId(enterprise.getEnterpriseId());
enforcementInfo.setUpdateTime(LocalDateTime.now());
enforcementInfoRepository.save(enforcementInfo);
});
enforceCheckRepository.findById(enforcementInfoDto.getEnforceCheckId()).ifPresent(enforceCheck -> {
Optional.ofNullable(enforcementInfoDto.getCheckItemIds()).ifPresent(ids -> enforceCheck.setCheckItemIds(String.join(",", ids)));
enforceCheck.setCheckType(enforcementInfoDto.getCheckType());
enforceCheck.setUpdateTime(LocalDateTime.now());
enforceCheckRepository.save(enforceCheck);
});
});
}
/**
* 根据ID删除执法信息
*
* @param enforcementId 执法信息ID
*/
@Transactional
public void deleteEnforcementInfoById(String enforcementId) {
// 删除检查信息
List<String> enforceCheckIds = enforceCheckRepository.findByEnforcementId(enforcementId).stream().map(EnforceCheck::getEnforceCheckId).collect(Collectors.toList());
enforceCheckRepository.deleteAllById(enforceCheckIds);
// 删除执法信息
enforcementInfoRepository.deleteById(enforcementId);
}
/**
* 批量删除执法信息
*
* @param enforcementIds 执法信息ID列表
*/
@Transactional
public void deleteEnforcementInfosByIds(List<String> enforcementIds) {
// 删除检查信息
enforcementIds.forEach(enforcementId -> {
List<String> enforceCheckIds = enforceCheckRepository.findByEnforcementId(enforcementId).stream().map(EnforceCheck::getEnforceCheckId).collect(Collectors.toList());
enforceCheckRepository.deleteAllById(enforceCheckIds);
});
// 删除执法信息
enforcementInfoRepository.deleteAllById(enforcementIds);
}
/**
* 保存方案审批信息
*
* @param enforcementInfoDto 方案审批信息
*/
@Transactional
public void savePlanApproval(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
enforcementInfo.setPlanIsPass(enforcementInfoDto.getPlanIsPass());
if ("1".equals(enforcementInfoDto.getPlanIsPass())) {
enforcementInfo.setCurrentNodeCode(FlowNode.plan_approved);
enforcementInfo.setCurrentNode("方案审批通过");
} else {
enforcementInfo.setCurrentNodeCode(FlowNode.plan_approval_failed);
enforcementInfo.setCurrentNode("方案审批未通过");
}
enforcementInfo.setPlanApprovalDesc(enforcementInfoDto.getPlanApprovalDesc());
enforcementInfo.setPlanApprovalUserId(enforcementInfoDto.getPlanApprovalUserId());
enforcementInfo.setPlanApprovalUserName(enforcementInfoDto.getPlanApprovalUserName());
enforcementInfo.setPlanApprovalTime(enforcementInfoDto.getPlanApprovalTime());
});
}
/**
* 保存总结信息
*
* @param enforcementInfoDto 总结信息
*/
@Transactional
public void saveSummarize(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
if ("1".equals(enforcementInfoDto.getIsRegister())) {
enforcementInfo.setFillingFlag("1");
enforcementInfo.setCurrentNodeCode(FlowNode.inspect_summarize);
enforcementInfo.setCurrentNode("总结");
} else {
enforcementInfo.setFillingFlag("0");
enforcementInfo.setCurrentNodeCode(FlowNode.done);
enforcementInfo.setCurrentNode("完成");
}
enforcementInfo.setSummarizeDesc(enforcementInfoDto.getSummarizeDesc());
enforcementInfo.setSummarizeUserId(enforcementInfoDto.getSummarizeUserId());
enforcementInfo.setSummarizeUserName(enforcementInfoDto.getSummarizeUserName());
enforcementInfo.setSummarizeTime(enforcementInfoDto.getSummarizeTime());
});
}
/**
* 保存案件信息
*
* @param caseInfoDto 案件信息
*/
@Transactional
public void saveCaseInfo(CaseInfoDto caseInfoDto) {
String enforcementId = caseInfoDto.getEnforcementId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
enforcementInfo.setCurrentNodeCode(FlowNode.filed);
enforcementInfo.setCurrentNode("已立案");
enforcementInfo.setFillingFlag("1");
enforcementInfo.setFillingTime(caseInfoDto.getFillingTime());
Case caseInfo = new Case();
caseInfo.setCaseNum(generateCodeService.buildCode("xa", "case", null, 0));
caseInfo.setEnforcementId(enforcementInfo.getEnforcementId());
caseInfo.setAgencyId(caseInfoDto.getAgencyId());
caseInfo.setFiledUserName(caseInfoDto.getFiledUserName());
caseInfo.setFiledUserId(caseInfoDto.getFiledUserId());
caseInfo.setFillingDate(LocalDate.now());
caseInfo.setIsLawBreak(caseInfoDto.getIsLawBreak());
caseInfo.setCaseSourceCode(caseInfoDto.getCaseSourceCode());
caseInfo.setCaseSource(caseInfoDto.getCaseSource());
caseInfo.setCaseName(caseInfoDto.getCaseName());
caseInfo.setCaseAdd(caseInfoDto.getCaseAdd());
caseInfo.setCaseTime(caseInfoDto.getCaseTime());
caseInfo.setCaseCause(caseInfoDto.getCaseCause());
caseInfo.setCaseDesc(caseInfoDto.getCaseDesc());
caseInfo.setDisposition(caseInfoDto.getDisposition());
caseInfo.setCreatedTime(LocalDateTime.now());
caseInfo.setStatus(Case.CaseStatus.filed);
caseInfo.setEnterpriseId(enforcementInfo.getEnterpriseId());
caseRepository.save(caseInfo);
});
}
/**
* 推送案件信息
*
* @param caseInfoDto 案件信息
*/
@Transactional
public void pushCaseInfo(CaseInfoDto caseInfoDto) {
String enforcementId = caseInfoDto.getEnforcementId();
caseRepository.findByEnforcementInfoEnforcementId(enforcementId).ifPresent(caseInfo -> {
// Case caseInfo = new Case();
// caseInfo.setCaseNum(caseInfoDto.getCaseNum());
// caseInfo.setCaseName(caseInfoDto.getCaseName());
// caseInfo.setCaseCause(caseInfoDto.getCaseCause());
// caseInfo.setCaseSource(caseInfoDto.getCaseSource());
// caseInfo.setFillingDate(LocalDate.now());
// caseInfo.setCreatedTime(LocalDateTime.now());
// caseInfo.setStatus(Case.CaseStatus.filed);
// caseInfo.setEnterpriseId(enforcementInfo.getEnterpriseId());
// caseInfo.setEnforcementId(enforcementInfo.getEnforcementId());
// caseInfo.setFiledUserId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
enforcementInfo.setCurrentNodeCode(FlowNode.investigating);
enforcementInfo.setCurrentNode("调查取证");
});
});
}
/**
* 保存集体讨论信息
*
* @param enforcementInfoDto 集体讨论信息
*/
@Transactional
public void saveBrainstorm(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
if ("1".equals(enforcementInfoDto.getIsRegister())) {
enforcementInfo.setCurrentNodeCode(FlowNode.closed);
enforcementInfo.setCurrentNode("结案");
enforcementInfo.setCaseClosingTime(LocalDateTime.now());
} else {
enforcementInfo.setCurrentNodeCode(FlowNode.brainstorm);
enforcementInfo.setCurrentNode("集体讨论");
}
enforcementInfo.setBrainstormDesc(enforcementInfoDto.getBrainstormDesc());
enforcementInfo.setBrainstormUserId(enforcementInfoDto.getBrainstormUserId());
enforcementInfo.setBrainstormUserName(enforcementInfoDto.getBrainstormUserName());
enforcementInfo.setBrainstormTime(enforcementInfoDto.getBrainstormTime());
});
}
/**
* 保存案件审核信息
*
* @param enforcementInfoDto 案件审核信息
*/
@Transactional
public void saveCaseExamine(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
caseRepository.findByEnforcementInfoEnforcementId(enforcementId).ifPresent(caseInfo -> {
caseInfo.setExamineUserId(enforcementInfoDto.getExamineUserId());
caseInfo.setExamineUserName(enforcementInfoDto.getExamineUserName());
caseInfo.setExamineDesc(enforcementInfoDto.getExamineDesc());
caseInfo.setExamineTime(enforcementInfoDto.getExamineTime());
});
}
/**
* 保存案件审批信息
*
* @param enforcementInfoDto 案件审批信息
*/
@Transactional
public void saveCaseApprove(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
enforcementInfo.setCurrentNodeCode(FlowNode.done);
enforcementInfo.setCurrentNode("完成");
});
caseRepository.findByEnforcementInfoEnforcementId(enforcementId).ifPresent(caseInfo -> {
caseInfo.setApproveUserId(enforcementInfoDto.getApproveUserId());
caseInfo.setApproveUserName(enforcementInfoDto.getApproveUserName());
caseInfo.setApproveDesc(enforcementInfoDto.getApproveDesc());
caseInfo.setApproveTime(enforcementInfoDto.getApproveTime());
});
}
@Transactional
public void updateFillingFlag(EnforcementInfoDto enforcementInfoDto) {
String enforcementId = enforcementInfoDto.getEnforcementId();
enforceCheckRepository.findByEnforcementId(enforcementId).forEach(enforceCheck -> {
enforceCheck.setCheckStatus("2");
enforceCheckRepository.save(enforceCheck);
});
enforcementInfoRepository.findById(enforcementId).ifPresent(enforcementInfo -> {
enforcementInfo.setFillingFlag(enforcementInfoDto.getFillingFlag());
enforcementInfo.setFillingTime(LocalDateTime.now());
enforcementInfoRepository.save(enforcementInfo);
});
}
}

View File

@ -0,0 +1,400 @@
package com.aisino.iles.lawenforcement.service;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
import com.aisino.iles.common.util.BeanUtils;
import com.aisino.iles.common.util.KmsServer;
import com.aisino.iles.lawenforcement.model.*;
import com.aisino.iles.lawenforcement.model.dto.EnterpriseInterfaceDto;
import com.aisino.iles.lawenforcement.model.query.EnterpriseQuery;
import com.aisino.iles.lawenforcement.repository.EnterpriseAuditRepository;
import com.aisino.iles.lawenforcement.repository.EnterpriseHistoryRepository;
import com.aisino.iles.lawenforcement.repository.EnterpriseRepository;
import com.smartlx.sso.client.model.RemoteUserInfo;
import com.smartlx.sso.client.properties.SsoClientProperties;
import jakarta.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
/**
* 企业审核信息服务类
*/
@Service
@Slf4j
public class EnterpriseAuditService {
private final EnterpriseAuditRepository enterpriseAuditRepo;
private final EnterpriseHistoryRepository enterpriseHistoryRepo;
private final EnterpriseRepository enterpriseRepo;
private final SsoClientProperties ssoClientProperties;
private final String saveUrl;
private final EnterpriseService enterpriseService;
private final AdministrativeLicenseService administrativeLicenseService;
public EnterpriseAuditService(EnterpriseAuditRepository enterpriseAuditRepo,
EnterpriseHistoryRepository enterpriseHistoryRepo,
EnterpriseRepository enterpriseRepo,
SsoClientProperties ssoClientProperties,
@Value("${third-party.enterprise.save:}") String saveUrl,
EnterpriseService enterpriseService,
AdministrativeLicenseService administrativeLicenseService) {
this.enterpriseAuditRepo = enterpriseAuditRepo;
this.enterpriseHistoryRepo = enterpriseHistoryRepo;
this.enterpriseRepo = enterpriseRepo;
this.ssoClientProperties = ssoClientProperties;
this.saveUrl = saveUrl;
this.enterpriseService = enterpriseService;
this.administrativeLicenseService = administrativeLicenseService;
}
/**
* 保存企业审核信息
*
* @param enterpriseAudit 企业审核信息
* @return 保存后的企业审核信息
*/
@Transactional
public EnterpriseAudit saveEnterpriseAudit(EnterpriseAudit enterpriseAudit, RemoteUserInfo user, String type) {
LocalDateTime now = LocalDateTime.now();
String enterpriseId = enterpriseAudit.getEnterpriseId();
if ("update".equals(type)) {
EnterpriseAudit audit = enterpriseAuditRepo.findById(enterpriseId).orElseThrow(() -> new RuntimeException("单位信息不存在"));
String unifiedSocialCode = enterpriseAudit.getUnifiedSocialCode();
if (enterpriseAuditRepo.existsByUnifiedSocialCodeAndDelFlagAndEnterpriseIdNot(unifiedSocialCode, (short) 0, enterpriseId)
|| enterpriseRepo.existsByUnifiedSocialCodeAndDelFlag(unifiedSocialCode, (short) 0))
throw new RuntimeException("社会统一信用代码【" + unifiedSocialCode + "】在企业上报审核/企业信息管理已存在");
String legalPhone = enterpriseAudit.getLegalPhone();
if (enterpriseAuditRepo.existsByLegalPhoneAndDelFlagAndEnterpriseIdNot(legalPhone, (short) 0, enterpriseId)
|| enterpriseRepo.existsByLegalPhoneAndDelFlag(legalPhone, (short) 0))
throw new RuntimeException("联系电话【" + legalPhone + "】在企业上报审核/企业信息管理已存在");
EnterpriseHistory history = new EnterpriseHistory();
BeanUtils.copyProperties(audit, history);
history.setTheType("普通修改");
if (null != user) {
history.setHistoryTime(now);
history.setTheUserName(user.getXm());
history.setTheUserName(user.getYhwybs());
}
history.setHistorySide("2");
enterpriseHistoryRepo.save(history);
//测试使用
// enterpriseRepo.findById(audit.getEnterpriseId()).ifPresent(enterprise -> uploadEnterprise(enterprise, user));
} else if ("audit".equals(type)) {
EnterpriseAudit audit = enterpriseAuditRepo.findById(enterpriseId).orElseThrow(() -> new RuntimeException("单位信息不存在"));
String unifiedSocialCode = audit.getUnifiedSocialCode();
if (enterpriseAuditRepo.existsByUnifiedSocialCodeAndDelFlagAndEnterpriseIdNot(unifiedSocialCode, (short) 0, enterpriseId)
|| enterpriseRepo.existsByUnifiedSocialCodeAndDelFlag(unifiedSocialCode, (short) 0))
throw new RuntimeException("社会统一信用代码【" + unifiedSocialCode + "】在企业上报审核/企业信息管理已存在");
String legalPhone = audit.getLegalPhone();
if (enterpriseAuditRepo.existsByLegalPhoneAndDelFlagAndEnterpriseIdNot(legalPhone, (short) 0, enterpriseId)
|| enterpriseRepo.existsByLegalPhoneAndDelFlag(legalPhone, (short) 0))
throw new RuntimeException("联系电话【" + legalPhone + "】在企业上报审核/企业信息管理已存在");
EnterpriseHistory history = new EnterpriseHistory();
BeanUtils.copyProperties(audit, history);
history.setTheType("审核");
if (null != user) {
history.setHistoryTime(now);
history.setTheUserName(user.getXm());
history.setTheUserName(user.getYhwybs());
audit.setAuditTime(now);
audit.setAuditNickName(user.getXm());
audit.setAuditUserName(user.getYhwybs());
audit.setModifyNickName(user.getXm());
audit.setModifyUserName(user.getYhwybs());
}
history.setHistorySide("2");
enterpriseHistoryRepo.save(history);
audit.setAuditStatus(enterpriseAudit.getAuditStatus());
audit.setAuditTime(enterpriseAudit.getAuditTime());
audit.setAuditOpinion(enterpriseAudit.getAuditOpinion());
audit.setModifyTime(now);
if ("1".equals(enterpriseAudit.getAuditStatus())) {
Enterprise enterprise = new Enterprise();
BeanUtils.copyProperties(audit, enterprise);
enterprise.setOperate("add");
enterpriseService.saveEnterprise(enterprise, user);
uploadEnterprise(enterprise, user);
}
// 检验加密签名保存
StringBuilder signOrg = new StringBuilder();
Optional.ofNullable(audit.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(audit.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(audit.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(audit.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s -> audit.setSginData(KmsServer.kmsSign(s)));
return enterpriseAuditRepo.save(audit);
} else {
String unifiedSocialCode = enterpriseAudit.getUnifiedSocialCode();
if (enterpriseAuditRepo.existsByUnifiedSocialCodeAndDelFlag(unifiedSocialCode, (short) 0)
|| enterpriseRepo.existsByUnifiedSocialCodeAndDelFlag(unifiedSocialCode, (short) 0))
throw new RuntimeException("社会统一信用代码【" + unifiedSocialCode + "】在企业上报审核/企业信息管理已存在");
String legalPhone = enterpriseAudit.getLegalPhone();
if (enterpriseAuditRepo.existsByLegalPhoneAndDelFlag(legalPhone, (short) 0)
|| enterpriseRepo.existsByLegalPhoneAndDelFlag(legalPhone, (short) 0))
throw new RuntimeException("联系电话【" + legalPhone + "】在企业上报审核/企业信息管理已存在");
enterpriseAudit.setEntryTime(now);
enterpriseAudit.setAuditStatus("0");
if (!StringUtils.hasText(enterpriseAudit.getBusinessCategory())) {
if ("5".equals(enterpriseAudit.getIndustryType()))
enterpriseAudit.setBusinessCategory("2");
else enterpriseAudit.setBusinessCategory("1");
}
if (null != user) {
enterpriseAudit.setEntryNickName(user.getXm());
enterpriseAudit.setEntryUserName(user.getYhwybs());
enterpriseAudit.setModifyNickName(user.getXm());
enterpriseAudit.setModifyUserName(user.getYhwybs());
}
}
enterpriseAudit.setModifyTime(now);
// 检验加密签名保存
StringBuilder signOrg = new StringBuilder();
Optional.ofNullable(enterpriseAudit.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(enterpriseAudit.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(enterpriseAudit.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.ofNullable(enterpriseAudit.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append);
Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s -> enterpriseAudit.setSginData(KmsServer.kmsSign(s)));
EnterpriseAudit save = enterpriseAuditRepo.save(enterpriseAudit);
List<AdministrativeLicense> administrativeLicenseInfos = enterpriseAudit.getAdministrativeLicenseInfos();
if (null != administrativeLicenseInfos && !administrativeLicenseInfos.isEmpty())
administrativeLicenseService.saveAdministrativeLicense(administrativeLicenseInfos, save.getEnterpriseId());
return save;
}
/**
* 批量保存企业审核信息
*
* @param enterpriseAudits 企业审核信息列表
* @return 保存后的企业审核信息列表
*/
@Transactional
public List<EnterpriseAudit> saveEnterpriseAudits(List<EnterpriseAudit> enterpriseAudits) {
return enterpriseAuditRepo.saveAll(enterpriseAudits);
}
/**
* 根据ID查询企业审核信息
*
* @param enterpriseId 企业ID
* @return 企业审核信息
*/
public Optional<EnterpriseAudit> findEnterpriseAuditById(String enterpriseId) {
return enterpriseAuditRepo.findById(enterpriseId).map(enterprise -> {
List<AdministrativeLicense> administrativeLicenses = Optional.ofNullable(administrativeLicenseService.findAllByEnterpriseId(enterpriseId))
.filter(list -> !list.isEmpty())
.orElseGet(() -> new ArrayList<>(Collections.singletonList(new AdministrativeLicense())));
enterprise.setAdministrativeLicenseInfos(administrativeLicenses);
return enterprise;
});
}
/**
* 查询所有企业审核信息
*
* @return 企业审核信息列表
*/
public List<EnterpriseAudit> findAllEnterpriseAudits(EnterpriseQuery query) {
return enterpriseAuditRepo.findAll(buildSpecification(query));
}
/**
* 分页查询企业审核信息
*
* @param pageRequest 分页请求
* @return 分页企业审核信息
*/
public Page<EnterpriseAudit> findEnterpriseAuditsPage(PageRequest pageRequest) {
return enterpriseAuditRepo.findAll(pageRequest);
}
/**
* 根据查询条件分页查询企业审核信息
*
* @param query 查询条件
* @return 分页企业审核信息
*/
public Page<EnterpriseAudit> findEnterpriseAuditsPage(EnterpriseQuery query) {
Specification<EnterpriseAudit> spec = buildSpecification(query);
// 构建分页和排序
PageRequest pageRequest;
if (StringUtils.hasText(query.sort())) {
Sort.Direction direction = "desc".equalsIgnoreCase(query.dir()) ? Sort.Direction.DESC : Sort.Direction.ASC;
Sort sort = Sort.by(direction, query.sort());
pageRequest = PageRequest.of(query.page() - 1, query.pageSize(), sort);
} else {
pageRequest = PageRequest.of(query.page() - 1, query.pageSize());
}
return enterpriseAuditRepo.findAll(spec, pageRequest);
}
/**
* 构建查询条件
*
* @param query 查询条件
* @return 规格
*/
private Specification<EnterpriseAudit> buildSpecification(EnterpriseQuery query) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getDynamicRiskLevel()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.dynamicRiskLevel), o)));
Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.enterpriseId), o)));
Optional.ofNullable(query.getUnitName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.unitName), "%" + o + "%")));
Optional.ofNullable(query.getUnifiedSocialCode()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.unifiedSocialCode), "%" + o + "%")));
Optional.ofNullable(query.getAgency()).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.agency).get(Agency_.agencyCode), com.aisino.iles.common.util.StringUtils.trimEven0(o.getAgencyCode()) + "%")));
Optional.ofNullable(query.getAgencyCode()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.agency).get(Agency_.agencyCode), com.aisino.iles.common.util.StringUtils.trimEven0(o) + "%")));
Optional.ofNullable(query.getIndustryType()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.industryType), o)));
Optional.ofNullable(query.getRiskCategory()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.riskCategory), o)));
Optional.ofNullable(query.getLegalRepresentative()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.legalRepresentative), "%" + o + "%")));
Optional.ofNullable(query.getContactPhone()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.contactPhone), o)));
Optional.ofNullable(query.getContactPhone()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.contactPhone), o)));
Optional.ofNullable(query.getBusinessStatus()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.businessStatus), o)));
Optional.ofNullable(query.getContactPerson()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.contactPerson), "%" + o + "%")));
Optional.ofNullable(query.getMainName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.mainName), "%" + o + "%")));
Optional.ofNullable(query.getDetailedAddress()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(EnterpriseAudit_.detailedAddress), "%" + o + "%")));
Optional.ofNullable(query.getUnitType()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.unitType), o)));
Optional.ofNullable(query.getOperationStatus()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.operationStatus), o)));
Optional.ofNullable(query.getBusinessRating()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.businessRating), o)));
Optional.ofNullable(query.getBusinessCategory()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(EnterpriseAudit_.businessCategory), o)));
Optional.ofNullable(query.getEstablishmentDateList()).filter(f -> f.length == 2).map(f -> {
List<Predicate> ts = new ArrayList<>();
Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get(EnterpriseAudit_.establishmentDate), from)).ifPresent(ts::add);
Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get(EnterpriseAudit_.establishmentDate), to)).ifPresent(ts::add);
return ts;
}).ifPresent(predicates::addAll);
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
/**
* 根据ID删除企业审核信息
*
* @param enterpriseId 企业ID
*/
@Transactional
public void deleteEnterpriseAuditById(String enterpriseId) {
enterpriseAuditRepo.deleteById(enterpriseId);
}
/**
* 批量删除企业审核信息
*
* @param enterpriseIds 企业ID列表
*/
@Transactional
public void deleteEnterpriseAuditsByIds(List<String> enterpriseIds) {
enterpriseAuditRepo.deleteAllById(enterpriseIds);
}
/**
* 检查企业审核信息是否存在
*
* @param enterpriseId 企业ID
* @return 是否存在
*/
public boolean existsEnterpriseAuditById(String enterpriseId) {
return enterpriseAuditRepo.existsById(enterpriseId);
}
public void uploadEnterprise(Enterprise enterprise, RemoteUserInfo user) {
EnterpriseInterfaceDto dto = new EnterpriseInterfaceDto();
dto.setCjrYhwybs(enterprise.getEntryUserName());//创建人用户唯一标识
dto.setCjsj(enterprise.getEntryTime());//创建时间
dto.setGxrYhwybs(enterprise.getModifyUserName());//更新人用户唯一标识
dto.setGxsj(enterprise.getModifyTime());//更新时间
dto.setSjyxx("1");//数据有效性(1:有效 0:无效)
dto.setQybh(null);//企业编号
dto.setQymc(enterprise.getUnitName());//企业名称
dto.setTyshxydm(enterprise.getUnifiedSocialCode());//统一社会信用代码
String economicType = enterprise.getEconomicType();
if (StringUtils.hasText(economicType)) {//经济类型分类代码
switch (economicType) {
case "1" -> dto.setJjlxfldm("110");
case "2" -> dto.setJjlxfldm("120");
case "3" -> dto.setJjlxfldm("130");
case "4" -> dto.setJjlxfldm("140");
case "5" -> dto.setJjlxfldm("150");
case "6" -> dto.setJjlxfldm("160");
case "7" -> dto.setJjlxfldm("170");
case "8" -> dto.setJjlxfldm("190");
case "9" -> dto.setJjlxfldm("290");
case "10" -> dto.setJjlxfldm("310");
case "11" -> dto.setJjlxfldm("330");
case "12" -> dto.setJjlxfldm("159");
}
}
if (null != enterprise.getEstablishmentDate())
dto.setClrq(enterprise.getEstablishmentDate().atTime(0, 0, 0));//成立日期
dto.setFddbrRybh(null);//法定代表人人员编号
dto.setQyjc(enterprise.getShortName());//企业简称
dto.setQygm(enterprise.getUnitScale());//企业规模代码
dto.setZgrs(enterprise.getEmployeeCount());//职工人数
dto.setZcdzXxdz(enterprise.getDetailedAddress());//注册地址详细地址
dto.setZcdzXzqhdm(enterprise.getAreaComb());//注册地址行政区划代码
if (null != enterprise.getRegisteredCapital())
dto.setZczb(enterprise.getRegisteredCapital().setScale(0, RoundingMode.DOWN).longValue());//注册资本
dto.setScjydzXxdz(enterprise.getOpLocAddress());//生产经营地址详细地址
dto.setScjydzXzqhdm(enterprise.getOpLocAreaComb());//生产经营地址行政区划代码
dto.setScjydzJd(null != enterprise.getLongitude() ? String.valueOf(enterprise.getLongitude()) : null);//经营地址经度
dto.setScjydzWd(null != enterprise.getLatitude() ? String.valueOf(enterprise.getLatitude()) : null);//经营地址纬度
dto.setJyfw(enterprise.getOpScope());//经营范围
if (null != enterprise.getExpiryDate())
dto.setYyqx(enterprise.getExpiryDate().atTime(0, 0, 0));//营业期限
dto.setYygldwZzjgdm(enterprise.getAgency().getAgencyCode());//发证机关代码
dto.setFzjgdm(enterprise.getOrgCode());
dto.setYyzt("11".equals(enterprise.getBusinessStatus()) ? "1" : "9");//1-正常存续在营开业注册设立2-异常未年报未年检证书逾期未年度考核3-吊销4-注销/撤销9-其他
dto.setQyLxdh(enterprise.getMainPhone());//企业注册固定电话
dto.setLxrRybh(null);//联系人-人员编号关联
dto.setQyfzrRybh(null);//企业负责人-人员编号关联
//1-煤矿 2-非煤矿山 3-危险化学品 4-烟花爆竹 5-工贸行业 99-其他
String industryType = enterprise.getIndustryType();
//1-工贸企业 2-危化企业 3-矿山企业 4-建筑施工企业 5-民用爆炸物企业 6-食品药品企业 7-交通运输企业
//1-矿山 2-危险化学品生产 3-危险化学品经营 4-危险化学品经营 5-加油站 6-工业企业 7-商贸企业 8-安全生产中介机构 9-安全生产检验检测机构 10-安全生产培训机构 99-其他
if (StringUtils.hasText(industryType)) {//管理类型代码
if (industryType.equals("1")) dto.setGllx("3");
if (industryType.equals("2")) dto.setGllx("2");
if (industryType.equals("3")) dto.setGllx("2");
if (industryType.equals("4")) dto.setGllx("2");
if (industryType.equals("6")) dto.setGllx("1");
if (industryType.equals("7")) dto.setGllx("1");
else dto.setGllx(null);
}
if (StringUtils.hasText(enterprise.getEconCategoryTypec()))
dto.setGmjjhyfldm(enterprise.getEconCategoryTypec());//国民经济行业分类代码国民经济行业分类GB/T 47542017
else if (StringUtils.hasText(enterprise.getEconCategoryTypeb()))
dto.setGmjjhyfldm(enterprise.getEconCategoryTypeb());
dto.setLxrxm(enterprise.getLegalRepresentative());//企业联系人
dto.setQyfzrxm(enterprise.getMainName());//企业负责人姓名
String accessToken = user.getAccessToken().getAccess_token();
String tokenType = user.getAccessToken().getToken_type();
String clientId = ssoClientProperties.getClientId();
log.info("url{}, token{}, clientId{}", saveUrl, accessToken, clientId);
try {
String body = HttpRequest.post(saveUrl)
.header("Content-Type", "application/json") // 设置 Content-Type JSON
.header("Authorization", tokenType + " " + accessToken) // 添加 appToken 请求头
.header("appId", clientId) // 添加 appId 请求头
.body(JSONUtil.toJsonStr(dto)) // dto 转换为 JSON 字符串作为请求体
.execute().body();
log.info("企业信息上传结果:{}", body);
} catch (Exception e) {
log.info("企业信息上报失败:" + e);
}
}
}

View File

@ -0,0 +1,49 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.lawenforcement.model.EnterpriseCamera;
import com.aisino.iles.lawenforcement.repository.EnterpriseCameraRepository;
import jakarta.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
/**
* 企业信息服务类
*/
@Slf4j
@Service
public class EnterpriseCameraService {
private final EnterpriseCameraRepository enterpriseCameraRepository;
public EnterpriseCameraService(EnterpriseCameraRepository enterpriseCameraRepository) {
this.enterpriseCameraRepository = enterpriseCameraRepository;
}
/**
* 分页查询企业监控点信息
*
* @param uscc
* @return
*/
public List<EnterpriseCamera> findEnterpriseCamera(String uscc) {
return enterpriseCameraRepository.findAll(buildSpecification(uscc));
// .map(this::handleResult);
}
private Specification<EnterpriseCamera> buildSpecification(String uscc) {
return Specification.where((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(uscc).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get("unifiedSocialCode"), o)));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
});
}
}

View File

@ -0,0 +1,145 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.common.util.PageableHelper;
import com.aisino.iles.lawenforcement.model.*;
import com.aisino.iles.lawenforcement.model.query.EnterpriseQuery;
import com.aisino.iles.lawenforcement.repository.AccidentHazardRepository;
import com.aisino.iles.lawenforcement.repository.DangerInfoRepository;
import com.aisino.iles.lawenforcement.repository.DocumentRepository;
import com.aisino.iles.lawenforcement.repository.EnterpriseRepository;
import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.persistence.criteria.Predicate;
import lombok.Data;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@Service
public class EnterpriseSubtableService {
private final DocumentRepository documentRepo;
private final AccidentHazardRepository accidentHazardRepo;
private final DangerInfoRepository dangerInfoRepo;
private final EnterpriseRepository enterpriseRepo;
public EnterpriseSubtableService(DocumentRepository documentRepo,
AccidentHazardRepository accidentHazardRepo,
DangerInfoRepository dangerInfoRepo,
EnterpriseRepository enterpriseRepo) {
this.documentRepo = documentRepo;
this.accidentHazardRepo = accidentHazardRepo;
this.dangerInfoRepo = dangerInfoRepo;
this.enterpriseRepo = enterpriseRepo;
}
/**
* 重大事故隐患信息
*
* @param query 查询参数
* @return 结果
*/
@Transactional(readOnly = true)
public Page<DocumentDto> findCasePage(EnterpriseQuery query) {
return documentRepo.findAll(buildDocument(query),
PageableHelper.buildPageRequest(query.page(), query.pageSize(), "documentDate", "desc"))
.map(document -> {
DocumentDto dto = new DocumentDto();
Map<String, Object> map = document.getDocumenContent();
String cf = String.valueOf(map.get("cf"));
dto.setDocumentId(document.getDocumentId());
Optional.ofNullable(document.getCaseInfo().getEnterpriseId())
.flatMap(enterpriseRepo::findById).ifPresent(enterprise -> dto.setPenaltyUnit(enterprise.getUnitName()));
dto.setCaseName(document.getCaseInfo().getCaseName());
dto.setPenaltyRes(cf);
dto.setPenaltyTime(LocalDate.now());
return dto;
});
}
@Data
public static class DocumentDto {
/**
* 文书ID
*/
private String documentId;
/**
* 处罚单位
*/
private String penaltyUnit;
/**
* 涉案种类
*/
private String caseKind;
/**
* 案件名称
*/
private String caseName;
/**
* 处罚结果
*/
private String penaltyRes;
/**
* 处罚结果
*/
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate penaltyTime;
}
private Specification<Document> buildDocument(EnterpriseQuery query) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Document_.caseInfo).get(Case_.enterpriseId), o)));
// predicates.add(criteriaBuilder.equal(root.get(Document_.status), Document.DocumentStatus.done));
predicates.add(criteriaBuilder.equal(root.get(Document_.documentNo), 28));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
/**
* 重大事故隐患信息
*
* @param query 查询参数
* @return 结果
*/
public Page<AccidentHazard> findAccidentHazardPage(EnterpriseQuery query) {
return accidentHazardRepo.findAll(buildAccidentHazard(query),
PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createdon", "desc"));
}
private Specification<AccidentHazard> buildAccidentHazard(EnterpriseQuery query) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(AccidentHazard_.enterpriseId), o)));
predicates.add(criteriaBuilder.equal(root.get(AccidentHazard_.deletestatus), 0L));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
/**
* 重大危险源
*
* @param query 查询参数
* @return 结果
*/
public Page<DangerInfo> findDangerPage(EnterpriseQuery query) {
return dangerInfoRepo.findAll(buildDanger(query),
PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createdon", "desc"));
}
private Specification<DangerInfo> buildDanger(EnterpriseQuery query) {
return (root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(DangerInfo_.enterpriseId), o)));
predicates.add(criteriaBuilder.equal(root.get(DangerInfo_.deletestatus), 0L));
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
}

View File

@ -0,0 +1,69 @@
package com.aisino.iles.lawenforcement.service;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.aisino.iles.lawenforcement.model.EnterpriseWarn;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
@Slf4j
@Component
@RequiredArgsConstructor
public class EnterpriseWarnKafka {
private final EnterpriseWarnService enterpriseWarnService;
@KafkaListener(topics = "zhyj_hkspfx_sjbw", groupId = "zhzf-group")
public void listenToMessage(String message, Acknowledgment acknowledgment) {
log.info("kafka监听到的消息" + message);
try {
JSONObject jsonObject = JSONUtil.parseObj(message);
if (jsonObject != null) {
log.info("kafka监听到的消息--开始解析数据:" + jsonObject);
JSONObject params = jsonObject.getJSONObject("params");
if (params != null) {
params.getJSONArray("events")
.forEach(item -> {
JSONObject event = JSONUtil.parseObj(item);
if (event != null) {
JSONObject data = event.getJSONObject("data");
EnterpriseWarn enterpriseWarn = new EnterpriseWarn();
if (data != null) {
enterpriseWarn.setLat(data.getStr("latitude"));
enterpriseWarn.setLng(data.getStr("longitude"));
}
enterpriseWarn.setAlarmId(event.getStr("eventId"));
enterpriseWarn.setApiType(event.getStr("eventTypeCode"));
enterpriseWarn.setEventDesc(event.getStr("eventName"));
enterpriseWarn.setCameraName(event.getStr("srcName"));
enterpriseWarn.setAddress(event.getStr("srcName"));
enterpriseWarn.setInternationalCode(event.getStr("externalIndexCode"));
enterpriseWarn.setImageUrl("https://10.17.97.98" + event.getStr("snappedPicUrl"));
LocalDateTime time = ZonedDateTime.parse(event.getStr("happenTime")).toLocalDateTime();
enterpriseWarn.setTime(time);
// enterpriseWarn.setVideoUrl(event.getStr("snappedPicUrl"));
// enterpriseWarn.setStreetcode(enterpriseWarnDto.getStreetcode());
// enterpriseWarn.setStreet(enterpriseWarnDto.getStreet());
enterpriseWarn.setConfidence(event.getStr("similarity"));
enterpriseWarn.setJudgment(1);
enterpriseWarn.setRemark(event.getStr("remark"));
enterpriseWarnService.saveEnterpriseWarn(enterpriseWarn);
}
});
acknowledgment.acknowledge();
log.info("kafka监听到的消息--数据保存成功。");
}
}
log.info("kafka监听到的消息--结束解析数据。");
} catch (Exception e) {
log.info("视频智能分析--对外对接第三方数据接口;保存失败:{}", e.getMessage());
}
}
}

View File

@ -0,0 +1,98 @@
package com.aisino.iles.lawenforcement.service;
import com.aisino.iles.common.util.PageableHelper;
import com.aisino.iles.lawenforcement.model.EnterpriseWarn;
import com.aisino.iles.lawenforcement.model.dto.EnterpriseWarnDto;
import com.aisino.iles.lawenforcement.model.query.EnterpriseWarnQuery;
import com.aisino.iles.lawenforcement.repository.EnterpriseWarnRepository;
import jakarta.persistence.criteria.Predicate;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
/**
* 企业信息服务类
*/
@Slf4j
@Service
public class EnterpriseWarnService {
private final EnterpriseWarnRepository enterpriseWarnRepository;
public EnterpriseWarnService(EnterpriseWarnRepository enterpriseWarnRepository) {
this.enterpriseWarnRepository = enterpriseWarnRepository;
}
@Transactional
public void saveEnterpriseWarn(EnterpriseWarnDto enterpriseWarnDto) {
EnterpriseWarn enterpriseWarn = new EnterpriseWarn();
enterpriseWarn.setAlarmId(enterpriseWarnDto.getAlarmId().toString());
enterpriseWarn.setApiType(enterpriseWarnDto.getApiType().toString());
enterpriseWarn.setEventDesc(enterpriseWarnDto.getEventDesc());
enterpriseWarn.setCameraName(enterpriseWarnDto.getCameraName());
enterpriseWarn.setAddress(enterpriseWarnDto.getAddress());
enterpriseWarn.setInternationalCode(enterpriseWarnDto.getInternationalCode());
enterpriseWarn.setLat(enterpriseWarnDto.getLat().toString());
enterpriseWarn.setLng(enterpriseWarnDto.getLng().toString());
enterpriseWarn.setImageUrl(enterpriseWarnDto.getImageUrl());
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime time = LocalDateTime.parse(enterpriseWarnDto.getTime(), formatter);
enterpriseWarn.setTime(time);
enterpriseWarn.setVideoUrl(enterpriseWarnDto.getVideoUrl());
enterpriseWarn.setStreetcode(enterpriseWarnDto.getStreetcode());
enterpriseWarn.setStreet(enterpriseWarnDto.getStreet());
enterpriseWarn.setConfidence(enterpriseWarnDto.getConfidence().toString());
enterpriseWarn.setJudgment(enterpriseWarnDto.getJudgment());
try {
enterpriseWarnRepository.save(enterpriseWarn);
}catch (Exception e) {
log.info("企业预警信息保存失败:{}", e);
}
}
@Transactional
public void saveEnterpriseWarn(EnterpriseWarn enterpriseWarn) {
enterpriseWarnRepository.save(enterpriseWarn);
}
/**
* 分页查询企业预警信息
*
* @param query
* @return
*/
public Page<EnterpriseWarn> findEnterpriseWarnPage(EnterpriseWarnQuery query) {
return enterpriseWarnRepository
.findAll(buildSpecification(query), PageableHelper.buildPageRequest(query.page(), query.pageSize(), query.sort(), query.dir()));
// .map(this::handleResult);
}
private Specification<EnterpriseWarn> buildSpecification(EnterpriseWarnQuery query) {
return Specification.where((root, criteriaQuery, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
// Optional.ofNullable(query.getUnifiedSocialCode())
// .ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get("agency"), StringUtils.trimEven0(o) + "%")));
// Optional.ofNullable(query.getCreateTimeArr()).filter(f -> f.length == 2).map(f -> {
// List<Predicate> ts = new ArrayList<>();
// Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get(EnforcementInfo_.createTime), from)).ifPresent(ts::add);
// Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get(EnforcementInfo_.createTime), to)).ifPresent(ts::add);
// return ts;
// }).ifPresent(predicates::addAll);
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
});
}
// private EnforcementInfo handleResult(EnforcementInfo enforcementInfoDto) {
// Optional.ofNullable(enforcementInfoDto.getEnterprise()).ifPresent(enterprise -> enterprise.getUnitName());
// Optional.ofNullable(enforcementInfoDto.getAgency()).ifPresent(agency -> agency.getAgencyName());
// return enforcementInfoDto;
// }
}