parent
							
								
									8f0dfd5b67
								
							
						
					
					
						commit
						73d149c1d8
					
				@ -0,0 +1,17 @@ | 
				
			||||
package digital.laboratory.platform.entrustment.constant; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * 实际类型的格式化常量 | 
				
			||||
 */ | 
				
			||||
public interface DateTimeFormatterConstants { | 
				
			||||
 | 
				
			||||
    String yyyy年MM月dd日 = "yyyy年MM月dd日"; | 
				
			||||
 | 
				
			||||
    String yyyy年MM月dd日_HH时mm分ss秒 = "yyyy年MM月dd日 HH时mm分ss秒"; | 
				
			||||
 | 
				
			||||
    String yyyy_MM_dd = "yyyy-MM-dd"; | 
				
			||||
 | 
				
			||||
    String yyyy_MM_dd_HH_mm_ss = "yyyy-MM-dd HH:mm:ss"; | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,37 @@ | 
				
			||||
package digital.laboratory.platform.entrustment.event; | 
				
			||||
 | 
				
			||||
import lombok.Getter; | 
				
			||||
import org.springframework.context.ApplicationEvent; | 
				
			||||
 | 
				
			||||
import java.time.Clock; | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
 * 推送数据到LabsCare 数据平台上的spring 事件 | 
				
			||||
 */ | 
				
			||||
@Getter | 
				
			||||
public class PushDataToLabsCareEvent extends ApplicationEvent { | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 委托id | 
				
			||||
     */ | 
				
			||||
    private final String entrustId; | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 推送的数据类型, 1 鉴定委托书数据 | 2 鉴定事项确认书数据 | 
				
			||||
     */ | 
				
			||||
    private final Integer pushType; | 
				
			||||
 | 
				
			||||
    public PushDataToLabsCareEvent(Object source, String entrustId, Integer pushType) { | 
				
			||||
        super(source); | 
				
			||||
        this.entrustId = entrustId; | 
				
			||||
        this.pushType = pushType; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    public PushDataToLabsCareEvent(Object source, Clock clock, String entrustId, Integer pushType) { | 
				
			||||
        super(source, clock); | 
				
			||||
        this.entrustId = entrustId; | 
				
			||||
        this.pushType = pushType; | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
 | 
				
			||||
} | 
				
			||||
@ -0,0 +1,256 @@ | 
				
			||||
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.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 平台的事件, 采用异步 | 
				
			||||
 */ | 
				
			||||
@Slf4j | 
				
			||||
@Component | 
				
			||||
public class PushDataToLabsCareEventListener implements ApplicationListener<PushDataToLabsCareEvent> { | 
				
			||||
 | 
				
			||||
    @Resource | 
				
			||||
    private ApiPathProperties apiPathProperties; | 
				
			||||
 | 
				
			||||
    @Resource | 
				
			||||
    private EntrustmentService entrustmentService; | 
				
			||||
 | 
				
			||||
    @Resource | 
				
			||||
    private CommonFeignService commonFeignService; | 
				
			||||
 | 
				
			||||
    @Resource | 
				
			||||
    private EntrustmentIdentificationMaterialService entrustmentIdentificationMaterialService; | 
				
			||||
 | 
				
			||||
    private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日"); | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 处理委托数据推送事件 | 
				
			||||
     * | 
				
			||||
     * @param event 委托数据推送事件对象 | 
				
			||||
     */ | 
				
			||||
    @Override | 
				
			||||
    public void onApplicationEvent(PushDataToLabsCareEvent event) { | 
				
			||||
        CompletableFuture.supplyAsync(() -> { | 
				
			||||
            // 获取委托信息
 | 
				
			||||
            EntrustmentVO entrustVO = entrustmentService.getEntrustmentVOById(event.getEntrustId()); | 
				
			||||
            if (entrustVO == null) { | 
				
			||||
                log.warn("未找到委托信息, entrustId={}", event.getEntrustId()); | 
				
			||||
                return null; | 
				
			||||
            } | 
				
			||||
            return entrustVO; | 
				
			||||
        }, GlobalThreadPool.getInstance()).thenAcceptAsync(entrustVO -> { | 
				
			||||
            if (entrustVO == null) return; // 提前返回,避免后续报错
 | 
				
			||||
 | 
				
			||||
            // 处理不同的推送类型
 | 
				
			||||
            switch (event.getPushType()) { | 
				
			||||
                case 1: // 推送委托书数据
 | 
				
			||||
                    try { | 
				
			||||
                        Map<String, Object> dataMap = entrustmentService.buildEntrustLetterDataMap(entrustVO); | 
				
			||||
                        pushEntrustLetterData(entrustVO, dataMap); | 
				
			||||
                    } catch (IllegalAccessException e) { | 
				
			||||
                        log.error("委托编号 {} 的鉴定委托书数据推送失败!", entrustVO.getEntrustmentNo(), e); | 
				
			||||
                    } | 
				
			||||
                    break; | 
				
			||||
                case 2: // 推送鉴定事项确认书数据
 | 
				
			||||
                    try { | 
				
			||||
                        pushItemConfirmLetterData(entrustVO); | 
				
			||||
                    } catch (Exception e) { | 
				
			||||
                        log.error("受理编号 {} 的鉴定事项确认书数据推送失败!", entrustVO.getAcceptNo(), e); | 
				
			||||
                    } | 
				
			||||
                    break; | 
				
			||||
                default: | 
				
			||||
                    log.warn("未知的推送类型: {}", event.getPushType()); | 
				
			||||
                    break; | 
				
			||||
            } | 
				
			||||
        }, GlobalThreadPool.getInstance()).exceptionally(e -> { | 
				
			||||
            log.error("推送数据到 LabsCare 失败", e); | 
				
			||||
            return null; | 
				
			||||
        }); | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * 推送鉴定事项确认书数据 | 
				
			||||
     * | 
				
			||||
     * @param entrustVO 委托vo | 
				
			||||
     */ | 
				
			||||
    private void pushItemConfirmLetterData(EntrustmentVO entrustVO) { | 
				
			||||
        JSONObject jsonObject = buildItemConfirmLetterJsonPayload(entrustVO); | 
				
			||||
 | 
				
			||||
        try { | 
				
			||||
            ResponseEntity<String> 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", ""); // 领取人签名
 | 
				
			||||
        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", ""); // 鉴定机构受理人签字
 | 
				
			||||
        jsonObject.set("type", ""); | 
				
			||||
        jsonObject.set("wtbh", entrustVO.getAcceptNo()); // 委托书编号
 | 
				
			||||
        jsonObject.set("wtdw", entrustVO.getClientOrgName()); | 
				
			||||
        jsonObject.set("wtsj", entrustVO.getEntrustmentTime().format(formatter)); | 
				
			||||
        List<EntrustmentIdentificationMaterial> materialList = entrustmentIdentificationMaterialService.list(Wrappers.<EntrustmentIdentificationMaterial>lambdaQuery() | 
				
			||||
                .eq(EntrustmentIdentificationMaterial::getEntrustmentId, entrustVO.getId())); | 
				
			||||
        List<MaterialListForBookVo> materialBookVoList = entrustmentService.getMaterialBookVoList(materialList); | 
				
			||||
        List<JSONObject> 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<String, Object> dataMap) { | 
				
			||||
        JSONObject jsonObject = buildEntrustLetterJsonPayload(entrustVO, dataMap); | 
				
			||||
 | 
				
			||||
        try { | 
				
			||||
            ResponseEntity<String> 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<String, Object> dataMap) { | 
				
			||||
        JSONObject jsonObject = new JSONObject(); | 
				
			||||
        jsonObject.set("afsj", entrustVO.getHappenTime()); | 
				
			||||
        jsonObject.set("ajmc", entrustVO.getCaseName()); | 
				
			||||
        jsonObject.set("jyaq", entrustVO.getCaseBrief()); | 
				
			||||
        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<EntrustmentIdentificationMaterial> materialList = (List<EntrustmentIdentificationMaterial>) dataMap.get("materialList"); | 
				
			||||
        AtomicInteger index = new AtomicInteger(1); | 
				
			||||
        List<JSONObject> 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<String> 包含远程API响应数据的ResponseEntity对象 | 
				
			||||
     */ | 
				
			||||
    private ResponseEntity<String> exchangeRemoteApi(JSONObject jsonObject, String url) { | 
				
			||||
        HttpHeaders headers = new HttpHeaders(); | 
				
			||||
        headers.setContentType(MediaType.APPLICATION_JSON);  // 设置为 application/json
 | 
				
			||||
        HttpEntity<JSONObject> requestEntity = new HttpEntity<>(jsonObject, headers); | 
				
			||||
        ResponseEntity<String> response = HttpsUtils | 
				
			||||
                .genRestTemplate() | 
				
			||||
                .exchange( | 
				
			||||
                        url, | 
				
			||||
                        HttpMethod.POST, | 
				
			||||
                        requestEntity, | 
				
			||||
                        String.class | 
				
			||||
                ); | 
				
			||||
        return response; | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue