From 133ef6a2decb5be206edd2cd436a5b2a81a4086e Mon Sep 17 00:00:00 2001 From: renhao02 Date: Fri, 7 Mar 2025 17:32:19 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=89=A7=E6=B3=95=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E3=80=81=E6=89=A7=E6=B3=95=E4=BF=A1=E6=81=AF=E3=80=81?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E4=BF=A1=E6=81=AF=E3=80=81=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=88=86=E7=BA=A7=E5=88=86=E7=B1=BB=E3=80=81=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E4=B8=8A=E6=8A=A5=E5=AE=A1=E6=A0=B8=E7=AD=89=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/EnforceCheckService.java | 680 ++++++++ .../EnforcementInfoHistoryService.java | 377 +++++ .../service/EnforcementInfoService.java | 606 +++++++ .../service/EnterpriseAuditService.java | 400 +++++ .../service/EnterpriseCameraService.java | 49 + .../service/EnterpriseService.java | 1453 +++++++++++++++++ .../service/EnterpriseSubtableService.java | 145 ++ .../service/EnterpriseWarnKafka.java | 69 + .../service/EnterpriseWarnService.java | 98 ++ 9 files changed, 3877 insertions(+) create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnforceCheckService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoHistoryService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseAuditService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseCameraService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseSubtableService.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnKafka.java create mode 100644 server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnService.java diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforceCheckService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforceCheckService.java new file mode 100644 index 0000000..909c05f --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforceCheckService.java @@ -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 saveEnforceCheck(EnforceCheck enforceCheck, RemoteUserInfo user, String type) { + LocalDateTime now = LocalDateTime.now(); + List 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 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 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 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 items = checkItemRepo.findAllById(List.of(arr)); + Map 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 urls = dto.getUrls(); + if (null != urls && !urls.isEmpty()) { + List> list = urls.stream().map(u -> { + Map 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 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 build(EnforceCheckQuery query, RemoteUserInfo user) { + Agency currentAgency = agencyRepository.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!")); + return (root, criteriaQuery, criteriaBuilder) -> { + List 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 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 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 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 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 optional = enforceCheckRepo.findById(enforceCheck.getEnforceCheckId()); + if (optional.isPresent()) { + EnforceCheck e = optional.get(); + Map result = e.getCheckItemResult(); + String itemId = enforceCheck.getItemId(); + if (null != result && result.containsKey(itemId)) { + EnforceCheckScenePicDto dto = objectMapper.convertValue(result.get(itemId), EnforceCheckScenePicDto.class); + List 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 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 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 items = checkItemRepo.findAllById(List.of(arr)); + Map 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 urls = dto.getUrls(); + if (null != urls && !urls.isEmpty()) { + List> list = urls.stream().map(u -> { + Map 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 officerNames = new AtomicReference<>(""); + AtomicReference agencyCodes = new AtomicReference<>(""); + List 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 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 = 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 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 list = spotCheckListRepo.findBySpotId(o.getSpotId()); + List 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 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 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 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(); + } +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoHistoryService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoHistoryService.java new file mode 100644 index 0000000..39e2c41 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoHistoryService.java @@ -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 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 buildSpec(CaseQuery query, RemoteUserInfo user) { + Agency currentAgency = agencyRepo.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!")); + return Specification.where((root, q, criteriaBuilder) -> { + List 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 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 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 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 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 historyList = enforcementInfoHistoryRepository.findAll(buildSpec(query,user)).stream().map(this::transferHistoryInfo).toList(); + List casetoHistoryList = listZflatj(query,user); + List 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 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 buildcaseSpec(CaseQuery query, RemoteUserInfo user) { +// Agency currentAgency = agencyRepo.findByAgencyCode(user.getGajgjgdm()).orElseThrow(() -> new RuntimeException("当前用户机构数据错误,请检查!")); + return Specification.where((root, q, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + Optional.ofNullable(query.getFillingDate()).filter(f -> f.length == 2).map(f -> { + List 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; + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoService.java new file mode 100644 index 0000000..0c2d431 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnforcementInfoService.java @@ -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 saveEnforcementInfo(EnforcementInfoDto enforcementInfoDto, RemoteUserInfo user) { + // 1. 校验企业ID列表是否为空 + List enterpriseIds = enforcementInfoDto.getEnterpriseIds(); + if (CollectionUtils.isEmpty(enterpriseIds)) { + throw new BusinessError("企业信息不能为空!"); + } + List 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> 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> uploadAllFiles(MultipartFile[] files) { + // 1. 转换为List并过滤空文件 + List validFiles = Arrays.stream(files).filter(file -> !file.isEmpty()).collect(Collectors.toList()); + + // 2. 创建上传任务 + List>> uploadFutures = validFiles.stream().map(this::uploadFile).collect(Collectors.toList()); + + // 3. 合并所有Future + CompletableFuture allFutures = CompletableFuture.allOf(uploadFutures.toArray(new CompletableFuture[0])); + + // 4. 获取所有结果 + return allFutures.thenApply(v -> uploadFutures.stream().map(CompletableFuture::join).collect(Collectors.toList())).join(); // 在当前线程等待完成 + } + + // 单个文件上传方法 + private CompletableFuture> 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 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 findEnforcementInfosPage(EnforcementInfoQuery query) { + return enforcementInfoRepository + .findAll(buildSpecification(query), PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createTime", "desc")) + .map(this::handleResult); + } + + private Specification buildSpecification(EnforcementInfoQuery query) { + return Specification.where((root, criteriaQuery, criteriaBuilder) -> { + List 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 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 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 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 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> 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 enforceChecks = enforceCheckRepository.findByEnforcementId(enforcementInfo.getEnforcementId()); + enforceChecks.forEach(enforceCheck -> { + String officerIds = enforceCheck.getOfficerIds(); + if (StringUtils.isNotEmpty(officerIds)) { + List 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 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 enforcementIds) { + // 删除检查信息 + enforcementIds.forEach(enforcementId -> { + List 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); + }); + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseAuditService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseAuditService.java new file mode 100644 index 0000000..05d4c60 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseAuditService.java @@ -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 administrativeLicenseInfos = enterpriseAudit.getAdministrativeLicenseInfos(); + if (null != administrativeLicenseInfos && !administrativeLicenseInfos.isEmpty()) + administrativeLicenseService.saveAdministrativeLicense(administrativeLicenseInfos, save.getEnterpriseId()); + return save; + } + + /** + * 批量保存企业审核信息 + * + * @param enterpriseAudits 企业审核信息列表 + * @return 保存后的企业审核信息列表 + */ + @Transactional + public List saveEnterpriseAudits(List enterpriseAudits) { + return enterpriseAuditRepo.saveAll(enterpriseAudits); + } + + /** + * 根据ID查询企业审核信息 + * + * @param enterpriseId 企业ID + * @return 企业审核信息 + */ + public Optional findEnterpriseAuditById(String enterpriseId) { + return enterpriseAuditRepo.findById(enterpriseId).map(enterprise -> { + List 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 findAllEnterpriseAudits(EnterpriseQuery query) { + return enterpriseAuditRepo.findAll(buildSpecification(query)); + } + + /** + * 分页查询企业审核信息 + * + * @param pageRequest 分页请求 + * @return 分页企业审核信息 + */ + public Page findEnterpriseAuditsPage(PageRequest pageRequest) { + return enterpriseAuditRepo.findAll(pageRequest); + } + + /** + * 根据查询条件分页查询企业审核信息 + * + * @param query 查询条件 + * @return 分页企业审核信息 + */ + public Page findEnterpriseAuditsPage(EnterpriseQuery query) { + Specification 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 buildSpecification(EnterpriseQuery query) { + return (root, criteriaQuery, criteriaBuilder) -> { + List 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 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 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 4754—2017) + 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); + } + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseCameraService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseCameraService.java new file mode 100644 index 0000000..74bc012 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseCameraService.java @@ -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 findEnterpriseCamera(String uscc) { + return enterpriseCameraRepository.findAll(buildSpecification(uscc)); + // .map(this::handleResult); + } + + private Specification buildSpecification(String uscc) { + return Specification.where((root, criteriaQuery, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + Optional.ofNullable(uscc).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get("unifiedSocialCode"), o))); + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }); + } + + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseService.java new file mode 100644 index 0000000..cb8a43f --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseService.java @@ -0,0 +1,1453 @@ +package com.aisino.iles.lawenforcement.service; + + +import cn.hutool.http.HttpRequest; +import cn.hutool.json.JSONUtil; +import com.aisino.iles.common.util.*; +import com.aisino.iles.core.exception.BusinessError; +import com.aisino.iles.lawenforcement.model.*; +import com.aisino.iles.lawenforcement.model.dto.EnterpriseDto; +import com.aisino.iles.lawenforcement.model.dto.EnterpriseStatisticsDto; +import com.aisino.iles.lawenforcement.model.query.EnterpriseQuery; +import com.aisino.iles.lawenforcement.repository.AgencyRepository; +import com.aisino.iles.lawenforcement.repository.EnforceCheckRepository; +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.CriteriaBuilder; +import jakarta.persistence.criteria.Predicate; +import jakarta.persistence.criteria.Root; +import jakarta.persistence.criteria.Subquery; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +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 org.springframework.web.multipart.MultipartHttpServletRequest; + +import java.io.InputStream; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 企业信息服务类 + */ +@Slf4j +@Service +public class EnterpriseService { + + private final EnterpriseRepository enterpriseRepo; + private final EnterpriseHistoryRepository enterpriseHistoryRepo; + private final AgencyRepository agencyRepo; + private final EnforceCheckRepository enforceCheckRepo; + private final AdministrativeLicenseService administrativeLicenseService; + private final SsoClientProperties ssoClientProperties; + private final String selfInsAndSelfReportUrl; + private final DictInterfaceService dictService; + + public EnterpriseService(EnterpriseRepository enterpriseRepo, + EnterpriseHistoryRepository enterpriseHistoryRepo, + AgencyRepository agencyRepo, + EnforceCheckRepository enforceCheckRepo, + AdministrativeLicenseService administrativeLicenseService, + SsoClientProperties ssoClientProperties, + @Value("${third-party.enterprise.selfInsAndSelfReport:}") String selfInsAndSelfReportUrl, + DictInterfaceService dictService) { + this.enterpriseRepo = enterpriseRepo; + this.enterpriseHistoryRepo = enterpriseHistoryRepo; + this.agencyRepo = agencyRepo; + this.enforceCheckRepo = enforceCheckRepo; + this.administrativeLicenseService = administrativeLicenseService; + this.ssoClientProperties = ssoClientProperties; + this.selfInsAndSelfReportUrl = selfInsAndSelfReportUrl; + this.dictService = dictService; + } + + /** + * 保存企业信息 + * + * @param enterprise 企业信息 + * @return 保存后的企业信息 + */ + @Transactional + public Enterprise saveEnterprise(Enterprise enterprise, RemoteUserInfo user) { + LocalDateTime now = LocalDateTime.now(); + if ("update".equals(enterprise.getOperate())) { + String unifiedSocialCode = enterprise.getUnifiedSocialCode(); + String enterpriseId = enterprise.getEnterpriseId(); + if (enterpriseRepo.existsByUnifiedSocialCodeAndDelFlagAndEnterpriseIdNot(unifiedSocialCode, (short) 0, enterpriseId)) + throw new RuntimeException("社会统一信用代码【" + unifiedSocialCode + "】在企业信息管理已存在"); + String legalPhone = enterprise.getLegalPhone(); + if (enterpriseRepo.existsByLegalPhoneAndDelFlagAndEnterpriseIdNot(legalPhone, (short) 0, enterpriseId)) + throw new RuntimeException("联系电话【" + legalPhone + "】在企业上报审核/企业信息管理已存在"); + Optional optional = enterpriseRepo.findById(enterpriseId); + if (optional.isPresent()) { + EnterpriseHistory history = new EnterpriseHistory(); + BeanUtils.copyProperties(optional.get(), history); + history.setTheType("普通修改"); + history.setHistoryTime(now); + if (null != user) { + history.setTheUserName(user.getYhwybs()); + history.setTheUserNickName(user.getXm()); + } + enterpriseHistoryRepo.save(history); + } + } else { + enterprise.setEntryTime(now); + enterprise.setIsRemove((short) 0); + enterprise.setDelFlag((short) 0); + enterprise.setDataSource("1"); + if (null != user) { + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + } + } + enterprise.setModifyTime(now); + if (null != user) { + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + } + if (enterprise.getDataSource().equals("3")) + enterprise.setDataSource("31"); + + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s->enterprise.setSginData(KmsServer.kmsSign(s))); + Enterprise save = enterpriseRepo.save(enterprise); + List administrativeLicenseInfos = enterprise.getAdministrativeLicenseInfos(); + if (null != administrativeLicenseInfos && !administrativeLicenseInfos.isEmpty()) + administrativeLicenseService.saveAdministrativeLicense(administrativeLicenseInfos, save.getEnterpriseId()); + return save; + } + + /** + * 根据ID查询企业信息 + * + * @param enterpriseId 企业ID + * @return 企业信息 + */ + public Optional findEnterpriseById(String enterpriseId) { + return enterpriseRepo.findById(enterpriseId).map(enterprise -> { + List 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 findAllEnterprises(EnterpriseQuery query, RemoteUserInfo user) { + List enterpriseIds = query.getEnterpriseIds(); + if (null != enterpriseIds && !enterpriseIds.isEmpty()) { + return enterpriseRepo.findAllById(enterpriseIds).stream() + .map(enterprise -> { + EnterpriseDto dto = new EnterpriseDto(); + BeanUtils.copyProperties(enterprise, dto); + long l = enforceCheckRepo.countByEnforcementInfo_EnterpriseId(enterprise.getEnterpriseId()); + dto.setCheckNum(l); + dto.setIndustryType(Constants.DictDisplay.hylbMap.get(enterprise.getIndustryType())); + dto.setBusinessStatus(Constants.DictDisplay.yyztMap.get(enterprise.getBusinessStatus())); + dto.setBusinessRating(Constants.DictDisplay.qyfjMap.get(enterprise.getBusinessRating())); + dto.setBusinessCategory(Constants.DictDisplay.qyflMap.get(enterprise.getBusinessCategory())); + return dto; + }).collect(Collectors.toList()); + } + return enterpriseRepo.findAll(buildSpecification(query, user)).stream().map(enterprise -> { + EnterpriseDto dto = new EnterpriseDto(); + BeanUtils.copyProperties(enterprise, dto); + dto.setIndustryType(Constants.DictDisplay.hylbMap.get(enterprise.getIndustryType())); + dto.setBusinessStatus(Constants.DictDisplay.yyztMap.get(enterprise.getBusinessStatus())); + dto.setBusinessRating(Constants.DictDisplay.qyfjMap.get(enterprise.getBusinessRating())); + dto.setBusinessCategory(Constants.DictDisplay.qyflMap.get(enterprise.getBusinessCategory())); + return dto; + }).collect(Collectors.toList()); + } + + /** + * 根据查询条件分页查询企业信息 + * + * @param query 查询条件 + * @return 分页企业信息 + */ + public Page findEnterprisesPage(EnterpriseQuery query, RemoteUserInfo user) { + return enterpriseRepo.findAll(buildSpecification(query, user).and( + Specification.where((r, q, c) -> + q.multiselect( + r.get(Enterprise_.enterpriseId), + r.get(Enterprise_.industryType), + r.get(Enterprise_.unitName), + r.get(Enterprise_.unifiedSocialCode), + r.get(Enterprise_.businessStatus), + r.get(Enterprise_.businessRating), + r.get(Enterprise_.businessCategory), + r.get(Enterprise_.establishmentDate), + r.get(Enterprise_.delFlag), + r.get(Enterprise_.isRemove), + r.get(Enterprise_.detailedAddress), + r.get(Enterprise_.mainName), + r.get(Enterprise_.mainPhone), + r.get(Enterprise_.agency), + r.get(Enterprise_.videoAccess), + r.get(Enterprise_.perceptionAccess), + r.get(Enterprise_.infoAccess), + r.get(Enterprise_.permitAccess), + r.get(Enterprise_.legalRepresentative), + r.get(Enterprise_.legalPhone), + r.get(Enterprise_.unitScale) + ).getRestriction())), + PageableHelper.buildPageRequest(query.page(), query.pageSize(), ("NA".equals(query.getTag()) || "ssj".equals(query.getTag())) ? "businessCategory,enterpriseId" : query.sort(), "desc")) + .map(enterprise -> { + EnterpriseDto dto = new EnterpriseDto(); + BeanUtils.copyProperties(enterprise, dto); + dto.setVideoAccessMsg("1".equals(enterprise.getVideoAccess()) ? "是" : "否"); + dto.setPerceptionAccessMsg("1".equals(enterprise.getPerceptionAccess()) ? "是" : "否"); + dto.setInfoAccessMsg("1".equals(enterprise.getInfoAccess()) ? "是" : "否"); + dto.setPermitAccessMsg("1".equals(enterprise.getPermitAccess()) ? "是" : "否"); + if ("fjfl".equals(query.getTag())) { + long l = enforceCheckRepo.countByEnforcementInfo_EnterpriseId(enterprise.getEnterpriseId()); + dto.setCheckNum(l); + } + return dto; + }); + } + + /** + * 构建查询条件 + * + * @param query 查询条件 + * @return 规格 + */ + private Specification buildSpecification(EnterpriseQuery query, RemoteUserInfo user) { + return (root, criteriaQuery, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + root.join(Enterprise_.agency); + String agencyCode; + if (StringUtils.hasText(query.getAgencyCode())) + agencyCode = com.aisino.iles.common.util.StringUtils.trimEven0(query.getAgencyCode()) + "%"; + else + agencyCode = Optional.ofNullable(query.getAgency()) + .map(o -> com.aisino.iles.common.util.StringUtils.trimEven0(o.getAgencyCode()) + "%") + .orElse(com.aisino.iles.common.util.StringUtils.trimEven0(user.getGajgjgdm()) + "%"); + predicates.add(criteriaBuilder.like(root.get(Enterprise_.agency).get(Agency_.agencyCode), agencyCode)); + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.delFlag), 0)); + Optional.ofNullable(query.getAgencyName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.agency).get(Agency_.agencyName), o + "%"))); + Optional.ofNullable(query.getDynamicRiskLevel()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.dynamicRiskLevel), o))); + Optional.ofNullable(query.getEnterpriseId()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.enterpriseId), o))); + Optional.ofNullable(query.getUnitName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.unitName), "%" + o + "%"))); + Optional.ofNullable(query.getUnifiedSocialCode()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.unifiedSocialCode), "%" + o + "%"))); + Optional.ofNullable(query.getIndustryType()).filter(StringUtils::hasText).ifPresent(industryTypes -> { + String[] industryTypeArray = Arrays.stream(industryTypes.split(",")) + .map(String::trim) + .filter(StringUtils::hasText) + .toArray(String[]::new); + if (industryTypeArray.length > 1) { + predicates.add(root.get(Enterprise_.industryType).in(industryTypeArray)); + } else if (industryTypeArray.length == 1) { + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.industryType), industryTypeArray[0])); + } + }); +// if (!StringUtils.hasText(query.getIndustryType())) { +// CriteriaBuilder.In in = criteriaBuilder.in(root.get(Enterprise_.industryType)); +// categories().forEach(in::value); +// predicates.add(in); +// } + Optional.ofNullable(query.getMajorAccidentHazard()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.majorAccidentHazard), "%" + o + "%"))); + if ("0".equals(query.getMajorDanger())) { + predicates.add(criteriaBuilder.or( + criteriaBuilder.equal(root.get(Enterprise_.majorDanger), "0"), + criteriaBuilder.isNull(root.get(Enterprise_.majorDanger)) + )); + } else + Optional.ofNullable(query.getMajorDanger()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.majorDanger), o))); + Optional.ofNullable(query.getRiskCategory()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.riskCategory), o))); + Optional.ofNullable(query.getLegalRepresentative()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.legalRepresentative), "%" + o + "%"))); + Optional.ofNullable(query.getContactPhone()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.contactPhone), o))); + Optional.ofNullable(query.getContactPhone()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.contactPhone), o))); + Optional.ofNullable(query.getBusinessStatus()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.businessStatus), o))); + Optional.ofNullable(query.getContactPerson()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.contactPerson), "%" + o + "%"))); + Optional.ofNullable(query.getMainName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.mainName), "%" + o + "%"))); + Optional.ofNullable(query.getDetailedAddress()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.detailedAddress), "%" + o + "%"))); + Optional.ofNullable(query.getUnitType()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.unitType), o))); + Optional.ofNullable(query.getOperationStatus()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.operationStatus), o))); + Optional.ofNullable(query.getIsRemove()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.isRemove), o))); + String tag = query.getTag(); + if (!StringUtils.hasText(query.getBusinessCategory()) && "NA".equals(tag)) + predicates.add(criteriaBuilder.notEqual(root.get(Enterprise_.businessCategory), "1")); + Optional.ofNullable(query.getBusinessRating()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.businessRating), o))); + Optional.ofNullable(query.getBusinessCategory()).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.businessCategory), o))); + Optional.ofNullable(query.getEstablishmentDateList()).filter(f -> f.length == 2).map(f -> { + List ts = new ArrayList<>(); + Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get(Enterprise_.establishmentDate), from)).ifPresent(ts::add); + Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get(Enterprise_.establishmentDate), to)).ifPresent(ts::add); + return ts; + }).ifPresent(predicates::addAll); + if (null != query.getIndustryTypes() && !query.getIndustryTypes().isEmpty()) { + CriteriaBuilder.In in = criteriaBuilder.in(root.get(Enterprise_.industryType)); + query.getIndustryTypes().forEach(in::value); + predicates.add(in); + } + Optional.ofNullable(query.getVideoAccess()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.videoAccess), o))); + Optional.ofNullable(query.getPerceptionAccess()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.perceptionAccess), o))); + Optional.ofNullable(query.getInfoAccess()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.infoAccess), o))); + Optional.ofNullable(query.getPermitAccess()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.permitAccess), o))); + Optional.ofNullable(query.getEconCategory()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.econCategory), o))); + Optional.ofNullable(query.getEconCategoryTypeb()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.econCategoryTypeb), o))); + if ("zhjg".equals(tag)) { + /*predicates.add(criteriaBuilder.or( + criteriaBuilder.equal(root.get(Enterprise_.econCategory), "E"), + criteriaBuilder.equal(root.get(Enterprise_.econCategoryTypeb), "851") + ));*/ + // 修改为允许null值的条件 + predicates.add(criteriaBuilder.or( + criteriaBuilder.notEqual(root.get(Enterprise_.econCategory), "E"), + criteriaBuilder.isNull(root.get(Enterprise_.econCategory)) + )); + predicates.add(criteriaBuilder.or( + criteriaBuilder.notEqual(root.get(Enterprise_.econCategoryTypeb), "851"), + criteriaBuilder.isNull(root.get(Enterprise_.econCategoryTypeb)) + )); + } + // predicates.add(criteriaBuilder.equal(root.get(Enterprise_.delFlag), 0L)); + if ("ins_start".equals(tag)) {// 创建子查询:查找存在未结束巡查记录的企业 + Subquery subquery = criteriaQuery.subquery(Long.class); + Root insEnterprseRoot = subquery.from(InsEnterprse.class); + subquery.select(insEnterprseRoot.get("enterprise").get("enterpriseId")) // 假设有关联字段enterprise + .where( + criteriaBuilder.and( + criteriaBuilder.equal(insEnterprseRoot.get("enterprise"), root), // 关联主查询 + criteriaBuilder.lessThanOrEqualTo(insEnterprseRoot.get("validStartTime"), LocalDateTime.now()), + criteriaBuilder.greaterThanOrEqualTo(insEnterprseRoot.get("validEndTime"), LocalDateTime.now()) + ) + ); + // 主查询条件:排除存在未结束巡查记录的企业 + predicates.add(criteriaBuilder.exists(subquery)); + } + if ("ins".equals(tag)) {// 创建子查询:查找存在未结束巡查记录的企业 + Subquery subquery = criteriaQuery.subquery(Long.class); + Root insEnterprseRoot = subquery.from(InsEnterprse.class); + subquery.select(insEnterprseRoot.get("enterprise").get("enterpriseId")) // 假设有关联字段enterprise + .where( + criteriaBuilder.and( + criteriaBuilder.equal(insEnterprseRoot.get("enterprise"), root), // 关联主查询 + criteriaBuilder.greaterThanOrEqualTo(insEnterprseRoot.get("validEndTime"), LocalDateTime.now()) + ) + ); + // 主查询条件:排除存在未结束巡查记录的企业 + predicates.add(criteriaBuilder.not(criteriaBuilder.exists(subquery))); + } + Optional.ofNullable(query.getEntryTimeArr()).filter(f -> f.length == 2).map(f -> { + List ts = new ArrayList<>(); + Optional.ofNullable(f[0]).map(from -> criteriaBuilder.greaterThanOrEqualTo(root.get(Enterprise_.entryTime), from)).ifPresent(ts::add); + Optional.ofNullable(f[1]).map(to -> criteriaBuilder.lessThanOrEqualTo(root.get(Enterprise_.entryTime), to)).ifPresent(ts::add); + return ts; + }).ifPresent(predicates::addAll); + Optional.ofNullable(query.getIsWithin()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.isWithin), o))); + Optional.ofNullable(query.getGyqyfl()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.equal(root.get(Enterprise_.gyqyfl), o))); + Optional.ofNullable(query.getXclx()).filter(StringUtils::hasText).ifPresent(o -> { + if ("1".equals(o)) { + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.videoAccess), o)); + } else if ("2".equals(o)) { + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.perceptionAccess), o)); + } else if ("3".equals(o)) { + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.infoAccess), o)); + } else if ("4".equals(o)) { + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.permitAccess), o)); + } + }); + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } + + /** + * 根据ID删除企业信息 + * + * @param enterpriseId 企业ID + */ + @Transactional + public void deleteEnterpriseById(String enterpriseId, RemoteUserInfo user) { + Enterprise enterprise = new Enterprise(); + enterprise.setEnterpriseId(enterpriseId); + enterprise.setOperate("delete"); + operateEnterprise(enterprise, user); + } + + /** + * 批量删除企业信息 + * + * @param enterpriseIds 企业ID列表 + */ + @Transactional + public void deleteEnterprisesByIds(List enterpriseIds, RemoteUserInfo user) { + enterpriseIds.forEach(enterpriseId -> { + Enterprise enterprise = new Enterprise(); + enterprise.setEnterpriseId(enterpriseId); + enterprise.setOperate("delete"); + operateEnterprise(enterprise, user); + }); + } + + /** + * 检查企业是否存在 + * + * @param enterpriseId 企业ID + * @return 是否存在 + */ + public boolean existsEnterpriseById(String enterpriseId) { + return enterpriseRepo.existsById(enterpriseId); + } + + /** + * 企业信息统计 + * + * @param query 查询条件 + * @param user 当前用户信息 + * @return 统计结果 + */ + public List> ledgerStatistics(EnterpriseQuery query, RemoteUserInfo user) { + String agencyCode = query.getAgencyCode(); + if (!StringUtils.hasText(agencyCode)) agencyCode = user.getGajgjgdm(); + Integer agencyLevel = query.getAgencyLevel(); + if (null == agencyLevel) + agencyLevel = agencyRepo.findByAgencyCode(agencyCode).map(Agency::getAgencyLevel).orElseThrow(() -> new BusinessError("当前用户没有匹配到有效的机构信息")); + String code = com.aisino.iles.common.util.StringUtils.trimEven0(agencyCode) + "%"; + List agencyList = agencyRepo.findLikeAgencyCode(code, agencyLevel).stream().filter(o -> !"01610100000000001".equals(o.getAgencyCode())).toList(); + LocalDateTime[] entryTimeArr = query.getEntryTimeArr(); + List list = (null != entryTimeArr && entryTimeArr.length == 2) ? + enterpriseRepo.ledgerStatisticsByEntryTime(code, entryTimeArr[0], entryTimeArr[1]) : enterpriseRepo.ledgerStatistics(code); + Map> listMap = list.stream().collect(Collectors.groupingBy(EnterpriseStatisticsDto::getAgencyCode)); + Map> mm = new HashMap<>(); + Set map = categories(); + listMap.forEach((key, val) -> { + Map resMap = new HashMap<>(); + map.forEach(k -> { + val.stream().filter(dto -> k.equals(dto.getIndustryType())).findFirst().ifPresentOrElse(dto -> resMap.put(k, dto.getNum()), () -> resMap.put(k, 0L)); + }); + long sum = val.stream().map(EnterpriseStatisticsDto::getNum) + .mapToLong(o -> Long.parseLong(String.valueOf(o))) + .sum(); + resMap.put("total", sum); + mm.put(key, resMap); + }); + return agencyList.stream().map(o -> { + Map resMap = new HashMap<>(); + resMap.put("agencyCode", o.getAgencyCode()); + resMap.put("agencyName", o.getAgencyName()); + resMap.put("agencyLevel", o.getAgencyLevel()); + resMap.put("hasChildren", o.getLeaf() ? 0 : 1); + Set set = mm.keySet().stream().filter(v -> v.length() >= o.getAgencySimpleCode().length()) + .filter(v -> Objects.equals(v.substring(0, o.getAgencySimpleCode().length()), o.getAgencySimpleCode()))//过滤掉截取后不相同的数据 + .collect(Collectors.toSet()); + // 累加相同属性的值 + Map mapSum = set.stream() + .flatMap(str -> mm.get(str).entrySet().stream()) + .collect(Collectors.toMap( + Map.Entry::getKey, + Map.Entry::getValue, + (v1, v2) -> (Long) v1 + (Long) v2 + )); + if (mapSum.isEmpty()) { + map.forEach(k -> resMap.put(k, 0L)); + resMap.put("total", 0L); + } else { + resMap.putAll(mapSum); + } + return resMap; + }).collect(Collectors.toList()); + } + + /** + * 企业管理可视化统计 + * + * @param query 查询参数 + * @param user 用户 + * @return 统计结果 + */ + public Map visualizeStatistics(EnterpriseQuery query, RemoteUserInfo user) { + String agencyCode = com.aisino.iles.common.util.StringUtils.trimEven0(user.getGajgjgdm()) + "%"; + List list = enterpriseRepo.visualizeStatistics(agencyCode); + Map res = new HashMap<>(); + Set categories = categories(); + list.stream().filter(o -> categories.contains(o.getIndustryType())).forEach(o -> res.put(o.getIndustryType(), o.getNum())); + res.put("total", list.stream().mapToLong(o -> Long.parseLong(String.valueOf(o.getNum()))).sum()); + categories.stream().filter(o -> !res.containsKey(o)).forEach(o -> res.put(o, 0L)); + Long structures = enterpriseRepo.buildingConstruction(agencyCode); + Long hospital = enterpriseRepo.hospital(agencyCode); + Long ohter = enterpriseRepo.ohter(agencyCode); + res.put("structures", structures); + res.put("hospital", hospital); + res.put("ohter", ohter); + return res; + } + + private Set categories() { + return new HashSet<>(Constants.DictDisplay.hylbMap.keySet()); + } + + @Transactional + public Enterprise operateEnterprise(Enterprise enterprise, RemoteUserInfo user) { + LocalDateTime now = LocalDateTime.now(); + String operate = enterprise.getOperate(); + Enterprise save = new Enterprise(); + enterpriseRepo.findById(enterprise.getEnterpriseId()).ifPresent(o -> { + BeanUtils.copyProperties(o, save); + String msg = ""; + if ("remove".equals(operate)) { + save.setIsRemove((short) 1); + msg = "移除计划清单"; + } else if ("join".equals(operate)) { + save.setIsRemove((short) 0); + msg = "加入计划清单"; + } else if ("delete".equals(operate)) { + save.setDeleteTime(now); + save.setDelFlag((short) 1); + msg = "删除"; + } else if ("tune".equals(operate)) { + save.setBusinessRating(enterprise.getBusinessRating()); + save.setBusinessCategory(enterprise.getBusinessCategory()); + msg = "分级分类调整"; + } + EnterpriseHistory history = new EnterpriseHistory(); + BeanUtils.copyProperties(o, history); + history.setTheType(msg); + history.setHistoryTime(now); + if (null != user) { + history.setTheUserName(user.getYhwybs()); + history.setTheUserNickName(user.getXm()); + } + enterpriseHistoryRepo.save(history); + }); + save.setModifyTime(now); + if (null != user) { + save.setModifyUserName(user.getYhwybs()); + save.setModifyNickName(user.getXm()); + } + return enterpriseRepo.save(save); + } + + @Transactional + public void enterpriseByImport(MultipartHttpServletRequest request, RemoteUserInfo user) throws Exception { + List files = request.getFiles("file"); + String lx = request.getParameter("lx"); + if (files.isEmpty()) + throw new BusinessError("导入的文件不能为空"); + MultipartFile file = files.get(0); + InputStream is = file.getInputStream(); + List list = ExportExcelUtil.parseExcelToList(is, Objects.requireNonNull(file.getOriginalFilename())); + if ("0".equals(lx)) localImport(user, list); + else if ("1".equals(lx)) remoteImportOne(user, list); + else if ("2".equals(lx)) remoteImportTwo(user, list); + else if ("3".equals(lx)) remoteImportThree(user, list); + else if ("4".equals(lx)) remoteImportFour(user, list); + } + + private void localImport(RemoteUserInfo user, List list) { + if (null == list || list.isEmpty() || list.size() < 3) + throw new BusinessError("上传的文件无效或数据为空"); + List enterprises = new ArrayList<>(); + for (int i = 2; i < list.size(); i++) { + Object[] temp = list.get(i); + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String unitName = ((String) temp[0]); + String unifiedSocialCode = ((String) temp[1]);//统一社会信用代码 + String regulatedIndustry = ((String) temp[2]);//国民经济行业分类与代码(GB/T 4754-2002) + String agencyCode = ((String) temp[3]);//所属监管部门编码 + String businessStatus = String.valueOf(temp[4]);//营业状态代码 + String industryType = ((String) temp[5]);//监管行业代码 + String areaComb = ((String) temp[6]);//注册地址区县代码 + String detailedAddress = ((String) temp[7]);//注册地详址 + String opLocAreaComb = ((String) temp[8]);//经营地址区县代码 + String opLocAddress = ((String) temp[9]);//经营地详址 + String businessRating = ((String) temp[10]);//企业分级 + String businessCategory = ((String) temp[11]);//企业分级 + String legalRepresentative = ((String) temp[12]);//法定代表人(经营者)姓名 + String legalPhone = ((String) temp[13]);//联系电话 + String legalDuty = ((String) temp[14]);//法定代表人(经营者)职位 + String opScope = ((String) temp[15]);//主营业务 + String oilExtract = ((String) temp[16]);//是否石油开采 + String safetyFocus = ((String) temp[17]);//列入安全生产监管重点企业 + String isScaleEnterprise = ((String) temp[18]);//规模以上生产经营单位 + String safetyLic = ((String) temp[19]);//企业是否有安全生产许可证 + if (null == unitName || !StringUtils.hasText(unitName.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【生产经营单位名称】不能为空,请检查!"); + if (null == unifiedSocialCode || !StringUtils.hasText(unifiedSocialCode.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【统一社会信用代码】不能为空,请检查!"); + if (null == regulatedIndustry || !StringUtils.hasText(regulatedIndustry.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【国民经济行业分类与代码(GB/T 4754-2002)】不能为空,请检查!"); + if (null == agencyCode || !StringUtils.hasText(agencyCode.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【所属监管部门编码】不能为空,请检查!"); + if (null == businessStatus || !StringUtils.hasText(businessStatus.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【营业状态代码】不能为空,请检查!"); + if (null == areaComb || !StringUtils.hasText(areaComb.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【监管行业代码】不能为空,请检查!"); + if (null == detailedAddress || !StringUtils.hasText(detailedAddress.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【注册地址区县代码】不能为空,请检查!"); + if (null == opLocAreaComb || !StringUtils.hasText(opLocAreaComb.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【注册地详址】不能为空,请检查!"); + if (null == opLocAddress || !StringUtils.hasText(opLocAddress.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【经营地址区县代码】不能为空,请检查!"); + if (null == industryType || !StringUtils.hasText(industryType.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【经营地详址】不能为空,请检查!"); + if (null == businessRating || !StringUtils.hasText(businessRating.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【企业分级代码】不能为空,请检查!"); + if (null == businessCategory || !StringUtils.hasText(businessCategory.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【企业分类代码】不能为空,请检查!"); + if (null == legalRepresentative || !StringUtils.hasText(legalRepresentative.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【法定代表人(经营者)姓名】不能为空,请检查!"); + if (null == legalPhone || !StringUtils.hasText(legalPhone.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【联系电话】不能为空,请检查!"); + if (null == legalDuty || !StringUtils.hasText(legalDuty.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【法定代表人(经营者)职位】不能为空,请检查!"); + if (null == opScope || !StringUtils.hasText(opScope.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【主营业务】不能为空,请检查!"); + if (null == oilExtract || !StringUtils.hasText(oilExtract.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【是否石油开采】不能为空,请检查!"); + if (null == safetyFocus || !StringUtils.hasText(safetyFocus.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【列入安全生产监管重点企业】不能为空,请检查!"); + if (null == isScaleEnterprise || !StringUtils.hasText(isScaleEnterprise.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【规模以上生产经营单位】不能为空,请检查!"); + if (null == safetyLic || !StringUtils.hasText(safetyLic.trim())) + throw new BusinessError("上传文件第" + (i + 1) + "行的【企业是否有安全生产许可证】不能为空,请检查!"); + Enterprise enterprise = new Enterprise(); + enterprise.setUnitName(unitName); + enterprise.setUnifiedSocialCode(unifiedSocialCode); + enterprise.setBusinessStatus(businessStatus); + Optional agencyOptional = agencyRepo.findByAgencyCode(agencyCode); + if (agencyOptional.isEmpty()) + throw new BusinessError("上传文件第" + (i + 1) + "行的【所属监管部门编码】不存在,请检查!"); + if (enterpriseRepo.existsByUnifiedSocialCodeAndDelFlag(unifiedSocialCode, (short) 0)) + throw new RuntimeException("上传文件第" + (i + 1) + "行的【社会统一信用代码】在企业信息管理中已存在"); + enterprise.setAgency(agencyOptional.get()); + enterprise.setRegulatedIndustry(regulatedIndustry); + String[] ris = regulatedIndustry.split("/"); + for (int i1 = 0; i1 < ris.length; i1++) { + if (i1 == 0) enterprise.setEconCategory(ris[i1]); + if (i1 == 1) enterprise.setEconCategoryTypea(ris[i1]); + if (i1 == 2) enterprise.setEconCategoryTypeb(ris[i1]); + if (i1 == 3) enterprise.setEconCategoryTypec(ris[i1]); + } + enterprise.setAreaComb(areaComb); + String[] areaCombs = areaComb.split("/"); + for (int i1 = 0; i1 < areaCombs.length; i1++) { + if (i1 == 0) enterprise.setProvince(areaCombs[i1]); + if (i1 == 1) enterprise.setCity(areaCombs[i1]); + if (i1 == 2) enterprise.setCounty(areaCombs[i1]); + } + enterprise.setDetailedAddress(detailedAddress); + enterprise.setOpLocAreaComb(opLocAreaComb); + String[] opLocAreaCombs = opLocAreaComb.split("/"); + for (int i1 = 0; i1 < opLocAreaCombs.length; i1++) { + if (i1 == 0) enterprise.setOpLocProvince(opLocAreaCombs[i1]); + if (i1 == 1) enterprise.setOpLocCity(opLocAreaCombs[i1]); + if (i1 == 2) enterprise.setOpLocArea(opLocAreaCombs[i1]); + } + enterprise.setOpLocAddress(opLocAddress); + enterprise.setIndustryType(industryType); + enterprise.setBusinessRating(businessRating); + enterprise.setBusinessCategory(businessCategory); + enterprise.setLegalRepresentative(legalRepresentative); + enterprise.setLegalPhone(legalPhone); + enterprise.setLegalDuty(legalDuty); + enterprise.setOpScope(opScope); + enterprise.setOilExtract("是".equals(oilExtract) ? "1" : "0"); + enterprise.setSafetyFocus("是".equals(safetyFocus) ? "1" : "0"); + enterprise.setIsScaleEnterprise("是".equals(isScaleEnterprise) ? "1" : "0"); + enterprise.setSafetyLic("是".equals(safetyLic) ? "1" : "0"); + enterprise.setDataSource("2"); + enterprise.setDelFlag((short) 0); + LocalDateTime now = LocalDateTime.now(); + enterprise.setModifyTime(now); + enterprise.setEntryTime(now); + if (null != user) { + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + } + enterprise.setIsWithin("0"); + enterprise.setIsRemove((short) 0); + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s->enterprise.setSginData(KmsServer.kmsSign(s))); + enterprises.add(enterprise); + } + } + if (!enterprises.isEmpty()) enterpriseRepo.saveAll(enterprises); + } + + private void remoteImportOne(RemoteUserInfo user, List list) { + if (null == list || list.isEmpty() || list.size() < 2) + throw new BusinessError("上传的文件无效或数据为空"); + dictService.getDictItemByUser("YJ_CODE_9017", user); + // 增大批处理大小以提高性能 + int batchSize = 5000; + for (int i = 1; i < list.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, list.size()); + List batch = list.subList(i, endIndex); + processBatchOne(user, batch, i); + } + } + + private void processBatchOne(RemoteUserInfo user, List list, int startIndex) { + List enterprises = new ArrayList<>(); + Map existingEnterprises = new HashMap<>(); + Set unifiedSocialCodes = new HashSet<>(); + + // 先收集所有统一社会信用代码 + for (Object[] temp : list) { + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String unifiedSocialCode = (String) temp[2]; + if (unifiedSocialCode != null && StringUtils.hasText(unifiedSocialCode.trim())) { + unifiedSocialCodes.add(unifiedSocialCode.trim()); + } + } + } + // 批量查询已存在的企业信息 + if (!unifiedSocialCodes.isEmpty()) { + List existingList = enterpriseRepo.findByUnifiedSocialCodeIn(unifiedSocialCodes); + existingEnterprises = existingList.stream().collect(Collectors.toMap(Enterprise::getUnifiedSocialCode, e -> e)); + } + LocalDateTime now = LocalDateTime.now(); + for (int i = 0; i < list.size(); i++) { + Object[] temp = list.get(i); + try { + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + /*0 区县 + 1 单位名称 + 2 统一社会信用代码 + 3 单位所在地_县 opLocArea;//经营地址所在区 + 4 单位所在地_乡 town;//单位所在地-乡/镇 + 5 单位所在地_村 village;//单位所在地-村 + 6 单位所在地_门牌号 opLocAddress;//经营详细地址 + 7 单位类型 + 8 运营状态 businessStatus 1-11 2-12 + 9 法定代表人 legalRepresentative + 10 主要业务活动1 opScope + 11 行业代码 econCategoryTypec + 12 行业大类 econCategoryTypea + 13 行业中类 econCategoryTypeb + 14 机构类型 + 15 登记注册统计类别 registrationType + 16 固定电话 + 17 移动电话 legalPhone + 18 部门提供注册地地址信息 + 19 单位注册地_县 county;//注册地址所在地-县 + 20 单位注册地_乡 + 21 单位注册地_村 + 22 单位注册地_门牌号 detailedAddress*/ + String agencyName = (String) temp[0]; + String unitName = (String) temp[1]; + String unifiedSocialCode = (String) temp[2]; + if (null == unitName || !StringUtils.hasText(unitName.trim())) + throw new BusinessError("上传文件第" + (startIndex + i + 1) + "行的【生产经营单位名称】不能为空,请检查!"); + if (null == unifiedSocialCode || !StringUtils.hasText(unifiedSocialCode.trim())) + throw new BusinessError("上传文件第" + (startIndex + i + 1) + "行的【统一社会信用代码】不能为空,请检查!"); + Enterprise enterprise; + if (existingEnterprises.containsKey(unifiedSocialCode)) { + enterprise = existingEnterprises.get(unifiedSocialCode); + } else { + enterprise = new Enterprise(); + enterprise.setDelFlag((short) 0); + enterprise.setIsRemove((short) 0); + enterprise.setEntryTime(now); + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + enterprise.setIsWithin("0"); + } + if (StringUtils.hasText(agencyName)) { + String agencyId = Constants.enterpriseImportOne.get(agencyName); + Optional.ofNullable(agencyId).filter(StringUtils::hasText).ifPresent(o -> { + Agency agency = new Agency(); + agency.setAgencyId(agencyId); + enterprise.setAgency(agency); + }); + } + enterprise.setUnitName(unitName); + enterprise.setUnifiedSocialCode(unifiedSocialCode); + String opLocArea = (String) temp[3]; + enterprise.setOpLocArea(opLocArea); + enterprise.setOpLocAreaComb(opLocArea); + String town = (String) temp[4]; + enterprise.setTown(town); + String village = (String) temp[5]; + enterprise.setVillage(village); + String opLocAddress = (String) temp[6]; + enterprise.setOpLocAddress(opLocAddress); + String businessStatus = (String) temp[8]; + if (StringUtils.hasText(businessStatus)) { + if ("1".equals(businessStatus)) + enterprise.setBusinessStatus("11"); + else if ("2".equals(businessStatus)) + enterprise.setBusinessStatus("12"); + } + String legalRepresentative = (String) temp[9]; + enterprise.setLegalRepresentative(legalRepresentative); + String opScope = (String) temp[10]; + enterprise.setOpScope(opScope); + if (StringUtils.hasText(opScope)) { + if (opScope.endsWith("加工") || opScope.endsWith("制造") || opScope.endsWith("生产")) + enterprise.setIndustryType("6");//工业企业 + else if (opScope.contains("化工")) + enterprise.setIndustryType("2");//危险化学品生产 + else if (opScope.endsWith("批发") || opScope.endsWith("零售")) + enterprise.setIndustryType("7");//商贸企业 + else enterprise.setIndustryType("99"); + } else enterprise.setIndustryType("99"); + if (enterprise.getUnitName().contains("加油站")) + enterprise.setIndustryType("5"); + String econCategoryTypec = (String) temp[11]; + enterprise.setEconCategoryTypec(econCategoryTypec); + String econCategoryTypea = (String) temp[12]; + enterprise.setEconCategoryTypea(econCategoryTypea); + String econCategoryTypeb = (String) temp[13]; + enterprise.setEconCategoryTypeb(econCategoryTypeb); + String regulatedIndustry; + if (StringUtils.hasText(econCategoryTypea)) { + String econCategory = dictService.getFjdm(econCategoryTypea); + enterprise.setEconCategory(econCategory); + regulatedIndustry = econCategory + "/" + econCategoryTypea + "/"; + if (StringUtils.hasText(econCategoryTypeb)) + regulatedIndustry += econCategoryTypeb + "/"; + if (StringUtils.hasText(econCategoryTypec)) + regulatedIndustry += econCategoryTypec; + enterprise.setRegulatedIndustry(regulatedIndustry); + } + String registrationType = ((String) temp[15]); + enterprise.setRegistrationType(registrationType); + String legalPhone = ((String) temp[17]); + enterprise.setLegalPhone(legalPhone); + String county = ((String) temp[19]); + enterprise.setCounty(county); + enterprise.setAreaComb(county); + String detailedAddress = ((String) temp[22]); + enterprise.setDetailedAddress(detailedAddress); + enterprise.setModifyTime(now); + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + enterprise.setDataSource("10"); + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s->enterprise.setSginData(KmsServer.kmsSign(s))); + if ("5".equals(enterprise.getIndustryType())) + enterprise.setBusinessCategory("2"); + else enterprise.setBusinessCategory("1"); + enterprises.add(enterprise); + } + } catch (Exception e) { + log.error("导入第一部分数据异常err={},temp={},tempto={},uscc={},idx={}", e, temp, Arrays.toString(temp), temp[2], startIndex); + } + } + // 批量保存企业信息 + if (!enterprises.isEmpty()) { + log.info("开始保存第一部分数据"); + enterpriseRepo.saveAll(enterprises); + } + } + + private void remoteImportTwo(RemoteUserInfo user, List list) { + if (null == list || list.isEmpty() || list.size() < 2) + throw new BusinessError("上传的文件无效或数据为空"); + // 增大批处理大小以提高性能 + int batchSize = 5000; + for (int i = 1; i < list.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, list.size()); + List batch = list.subList(i, endIndex); + processBatchTwo(user, batch, i); + } + } + + private void processBatchTwo(RemoteUserInfo user, List list, int startIndex) { + List enterprises = new ArrayList<>(); + Map existingEnterprises = new HashMap<>(); + Set unifiedSocialCodes = new HashSet<>(); + // 先收集所有统一社会信用代码 + for (Object[] temp : list) { + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String unifiedSocialCode = (String) temp[5]; + if (unifiedSocialCode != null && StringUtils.hasText(unifiedSocialCode.trim())) { + unifiedSocialCodes.add(unifiedSocialCode.trim()); + } + } + } + // 批量查询已存在的企业信息 + if (!unifiedSocialCodes.isEmpty()) { + List existingList = enterpriseRepo.findByUnifiedSocialCodeIn(unifiedSocialCodes); + existingEnterprises = existingList.stream().collect(Collectors.toMap(Enterprise::getUnifiedSocialCode, e -> e)); + } + LocalDateTime now = LocalDateTime.now(); + for (Object[] objects : list) { + try { + if (Arrays.stream(objects).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + /* 0 区县开发区 + 1 管理码 + 2 期别(年) + 3 期别(月) + 4 组织机构代码 orgCode + 5 统一社会信用代码 unifiedSocialCode + 6 单位详细名称 unitName + 7 主要业务活动(或主要产品)1 opScope + 8 单位规模 unitScale + 9 报表类别 + 10 企业控股情况 economicType + 11 机构类型 + 12 登记注册类型 + 13 从业人员期末人数;人 + 14 女性;人 + 15 营业收入;千元 + 16 行政区划代码 agency + 17 省(自治区、直辖市) opLocProvince;//经营地址所在省 + 18 地(区、市、州、盟) opLocCity;//经营地址所在市 + 19 县(区、市、旗) opLocArea;//经营地址所在区 + 20 乡(镇、街道办事处) + 21 街(村)、门牌号 + 22 社区(居委会)、村委会 opLocAddress;//经营详细地址 + 23 单位注册地址所在行政区划代码 + 24 省(自治区、直辖市)(注册地址) province;//注册地址所在地-省 + 25 地(区、市、州、盟)(注册地址) city;//注册地址所在地-地级市 + 26 县(区、市、旗)(注册地址) county;//注册地址所在地-县 + 27 乡(镇、街道办事处)(注册地址) + 28 街(村)、门牌号(注册地址) + 29 社区(居委会)、村委会(注册地) detailedAddress + 30 单位负责人 mainName + 31 法定代表人(单位负责人) legalRepresentative + 32 区号 + 33 固定电话 + 34 分机号 + 35 移动电话 legalPhone + 36 传真号码 + 37 传真分机号 + 38 邮政编码 postalCode +*/ + String agencyCode = (String) objects[1]; + String orgCode = (String) objects[4];//组织机构代码 + String unifiedSocialCode = (String) objects[5];//统一社会信用代码 + String unitName = (String) objects[6];//单位名称 + if (null == unitName || !StringUtils.hasText(unitName.trim())) + throw new BusinessError("上传文件第" + (startIndex + 1) + "行的【生产经营单位名称】不能为空,请检查!"); + if (null == unifiedSocialCode || !StringUtils.hasText(unifiedSocialCode.trim())) + throw new BusinessError("上传文件第" + (startIndex + 1) + "行的【统一社会信用代码】不能为空,请检查!"); + Enterprise enterprise; + if (existingEnterprises.containsKey(unifiedSocialCode)) { + enterprise = existingEnterprises.get(unifiedSocialCode); + } else { + enterprise = new Enterprise(); + enterprise.setDelFlag((short) 0); + enterprise.setIsRemove((short) 0); + enterprise.setEntryTime(now); + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + } + enterprise.setUnitName(unitName); + enterprise.setUnifiedSocialCode(unifiedSocialCode); + enterprise.setOrgCode(orgCode); + if (StringUtils.hasText(agencyCode)) { + String agencyId = Constants.enterpriseImportTwo.get(agencyCode); + Optional.ofNullable(agencyId).filter(StringUtils::hasText).ifPresent(o -> { + Agency agency = new Agency(); + agency.setAgencyId(agencyId); + enterprise.setAgency(agency); + }); + } + String opScope = (String) objects[7]; + enterprise.setOpScope(opScope); + String unitScale = (String) objects[8]; + if (StringUtils.hasText(unitScale)) { + //1-大型 2-中型 3-小型 4-微型 + if ("大型".equals(unitScale)) + enterprise.setUnitScale("1"); + if ("中型".equals(unitScale)) + enterprise.setUnitScale("2"); + if ("小型".equals(unitScale)) + enterprise.setUnitScale("3"); + if ("微型".equals(unitScale)) + enterprise.setUnitScale("4"); + } + String bblb = (String) objects[9]; + if ("规模以上工业".equals(bblb)) { + enterprise.setIndustryType("6");//工业企业 + enterprise.setIsWithin("1"); + } else enterprise.setIsWithin("0"); + if ("批发零售业".equals(bblb)) + enterprise.setIndustryType("7");//商贸企业 + else enterprise.setIndustryType("99"); + if (enterprise.getUnitName().contains("加油站")) + enterprise.setIndustryType("5"); + String economicType = (String) objects[10]; + if (StringUtils.hasText(economicType)) + enterprise.setEconomicType(Constants.enterpriseByEconomicType.get(economicType)); + String opLocProvince = (String) objects[17]; + enterprise.setOpLocProvince(opLocProvince); + String opLocCity = (String) objects[18]; + enterprise.setOpLocCity(opLocCity); + String opLocArea = (String) objects[19]; + enterprise.setOpLocArea(opLocArea); + String opLocAreaComb = ""; + if (StringUtils.hasText(opLocProvince)) + opLocAreaComb = opLocProvince; + if (StringUtils.hasText(opLocCity)) + opLocAreaComb = opLocAreaComb + "/" + opLocCity; + if (StringUtils.hasText(opLocArea)) + opLocAreaComb = opLocAreaComb + "/" + opLocArea; + enterprise.setOpLocAreaComb(opLocAreaComb); + String opLocAddress = (String) objects[22]; + enterprise.setOpLocAddress(opLocAddress); + String province = (String) objects[24]; + enterprise.setProvince(province); + String city = (String) objects[25]; + enterprise.setCity(city); + String county = (String) objects[26]; + enterprise.setCounty(county); + String areaComb = ""; + if (StringUtils.hasText(province)) + areaComb = province; + if (StringUtils.hasText(city)) + areaComb = areaComb + "/" + city; + if (StringUtils.hasText(county)) + areaComb = areaComb + "/" + county; + enterprise.setAreaComb(areaComb); + String detailedAddress = (String) objects[29]; + enterprise.setDetailedAddress(detailedAddress); + String mainName = (String) objects[30]; + enterprise.setMainName(mainName); + String legalRepresentative = (String) objects[31]; + enterprise.setLegalRepresentative(legalRepresentative); + String legalPhone = (String) objects[35]; + enterprise.setLegalPhone(legalPhone); + String postalCode = (String) objects[38]; + enterprise.setPostalCode(postalCode); + enterprise.setModifyTime(now); + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + enterprise.setDataSource("20"); + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s-> enterprise.setSginData(KmsServer.kmsSign(s))); + if ("5".equals(enterprise.getIndustryType())) + enterprise.setBusinessCategory("2"); + else enterprise.setBusinessCategory("1"); + enterprises.add(enterprise); + } + } catch (Exception e) { + log.error("导入第二部分数据异常", e); + } + } + if (!enterprises.isEmpty()) enterpriseRepo.saveAll(enterprises); + } + + private void remoteImportThree(RemoteUserInfo user, List list) { + if (null == list || list.isEmpty() || list.size() < 2) + throw new BusinessError("上传的文件无效或数据为空"); + Map existingEnterprises = new HashMap<>(); + Map existingEnterprisesNmae = new HashMap<>(); + Set unifiedSocialCodes = new HashSet<>(); + Set unitNames = new HashSet<>(); + // 先收集所有统一社会信用代码 + for (Object[] temp : list) { + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String unifiedSocialCode = (String) temp[3]; + if (unifiedSocialCode != null && StringUtils.hasText(unifiedSocialCode.trim())) { + unifiedSocialCodes.add(unifiedSocialCode.trim()); + } else { + String unitName = (String) temp[1]; + if (unitName != null && StringUtils.hasText(unitName.trim())) { + unitNames.add(unitName.trim()); + } + } + } + } + // 批量查询已存在的企业信息 + if (!unifiedSocialCodes.isEmpty()) { + List existingList = enterpriseRepo.findByUnifiedSocialCodeIn(unifiedSocialCodes); + List existingByUnitNameList = enterpriseRepo.findByUnitNameInAndDelFlag(unitNames, (short) 0); + existingEnterprises = existingList.stream().collect(Collectors.toMap(Enterprise::getUnifiedSocialCode, e -> e)); + existingEnterprisesNmae = existingByUnitNameList.stream().collect(Collectors.toMap(Enterprise::getUnitName, e -> e)); + } + LocalDateTime now = LocalDateTime.now(); + List enterprises = new ArrayList<>(); + for (int i = 1; i < list.size(); i++) { + Object[] temp = list.get(i); + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String agencyName = (String) temp[0]; + String unitName = (String) temp[1];//单位名称 + String businessStatus = (String) temp[2];//营业状态 + String unifiedSocialCode = (String) temp[3];//统一社会信用代码 + Enterprise enterprise; + if (StringUtils.hasText(unifiedSocialCode) && existingEnterprises.containsKey(unifiedSocialCode)) { + enterprise = existingEnterprises.get(unifiedSocialCode); + } else if (existingEnterprisesNmae.containsKey(unitName)) { + enterprise = existingEnterprisesNmae.get(unitName); + } else { + enterprise = new Enterprise(); + enterprise.setDelFlag((short) 0); + enterprise.setIsRemove((short) 0); + enterprise.setEntryTime(now); + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + } + enterprise.setUnitName(unitName); + if (StringUtils.hasText(unifiedSocialCode)) + enterprise.setUnifiedSocialCode(unifiedSocialCode); + if (StringUtils.hasText(agencyName)) { + String agencyId = Constants.enterpriseImportOne.get(agencyName); + Optional.ofNullable(agencyId).filter(StringUtils::hasText).ifPresent(o -> { + Agency agency = new Agency(); + agency.setAgencyId(agencyId); + enterprise.setAgency(agency); + }); + } + enterprise.setBusinessStatus(businessStatus); + String industryType = (String) (temp[4]);//行业类别 + enterprise.setIndustryType(industryType); + String opLocAddress = (String) temp[5];//企业地址 + enterprise.setOpLocAddress(opLocAddress); + String mainName = (String) temp[6];//负责人名称 + enterprise.setMainName(mainName); + String mainPhone = (String) (temp[7]);//负责人电话 + enterprise.setMainPhone(mainPhone); + String majorDanger = (String) (temp[8]);//是否有重大危险源 + enterprise.setMajorDanger(majorDanger); + String legalRepresentative = (String) temp[9];//法人 + enterprise.setLegalRepresentative(legalRepresentative); + String legalPhone = (String) (temp[10]);//法人电话 + enterprise.setLegalPhone(legalPhone); + String opScope = (String) temp[11];//业务范围 + enterprise.setOpScope(opScope); + enterprise.setModifyTime(now); + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + enterprise.setDataSource("30"); + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s-> enterprise.setSginData(KmsServer.kmsSign(s))); + if ("5".equals(enterprise.getIndustryType())) + enterprise.setBusinessCategory("2"); + else enterprise.setBusinessCategory("1"); + enterprises.add(enterprise); + } + } + if (!enterprises.isEmpty()) enterpriseRepo.saveAll(enterprises); + } + + private void remoteImportFour(RemoteUserInfo user, List list) { + if (null == list || list.isEmpty() || list.size() < 2) + throw new BusinessError("上传的文件无效或数据为空"); + // 增大批处理大小以提高性能 + int batchSize = 5000; + for (int i = 1; i < list.size(); i += batchSize) { + int endIndex = Math.min(i + batchSize, list.size()); + List batch = list.subList(i, endIndex); + processBatchFour(user, batch, i); + } + } + + private void processBatchFour(RemoteUserInfo user, List list, int startIndex) { + List enterprises = new ArrayList<>(); + Map existingEnterprises = new HashMap<>(); + Set unifiedSocialCodes = new HashSet<>(); + // 先收集所有统一社会信用代码 + for (Object[] temp : list) { + if (Arrays.stream(temp).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + String unifiedSocialCode = (String) temp[3]; + if (unifiedSocialCode != null && StringUtils.hasText(unifiedSocialCode.trim())) { + unifiedSocialCodes.add(unifiedSocialCode.trim()); + } + } + } + // 批量查询已存在的企业信息 + if (!unifiedSocialCodes.isEmpty()) { + List existingList = enterpriseRepo.findByUnifiedSocialCodeIn(unifiedSocialCodes); + existingEnterprises = existingList.stream().collect(Collectors.toMap(Enterprise::getUnifiedSocialCode, e -> e)); + } + LocalDateTime now = LocalDateTime.now(); + for (Object[] objects : list) { + try { + if (Arrays.stream(objects).anyMatch(obj -> obj != null && (!(obj instanceof String) || !((String) obj).trim().isEmpty()))) { + /* 0 类别 industryType + 1 区县 agencyName + 2 单位名称 unitName + 3 统一社会信用代码 unifiedSocialCode + 4 单位所在地_乡 town + 5 单位所在地_门牌号 opLocAddress + 6 运营状态 businessStatus + 7 法定代表人 legalRepresentative + 8 主要业务活动1 opScope + 9 行业代码 econCategoryTypec + 10 行业大类 econCategoryTypea + 11 行业中类 econCategoryTypeb + 12 机构类型 + 13 登记注册统计类别 + 14 固定电话 + 15 移动电话 legalPhone +*/ + String industryType = (String) objects[0];//类别 + String agencyName = (String) objects[1];//区县 + String unitName = (String) objects[2];//单位名称 + String unifiedSocialCode = (String) objects[3];//统一社会信用代码 + String town = (String) objects[4];//单位所在地-乡/镇 + String opLocAddress = (String) objects[5];//单位所在地_门牌号 + String businessStatus = (String) objects[6];//运营状态 + String legalRepresentative = (String) objects[7];//法定代表人 + String opScope = (String) objects[8];//主要业务活动1 + String econCategoryTypec = (String) objects[9];//行业代码 + String econCategoryTypea = (String) objects[10];//行业大类 + String econCategoryTypeb = (String) objects[11];//行业中类 + String legalPhone = (String) objects[15];//移动电话 + Enterprise enterprise; + if (existingEnterprises.containsKey(unifiedSocialCode)) { + enterprise = existingEnterprises.get(unifiedSocialCode); + } else { + enterprise = new Enterprise(); + enterprise.setDelFlag((short) 0); + enterprise.setIsRemove((short) 0); + enterprise.setEntryTime(now); + enterprise.setEntryUserName(user.getYhwybs()); + enterprise.setEntryNickName(user.getXm()); + } + enterprise.setUnitName(unitName); + enterprise.setUnifiedSocialCode(unifiedSocialCode); + if (StringUtils.hasText(agencyName)) { + String agencyId = Constants.enterpriseImportOne.get(agencyName); + Optional.ofNullable(agencyId).filter(StringUtils::hasText).ifPresent(o -> { + Agency agency = new Agency(); + agency.setAgencyId(agencyId); + enterprise.setAgency(agency); + }); + } + enterprise.setEconCategoryTypec(econCategoryTypec); + enterprise.setEconCategoryTypea(econCategoryTypea); + enterprise.setEconCategoryTypeb(econCategoryTypeb); + String regulatedIndustry; + if (StringUtils.hasText(econCategoryTypea)) { + String econCategory = dictService.getFjdm(econCategoryTypea); + enterprise.setEconCategory(econCategory); + regulatedIndustry = econCategory + "/" + econCategoryTypea + "/"; + if (StringUtils.hasText(econCategoryTypeb)) + regulatedIndustry += econCategoryTypeb + "/"; + if (StringUtils.hasText(econCategoryTypec)) + regulatedIndustry += econCategoryTypec; + enterprise.setRegulatedIndustry(regulatedIndustry); + } + enterprise.setOpScope(opScope); + if (StringUtils.hasText(industryType)) + enterprise.setIndustryType(Constants.enterpriseByIndustryType.get(industryType)); + enterprise.setOpLocAddress(opLocAddress); + enterprise.setTown(town); + if (StringUtils.hasText(businessStatus)) { + if ("1".equals(businessStatus)) + enterprise.setBusinessStatus("11"); + else if ("2".equals(businessStatus)) + enterprise.setBusinessStatus("12"); + } + enterprise.setLegalRepresentative(legalRepresentative); + enterprise.setLegalPhone(legalPhone); + enterprise.setModifyTime(now); + enterprise.setModifyUserName(user.getYhwybs()); + enterprise.setModifyNickName(user.getXm()); + enterprise.setDataSource("40"); + // 检验加密签名保存 + StringBuilder signOrg = new StringBuilder(); + Optional.ofNullable(enterprise.getContactPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getLegalPersonIdNumber()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.ofNullable(enterprise.getMainPhone()).filter(StringUtils::hasText).ifPresent(signOrg::append); + Optional.of(signOrg.toString()).filter(StringUtils::hasText).ifPresent(s-> enterprise.setSginData(KmsServer.kmsSign(s))); + if ("5".equals(enterprise.getIndustryType())) + enterprise.setBusinessCategory("2"); + else enterprise.setBusinessCategory("1"); + enterprises.add(enterprise); + } + } catch (Exception e) { + log.error("导入第四部分数据异常", e); + } + } + if (!enterprises.isEmpty()) enterpriseRepo.saveAll(enterprises); + } + + /** + * 根据机构代码查询企业列表 + * + * @param query 机构id + * @return 企业列表 + */ + public Page findEnterprisesByAgencyId(EnterpriseQuery query, RemoteUserInfo user) { + String agencyId = query.getAgencyId(); + if (!StringUtils.hasText(query.getAgencyCode()) && StringUtils.hasText(agencyId)) { + Agency agency = agencyRepo.findById(agencyId).orElseThrow(() -> new BusinessError("机构不存在")); + query.setAgencyCode(agency.getAgencyCode()); + } + return enterpriseRepo.findAll(buildSpec(query, user), PageableHelper.buildPageRequest(query.page(), query.pageSize())); + } + + /** + * 构建查询条件 + * + * @param query 查询条件 + * @return 规格 + */ + private Specification buildSpec(EnterpriseQuery query, RemoteUserInfo user) { + return (root, criteriaQuery, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + root.join(Enterprise_.agency); + String agencyCode; + if (StringUtils.hasText(query.getAgencyCode())) { + agencyCode = com.aisino.iles.common.util.StringUtils.trimEven0(query.getAgencyCode()) + "%"; + } else { + agencyCode = Optional.ofNullable(query.getAgency()).map(o -> com.aisino.iles.common.util.StringUtils.trimEven0(o.getAgencyCode()) + "%").orElse(com.aisino.iles.common.util.StringUtils.trimEven0(user.getGajgjgdm()) + "%"); + } + predicates.add(criteriaBuilder.like(root.get(Enterprise_.agency).get(Agency_.agencyCode), agencyCode)); + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.delFlag), 0)); + Optional.ofNullable(query.getUnitName()).filter(StringUtils::hasText).ifPresent(o -> predicates.add(criteriaBuilder.like(root.get(Enterprise_.unitName), "%" + o + "%"))); + if (query.getEnterpriseIds() != null && !query.getEnterpriseIds().isEmpty()) { + criteriaQuery.orderBy(criteriaBuilder.asc(criteriaBuilder.selectCase().when(root.get(Enterprise_.enterpriseId).in(query.getEnterpriseIds()), 0).otherwise(1))); + } +// if (!StringUtils.hasText(query.getIndustryType())) { +// CriteriaBuilder.In in = criteriaBuilder.in(root.get(Enterprise_.industryType)); +// categories().forEach(in::value); +// predicates.add(in); +// } + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } + + /** + * 分页查询接入企业信息 + * + * @param query 查询条件 + * @return 分页企业信息 + */ + public Page findJoinEnterprisesPage(EnterpriseQuery query) { + return enterpriseRepo.findAll(buildSpecification2(query).and( + Specification.where((r, q, c) -> + q.multiselect( + r.get(Enterprise_.enterpriseId), + r.get(Enterprise_.industryType), + r.get(Enterprise_.unitName), + r.get(Enterprise_.unifiedSocialCode), + r.get(Enterprise_.businessStatus), + r.get(Enterprise_.businessRating), + r.get(Enterprise_.businessCategory), + r.get(Enterprise_.establishmentDate), + r.get(Enterprise_.delFlag), + r.get(Enterprise_.isRemove), + r.get(Enterprise_.detailedAddress), + r.get(Enterprise_.mainName), + r.get(Enterprise_.mainPhone), + r.get(Enterprise_.agency), + r.get(Enterprise_.videoAccess), + r.get(Enterprise_.perceptionAccess), + r.get(Enterprise_.infoAccess), + r.get(Enterprise_.permitAccess) + ).getRestriction())), + PageableHelper.buildPageRequest(query.page(), query.pageSize(), query.sort(), "descending".equals(query.dir()) ? "desc" : query.dir())) + .map(enterprise -> { + EnterpriseDto dto = new EnterpriseDto(); + BeanUtils.copyProperties(enterprise, dto); + return dto; + }); + } + + private Specification buildSpecification2(EnterpriseQuery query) { + return (root, criteriaQuery, criteriaBuilder) -> { + List predicates = new ArrayList<>(); + + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.delFlag), 0)); + + Predicate videoAccess = criteriaBuilder.equal(root.get(Enterprise_.videoAccess), "1"); + Predicate perceptionAccess = criteriaBuilder.equal(root.get(Enterprise_.perceptionAccess), "1"); + Predicate infoAccess = criteriaBuilder.equal(root.get(Enterprise_.infoAccess), "1"); + Predicate permitAccess = criteriaBuilder.equal(root.get(Enterprise_.permitAccess), "1"); + Predicate orCondition = criteriaBuilder.or(videoAccess, perceptionAccess, infoAccess, permitAccess); + predicates.add(orCondition); + + switch (query.getQylx()) { + case "ks": + predicates.add(root.get(Enterprise_.industryType).in("1")); + break; + case "wh": + predicates.add(root.get(Enterprise_.industryType).in("2", "3", "4")); + break; + case "jyz": + predicates.add(root.get(Enterprise_.industryType).in("5")); + break; + case "gm": + predicates.add(root.get(Enterprise_.industryType).in("6", "7")); + break; + case "aqsc": + predicates.add(root.get(Enterprise_.industryType).in("8", "9", "10")); + break; + case "jzsg": + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.econCategory), "e")); + break; + case "yy": + predicates.add(criteriaBuilder.equal(root.get(Enterprise_.econCategoryTypeb), "851")); + break; + default: + } + + return criteriaBuilder.and(predicates.toArray(new Predicate[0])); + }; + } + + /** + * 企业信息自查自报 + * + * @return 自查自报 + */ + public String getEnterpriseSelfInsAndSelfReportPage(EnterpriseQuery query, RemoteUserInfo user) { + Map param = new HashMap<>(); + param.put("limit", "100"); + param.put("page", 1); +// Map entity = new HashMap<>(); +// entity.put("unifiedSocialCode", query.getUnifiedSocialCode()); +// param.put("entity", entity); + + String accessToken = user.getAccessToken().getAccess_token(); + String tokenType = user.getAccessToken().getToken_type(); + String clientId = ssoClientProperties.getClientId(); + log.info("url:{}, token:{}, clientId:{}", selfInsAndSelfReportUrl, accessToken, clientId); + String body = null; + try { + body = HttpRequest.post(selfInsAndSelfReportUrl) + .header("Content-Type", "application/json") // 设置 Content-Type 为 JSON + .header("Authorization", tokenType + " " + accessToken) // 添加 appToken 请求头 + .header("appId", clientId) // 添加 appId 请求头 + .body(JSONUtil.toJsonStr(param)) // 将 dto 转换为 JSON 字符串作为请求体 + .execute() + .body(); + log.info("企业自查自报信息结果:{}", body); + } catch (Exception e) { + log.info("企业自查自报查询失败:" + e); + } + return body; + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseSubtableService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseSubtableService.java new file mode 100644 index 0000000..cdfc41c --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseSubtableService.java @@ -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 findCasePage(EnterpriseQuery query) { + return documentRepo.findAll(buildDocument(query), + PageableHelper.buildPageRequest(query.page(), query.pageSize(), "documentDate", "desc")) + .map(document -> { + DocumentDto dto = new DocumentDto(); + Map 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 buildDocument(EnterpriseQuery query) { + return (root, criteriaQuery, criteriaBuilder) -> { + List 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 findAccidentHazardPage(EnterpriseQuery query) { + return accidentHazardRepo.findAll(buildAccidentHazard(query), + PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createdon", "desc")); + } + + private Specification buildAccidentHazard(EnterpriseQuery query) { + return (root, criteriaQuery, criteriaBuilder) -> { + List 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 findDangerPage(EnterpriseQuery query) { + return dangerInfoRepo.findAll(buildDanger(query), + PageableHelper.buildPageRequest(query.page(), query.pageSize(), "createdon", "desc")); + } + + private Specification buildDanger(EnterpriseQuery query) { + return (root, criteriaQuery, criteriaBuilder) -> { + List 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])); + }; + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnKafka.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnKafka.java new file mode 100644 index 0000000..7caaf63 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnKafka.java @@ -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()); + } + } + +} diff --git a/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnService.java b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnService.java new file mode 100644 index 0000000..2716cc3 --- /dev/null +++ b/server/src/main/java/com/aisino/iles/lawenforcement/service/EnterpriseWarnService.java @@ -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 findEnterpriseWarnPage(EnterpriseWarnQuery query) { + return enterpriseWarnRepository + .findAll(buildSpecification(query), PageableHelper.buildPageRequest(query.page(), query.pageSize(), query.sort(), query.dir())); + // .map(this::handleResult); + } + + private Specification buildSpecification(EnterpriseWarnQuery query) { + return Specification.where((root, criteriaQuery, criteriaBuilder) -> { + List 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 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; +// } + +}