diff --git a/src/main/java/digital/laboratory/platform/entrustment/EntrustmentApplication.java b/src/main/java/digital/laboratory/platform/entrustment/EntrustmentApplication.java index 7248a08..90c8741 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/EntrustmentApplication.java +++ b/src/main/java/digital/laboratory/platform/entrustment/EntrustmentApplication.java @@ -6,7 +6,9 @@ import digital.laboratory.platform.common.swagger.annotation.EnableDLPSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.scheduling.annotation.EnableScheduling; +@EnableScheduling // 开启定时任务 @EnableDLPSwagger2 @EnableDLPFeignClients @EnableDiscoveryClient diff --git a/src/main/java/digital/laboratory/platform/entrustment/config/EntrustStateMachineConfig.java b/src/main/java/digital/laboratory/platform/entrustment/config/EntrustStateMachineConfig.java index 5ffc7b6..c022d59 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/config/EntrustStateMachineConfig.java +++ b/src/main/java/digital/laboratory/platform/entrustment/config/EntrustStateMachineConfig.java @@ -1,38 +1,38 @@ -package digital.laboratory.platform.entrustment.config; - -import digital.laboratory.platform.entrustment.enums.EntrustEvent; -import digital.laboratory.platform.entrustment.enums.EntrustStatusConstants; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Configuration; -import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; -import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; - -/** - * @author ChenJiangBao - * @version 1.0 - * @description: 委托状态机配置类 - * @date 2025/3/14 11:47 - */ -@Configuration -public class EntrustStateMachineConfig extends EnumStateMachineConfigurerAdapter { - - @Value("${dlp.entrustment.isApprovalRequired}") - private boolean isApprovalRequired; // 动态标志判断是否需要审批 - - @Override - public void configure(StateMachineStateConfigurer states) throws Exception { - states.withStates() - .initial(EntrustStatusConstants.ENTRUST_STATUS_CREATED) - .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CHECK_CLAIM) - .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CHECK) - .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CONFIRM) - .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_DELIVER) - .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_ACCEPT) - .state(EntrustStatusConstants.ENTRUST_STATUS_ACCEPTED) - .state(EntrustStatusConstants.ENTRUST_STATUS_TEST_FINISH) - .state(EntrustStatusConstants.ENTRUST_STATUS_COMPLETED) - .state(EntrustStatusConstants.ENTRUST_STATUS_TERMINATED) - .state(EntrustStatusConstants.ENTRUST_STATUS_ABORTED) - .end(EntrustStatusConstants.ENTRUST_STATUS_COMPLETED); - } -} +//package digital.laboratory.platform.entrustment.config; +// +//import digital.laboratory.platform.entrustment.enums.EntrustEvent; +//import digital.laboratory.platform.entrustment.enums.EntrustStatusConstants; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.statemachine.config.EnumStateMachineConfigurerAdapter; +//import org.springframework.statemachine.config.builders.StateMachineStateConfigurer; +// +///** +// * @author ChenJiangBao +// * @version 1.0 +// * @description: 委托状态机配置类 +// * @date 2025/3/14 11:47 +// */ +//@Configuration +//public class EntrustStateMachineConfig extends EnumStateMachineConfigurerAdapter { +// +// @Value("${dlp.entrustment.isApprovalRequired}") +// private boolean isApprovalRequired; // 动态标志判断是否需要审批 +// +// @Override +// public void configure(StateMachineStateConfigurer states) throws Exception { +// states.withStates() +// .initial(EntrustStatusConstants.ENTRUST_STATUS_CREATED) +// .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CHECK_CLAIM) +// .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CHECK) +// .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_CONFIRM) +// .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_DELIVER) +// .state(EntrustStatusConstants.ENTRUST_STATUS_WAITING_ACCEPT) +// .state(EntrustStatusConstants.ENTRUST_STATUS_ACCEPTED) +// .state(EntrustStatusConstants.ENTRUST_STATUS_TEST_FINISH) +// .state(EntrustStatusConstants.ENTRUST_STATUS_COMPLETED) +// .state(EntrustStatusConstants.ENTRUST_STATUS_TERMINATED) +// .state(EntrustStatusConstants.ENTRUST_STATUS_ABORTED) +// .end(EntrustStatusConstants.ENTRUST_STATUS_COMPLETED); +// } +//} diff --git a/src/main/java/digital/laboratory/platform/entrustment/entity/Entrustment.java b/src/main/java/digital/laboratory/platform/entrustment/entity/Entrustment.java index 14d1127..d067c45 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/entity/Entrustment.java +++ b/src/main/java/digital/laboratory/platform/entrustment/entity/Entrustment.java @@ -739,7 +739,7 @@ public class Entrustment extends BaseEntity { * 是否流转 */ @ApiModelProperty(value="是否流转,0,未流转,1是已经流转") - private Integer isTrans; + private Integer isTrans; /** * 是否退回, @@ -747,7 +747,12 @@ public class Entrustment extends BaseEntity { @ApiModelProperty(value="是否退回(0:未退回,-1:已退回)") private Integer returnOrNot; + @ApiModelProperty("标记该委托是否已经上传了检材照片, 默认false") private Boolean materialImageFlag = false; + @ApiModelProperty("是否推送数据到LabsCare的标识,[EntrustLetter:true 代表推送委托书成功 | ItemConfirmLetter:true 代表推送鉴定事项确认书成功]" + + "如果这个字段为空则表示失败,如果两个推送都成功,以英文逗号分隔") + private String pushFlag; + } diff --git a/src/main/java/digital/laboratory/platform/entrustment/listener/PushDataToLabsCareEventListener.java b/src/main/java/digital/laboratory/platform/entrustment/listener/PushDataToLabsCareEventListener.java index 35eb11b..43d33e1 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/listener/PushDataToLabsCareEventListener.java +++ b/src/main/java/digital/laboratory/platform/entrustment/listener/PushDataToLabsCareEventListener.java @@ -1,31 +1,16 @@ package digital.laboratory.platform.entrustment.listener; -import cn.hutool.core.util.StrUtil; -import cn.hutool.json.JSONObject; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; import digital.laboratory.platform.entrustment.config.GlobalThreadPool; -import digital.laboratory.platform.entrustment.config.properties.ApiPathProperties; -import digital.laboratory.platform.entrustment.entity.EntrustmentIdentificationMaterial; import digital.laboratory.platform.entrustment.event.PushDataToLabsCareEvent; -import digital.laboratory.platform.entrustment.service.CommonFeignService; -import digital.laboratory.platform.entrustment.service.EntrustmentIdentificationMaterialService; import digital.laboratory.platform.entrustment.service.EntrustmentService; +import digital.laboratory.platform.entrustment.service.PushDataToLabsCareService; import digital.laboratory.platform.entrustment.vo.EntrustmentVO; -import digital.laboratory.platform.entrustment.vo.MaterialListForBookVo; -import digital.laboratory.platform.othersys.utils.HttpsUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationListener; -import org.springframework.http.*; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestClientException; import javax.annotation.Resource; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Map; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; /** * 监听有关推送数据到LabsCare 平台的事件, 采用异步 @@ -34,22 +19,11 @@ import java.util.stream.Collectors; @Component public class PushDataToLabsCareEventListener implements ApplicationListener { - @Resource - private ApiPathProperties apiPathProperties; - @Resource private EntrustmentService entrustmentService; @Resource - private CommonFeignService commonFeignService; - - @Resource - private EntrustmentIdentificationMaterialService entrustmentIdentificationMaterialService; - - private final static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); - - // "#NULL#" 作为空数据的占位符, 对于系统中没有的信息以占位符代替 - private final static String NULL_PLACEHOLDER = "#NULL#"; + private PushDataToLabsCareService pushDataToLabsCareService; /** * 处理委托数据推送事件 @@ -73,15 +47,14 @@ public class PushDataToLabsCareEventListener implements ApplicationListener dataMap = entrustmentService.buildEntrustLetterDataMap(entrustVO); - pushEntrustLetterData(entrustVO, dataMap); - } catch (IllegalAccessException e) { + pushDataToLabsCareService.pushEntrustLetterData(entrustVO); + } catch (Exception e) { log.error("委托编号 {} 的鉴定委托书数据推送失败!", entrustVO.getEntrustmentNo(), e); } break; case 2: // 推送鉴定事项确认书数据 try { - pushItemConfirmLetterData(entrustVO); + pushDataToLabsCareService.pushItemConfirmLetterData(entrustVO); } catch (Exception e) { log.error("受理编号 {} 的鉴定事项确认书数据推送失败!", entrustVO.getAcceptNo(), e); } @@ -96,167 +69,4 @@ public class PushDataToLabsCareEventListener implements ApplicationListener response = exchangeRemoteApi(jsonObject, apiPathProperties.getConfirmLetter()); - - if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("\"status\":200")) { - log.info("推送鉴定事项确认书数据成功, 受理编号: {}, 响应: {}", entrustVO.getAcceptNo(), response.getBody()); - } else { - log.warn("推送鉴定事项确认书数据失败, 受理编号: {}, 状态码: {}, 响应: {}", - entrustVO.getAcceptNo(), response.getStatusCode(), response.getBody()); - } - } catch (RestClientException e) { - log.error("推送鉴定事项确认书数据到 LabsCare 失败, 受理编号: {}", entrustVO.getAcceptNo(), e); - } - } - - /** - * 构建鉴定事项确认书的JSON负载 - * - * @param entrustVO 委托单VO对象,包含构建JSON负载所需的数据 - * @return 包含鉴定事项确认书数据的JSONObject对象 - */ - private JSONObject buildItemConfirmLetterJsonPayload(EntrustmentVO entrustVO) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("ajmc", entrustVO.getCaseName()); // 案件名称 - jsonObject.set("dwfzr", StrUtil.join("、", entrustVO.getDeliverer1Name(), entrustVO.getDeliverer2Name())); // 送检人签名 - // 检材处理要求,这里的值是直接复制了确认书里的值 - jsonObject.set("jcclyq", "以上检材均按照《办理毒品犯罪案件毒品提取、扣押、称量、取样和送检程序若干问题的规定》、《贵阳市公安局关于进一步规范毒品取样、保管及送检程序的通知》要求的提取部位和提取方法进行取样。"); - jsonObject.set("jdjbrqm", ""); /// 鉴定机构经办人签字 ,我们系统是单位自己打印出来,线下自己手签 - jsonObject.set("jdyq", entrustVO.getEntrustRequirement()); // 鉴定要求 - jsonObject.set("jyaq", entrustVO.getCaseBrief()); // 简要案情 - jsonObject.set("lqrqm", NULL_PLACEHOLDER); // 领取人签名 - jsonObject.set("sjr1", entrustVO.getDeliverer1Name()); // 送检人1姓名 - jsonObject.set("sjr2", entrustVO.getDeliverer2Name()); // 送检人2姓名 - jsonObject.set("sjr1dh", entrustVO.getDeliverer1Phone()); // 送检人电话 - jsonObject.set("sjr2dh", entrustVO.getDeliverer2Phone()); - jsonObject.set("sjr1zjh", StrUtil.join(":", entrustVO.getDeliverer1Cert(), entrustVO.getDeliverer1Id())); // 送检人证件和号码 - jsonObject.set("sjr2zjh", StrUtil.join(":", entrustVO.getDeliverer2Cert(), entrustVO.getDeliverer2Id())); - jsonObject.set("sjr1zw", entrustVO.getDeliverer1Position()); // 送检人职务 - jsonObject.set("sjr2zw", entrustVO.getDeliverer2Position()); - jsonObject.set("slbh", entrustVO.getAcceptNo()); - jsonObject.set("slrq", entrustVO.getAcceptTime().format(formatter)); - jsonObject.set("slr", commonFeignService.remoteGetUserById(entrustVO.getAcceptUser()).getName()); - jsonObject.set("slrqm", NULL_PLACEHOLDER); // 鉴定机构受理人签字 - jsonObject.set("type", NULL_PLACEHOLDER); - jsonObject.set("wtbh", entrustVO.getAcceptNo()); // 委托书编号 - jsonObject.set("wtdw", entrustVO.getClientOrgName()); - jsonObject.set("wtsj", entrustVO.getEntrustmentTime().format(formatter)); - List materialList = entrustmentIdentificationMaterialService.list(Wrappers.lambdaQuery() - .eq(EntrustmentIdentificationMaterial::getEntrustmentId, entrustVO.getId())); - List materialBookVoList = entrustmentService.getMaterialBookVoList(materialList); - List table = materialBookVoList.stream().map(materialBookVo -> { - JSONObject materialBookVoJson = new JSONObject(); - materialBookVoJson.set("baozhuang", materialBookVo.isPackComplete() ? "是" : "否"); - materialBookVoJson.set("bh", materialBookVo.getOrderNo()); - materialBookVoJson.set("yswzl", materialBookVo.getMaterialName()); - materialBookVoJson.set("bz", materialBookVo.getRemark()); - materialBookVoJson.set("lcygs", materialBookVo.getRtSampleQuantity()); - materialBookVoJson.set("sl", materialBookVo.getTotalSampleDes()); - materialBookVoJson.set("xzms", materialBookVo.getFormName()); - return materialBookVoJson; - }).collect(Collectors.toList()); - jsonObject.put("table", table); - return jsonObject; - } - - - /** - * 推送委托函数据 - * - * @param entrustVO - * @param dataMap 待推送的数据映射 - */ - private void pushEntrustLetterData(EntrustmentVO entrustVO, Map dataMap) { - JSONObject jsonObject = buildEntrustLetterJsonPayload(entrustVO, dataMap); - - try { - ResponseEntity response = exchangeRemoteApi(jsonObject, apiPathProperties.getEntrustLetter()); - - if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("\"status\":200")) { - log.info("推送鉴定委托书数据成功, 委托编号: {}, 响应: {}", entrustVO.getEntrustmentNo(), response.getBody()); - } else { - log.warn("推送鉴定委托书数据失败, 委托编号: {}, 状态码: {}, 响应: {}", - entrustVO.getEntrustmentNo(), response.getStatusCode(), response.getBody()); - } - } catch (RestClientException e) { - log.error("推送鉴定委托书数据到 LabsCare 失败, 委托编号: {}", entrustVO.getEntrustmentNo(), e); - } - } - - - /** - * 构建委托函的JSON负载 - * - * @param entrustVO 委托VO对象 - * @param dataMap 数据映射 - * @return 构建好的JSON对象 - */ - private JSONObject buildEntrustLetterJsonPayload(EntrustmentVO entrustVO, Map dataMap) { - JSONObject jsonObject = new JSONObject(); - jsonObject.set("afsj", entrustVO.getHappenTime()); // 案发时间 - jsonObject.set("ajmc", entrustVO.getCaseName()); // 案事件名称 - jsonObject.set("dwgz", NULL_PLACEHOLDER); // 单位盖章 - jsonObject.set("jyaq", entrustVO.getCaseBrief()); // 简要案情 - jsonObject.set("sjdwfzr", NULL_PLACEHOLDER); // 单位负责人签名 - jsonObject.set("sjr1", entrustVO.getDeliverer1Name()); // 送检人 - jsonObject.set("sjr2", entrustVO.getDeliverer2Name()); - jsonObject.set("sjr1dh", entrustVO.getDeliverer1Phone()); - jsonObject.set("sjr2dh", entrustVO.getDeliverer2Phone()); - jsonObject.set("slrq", entrustVO.getAcceptTime().format(formatter)); - jsonObject.set("type", NULL_PLACEHOLDER); - jsonObject.set("wtdw", entrustVO.getClientOrgName()); - jsonObject.set("wtsj", entrustVO.getEntrustmentTime().format(formatter)); - jsonObject.set("yjdqk", entrustVO.getOldIdentificationResult()); - - // 组装材料信息 - List materialList = (List) dataMap.get("materialList"); - AtomicInteger index = new AtomicInteger(1); - List table = materialList.stream().map(material -> { - JSONObject materialJson = new JSONObject(); - materialJson.set("bzsfwz", material.getPackComplete() ? "是" : "否"); - materialJson.set("jyjdyq", material.getDrugsValue() + material.getAnalysisOptionValue()); - materialJson.set("lcygs", material.getRtSampleQuantity()); - materialJson.set("projectName", index.getAndIncrement()); - materialJson.set("tqdd", material.getDrawPlace()); - materialJson.set("tqsj", material.getDrawTime().format(formatter)); - materialJson.set("xzms", material.getFormName()); - materialJson.set("yswzl", material.getName()); - materialJson.set("zltj", material.getQuantity() + material.getUnit()); - return materialJson; - }).collect(Collectors.toList()); - - jsonObject.set("table", table); - return jsonObject; - } - - /** - * 通过POST请求与远程API进行交互 - * - * @param jsonObject 包含请求数据的JSONObject对象 - * @param url 远程API的URL - * @return ResponseEntity 包含远程API响应数据的ResponseEntity对象 - */ - private ResponseEntity exchangeRemoteApi(JSONObject jsonObject, String url) { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); // 设置为 application/json - HttpEntity requestEntity = new HttpEntity<>(jsonObject, headers); - ResponseEntity response = HttpsUtils - .genRestTemplate() - .exchange( - url, - HttpMethod.POST, - requestEntity, - String.class - ); - return response; - } } diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/PushDataToLabsCareService.java b/src/main/java/digital/laboratory/platform/entrustment/service/PushDataToLabsCareService.java new file mode 100644 index 0000000..25bf80b --- /dev/null +++ b/src/main/java/digital/laboratory/platform/entrustment/service/PushDataToLabsCareService.java @@ -0,0 +1,28 @@ +package digital.laboratory.platform.entrustment.service; + +import digital.laboratory.platform.entrustment.vo.EntrustmentVO; + +import java.util.Map; + +/** + * @author ChenJiangBao + * @version 1.0 + * @description: 推送数据到labscare平台接口 + * @date 2025/3/27 16:32 + */ +public interface PushDataToLabsCareService { + + /** + * 推送鉴定事项确认书数据 + * + * @param entrustVO 委托vo + */ + void pushItemConfirmLetterData(EntrustmentVO entrustVO); + + /** + * 推送委托函数据 + * + * @param entrustVO + */ + void pushEntrustLetterData(EntrustmentVO entrustVO) throws IllegalAccessException; +} diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/impl/CommonFeignServiceImpl.java b/src/main/java/digital/laboratory/platform/entrustment/service/impl/CommonFeignServiceImpl.java index 6cb6caa..d6c76c3 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/service/impl/CommonFeignServiceImpl.java +++ b/src/main/java/digital/laboratory/platform/entrustment/service/impl/CommonFeignServiceImpl.java @@ -60,7 +60,7 @@ public class CommonFeignServiceImpl implements CommonFeignService { @Override public SysOrg remoteGetSysOrg(String orgId) { SysOrg sysOrg = null; - R r = remoteOrgService.getById(orgId); + R r = remoteOrgService.getByIdWithoutToken(orgId); if (r != null && r.getCode() == CommonConstants.SUCCESS) { sysOrg = r.getData(); } else { diff --git a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentServiceImpl.java b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentServiceImpl.java index 4a91666..93414f5 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentServiceImpl.java +++ b/src/main/java/digital/laboratory/platform/entrustment/service/impl/EntrustmentServiceImpl.java @@ -40,6 +40,7 @@ import digital.laboratory.platform.entrustment.entity.*; import digital.laboratory.platform.entrustment.enums.AnalysisOptionEnums; import digital.laboratory.platform.entrustment.enums.EntrustAlterApplyStatus; import digital.laboratory.platform.entrustment.enums.EntrustStatusConstants; +import digital.laboratory.platform.entrustment.event.PushDataToLabsCareEvent; import digital.laboratory.platform.entrustment.handler.AppStartupRunner; import digital.laboratory.platform.entrustment.mapper.EntrustmentMapper; import digital.laboratory.platform.entrustment.misc.ProcessFlowMapper; @@ -68,6 +69,8 @@ import org.springframework.mock.web.MockMultipartFile; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import javax.activation.MimetypesFileTypeMap; import javax.annotation.Resource; @@ -132,8 +135,6 @@ public class EntrustmentServiceImpl extends ServiceImpl materialList = entrustmentIdentificationMaterialService.list( @@ -2445,22 +2446,8 @@ public class EntrustmentServiceImpl extends ServiceImpl { - this.generateIdentifyItemsBook(entrustment.getId()); - try { - GenerateEntrustmentLetterPDF(this.getEntrustmentVOById(entrustment.getId())); - } catch (Exception e) { - log.error("委托书重新生成失败, 失败原因: {}", e.getMessage()); - } - // 推送数据到LabsCare 平台 -// // 保存当前请求上下文到 RequestContextHolder -// HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); -// // 让异步线程继承主线程的上下文 -// RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); -// applicationContext.publishEvent(new PushDataToLabsCareEvent(this, entrust.getId(), 1)); -// applicationContext.publishEvent(new PushDataToLabsCareEvent(this, entrust.getId(), 2)); - }); + // 异步处理 + processPushDataAndUpdateDoc(entrustment.getId()); //同步第三方禁毒系统的受理功能 开始-------------------------------------------------------------- boolean isSuccess = true; @@ -2523,6 +2510,38 @@ public class EntrustmentServiceImpl extends ServiceImpl { + try { + this.generateIdentifyItemsBook(entrustId); + try { + GenerateEntrustmentLetterPDF(this.getEntrustmentVOById(entrustId)); + } catch (Exception e) { + log.error("委托书重新生成失败, 失败原因: {}", e.getMessage()); + } + // 推送数据到LabsCare 平台 + // 让异步线程继承主线程的上下文 + RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request)); + applicationContext.publishEvent(new PushDataToLabsCareEvent(this, entrustId, 1)); + applicationContext.publishEvent(new PushDataToLabsCareEvent(this, entrustId, 2)); + } finally { + // 清理 RequestContextHolder,避免线程池污染 + RequestContextHolder.resetRequestAttributes(); + } + }).exceptionally(e -> { + e.printStackTrace(); + return null; + }); + } + /** * 创建需要流转到流转系统的检材列表 * @@ -2640,7 +2659,7 @@ public class EntrustmentServiceImpl extends ServiceImpl entrustmentList = entrustmentMapper.getEntrustmentVOList( + Wrappers.query() + .in("e.status", + EntrustStatusConstants.ENTRUST_STATUS_ACCEPTED.getStatus(), + EntrustStatusConstants.ENTRUST_STATUS_TEST_FINISH.getStatus(), + EntrustStatusConstants.ENTRUST_STATUS_COMPLETED.getStatus()) + .and(wrapper -> wrapper + .eq("e.push_flag", "") + .or() + .isNull("e.push_flag") + .or() + .like("e.push_flag", "false") + ) + ); + + for (EntrustmentVO entrustmentVO : entrustmentList) { + String pushFlag = entrustmentVO.getPushFlag(); + if (StrUtil.isBlank(pushFlag)) { + pushEntrustLetterData(entrustmentVO); + pushItemConfirmLetterData(entrustmentVO); + } else { + List flagList = StrUtil.split(pushFlag, StrUtil.COMMA).stream().filter(str -> str.contains("false")).collect(Collectors.toList()); + for (String flag : flagList) { + if (flag.contains(ENTRUST_LETTER)) { + pushEntrustLetterData(entrustmentVO); + } else { + pushItemConfirmLetterData(entrustmentVO); + } + } + } + } + } + + /** + * 推送鉴定事项确认书数据 + * + * @param entrustVO 委托vo + */ + @Override + public void pushItemConfirmLetterData(EntrustmentVO entrustVO) { + JSONObject jsonObject = buildItemConfirmLetterJsonPayload(entrustVO); + String successFlag = ITEM_CONFIRM_LETTER + ":true"; + String failureFlag = ITEM_CONFIRM_LETTER + ":false"; + try { + ResponseEntity response = exchangeRemoteApi(jsonObject, apiPathProperties.getConfirmLetter()); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("\"status\":200")) { + updatePushFlag(entrustVO, ITEM_CONFIRM_LETTER, successFlag); + log.info("推送鉴定事项确认书数据成功, 受理编号: {}, 响应: {}", entrustVO.getAcceptNo(), response.getBody()); + } else { + updatePushFlag(entrustVO, ITEM_CONFIRM_LETTER, failureFlag); + log.warn("推送鉴定事项确认书数据失败, 受理编号: {}, 状态码: {}, 响应: {}", + entrustVO.getAcceptNo(), response.getStatusCode(), response.getBody()); + } + } catch (RestClientException e) { + log.error("推送鉴定事项确认书数据到 LabsCare 失败, 受理编号: {}", entrustVO.getAcceptNo(), e); + } + } + + /** + * 推送委托函数据 + * + * @param entrustVO + */ + @Override + public void pushEntrustLetterData(EntrustmentVO entrustVO) throws IllegalAccessException { + Map dataMap = entrustmentService.buildEntrustLetterDataMap(entrustVO); + JSONObject jsonObject = buildEntrustLetterJsonPayload(entrustVO, dataMap); + + String successFlag = ENTRUST_LETTER + ":true"; + String failureFlag = ENTRUST_LETTER + ":false"; + try { + ResponseEntity response = exchangeRemoteApi(jsonObject, apiPathProperties.getEntrustLetter()); + + if (response.getStatusCode().is2xxSuccessful() && response.getBody().contains("\"status\":200")) { + updatePushFlag(entrustVO, ENTRUST_LETTER, successFlag); + log.info("推送鉴定委托书数据成功, 委托编号: {}, 响应: {}", entrustVO.getEntrustmentNo(), response.getBody()); + } else { + updatePushFlag(entrustVO, ENTRUST_LETTER, failureFlag); + log.warn("推送鉴定委托书数据失败, 委托编号: {}, 状态码: {}, 响应: {}", + entrustVO.getEntrustmentNo(), response.getStatusCode(), response.getBody()); + } + } catch (RestClientException e) { + log.error("推送鉴定委托书数据到 LabsCare 失败, 委托编号: {}", entrustVO.getEntrustmentNo(), e); + } + } + + + /** + * 构建委托函的JSON负载 + * + * @param entrustVO 委托VO对象 + * @param dataMap 数据映射 + * @return 构建好的JSON对象 + */ + private JSONObject buildEntrustLetterJsonPayload(EntrustmentVO entrustVO, Map dataMap) { + JSONObject jsonObject = new JSONObject(); + jsonObject.set("afsj", entrustVO.getHappenTime()); // 案发时间 + jsonObject.set("ajmc", entrustVO.getCaseName()); // 案事件名称 + jsonObject.set("dwgz", entrustVO.getClientOrgName()); // 单位盖章 + jsonObject.set("jyaq", entrustVO.getCaseBrief()); // 简要案情 + jsonObject.set("sjdwfzr", entrustVO.getDeliverer1Name() + "、" + entrustVO.getDeliverer2Name()); // 单位负责人签名 + jsonObject.set("sjr1", entrustVO.getDeliverer1Name()); // 送检人 + jsonObject.set("sjr2", entrustVO.getDeliverer2Name()); + jsonObject.set("sjr1dh", entrustVO.getDeliverer1Phone()); + jsonObject.set("sjr2dh", entrustVO.getDeliverer2Phone()); + jsonObject.set("slrq", entrustVO.getAcceptTime().format(formatter)); + jsonObject.set("wtdw", entrustVO.getClientOrgName()); + jsonObject.set("wtsj", entrustVO.getEntrustmentTime().format(formatter)); + jsonObject.set("yjdqk", entrustVO.getOldIdentificationResult()); + + // 组装材料信息 + List materialList = (List) dataMap.get("materialList"); + AtomicInteger index = new AtomicInteger(1); + List table = materialList.stream().map(material -> { + JSONObject materialJson = new JSONObject(); + materialJson.set("bzsfwz", material.getPackComplete() ? "是" : "否"); + materialJson.set("jyjdyq", material.getDrugsValue() + material.getAnalysisOptionValue()); + materialJson.set("lcygs", material.getRtSampleQuantity()); + materialJson.set("projectName", index.getAndIncrement()); + materialJson.set("tqdd", material.getDrawPlace()); + materialJson.set("tqsj", material.getDrawTime().format(formatter)); + materialJson.set("xzms", material.getFormName()); + materialJson.set("yswzl", material.getName()); + materialJson.set("zltj", material.getQuantity() + material.getUnit()); + return materialJson; + }).collect(Collectors.toList()); + + jsonObject.set("table", table); + return jsonObject; + } + + /** + * 构建鉴定事项确认书的JSON负载 + * + * @param entrustVO 委托单VO对象,包含构建JSON负载所需的数据 + * @return 包含鉴定事项确认书数据的JSONObject对象 + */ + private JSONObject buildItemConfirmLetterJsonPayload(EntrustmentVO entrustVO) { + JSONObject jsonObject = new JSONObject(); + SysUser sysUser = commonFeignService.remoteGetUserById(entrustVO.getAcceptUser()); + jsonObject.set("ajmc", entrustVO.getCaseName()); // 案件名称 + jsonObject.set("dwfzr", StrUtil.join("、", entrustVO.getDeliverer1Name(), entrustVO.getDeliverer2Name())); // 送检人签名 + // 检材处理要求,这里的值是直接复制了确认书里的值 + jsonObject.set("jcclyq", "以上检材均按照《办理毒品犯罪案件毒品提取、扣押、称量、取样和送检程序若干问题的规定》、《贵阳市公安局关于进一步规范毒品取样、保管及送检程序的通知》要求的提取部位和提取方法进行取样。"); + jsonObject.set("jdjbrqm", sysUser.getName()); /// 鉴定机构经办人签字 ,我们系统是单位自己打印出来,线下自己手签 + jsonObject.set("jdyq", entrustVO.getEntrustRequirement()); // 鉴定要求 + jsonObject.set("jyaq", entrustVO.getCaseBrief()); // 简要案情 + jsonObject.set("lqrqm", StrUtil.join("、", entrustVO.getDeliverer1Name(), entrustVO.getDeliverer2Name())); // 领取人签名 + jsonObject.set("sjr1", entrustVO.getDeliverer1Name()); // 送检人1姓名 + jsonObject.set("sjr2", entrustVO.getDeliverer2Name()); // 送检人2姓名 + jsonObject.set("sjr1dh", entrustVO.getDeliverer1Phone()); // 送检人电话 + jsonObject.set("sjr2dh", entrustVO.getDeliverer2Phone()); + jsonObject.set("sjr1zjh", StrUtil.join(":", entrustVO.getDeliverer1Cert(), entrustVO.getDeliverer1Id())); // 送检人证件和号码 + jsonObject.set("sjr2zjh", StrUtil.join(":", entrustVO.getDeliverer2Cert(), entrustVO.getDeliverer2Id())); + jsonObject.set("sjr1zw", entrustVO.getDeliverer1Position()); // 送检人职务 + jsonObject.set("sjr2zw", entrustVO.getDeliverer2Position()); + jsonObject.set("slbh", entrustVO.getAcceptNo()); + jsonObject.set("slrq", entrustVO.getAcceptTime().format(formatter)); + jsonObject.set("slr", sysUser.getName()); + jsonObject.set("slrqm", sysUser.getName()); // 鉴定机构受理人签字 + jsonObject.set("wtbh", entrustVO.getAcceptNo()); // 委托书编号 + jsonObject.set("wtdw", entrustVO.getClientOrgName()); + jsonObject.set("wtsj", entrustVO.getEntrustmentTime().format(formatter)); + List materialList = entrustmentIdentificationMaterialService.list(Wrappers.lambdaQuery() + .eq(EntrustmentIdentificationMaterial::getEntrustmentId, entrustVO.getId())); + List materialBookVoList = entrustmentService.getMaterialBookVoList(materialList); + List table = materialBookVoList.stream().map(materialBookVo -> { + JSONObject materialBookVoJson = new JSONObject(); + materialBookVoJson.set("baozhuang", materialBookVo.isPackComplete() ? "是" : "否"); + materialBookVoJson.set("bh", materialBookVo.getOrderNo()); + materialBookVoJson.set("yswzl", materialBookVo.getMaterialName()); + materialBookVoJson.set("bz", StrUtil.isBlank(materialBookVo.getRemark()) ? NULL_PLACEHOLDER : materialBookVo.getRemark()); + materialBookVoJson.set("lcygs", materialBookVo.getRtSampleQuantity()); + materialBookVoJson.set("sl", materialBookVo.getTotalSampleDes()); + materialBookVoJson.set("xzms", materialBookVo.getFormName()); + return materialBookVoJson; + }).collect(Collectors.toList()); + jsonObject.put("table", table); + return jsonObject; + } + + + /** + * 通过POST请求与远程API进行交互 + * + * @param jsonObject 包含请求数据的JSONObject对象 + * @param url 远程API的URL + * @return ResponseEntity 包含远程API响应数据的ResponseEntity对象 + */ + private ResponseEntity exchangeRemoteApi(JSONObject jsonObject, String url) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); // 设置为 application/json + HttpEntity requestEntity = new HttpEntity<>(jsonObject, headers); + ResponseEntity response = HttpsUtils + .genRestTemplate() + .exchange( + url, + HttpMethod.POST, + requestEntity, + String.class + ); + return response; + } + + /** + * 更新推送标志 + * + * @param entrustVO 委托VO对象 + * @param pushType 推送类型 EntrustLetter 委托书 | ItemConfirmLetter 事项确认书 + * @param newFlag 新的推送标志 + */ + private void updatePushFlag(EntrustmentVO entrustVO, String pushType, String newFlag) { + List flagList = Optional.ofNullable(StrUtil.split(entrustVO.getPushFlag(), StrUtil.COMMA)) + .orElse(new ArrayList<>()); + + // 判断是否已有 指定的推送类型,如果有就替换,否则添加 + boolean exists = flagList.stream().anyMatch(flag -> flag.contains(pushType)); + if (exists) { + flagList.replaceAll(flag -> flag.contains(pushType) ? newFlag : flag); + } else { + flagList.add(newFlag); + } + + // 更新数据库 + entrustmentService.update(Wrappers.lambdaUpdate() + .eq(Entrustment::getId, entrustVO.getId()) + .set(Entrustment::getPushFlag, String.join(",", flagList))); + } + + +} diff --git a/src/main/java/digital/laboratory/platform/entrustment/vo/EntrustmentVO.java b/src/main/java/digital/laboratory/platform/entrustment/vo/EntrustmentVO.java index 688226f..8ca367d 100644 --- a/src/main/java/digital/laboratory/platform/entrustment/vo/EntrustmentVO.java +++ b/src/main/java/digital/laboratory/platform/entrustment/vo/EntrustmentVO.java @@ -1,50 +1,93 @@ package digital.laboratory.platform.entrustment.vo; +import digital.laboratory.platform.common.aop.annotation.DlpFeign; import digital.laboratory.platform.entrustment.entity.Entrustment; import digital.laboratory.platform.entrustment.entity.EntrustmentIdentificationMaterial; +import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data +@ApiModel(description = "委托信息视图对象") public class EntrustmentVO extends Entrustment { - String caseName; // 案件名称 - String caseNo; // 案件编号 - String caseBrief; // 案情简要 - List clientOrgAncestors; // 委托单位的祖先 id, json 字符串数组 - String submitterName; // 委托提交人姓名 - String checkClaimUserName; // 审核任务认领人姓名 - String checkUserName; // 审核人姓名 - String approveClaimUserName; // 审批任务认领人姓名 - String approveUserName; // 审批人姓名 - String deliverConfirmUserName; // 送检确认人姓名 - String deliverSubmitterName; // 送检操作提交人姓名 - String acceptClaimUserName; // 受理任务认领人姓名 - String acceptUserName; // 受理人姓名 - String reportSenderUserName; // 报告发放人姓名 - String sampleSenderUserName; // 检材发放人姓名 + @ApiModelProperty("案件名称") + private String caseName; - String createUserName; // 创建人姓名 - String updateUserName; // 更新人姓名 + @ApiModelProperty("案件编号") + private String caseNo; - String statusDescription; // 状态描述 - String previousStatusDescription; // 上一个状态的描述 + @ApiModelProperty("案情简要") + private String caseBrief; - int identificationMaterialCount; // 检材数量 + @ApiModelProperty("委托单位的祖先 ID(JSON 数组)") + private List clientOrgAncestors; - String oldIdentificationBrief; // 原鉴定情况(组合5个字段形成综述) + @ApiModelProperty("委托提交人姓名") + private String submitterName; - String identificationNo; + @ApiModelProperty("审核任务认领人姓名") + private String checkClaimUserName; - String happenTime;//案发时间 + @ApiModelProperty("审核人姓名") + private String checkUserName; + + @ApiModelProperty("审批任务认领人姓名") + private String approveClaimUserName; + + @ApiModelProperty("审批人姓名") + private String approveUserName; + + @ApiModelProperty("送检确认人姓名") + private String deliverConfirmUserName; + + @ApiModelProperty("送检操作提交人姓名") + private String deliverSubmitterName; + + @ApiModelProperty("受理任务认领人姓名") + private String acceptClaimUserName; + + @ApiModelProperty("受理人姓名") + private String acceptUserName; + + @ApiModelProperty("报告发放人姓名") + private String reportSenderUserName; + + @ApiModelProperty("检材发放人姓名") + private String sampleSenderUserName; + + @ApiModelProperty("创建人姓名") + private String createUserName; + + @ApiModelProperty("更新人姓名") + private String updateUserName; + + @ApiModelProperty("状态描述") + private String statusDescription; + + @ApiModelProperty("上一个状态的描述") + private String previousStatusDescription; + + @ApiModelProperty("检材数量") + private int identificationMaterialCount; + + @ApiModelProperty("原鉴定情况(组合 5 个字段形成综述)") + private String oldIdentificationBrief; + + @ApiModelProperty("鉴定编号") + private String identificationNo; + + @ApiModelProperty("案发时间") + private String happenTime; @ApiModelProperty("委托关联的检出有多少检出的数量") private Integer checkoutResultCount; - @ApiModelProperty("委托关联的检出有多少检出信息字符串") + @ApiModelProperty("委托关联的检出信息字符串") private String checkoutResultStr; - private List materialList;//检材列表 + @ApiModelProperty("检材列表") + private List materialList; } diff --git a/src/main/resources/mapper/EntrustmentMapper.xml b/src/main/resources/mapper/EntrustmentMapper.xml index df5ca31..6902869 100644 --- a/src/main/resources/mapper/EntrustmentMapper.xml +++ b/src/main/resources/mapper/EntrustmentMapper.xml @@ -4,425 +4,425 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + - - - - - - - - + + - - + - + - + - + + e.id, + e.case_id, + e.entrustment_no, + e.third_sys_entrust_no, + e.entrustment_type, + e.business_type, + e.process_instance_id, + e.identification_id, + e.entrustment_time, + e.submitter, + e.submit_time, + e.client_org_id, + e.client_org_name, + e.client_address, + e.client_postcode, + e.client_tel, + e.client_fax, + e.identification_domain, + e.identification_org_name, + e.qualitative_analysis, + e.quantitative_analysis, + e.other_identification_requests, + e.candidate_drugs, + e.is_client_specified_method, + e.client_specified_method, + e.destructive_analysis, + e.other_identification_notes, + e.reidentification, + e.old_identification_org_name, + e.old_identification_document, + e.old_identification_result, + e.reidentification_reason, + e.avoid_identifier, + e.specified_identifier, + e.other_agreement, + e.comments, + e.check_candidate_user, + e.check_claim_user, + e.check_claim_time, + e.check_user, + e.check_time, + e.check_comments, + e.check_times, + e.check_all_identification_material_confirmed, + e.approve_candidate_user, + e.approve_claim_user, + e.approve_claim_time, + e.approve_user, + e.approve_time, + e.approve_comments, + e.approve_times, + e.deliver_confirm_user, + e.deliver_confirm_time, + e.deliver_confirm_comments, + e.deliver_time, + e.deliver_submitter, + e.deliverer1_name, + e.deliverer1_position, + e.deliverer1_cert, + e.deliverer1_id, + e.deliverer1_phone, + e.deliverer2_name, + e.deliverer2_position, + e.deliverer2_cert, + e.deliverer2_id, + e.deliverer2_phone, + e.accept_claim_user, + e.accept_claim_time, + e.accept_no, + e.accept_user, + e.accept_time, + e.accept_comments, + e.identification_items_confirm_printed, + e.process_info, + e.report_receive_mode, + e.report_receiver1_user_id, + e.report_receiver1_name, + e.report_receiver1_position, + e.report_receiver1_cert, + e.report_receiver1_id, + e.report_receiver1_phone, + e.report_receiver2_user_id, + e.report_receiver2_name, + e.report_receiver2_position, + e.report_receiver2_cert, + e.report_receiver2_id, + e.report_receiver2_phone, + e.report_sender_user_id, + e.report_sent_time, + e.report_receiver1_signature, + e.report_receiver2_signature, + e.sample_receive_mode, + e.sample_receiver1_user_id, + e.sample_receiver1_name, + e.sample_receiver1_position, + e.sample_receiver1_cret, + e.sample_receiver1_id, + e.sample_receiver1_phone, + e.sample_receiver2_user_id, + e.sample_receiver2_name, + e.sample_receiver2_position, + e.sample_receiver2_cret, + e.sample_receiver2_id, + e.sample_receiver2_phone, + e.sample_sender_user_id, + e.sample_sent_time, + e.sample_receiver1_person_signature, + e.sample_receiver2_person_signnature, + e.status, + e.previous_status, + e.create_time, + e.create_by, + e.update_time, + e.update_by, + e.entrustment_letter_path, + e.identification_items_confirm_path, + e.accept_need_professional, + e.data_sources, + e.accept_no_third_sys, + e.entrust_requirement, + e.post_address, + e.return_or_not, + e.is_trans, + e.material_image_flag, + e.push_flag + - - e.id, - e.case_id, - e.entrustment_no, - e.third_sys_entrust_no, - e.entrustment_type, - e.business_type, - e.process_instance_id, - e.identification_id, - e.entrustment_time, - e.submitter, - e.submit_time, - e.client_org_id, - e.client_org_name, - e.client_address, - e.client_postcode, - e.client_tel, - e.client_fax, - e.identification_domain, - e.identification_org_name, - e.qualitative_analysis, - e.quantitative_analysis, - e.other_identification_requests, - e.candidate_drugs, - e.is_client_specified_method, - e.client_specified_method, - e.destructive_analysis, - e.other_identification_notes, - e.reidentification, - e.old_identification_org_name, - e.old_identification_document, - e.old_identification_result, - e.reidentification_reason, - e.avoid_identifier, - e.specified_identifier, - e.other_agreement, - e.comments, - e.check_candidate_user, - e.check_claim_user, - e.check_claim_time, - e.check_user, - e.check_time, - e.check_comments, - e.check_times, - e.check_all_identification_material_confirmed, - e.approve_candidate_user, - e.approve_claim_user, - e.approve_claim_time, - e.approve_user, - e.approve_time, - e.approve_comments, - e.approve_times, - e.deliver_confirm_user, - e.deliver_confirm_time, - e.deliver_confirm_comments, - e.deliver_time, - e.deliver_submitter, - e.deliverer1_name, - e.deliverer1_position, - e.deliverer1_cert, - e.deliverer1_id, - e.deliverer1_phone, - e.deliverer2_name, - e.deliverer2_position, - e.deliverer2_cert, - e.deliverer2_id, - e.deliverer2_phone, - e.accept_claim_user, - e.accept_claim_time, - e.accept_no, - e.accept_user, - e.accept_time, - e.accept_comments, - e.identification_items_confirm_printed, - e.process_info, - e.report_receive_mode, - e.report_receiver1_user_id, - e.report_receiver1_name, - e.report_receiver1_position, - e.report_receiver1_cert, - e.report_receiver1_id, - e.report_receiver1_phone, - e.report_receiver2_user_id, - e.report_receiver2_name, - e.report_receiver2_position, - e.report_receiver2_cert, - e.report_receiver2_id, - e.report_receiver2_phone, - e.report_sender_user_id, - e.report_sent_time, - e.report_receiver1_signature, - e.report_receiver2_signature, - e.sample_receive_mode, - e.sample_receiver1_user_id, - e.sample_receiver1_name, - e.sample_receiver1_position, - e.sample_receiver1_cret, - e.sample_receiver1_id, - e.sample_receiver1_phone, - e.sample_receiver2_user_id, - e.sample_receiver2_name, - e.sample_receiver2_position, - e.sample_receiver2_cret, - e.sample_receiver2_id, - e.sample_receiver2_phone, - e.sample_sender_user_id, - e.sample_sent_time, - e.sample_receiver1_person_signature, - e.sample_receiver2_person_signnature, - e.status, - e.previous_status, - e.create_time, - e.create_by, - e.update_time, - e.update_by, - e.entrustment_letter_path, - e.identification_items_confirm_path, - e.transfer_status, - e.transfer_oper_signnature, - e.transfer_get_signnature, - e.transfer_name, - e.transfer_no, - e.accept_need_professional, - e.data_sources, - e.accept_no_third_sys, - e.entrust_requirement, - e.post_address, - e.return_or_not, - e.is_trans, - e.material_image_flag - + - + SELECT + , + c.case_name, + c.case_no, + c.case_brief, + c.happen_time, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.submitter + ) AS submitter_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.check_claim_user + ) AS check_claim_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.check_user + ) AS check_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.approve_claim_user + ) AS approve_claim_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.approve_user + ) AS approve_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.deliver_confirm_user + ) AS deliver_confirm_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.deliver_submitter + ) AS deliver_submitter_name, + -- ( + -- SELECT user.name + -- FROM dlp_base.sys_user user + -- WHERE user.user_id=e.accept_claim_user + -- ) AS accept_claim_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.accept_user + ) AS accept_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.report_sender_user_id + ) AS report_sender_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.sample_sender_user_id + ) AS sample_sender_user_name, - SELECT - , - c.case_name, - c.case_no, - c.case_brief, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.submitter - ) AS submitter_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.check_claim_user - ) AS check_claim_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.check_user - ) AS check_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.approve_claim_user - ) AS approve_claim_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.approve_user - ) AS approve_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.deliver_confirm_user - ) AS deliver_confirm_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.deliver_submitter - ) AS deliver_submitter_name, - -- ( - -- SELECT user.name - -- FROM dlp_base.sys_user user - -- WHERE user.user_id=e.accept_claim_user - -- ) AS accept_claim_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.accept_user - ) AS accept_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.report_sender_user_id - ) AS report_sender_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.sample_sender_user_id - ) AS sample_sender_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.create_by + ) AS create_user_name, + ( + SELECT user.name + FROM dlp_base.sys_user user + WHERE user.user_id=e.update_by + ) AS update_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.create_by - ) AS create_user_name, - ( - SELECT user.name - FROM dlp_base.sys_user user - WHERE user.user_id=e.update_by - ) AS update_user_name, + ( + SELECT COUNT(*) + FROM b_entrustment_identification_material eim + WHERE eim.entrustment_id=e.id + ) AS identification_material_count, - ( - SELECT COUNT(*) - FROM b_entrustment_identification_material eim - WHERE eim.entrustment_id=e.id - ) AS identification_material_count, + ( + select identification_no + from b_identification i + where i.id = e.identification_id + ) as identification_no, + ( + SELECT COUNT(*) FROM b_entrust_material_checkout_result emr WHERE emr.entrust_id = e.id + ) AS checkout_result_count - ( - select identification_no - from b_identification i - where i.id = e.identification_id - ) as identification_no, - ( - SELECT COUNT(*) FROM b_entrust_material_checkout_result emr WHERE emr.entrust_id = e.id - ) AS checkout_result_count + FROM b_entrustment e + LEFT JOIN b_case_event c on e.case_id=c.id - FROM b_entrustment e - LEFT JOIN b_case_event c on e.case_id=c.id + - - - - + + - - + + - - + + - - - - + + + + - + - + - +