Przeglądaj źródła

中煤爬虫报价相关

shenweidong 1 rok temu
rodzic
commit
705956a0e3
17 zmienionych plików z 1292 dodań i 30 usunięć
  1. 14 7
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/service/impl/ZhongMeiApiRequestImpl.java
  2. 531 4
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/component/ZmCrawlerRequestComponent.java
  3. 41 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/ZmCrawlerImageConstant.java
  4. 9 2
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/enums/RequestUrl.java
  5. 58 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerImageImportRequest.java
  6. 113 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerOrderStatusRequest.java
  7. 1 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java
  8. 57 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerSubmitRequest.java
  9. 48 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerImageImportResponse.java
  10. 139 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerOrderStatusResponse.java
  11. 74 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerSubmitResponse.java
  12. 35 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/po/ZmCrawlerOrder.java
  13. 6 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/properties/ZmCrawlerProperties.java
  14. 16 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/repository/ZmCrawlerOrderReposiroty.java
  15. 88 15
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java
  16. 46 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZmCrawlerOrderServiceImpl.java
  17. 16 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/ZmCrawlerOrderService.java

+ 14 - 7
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/service/impl/ZhongMeiApiRequestImpl.java

@@ -1,12 +1,10 @@
 package com.jzg.quote.zhongmei.api.service.impl;
 
 
+import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.constant.InsuranceCode;
-import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.*;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
 import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
@@ -70,7 +68,7 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
 
     @Override
     @Transactional
-    public void underwriting(UnderwritingVo underwritingVo) {
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
         OrderBase orderBase = underwritingVo.getOrder();
         //获取配置信息
         ZmApiConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmApiConfigureParameters.class, orderBase.getAttributionInformationVo().getConfigInfo());
@@ -95,10 +93,17 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
             zmApiOrder.setPayUrl(submitResponse.getPayUrl());
             zhongmeiApiOrderService.update(zmApiOrder);
         }
+        return null;
     }
 
+    /**
+     * 获取支付链接
+     *
+     * @param paymentLinkVo
+     */
     @Override
-    public String getPaymentLink(OrderBase orderBase) {
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
+        OrderBase orderBase = paymentLinkVo.getOrder();
         ZmApiOrder zmApiOrder = zhongmeiApiOrderService.findByOrdersNo(orderBase.getOrdersNo());
         String payUrl = zmApiOrder.getPayUrl();
         //如果mongodb中没有支付链接,说明是人工审核,需要调用核保状态查询接口
@@ -113,9 +118,11 @@ public class ZhongMeiApiRequestImpl implements ZhongMeiApiRequest {
             SubmitStatusQueryResponse submitStatusQueryResponse = zmApiRequestComponent.submitStatus(submitStatusQueryRequest, SubmitStatusQueryResponse.class);
             payUrl = StringUtils.isEmpty(submitStatusQueryResponse.getPayUrl()) ? submitStatusQueryResponse.getUnderWriteInd() : submitStatusQueryResponse.getPayUrl();
         }
-        return payUrl;
+        return null;
     }
 
+
+
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         OrderBase orderBase = insuranceUploadImageVo.getOrder();

+ 531 - 4
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/component/ZmCrawlerRequestComponent.java

@@ -1,34 +1,43 @@
 package com.jzg.quote.zhongmei.crawler.component;
 
+import cn.hutool.core.util.XmlUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.constant.CacheConstant;
-import com.jzg.quotation.commons.entity.vo.base.LoginBase;
-import com.jzg.quotation.commons.entity.vo.base.R;
+import com.jzg.quotation.commons.entity.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
 import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import com.jzg.quotation.commons.utils.DateUtil;
 import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
 import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
+import com.jzg.quote.zhongmei.crawler.constant.ZmCrawlerImageConstant;
 import com.jzg.quote.zhongmei.crawler.constant.enums.RequestUrl;
 import com.jzg.quote.zhongmei.crawler.entity.Request.*;
 import com.jzg.quote.zhongmei.crawler.entity.Response.*;
 import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
 import com.jzg.quote.zhongmei.crawler.entity.dto.SaleInfoDTO;
+import com.jzg.quote.zhongmei.crawler.entity.po.ZmCrawlerOrder;
 import com.jzg.quote.zhongmei.crawler.properties.ZmCrawlerProperties;
+import com.jzg.quote.zhongmei.crawler.service.ZmCrawlerOrderService;
 import com.jzg.quote.zhongmei.crawler.util.Base64Tool;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
-import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
-import org.springframework.util.StringUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
 import org.springframework.web.reactive.function.client.WebClient;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
 
 import java.time.Duration;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * @description:
@@ -234,4 +243,522 @@ public class ZmCrawlerRequestComponent {
     public ZmCrawlerQuotedPriceResponse quotedPrice(ZmCrawlerQuotedPriceRequest quotedPriceRequest) {
         return request(RequestUrl.QUOTED_PRICE, quotedPriceRequest, ZmCrawlerQuotedPriceResponse.class);
     }
+
+    /**
+     * 打开中煤,影像系统
+     * @param comCode
+     * @param token
+     * @param proposalNo
+     */
+    public void startUploadImage (String comCode, String token, String proposalNo) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("mark", "upload");
+        params.put("comCode", comCode);
+        params.put("token", token);
+        params.put("proposalNo", proposalNo);//投保单号
+        params.put("selectUrl", ZmCrawlerImageConstant.SELECT_URL);
+        params.put("uploadUrl", ZmCrawlerImageConstant.UPLOAD_URL);
+        params.put("imageSystemUrl", ZmCrawlerImageConstant.IMAGE_SYSTEM_URL);
+
+        requestComponent.asyncGet(RequestUrl.START_UPLOAD_IMAGE.getRequestUrl(zmCrawlerProperties.getBaseUrl()), params, null);
+    }
+
+    /**
+     * 导入影像
+     * @param importRequest
+     * @return
+     */
+    public ZmCrawlerImageImportResponse importImage(ZmCrawlerImageImportRequest importRequest, List<InsuranceImageVo.ImageDTO> imageDTOS) {
+        MultiValueMap<String, Object> params = new LinkedMultiValueMap<>();
+        params.put("batchId", Collections.singletonList(importRequest.getBatchId()));
+        params.put("batchVer", Collections.singletonList(importRequest.getBatchVer()));
+        params.put("busiNo", Collections.singletonList(importRequest.getBusiNo()));
+        params.put("appCode", Collections.singletonList(importRequest.getAppCode()));
+
+        AtomicInteger index = new AtomicInteger(0);//标记数量
+        imageDTOS.forEach(image -> {
+            Map<String, Object> imageMap = new HashMap<>();
+            imageMap.put("base64", image.getImageBase64Str());
+            imageMap.put("size", image.getImageSize());
+            imageMap.put("orginalName", image.getImageName());
+            params.put("image" + (index.getAndAdd(1)), Collections.singletonList(imageMap));
+        });
+
+        return requestComponent.formData(RequestUrl.IMPORT_IMAGE.getRequestUrl(zmCrawlerProperties.getImageUrl()),
+                params, ZmCrawlerImageImportResponse.class, null).getBody();
+    }
+
+    /**
+     * 获取已上传的影像
+     * https://image.chinacoal-ins.com/SunICMS/batch/batchAction!reqSydByBatch.action?a=4067.6205088073457&_=1743155426058&appCode=UW_03&appName=%E6%89%BF%E4%BF%9D%E8%BD%A6%E9%99%A9&userCode=14001393&batchId=9f30a2c22ba9338a8321170d1e853fe0&batchVer=&orgCode=00000000&newBatch=
+     * @return 返回数据示例
+     * <root>
+     * 	<RESPONSE_CODE>200</RESPONSE_CODE>
+     * 	<RESPONSE_MSG>请求SYD成功</RESPONSE_MSG>
+     * 	<PAGES>
+     * 		<PAGE PAGEID="14b12504-b1bc-4d21-8599-2a1097a8c452" PAGE_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJs5OSB51_N0OJPHESgmG_h21mdOw_NezJNIamN0z_u5wSs2tm4z9XhXgUgfnUA7fVg_1YcyOKN0gDh7lUPw72NHOMOakDCIBmgakXNfB6iMH8PaTXNMkSOD4Si2r6gH=" THUM_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJs5OSB51_N0OJPHESgmG_h21mdOw_NezJNIamN0z_u5wSs2tm4z9XhXqpiyiIgU-VhAxUPzBXifrDCOrIiMRpuAqKPZrXeXOSOFTpsyd6gIy6iMdXAAHSv2rXPIEdhH1Msy4" FILE_NO="14b12504-b1bc-4d21-8599-2a1097a8c452" PAGE_VER="2" />
+     * 		<PAGE PAGEID="5486dc8a-2f2e-4e46-9c67-e1b74eb2d984" PAGE_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJs6O8CUeSsaaJNIgmg6G_h6O_4OzSsSvJP6ESBXOUPH1UCew_Qz9XhXgUgfnUA7fVg_1YcyOKN0gDh7lUPw7SvHzSB2zdTMySiMBSOZrmBIOXgG1mhGOmCyOdhI4pCe=" THUM_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJs6O8CUeSsaaJNIgmg6G_h6O_4OzSsSvJP6ESBXOUPH1UCew_Qz9XhXqpiyiIgU-VhAxUPzBXifrDCOrIiMRpuAqKAA1Mu_ypTMESB0zpOZ1puGEAP_EdFIOmg_lmCyBmBIT" FILE_NO="5486dc8a-2f2e-4e46-9c67-e1b74eb2d984" PAGE_VER="2" />
+     * 		<PAGE PAGEID="bd750f02-2cca-4409-a553-e66457e0bda9" PAGE_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJuIe_s6rUB01JNIBSu5G_C2r8dta_N6sJP6u_B2t_u6rSgMa8dz9XhXgUgfnUA7fVg_1YcyOKN0gDh7lUPw7Ms0rSgIOAPIH8PaOdCy1DhaHpTMH8cF4pODlMvITXcH=" THUM_URL="https://imagetrm.chinacoal-ins.com:7008/SunTransAgent/servlet/GetImage?UhFOUNO1mCHtmCm18QUgpPEfcuzaVP67JufGSPDfX17EDPA1YdL1mCHtmCm18Q7AAtLrm1LzJuSR8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUN0RJuIe_s6rUB01JNIBSu5G_C2r8dta_N6sJP6u_B2t_u6rSgMa8dz9XhXqpiyiIgU-VhAxUPzBXifrDCOrIiMRpuAqK6FAXgmO8A6zXBMO8Pal2PIHAP_y6BfE_hG4puIAmgGE" FILE_NO="bd750f02-2cca-4409-a553-e66457e0bda9" PAGE_VER="1" />
+     * 	</PAGES>
+     * 	<SYD>
+     * 		<doc version="1.2">
+     * 			<DocInfo>
+     * 				<BATCH_ID>9f30a2c22ba9338a8321170d1e853fe0</BATCH_ID>
+     * 				<BUSI_NUM>4140834137920250011529</BUSI_NUM>
+     * 				<BIZ_ORG>00</BIZ_ORG>
+     * 				<APP_CODE>UW_03</APP_CODE>
+     * 				<APP_NAME>承保车险</APP_NAME>
+     * 				<BATCH_VER>2</BATCH_VER>
+     * 				<INTER_VER>2</INTER_VER>
+     * 				<STATUS>1</STATUS>
+     * 				<CREATE_USER>14001393</CREATE_USER>
+     * 				<CREATE_DATE>2025-03-27 14:43:12.767</CREATE_DATE>
+     * 				<MODIFY_USER>14001393</MODIFY_USER>
+     * 				<MODIFY_DATE>2025-03-28 16:48:31</MODIFY_DATE>
+     * 				<DOC_EXT>
+     * 					<EXT_ATTR ID="BUSI_NO" NAME="业务编号" IS_SHOW="1" IS_KEY="1" IS_NULL="0" INPUT_TYPE="1">4140834137920250011529</EXT_ATTR>
+     * 				</DOC_EXT>
+     * 			</DocInfo>
+     * 			<PageInfo>
+     * 				<PAGE PAGEID="14b12504-b1bc-4d21-8599-2a1097a8c452">
+     * 					<CREATE_USER>14001393</CREATE_USER>
+     * 					<CREATE_USERNAME>杨利</CREATE_USERNAME>
+     * 					<CREATE_TIME>2025-03-28 16:48:48</CREATE_TIME>
+     * 					<MODIFY_USER>14001393</MODIFY_USER>
+     * 					<MODIFY_TIME>2025-03-28 16:48:48</MODIFY_TIME>
+     * 					<PAGE_URL>14b12504-b1bc-4d21-8599-2a1097a8c452.jpg</PAGE_URL>
+     * 					<THUM_URL>14b12504-b1bc-4d21-8599-2a1097a8c452.jpg.jpg</THUM_URL>
+     * 					<IS_LOCAL>1</IS_LOCAL>
+     * 					<PAGE_VER>2</PAGE_VER>
+     * 					<PAGE_DESC>1743151807980</PAGE_DESC>
+     * 					<UPLOAD_ORG>中煤财产保险股份有限公司运城中心支公司</UPLOAD_ORG>
+     * 					<PAGE_CRC>d6e865286bd41833150f9c6cd9a1e894</PAGE_CRC>
+     * 					<PAGE_SIZE>1811</PAGE_SIZE>
+     * 					<PAGE_FORMAT>image/jpeg</PAGE_FORMAT>
+     * 					<PAGE_ENCRYPT>0</PAGE_ENCRYPT>
+     * 					<ORIGINAL_NAME>1743151807980.jpg</ORIGINAL_NAME>
+     * 					<PAGE_EXT />
+     * 					<PAGE_DESCS />
+     * 				</PAGE>
+     * 				<PAGE PAGEID="5486dc8a-2f2e-4e46-9c67-e1b74eb2d984">
+     * 					<CREATE_USER>14001393</CREATE_USER>
+     * 					<CREATE_USERNAME>杨利</CREATE_USERNAME>
+     * 					<CREATE_TIME>2025-03-28 16:48:48</CREATE_TIME>
+     * 					<MODIFY_USER>14001393</MODIFY_USER>
+     * 					<MODIFY_TIME>2025-03-28 16:48:48</MODIFY_TIME>
+     * 					<PAGE_URL>5486dc8a-2f2e-4e46-9c67-e1b74eb2d984.jpg</PAGE_URL>
+     * 					<THUM_URL>5486dc8a-2f2e-4e46-9c67-e1b74eb2d984.jpg.jpg</THUM_URL>
+     * 					<IS_LOCAL>1</IS_LOCAL>
+     * 					<PAGE_VER>2</PAGE_VER>
+     * 					<PAGE_DESC>1743151773536</PAGE_DESC>
+     * 					<UPLOAD_ORG>中煤财产保险股份有限公司运城中心支公司</UPLOAD_ORG>
+     * 					<PAGE_CRC>b8fef2daace2386cc9e5c8a177c68890</PAGE_CRC>
+     * 					<PAGE_SIZE>2903</PAGE_SIZE>
+     * 					<PAGE_FORMAT>image/jpeg</PAGE_FORMAT>
+     * 					<PAGE_ENCRYPT>0</PAGE_ENCRYPT>
+     * 					<ORIGINAL_NAME>1743151773536.jpg</ORIGINAL_NAME>
+     * 					<PAGE_EXT />
+     * 					<PAGE_DESCS />
+     * 				</PAGE>
+     * 				<PAGE PAGEID="bd750f02-2cca-4409-a553-e66457e0bda9">
+     * 					<CREATE_USER>14001393</CREATE_USER>
+     * 					<CREATE_USERNAME>杨利</CREATE_USERNAME>
+     * 					<CREATE_TIME>2025-03-27 14:43:12</CREATE_TIME>
+     * 					<MODIFY_USER>14001393</MODIFY_USER>
+     * 					<MODIFY_TIME>2025-03-27 14:43:12</MODIFY_TIME>
+     * 					<PAGE_URL>bd750f02-2cca-4409-a553-e66457e0bda9.jpg</PAGE_URL>
+     * 					<THUM_URL>bd750f02-2cca-4409-a553-e66457e0bda9.jpg.jpg</THUM_URL>
+     * 					<IS_LOCAL>1</IS_LOCAL>
+     * 					<PAGE_VER>1</PAGE_VER>
+     * 					<PAGE_DESC>行驶证</PAGE_DESC>
+     * 					<UPLOAD_ORG>中煤财产保险股份有限公司运城中心支公司</UPLOAD_ORG>
+     * 					<PAGE_CRC>9fcf7de426e367bb2dd4e5e10b843a9b</PAGE_CRC>
+     * 					<PAGE_SIZE>205203</PAGE_SIZE>
+     * 					<PAGE_FORMAT>image/jpeg</PAGE_FORMAT>
+     * 					<PAGE_ENCRYPT>0</PAGE_ENCRYPT>
+     * 					<ORIGINAL_NAME>行驶证.jpg</ORIGINAL_NAME>
+     * 					<PAGE_EXT />
+     * 					<PAGE_DESCS />
+     * 				</PAGE>
+     * 			</PageInfo>
+     * 			<VTREE APP_CODE="UW_03" APP_NAME="承保车险">
+     * 				<NODE ID="UW_0301" NAME="验车资料">
+     * 					<LEAF>bd750f02-2cca-4409-a553-e66457e0bda9</LEAF>
+     * 					<LEAF>5486dc8a-2f2e-4e46-9c67-e1b74eb2d984</LEAF>
+     * 					<LEAF>14b12504-b1bc-4d21-8599-2a1097a8c452</LEAF>
+     * 				</NODE>
+     * 			</VTREE>
+     * 		</doc>
+     * 	</SYD>
+     * </root>
+     */
+    public String getUploadedImages(String userCode, String batchId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("a", "");
+        params.put("_", System.currentTimeMillis() * 1000);//毫秒级时间戳
+        params.put("appCode", ZmCrawlerImageConstant.ZM_IMAGE_APP_CODE);
+        params.put("appName", ZmCrawlerImageConstant.ZM_IMAGE_APP_NAME);
+        params.put("userCode", userCode);
+        params.put("batchId", batchId);//批次号
+        params.put("batchVer", "");//提交图片数量
+        params.put("orgCode", ZmCrawlerImageConstant.ZM_IMAGE_ORG_CODE);
+        params.put("newBatch", "");
+
+        String responseXml = requestComponent.get(RequestUrl.GET_UPLOADED_IMAGE.getRequestUrl(zmCrawlerProperties.getImageUrl()), params, "", String.class, null);
+        return responseXml;
+    }
+
+    /**
+     * 提交影像 数据示例
+     * xmlStr=
+     * <?xml version="1.0" encoding="UTF-8" ?>
+     * <doc version="1.2">
+     * 	<DocInfo>
+     * 		<BATCH_ID>
+     * 			9f30a2c22ba9338a8321170d1e853fe0
+     * 		</BATCH_ID>
+     * 		<BUSI_NUM>
+     * 			4140834137920250011529
+     * 		</BUSI_NUM>
+     * 		<BIZ_ORG>
+     * 			00
+     * 		</BIZ_ORG>
+     * 		<APP_CODE>
+     * 			UW_03
+     * 		</APP_CODE>
+     * 		<APP_NAME>
+     * 			承保车险
+     * 		</APP_NAME>
+     * 		<BATCH_VER>
+     * 			2
+     * 		</BATCH_VER>
+     * 		<INTER_VER>
+     * 			2
+     * 		</INTER_VER>
+     * 		<STATUS>
+     * 			1
+     * 		</STATUS>
+     * 		<CREATE_USER>
+     * 			14001393
+     * 		</CREATE_USER>
+     * 		<CREATE_DATE>
+     * 			2025-03-27 14:43:12.767
+     * 		</CREATE_DATE>
+     * 		<MODIFY_USER>
+     * 			14001393
+     * 		</MODIFY_USER>
+     * 		<MODIFY_DATE>
+     * 			2025-03-28 16:48:31
+     * 		</MODIFY_DATE>
+     * 		<DOC_EXT>
+     * 			<EXT_ATTR ID="BUSI_NO" NAME="业务编号" IS_SHOW="1" IS_KEY="1" IS_NULL="0"
+     * 			INPUT_TYPE="1">
+     * 				4140834137920250011529
+     * 			</EXT_ATTR>
+     * 		</DOC_EXT>
+     * 	</DocInfo>
+     * 	<PageInfo>
+     * 		<PAGE PAGEID="bd750f02-2cca-4409-a553-e66457e0bda9">
+     * 			<CREATE_USER>
+     * 				14001393
+     * 			</CREATE_USER>
+     * 			<CREATE_USERNAME>
+     * 				杨利
+     * 			</CREATE_USERNAME>
+     * 			<CREATE_TIME>
+     * 				2025-03-27 14:43:12
+     * 			</CREATE_TIME>
+     * 			<MODIFY_USER>
+     * 				14001393
+     * 			</MODIFY_USER>
+     * 			<MODIFY_TIME>
+     * 				2025-03-27 14:43:12
+     * 			</MODIFY_TIME>
+     * 			<PAGE_URL>
+     * 				bd750f02-2cca-4409-a553-e66457e0bda9.jpg
+     * 			</PAGE_URL>
+     * 			<THUM_URL>
+     * 				bd750f02-2cca-4409-a553-e66457e0bda9.jpg.jpg
+     * 			</THUM_URL>
+     * 			<IS_LOCAL>
+     * 				1
+     * 			</IS_LOCAL>
+     * 			<PAGE_VER>
+     * 				1
+     * 			</PAGE_VER>
+     * 			<PAGE_DESC>
+     * 				行驶证
+     * 			</PAGE_DESC>
+     * 			<UPLOAD_ORG>
+     * 				中煤财产保险股份有限公司运城中心支公司
+     * 			</UPLOAD_ORG>
+     * 			<PAGE_CRC>
+     * 				9fcf7de426e367bb2dd4e5e10b843a9b
+     * 			</PAGE_CRC>
+     * 			<PAGE_SIZE>
+     * 				205203
+     * 			</PAGE_SIZE>
+     * 			<PAGE_FORMAT>
+     * 				image/jpeg
+     * 			</PAGE_FORMAT>
+     * 			<PAGE_ENCRYPT>
+     * 				0
+     * 			</PAGE_ENCRYPT>
+     * 			<ORIGINAL_NAME>
+     * 				行驶证.jpg
+     * 			</ORIGINAL_NAME>
+     * 			<PAGE_EXT/>
+     * 			<PAGE_DESCS/>
+     * 		</PAGE>
+     * 		<PAGE PAGEID="5486dc8a-2f2e-4e46-9c67-e1b74eb2d984">
+     * 			<CREATE_USER>
+     * 				14001393
+     * 			</CREATE_USER>
+     * 			<CREATE_USERNAME>
+     * 				杨利
+     * 			</CREATE_USERNAME>
+     * 			<CREATE_TIME>
+     * 				2025-03-28 16:48:48
+     * 			</CREATE_TIME>
+     * 			<MODIFY_USER>
+     * 				14001393
+     * 			</MODIFY_USER>
+     * 			<MODIFY_TIME>
+     * 				2025-03-28 16:48:48
+     * 			</MODIFY_TIME>
+     * 			<PAGE_URL>
+     * 				https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8CmRmB5R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4Lt_CZuUhmwSdO1UBIfJNMf_CSG8Pmu_1tfmPHv_hA4mg2z8C2qpiyiIiMRpuAqKNMOSODT8cITdTIBAPIdmhn16gIkAcMOMtHODTMkXgnr
+     * 			</PAGE_URL>
+     * 			<THUM_URL>
+     * 				https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8CmRmB5R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4Lt_CZuUhmwSdO1UBIfJNMf_CSG8Pmu_1tfmPHv_hA4mg2z8C2qpiyiJg-rU1UOVuGfVBt4mea4SBIApsfdSOF4mfIOpOFy2cME8Pa1DC2ODT51p0==
+     * 			</THUM_URL>
+     * 			<IS_LOCAL>
+     * 				0
+     * 			</IS_LOCAL>
+     * 			<PAGE_VER>
+     * 				2
+     * 			</PAGE_VER>
+     * 			<PAGE_DESC>
+     * 				1743151773536
+     * 			</PAGE_DESC>
+     * 			<UPLOAD_ORG>
+     * 				中煤财产保险股份有限公司运城中心支公司
+     * 			</UPLOAD_ORG>
+     * 			<PAGE_CRC/>
+     * 			<PAGE_SIZE>
+     * 				2903
+     * 			</PAGE_SIZE>
+     * 			<PAGE_FORMAT>
+     * 				image/jpeg
+     * 			</PAGE_FORMAT>
+     * 			<PAGE_ENCRYPT>
+     * 				0
+     * 			</PAGE_ENCRYPT>
+     * 			<ORIGINAL_NAME>
+     * 				1743151773536.jpg
+     * 			</ORIGINAL_NAME>
+     * 			<PAGE_DESCS/>
+     * 			<PAGE_EXT/>
+     * 		</PAGE>
+     * 		<PAGE PAGEID="14b12504-b1bc-4d21-8599-2a1097a8c452">
+     * 			<CREATE_USER>
+     * 				14001393
+     * 			</CREATE_USER>
+     * 			<CREATE_USERNAME>
+     * 				杨利
+     * 			</CREATE_USERNAME>
+     * 			<CREATE_TIME>
+     * 				2025-03-28 16:48:48
+     * 			</CREATE_TIME>
+     * 			<MODIFY_USER>
+     * 				14001393
+     * 			</MODIFY_USER>
+     * 			<MODIFY_TIME>
+     * 				2025-03-28 16:48:48
+     * 			</MODIFY_TIME>
+     * 			<PAGE_URL>
+     * 				https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8CmRmB5R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4LE_hHEmB6r_Qt4mPIBJNMemB5G8C6z8dO1SN5r8NDa8hmO_NHqpiyiIiMRpuAqKcMldhak8NfT_FHr6BMl8c5OXiFA8NyOXAIH6i2OSeaA
+     * 			</PAGE_URL>
+     * 			<THUM_URL>
+     * 				https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8CmRmB5R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4LE_hHEmB6r_Qt4mPIBJNMemB5G8C6z8dO1SN5r8NDa8hmO_NHqpiyiJg-rU1UOVuGfVBO1_THzdh_yXPIEpua4dhIymeaBmFABMtIdANMTXeay_0==
+     * 			</THUM_URL>
+     * 			<IS_LOCAL>
+     * 				0
+     * 			</IS_LOCAL>
+     * 			<PAGE_VER>
+     * 				2
+     * 			</PAGE_VER>
+     * 			<PAGE_DESC>
+     * 				1743151807980
+     * 			</PAGE_DESC>
+     * 			<UPLOAD_ORG>
+     * 				中煤财产保险股份有限公司运城中心支公司
+     * 			</UPLOAD_ORG>
+     * 			<PAGE_CRC/>
+     * 			<PAGE_SIZE>
+     * 				1811
+     * 			</PAGE_SIZE>
+     * 			<PAGE_FORMAT>
+     * 				image/jpeg
+     * 			</PAGE_FORMAT>
+     * 			<PAGE_ENCRYPT>
+     * 				0
+     * 			</PAGE_ENCRYPT>
+     * 			<ORIGINAL_NAME>
+     * 				1743151807980.jpg
+     * 			</ORIGINAL_NAME>
+     * 			<PAGE_DESCS/>
+     * 			<PAGE_EXT/>
+     * 		</PAGE>
+     * 	</PageInfo>
+     * 	<VTREE APP_CODE="UW_03" APP_NAME="承保车险">
+     * 		<NODE ID="UW_0301" NAME="验车资料">
+     * 			<LEAF>
+     * 				bd750f02-2cca-4409-a553-e66457e0bda9
+     * 			</LEAF>
+     * 			<LEAF>
+     * 				5486dc8a-2f2e-4e46-9c67-e1b74eb2d984
+     * 			</LEAF>
+     * 			<LEAF>
+     * 				14b12504-b1bc-4d21-8599-2a1097a8c452
+     * 			</LEAF>
+     * 		</NODE>
+     * 	</VTREE>
+     * </doc>
+     * &svrIp=10.1.16.132&svrPort=8025
+     * @param uploadedImageXml
+     * @return success:上传成功。
+     */
+    public String submitImage(ZmCrawlerConfigureParameters parameters, String userCode, ZmCrawlerImageImportResponse importResponse,
+                              String uploadedImageXml, ZmCrawlerOrder crawlerOrder) {
+
+        //解析已上传的图片url
+        Document document = XmlUtil.readXML(uploadedImageXml.replace("\t", ""));
+        Node responseCode = document.getElementsByTagName(ZmCrawlerImageConstant.ZM_IMAGE_UPLOADED_RES_NODE).item(0);
+        Node sydNode = null;
+        if ("200".equals(responseCode.getTextContent())) {
+            sydNode = document.getElementsByTagName("SYD").item(0);
+        }
+        String sydNodeStr = XmlUtil.toStr(sydNode).replace("<SYD>","").replace("</SYD>","");
+
+        //组装提交图片xml字符串
+        String submitImageXml = buildSubmitXml(sydNodeStr, parameters, userCode, importResponse, crawlerOrder);
+        Map<String, Object> params = new HashMap<>();
+        params.put("xmlStr", submitImageXml);
+        params.put("svrIp", ZmCrawlerImageConstant.ZM_IMAGE_SUBMIT_IP);
+        params.put("svrPort", ZmCrawlerImageConstant.ZM_IMAGE_SUBMIT_PORT);
+
+        return requestComponent.get(RequestUrl.SUBMIT_IMAGE.getRequestUrl(zmCrawlerProperties.getImageUrl()), params, "", String.class, null);
+    }
+
+    /**
+     * 构建提交影像参数
+     * @param xmlStr
+     * @param parameters
+     * @param userCode
+     * @param importResponse
+     * @param crawlerOrder
+     * @return
+     */
+    public String buildSubmitXml(String xmlStr, ZmCrawlerConfigureParameters parameters, String userCode,
+                                 ZmCrawlerImageImportResponse importResponse, ZmCrawlerOrder crawlerOrder) {
+        Map<String, Object> result = importResponse.getResult();//导入影像后返回的数据
+
+        Document submitXml = XmlUtil.readXML(xmlStr);
+
+        NodeList childNodes = submitXml.getDocumentElement().getChildNodes();
+        Node pageInfoNode = childNodes.item(1);
+
+        for (int i = 0; i < result.keySet().size(); i++) {
+            Map<String, String> imageMap = (Map<String, String>) result.get(String.valueOf(i));
+
+            Element page = submitXml.createElement("PAGE");
+            page.setAttribute("PAGE_ID", imageMap.get("pageId"));
+
+            Element createUser = submitXml.createElement("CREATE_USER");
+            createUser.setTextContent(userCode);
+            page.appendChild(createUser);
+            Element createUserName = submitXml.createElement("CREATE_USERNAME");
+            createUser.setTextContent(crawlerOrder.getUserName());
+            page.appendChild(createUserName);
+            String currentDateTime = DateUtil.getDateFormat(new Date(), DateUtil.FULL_TIME_SPLIT_PATTERN);
+            Element createTime = submitXml.createElement("CREATE_TIME");
+            createUser.setTextContent(currentDateTime);
+            page.appendChild(createTime);
+            Element modifyUser = submitXml.createElement("MODIFY_USER");
+            createUser.setTextContent(crawlerOrder.getUserName());
+            page.appendChild(modifyUser);
+            Element modifyTime = submitXml.createElement("MODIFY_TIME");
+            createUser.setTextContent(currentDateTime);
+            page.appendChild(modifyTime);
+            Element pageUrl = submitXml.createElement("PAGE_URL");
+            createUser.setTextContent(imageMap.get("filePath"));
+            page.appendChild(pageUrl);
+            Element thumUrl = submitXml.createElement("THUM_URL");
+            createUser.setTextContent(imageMap.get("thumPath"));
+            page.appendChild(thumUrl);
+            Element isLocal = submitXml.createElement("IS_LOCAL");
+            createUser.setTextContent("0");
+            page.appendChild(isLocal);
+            Element pageVer = submitXml.createElement("PAGE_VER");
+            createUser.setTextContent(result.get("ImgNum").toString());
+            page.appendChild(pageVer);
+            String orginalName = imageMap.get("orginalName");
+            Element pageDesc = submitXml.createElement("PAGE_DESC");
+            createUser.setTextContent(orginalName.substring(0, orginalName.indexOf(".")));
+            page.appendChild(pageDesc);
+            Element uploadOrg = submitXml.createElement("UPLOAD_ORG");
+            createUser.setTextContent(parameters.getComName());
+            page.appendChild(uploadOrg);
+            Element pageCrc = submitXml.createElement("PAGE_CRC");
+            page.appendChild(pageCrc);//新提交的照片不设置值
+            Element pageSize = submitXml.createElement("PAGE_SIZE");
+            createUser.setTextContent(imageMap.get("size"));
+            page.appendChild(pageSize);
+            Element pageFormat = submitXml.createElement("PAGE_FORMAT");
+            createUser.setTextContent("image/jpeg");
+            page.appendChild(pageFormat);
+            Element pageEncrypt = submitXml.createElement("PAGE_ENCRYPT");
+            createUser.setTextContent("0");
+            page.appendChild(pageEncrypt);
+            Element originalName = submitXml.createElement("ORIGINAL_NAME");
+            createUser.setTextContent(orginalName);
+            page.appendChild(originalName);
+            Element pageExt = submitXml.createElement("PAGE_EXT");
+            createUser.setTextContent("");
+            page.appendChild(pageExt);
+            Element pageDescs = submitXml.createElement("PAGE_DESCS");
+            createUser.setTextContent("");
+            page.appendChild(pageDescs);
+            pageInfoNode.appendChild(page);
+
+            Node vTreeNode = childNodes.item(2);
+            Node nodeNode = vTreeNode.getFirstChild();
+            Element leafNode = submitXml.createElement("LEAF");
+            leafNode.setTextContent(imageMap.get("pageId"));
+            nodeNode.appendChild(leafNode);
+        }
+
+        return XmlUtil.toStr(submitXml);
+    }
+
+    /**
+     * 查询投保单状态
+     * @param orderStatusRequest
+     * @return
+     */
+    public ZmCrawlerOrderStatusResponse orderStatusQuery(ZmCrawlerOrderStatusRequest orderStatusRequest) {
+        ResponseEntity<ZmCrawlerOrderStatusResponse> responseEntity = requestComponent.objectPost(RequestUrl.ORDER_STATUS_QUERY.getRequestUrl(zmCrawlerProperties.getBaseUrl()), orderStatusRequest, ZmCrawlerOrderStatusResponse.class);
+        return responseEntity.getBody();
+    }
+
+    /**
+     * 提交核保
+     * @param submitRequest
+     * @return
+     */
+    public ZmCrawlerSubmitResponse submit(ZmCrawlerSubmitRequest submitRequest) {
+        ResponseEntity<ZmCrawlerSubmitResponse> responseEntity = requestComponent.objectPost(RequestUrl.SUBMIT.getRequestUrl(zmCrawlerProperties.getBaseUrl()), submitRequest, ZmCrawlerSubmitResponse.class);
+        return responseEntity.getBody();
+    }
 }

+ 41 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/ZmCrawlerImageConstant.java

@@ -0,0 +1,41 @@
+package com.jzg.quote.zhongmei.crawler.constant;
+
+/**
+ * @description: 中煤财险 上传影像相关常量
+ * @author: shenwd
+ * @date: 2025/3/28 09:42
+ **/
+public class ZmCrawlerImageConstant {
+
+    public static final String SELECT_URL = "https://hxkscd.chinacoal-ins.com/singlePlatform/common/ViewloadImage.do";
+
+    public static final String UPLOAD_URL = "https://hxkscd.chinacoal-ins.com/singlePlatform/others/UploadImage.do";
+
+    public static final String IMAGE_SYSTEM_URL = "https://hxkscd.chinacoal-ins.com/singlePlatform/proposal/ViewImageDirectServlet";
+
+    /**
+     * 影像系统批次号,MD5加密前,前半部分
+     */
+    public static final String ZM_IMAGE_BATCHID_PRE = "UW_03@";
+
+    public static final String ZM_IMAGE_APP_CODE = "UW_03";
+
+    public static final String ZM_IMAGE_APP_NAME = "承保车险";
+
+    public static final String ZM_IMAGE_ORG_CODE = "00000000";
+
+    /**
+     * 获取已上传影像,响应代码节点
+     */
+    public static final String ZM_IMAGE_UPLOADED_RES_NODE = "RESPONSE_CODE";
+
+    public static final String ZM_IMAGE_SUBMIT_IP = "10.1.16.132";
+
+    public static final String ZM_IMAGE_SUBMIT_PORT = "8025";
+
+    /**
+     * 中煤影像分类编码
+     * 01-验车资料;02-个人客户资料;03-企业客户资料;04-批改资料;05-车辆资料;06-保单批单资料;07-其他资料;08-反洗钱;09-销售环节资料;10-电子保单;11-投保单
+     */
+    public static final String [] ZM_IMAGE_TYPE = {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11"};
+}

+ 9 - 2
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/enums/RequestUrl.java

@@ -19,10 +19,17 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     NETPOINT_QUERY("/common/NetpointQuery.do", "网点查询"),
     MODELS_QUERY("/prpall/ModelsQuery.do", "车型查询"),
     ACTUAL_VALUE("/common/ActualValue.do", "实际价值查询"),
-    QUOTED_PRICE("/prpall/QuotedPrice.do", "报价")
-    ;
+    QUOTED_PRICE("/prpall/QuotedPrice.do", "报价"),
+
+    START_UPLOAD_IMAGE("/proposal/imgxml/proposal.imgxml.GT.tpl.html", "开始图片上传"),
+    GET_UPLOADED_IMAGE("https://image.chinacoal-ins.com/SunICMS/batch/batchAction!reqSydByBatch.action", "获取已上传的图片"),
+    IMPORT_IMAGE("https://image.chinacoal-ins.com/SunICMS/image/upload.action", "导入影像"),
+    SUBMIT_IMAGE("https://image.chinacoal-ins.com/SunICMS/image/upload2trm.action", "提交影像"),
 
+    ORDER_STATUS_QUERY("/common/FindBusinesses.do", "查询投保单状态"),
 
+    SUBMIT("/prpall/Submit.do", "提交核保")
+    ;
 
     private final String url;
     private final String description;

+ 58 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerImageImportRequest.java

@@ -0,0 +1,58 @@
+package com.jzg.quote.zhongmei.crawler.entity.Request;
+
+import cn.hutool.crypto.digest.MD5;
+import com.jzg.quote.zhongmei.crawler.constant.ZmCrawlerImageConstant;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 中煤财险 影像系统导入图片 请求参数
+ * @author: shenwd
+ * @date: 2025/3/28 14:50
+ **/
+@Data
+public class ZmCrawlerImageImportRequest implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2151837097917346645L;
+
+    /**
+     * 影像上传批次号
+     * UW_03@ + 投保单号,MD5加密后的字符串
+     */
+    private String batchId;
+
+    /**
+     * 图片数量
+     */
+    private String batchVer;
+
+    /**
+     * 编码
+     */
+    private String appCode = ZmCrawlerImageConstant.ZM_IMAGE_APP_CODE;
+
+    /**
+     * 投保单号
+     */
+    private String busiNo;
+
+    /**
+     * 编码+中煤内部照片类型编码
+     * 中煤真实数据 UW_0301,UW_0302...UW_0311
+     * 中煤内部照片类型编码不一样,则该字段为空
+     */
+    private String docCode;
+
+    public ZmCrawlerImageImportRequest(Integer batchVer, String busiNo, String imageCode, String batchId) {
+        this.batchId = batchId;
+        this.batchVer = String.valueOf(batchVer);
+        this.busiNo = busiNo;
+        this.docCode = generateDocCode(imageCode);
+    }
+
+    private String generateDocCode(String imageCode) {
+        return appCode + imageCode;
+    }
+}

+ 113 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerOrderStatusRequest.java

@@ -0,0 +1,113 @@
+package com.jzg.quote.zhongmei.crawler.entity.Request;
+
+import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description: 中煤财险 爬虫查询投保单状态 请求参数
+ * @author: shenwd
+ * @date: 2025/4/1 10:11
+ **/
+@Data
+@NoArgsConstructor
+public class ZmCrawlerOrderStatusRequest extends BaseRequest {
+    @Serial
+    private static final long serialVersionUID = -3968011204543499983L;
+
+    /**
+     * 登录机构编码
+     */
+    private String loginCom;
+
+    /**
+     * 数据每页数量
+     */
+    private Integer rows;
+
+    /**
+     * 数据页码
+     */
+    private Integer pageNo;
+
+    private String queryType;
+    private String queryFlag;
+
+    /**
+     * 保单归属机构编码
+     */
+    private String companyCode;
+
+    /**
+     * 保单号
+     */
+    private String policyNo;
+
+    private String endorseNo;
+
+    /**
+     * 被保人姓名
+     */
+    private String insuredName;
+
+    private List<String> queryStatus;
+
+    private String printStatus;
+
+    /**
+     * 车架号
+     */
+    private String VIN;
+    private String adjustPermitDate;
+    private String applicantIdentifyNumber;
+
+    /**
+     * 起保时间
+     */
+    private String effectiveDateBegin;
+
+    /**
+     * 终保时间
+     */
+    private String effectiveDateEnd;
+    private String engine;
+    private String expireDateBegin;
+    private String expireDateEnd;
+    private String insuredIdentifyNumber;
+    private String isInterimStorage;
+
+    /**
+     * 录单起始日期
+     */
+    private String operateDateTimeBegin;
+
+    /**
+     * 录单截止日期
+     */
+    private String operateDateTimeEnd;
+
+    /**
+     * 车牌号
+     */
+    private String plateNo;
+    private String proposalName;
+    private String proposalNo;
+    private String dealerCode;
+    private String isNewPolicy;
+    private String underWriteInd;
+
+    /**
+     * 承保类型
+     * 所有;主共业务;从共业务;独家承保业务
+     */
+    private String coinsType;
+
+    /**
+     * 当前操作所属菜单编码
+     */
+    private String subMenu;
+
+}

+ 1 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -192,7 +192,7 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
             contactDTO.setRelated("01");
             customerDTO.getContact().add(contactDTO);
 
-            customerDTO.setAge(Integer.parseInt(customerInfoVo.getAge()));
+            customerDTO.setAge(customerInfoVo.getAge());
             customerDTO.setContactAddr_app(customerInfoVo.getAddr());
             customerDTO.setBirthday(customerInfoVo.getBirthday());
             customerDTO.setSex(customerInfoVo.getGender());

+ 57 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerSubmitRequest.java

@@ -0,0 +1,57 @@
+package com.jzg.quote.zhongmei.crawler.entity.Request;
+
+import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 中煤财险 提交核保 请求参数
+ * @author: shenwd
+ * @date: 2025/4/1 14:31
+ **/
+@Data
+public class ZmCrawlerSubmitRequest extends BaseRequest {
+    @Serial
+    private static final long serialVersionUID = -7216611068847422815L;
+
+    private String operateType;
+
+    private String appliType;
+
+    private String loginCom;
+
+    @Data
+    public static class ContractMainDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 6000785829519913541L;
+
+        private String businessType;
+
+        private String contractNo;
+
+        private String remark;
+    }
+
+    /**
+     * {
+     *   "head": {
+     *     "transCode": "Submit",
+     *     "transType": "Req",
+     *     "token": "sineNAWtos20250401140555845oftY7hN0",
+     *     "source": "2"
+     *   },
+     *   "operateType": "1",
+     *   "contractMain": [
+     *     {
+     *       "businessType": "T-1",
+     *       "contractNo": "4140834137920250014828",
+     *       "remark": "submit"
+     *     }
+     *   ],
+     *   "appliType": "-1",
+     *   "loginCom": "14083100"
+     * }
+     */
+}

+ 48 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerImageImportResponse.java

@@ -0,0 +1,48 @@
+package com.jzg.quote.zhongmei.crawler.entity.Response;
+
+import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
+import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerImageImportRequest;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @description: 中煤财险 影像系统导入图片 返回参数
+ * @author: shenwd
+ * @date: 2025/3/28 15:30
+ **/
+@Data
+public class ZmCrawlerImageImportResponse extends BaseResponse {
+    @Serial
+    private static final long serialVersionUID = 2521368903956758850L;
+
+    private Map<String, Object> result;
+
+    /**数据示例
+     * {
+     * 	"0": {
+     * 		"exif": "%7B'Create%20SoftWare%7C%E5%88%9B%E5%BB%BA%E8%BD%AF%E4%BB%B6':'undefined','Camera%20model%7C%E7%9B%B8%E6%9C%BA%E5%9E%8B%E5%8F%B7':'undefined','CaptureTime%7C%E6%8B%8D%E6%91%84%E6%97%B6%E9%97%B4':'undefined','Width%20x%20Height%7C%E9%95%BF%20x%20%E5%AE%BD':'undefined%20x%20undefined','Latitude%7C%E7%BA%AC%E5%BA%A6':'undefined%20undefined','Longitude%7C%E7%BB%8F%E5%BA%A6':'undefined%20undefined','Altitude%7C%E9%AB%98%E5%BA%A6':'undefined','DocClass%7C':''%7D",
+     * 		"thumPath": "https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8N6RmB2R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm47B_CZtUByg8dOOmP5EJN2rmC0G8PIB8Qt4mhH1UCag8C0rmuHqpiyiJg-rU1UOVuGfVBOOXAIEANyOmCM1psHz2cI1XAIyDT21_C2r2NM4SvFBd0==",
+     * 		"filePath": "https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8N6RmB2R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm47B_CZtUByg8dOOmP5EJN2rmC0G8PIB8Qt4mhH1UCag8C0rmuHqpiyiIiMRpuAqKNIBAcIdMsMkmTITXcFOMOa4Msf1MOF12AAAXPGE2AIA",
+     * 		"pageId": "c485f0f9-41a1-4000-9bc8-b0b2d8f8003b",
+     * 		"fileName": "c485f0f9-41a1-4000-9bc8-b0b2d8f8003b.jpg",
+     * 		"md5": "2e613f1cdf7f9451f11681bce700e43e",
+     * 		"orginalName": "1743058978421.jpg",
+     * 		"size": "4115"
+     * 	    },
+     * 	"1": {
+     * 		"exif": "%7B'Create%20SoftWare%7C%E5%88%9B%E5%BB%BA%E8%BD%AF%E4%BB%B6':'undefined','Camera%20model%7C%E7%9B%B8%E6%9C%BA%E5%9E%8B%E5%8F%B7':'undefined','CaptureTime%7C%E6%8B%8D%E6%91%84%E6%97%B6%E9%97%B4':'undefined','Width%20x%20Height%7C%E9%95%BF%20x%20%E5%AE%BD':'undefined%20x%20undefined','Latitude%7C%E7%BA%AC%E5%BA%A6':'undefined%20undefined','Longitude%7C%E7%BB%8F%E5%BA%A6':'undefined%20undefined','Altitude%7C%E9%AB%98%E5%BA%A6':'undefined','DocClass%7C':''%7D",
+     * 		"thumPath": "https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8N6RmB2R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4LwmsHt8N6zUQteSBaBJN2OmN2GSg_f_dOOmsaamNyemuUB8NSqpiyiJg-rU1UOVuGfVBO1pCM1MOFOSOalMOXrdT5zMvIAmhnrXBflMvMOXPaHX2==",
+     * 		"filePath": "https://image.chinacoal-ins.com:443/SunICMS/image/getImage.action?UgfnUA7qSPtfKd7-VPFiUcmRpPtaUu6RUP_GJvIfSuA-DgAspPtrVhAAXhERSP2RmB01_N0smBZR8N6RmB2R8PSsmh51SsH1Sg5zmsmwSNZsmB5E_syemP6w_N_gUNyxm4LwmsHt8N6zUQteSBaBJN2OmN2GSg_f_dOOmsaamNyemuUB8NSqpiyiIiMRpuAqKAIkXiMA2N01Mv2z6eFkMtHOmBf1dCMdXgnzSiFTdh_l",
+     * 		"pageId": "8325959d-db8c-4414-bce5-438a10d3fc96",
+     * 		"fileName": "8325959d-db8c-4414-bce5-438a10d3fc96.jpg",
+     * 		"md5": "9fcf7de426e367bb2dd4e5e10b843a9b",
+     * 		"orginalName": "行驶证.jpg",
+     * 		"size": "205203"
+     *    },
+     * 	"ImgNum": 2
+     * }
+     */
+}

+ 139 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerOrderStatusResponse.java

@@ -0,0 +1,139 @@
+package com.jzg.quote.zhongmei.crawler.entity.Response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @description: 中煤财险 爬虫查询投保单状态 返回参数
+ * @author: shenwd
+ * @date: 2025/4/1 10:28
+ **/
+@Data
+public class ZmCrawlerOrderStatusResponse extends BaseResponse {
+    @Serial
+    private static final long serialVersionUID = -1591875113878782852L;
+
+    /**
+     * 页码
+     */
+    @JsonProperty("pageNo")
+    private Integer pageNo;
+
+    /**
+     * 页码
+     */
+    @JsonProperty("totalRow")
+    private Integer totalRow;
+
+    /**
+     * 页码
+     */
+    @JsonProperty("business")
+    private BusinessDTO business;
+
+    @Data
+    public static class BusinessDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -5415677418633153021L;
+
+        @JsonProperty("amount")
+        private Integer amount;
+
+        @JsonProperty("annualTaxAmount")
+        private Integer annualTaxAmount;
+
+        @JsonProperty("appliType")
+        private String appliType;
+
+        @JsonProperty("brandName")
+        private String brandName;
+
+        @JsonProperty("businessType")
+        private String businessType;
+
+        @JsonProperty("companyCode")
+        private String companyCode;
+
+        @JsonProperty("contractMainNo")
+        private String contractMainNo;
+
+        @JsonProperty("contractNo1")
+        private String contractNo1;
+
+        @JsonProperty("contractNo2")
+        private String contractNo2;
+
+        @JsonProperty("dealerCode")
+        private String dealerCode;
+
+        @JsonProperty("effectiveDate1")
+        private String effectiveDate1;
+
+        @JsonProperty("effectiveDate2")
+        private String effectiveDate2;
+
+        @JsonProperty("expireDate1")
+        private String expireDate1;
+
+        @JsonProperty("expireDate2")
+        private String expireDate2;
+
+        @JsonProperty("handleStatus")
+        private String handleStatus;
+
+        @JsonProperty("handler1Code")
+        private String handler1Code;
+
+        @JsonProperty("handlerName")
+        private String handlerName;
+
+        @JsonProperty("insuredName")
+        private String insuredName;
+
+        @JsonProperty("isNewPolicy")
+        private String isNewPolicy;
+
+        @JsonProperty("issueDate")
+        private String issueDate;
+
+        @JsonProperty("owners")
+        private String owners;
+
+        @JsonProperty("plateNo")
+        private String plateNo;
+
+        @JsonProperty("premiums1")
+        private Double premiums1;
+
+        @JsonProperty("premiums2")
+        private Double premiums2;
+
+        @JsonProperty("productCode")
+        private String productCode;
+
+        @JsonProperty("relatedType")
+        private String relatedType;
+
+        @JsonProperty("status")
+        private String status;
+
+        @JsonProperty("toPolicyFlag")
+        private String toPolicyFlag;
+
+        @JsonProperty("vIN")
+        private String vIN;
+
+        @JsonProperty("validInd")
+        private String validInd;
+
+        @JsonProperty("visaserialNo")
+        private String visaserialNo;
+
+        @JsonProperty("zmScore")
+        private String zmScore;
+    }
+}

+ 74 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerSubmitResponse.java

@@ -0,0 +1,74 @@
+package com.jzg.quote.zhongmei.crawler.entity.Response;
+
+import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 中煤财险 提交核保 返回参数
+ * @author: shenwd
+ * @date: 2025/4/1 14:35
+ **/
+@Data
+public class ZmCrawlerSubmitResponse extends BaseResponse {
+    @Serial
+    private static final long serialVersionUID = -3206031978930442288L;
+
+    @Data
+    public static class AppliResultDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 11853568275429651L;
+
+        private String contractNo;
+
+        private List<NotionDTO> notion;
+
+        private String status;
+        
+        private List<String> subContractNos;
+
+        @Data
+        public static class NotionDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = 3533632423153798032L;
+
+            private String uWNotion;
+
+            private String uWResult;
+
+            private String uWType;
+        }
+    }
+    /**
+     * {
+     *   "appliResult": [
+     *     {
+     *       "contractNo": "4140301137920250020324",
+     *       "notion": [
+     *         {
+     *           "uWNotion": "业务号:4140301033020250020987,双核审核自动通过!",
+     *           "uWResult": "双核审核自动通过",
+     *           "uWType": "1"
+     *         }
+     *       ],
+     *       "status": "0",
+     *       "subContractNos": [
+     *         "4140301033020250020987"
+     *       ]
+     *     }
+     *   ],
+     *   "head": {
+     *     "errorCode": "",
+     *     "logId": "7902025040114561369280",
+     *     "returnCode": "0",
+     *     "returnMessage": "成功",
+     *     "token": "sinASX5Xos20250401145307488oftDIFwX",
+     *     "transCode": "SUBMIT",
+     *     "transType": "RES"
+     *   }
+     * }
+     */
+}

+ 35 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/po/ZmCrawlerOrder.java

@@ -0,0 +1,35 @@
+package com.jzg.quote.zhongmei.crawler.entity.po;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.data.annotation.Id;
+import org.springframework.data.mongodb.core.mapping.Document;
+
+/**
+ * @description: 中煤财险 【爬虫】 报价过程信息存储
+ * @author: shenwd
+ * @date: 2025/3/28 10:03
+ **/
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+@Document("zhongmei.crawler.order")
+public class ZmCrawlerOrder {
+    @Id
+    private String id;
+    /**
+     * 交互唯一订单 OrderBase类的ordersNo
+     */
+    private String ordersNo;
+
+    /**
+     * 中煤投保单号
+     */
+    private String bussinessNo;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+}

+ 6 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/properties/ZmCrawlerProperties.java

@@ -14,7 +14,12 @@ import org.springframework.stereotype.Component;
 @ConfigurationProperties(prefix = "zhongmei.crawler")
 public class ZmCrawlerProperties {
     /**
-     * 中煤快速出单系统url
+     * 中煤快速出单系统url https://hxkscd.chinacoal-ins.com/singlePlatform
      */
     private String baseUrl;
+
+    /**
+     * 中煤影像系统url https://image.chinacoal-ins.com/SunICMS
+     */
+    private String imageUrl;
 }

+ 16 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/repository/ZmCrawlerOrderReposiroty.java

@@ -0,0 +1,16 @@
+package com.jzg.quote.zhongmei.crawler.repository;
+
+import com.jzg.quote.zhongmei.api.entity.po.ZmApiOrder;
+import com.jzg.quote.zhongmei.crawler.entity.po.ZmCrawlerOrder;
+import org.springframework.data.mongodb.repository.MongoRepository;
+import org.springframework.data.mongodb.repository.Query;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/28 10:06
+ **/
+public interface ZmCrawlerOrderReposiroty extends MongoRepository<ZmCrawlerOrder, String> {
+    @Query("{'ordersNo' : ?0}")
+    ZmCrawlerOrder findByOrdersNo(String ordersNo);
+}

+ 88 - 15
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -1,32 +1,32 @@
 package com.jzg.quote.zhongmei.crawler.service.Impl;
 
+import cn.hutool.crypto.digest.MD5;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.quotation.commons.constant.InsuranceCode;
-import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
-import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
+import com.jzg.quotation.commons.entity.vo.aggregated.*;
 import com.jzg.quotation.commons.entity.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import com.jzg.quotation.commons.entity.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
 import com.jzg.quote.zhongmei.crawler.build.ZmCrawlerQuoteResultVoBuild;
 import com.jzg.quote.zhongmei.crawler.component.ZmCrawlerRequestComponent;
-import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerActualValueRequest;
-import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerModelQueryRequest;
-import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerQuotedPriceRequest;
-import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerActualValueResponse;
-import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerModelQueryResponse;
-import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerQuotedPriceResponse;
+import com.jzg.quote.zhongmei.crawler.constant.ZmCrawlerImageConstant;
+import com.jzg.quote.zhongmei.crawler.entity.Request.*;
+import com.jzg.quote.zhongmei.crawler.entity.Response.*;
 import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
 import com.jzg.quote.zhongmei.crawler.entity.dto.SaleInfoDTO;
+import com.jzg.quote.zhongmei.crawler.entity.po.ZmCrawlerOrder;
 import com.jzg.quote.zhongmei.crawler.service.ZhongMeiCrawlerRequest;
+import com.jzg.quote.zhongmei.crawler.service.ZmCrawlerOrderService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @description: 中煤财险 爬虫报价
@@ -39,6 +39,8 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
 
     private final ZmCrawlerRequestComponent zmCrawlerRequestComponent;
 
+    private final ZmCrawlerOrderService zmCrawlerOrderService;
+
     /**
      * 登录
      * @param loginBase 登录信息
@@ -81,6 +83,11 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         ZmCrawlerQuotedPriceRequest quotedPriceRequest = new ZmCrawlerQuotedPriceRequest(zmCrawlerConfigureParameters, quoteVo, saleInfoDTO, fullCarDataDTO, actualValueResponse, userCode, head);
         ZmCrawlerQuotedPriceResponse quotedPriceResponse = zmCrawlerRequestComponent.quotedPrice(quotedPriceRequest);
 
+        ZmCrawlerOrder zmCrawlerOrder = new ZmCrawlerOrder();
+        zmCrawlerOrder.setOrdersNo(quoteVo.getOrder().getOrdersNo());
+        zmCrawlerOrder.setUserName(quotedPriceResponse.getBussinessMain().getSaleInfo().getSalesman().getHandlerName());
+        zmCrawlerOrderService.save(zmCrawlerOrder);
+
         return ZmCrawlerQuoteResultVoBuild.build(quoteVo, quotedPriceResponse);
     }
 
@@ -88,20 +95,41 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
      * 提交核保 子订单
      *
      * @param underwritingVo
+     * @return
      */
     @Override
-    public void underwriting(UnderwritingVo underwritingVo) {
+    public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
+        // 1.0获取token的请求头
+        AttributionInformationVo attributionInformationVo = underwritingVo
+                .getOrder()
+                .getAttributionInformationVo();
+        String userCode = zmCrawlerRequestComponent.getUserCode(attributionInformationVo.getUsername());
+        String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
+        //获取配置信息
+        ZmCrawlerConfigureParameters zmCrawlerConfigureParameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        BaseRequestHead head = new BaseRequestHead(authorization, zmCrawlerConfigureParameters.getSource());
 
+        ZmCrawlerSubmitRequest submitRequest = new ZmCrawlerSubmitRequest();
+        submitRequest.setHead(head);
+        ZmCrawlerSubmitResponse submit = zmCrawlerRequestComponent.submit(submitRequest);
+        return null;
     }
 
     /**
      * 获取支付链接
      *
-     * @param orderBase
+     * @param paymentLinkVo
      */
     @Override
-    public String getPaymentLink(OrderBase orderBase) throws JsonProcessingException {
-        return "";
+    public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws JsonProcessingException {
+        // 1.0获取token的请求头
+        AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
+        String userCode = zmCrawlerRequestComponent.getUserCode(attributionInformationVo.getUsername());
+        String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
+        //获取配置信息
+        ZmCrawlerConfigureParameters zmCrawlerConfigureParameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        BaseRequestHead head = new BaseRequestHead(authorization, zmCrawlerConfigureParameters.getSource());
+        return null;
     }
 
     /**
@@ -111,7 +139,36 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
      */
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-
+        AttributionInformationVo attributionInformationVo = insuranceUploadImageVo
+                .getOrder()
+                .getAttributionInformationVo();
+        String userCode = zmCrawlerRequestComponent.getUserCode(attributionInformationVo.getUsername());
+        String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
+        //获取配置信息
+        ZmCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+
+        ZmCrawlerOrder crawlerOrder = zmCrawlerOrderService.findByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
+        //打开影像系统
+        zmCrawlerRequestComponent.startUploadImage(userCode.substring(0,2), authorization, crawlerOrder.getBussinessNo());
+        //生成影像批次号
+        String batchId = MD5.create().digestHex(ZmCrawlerImageConstant.ZM_IMAGE_BATCHID_PRE + crawlerOrder.getBussinessNo());
+
+        //导入影像
+        ZmCrawlerImageImportResponse importResponse = null;
+        for (InsuranceImageVo image : insuranceUploadImageVo.getImageVoList()) {
+            List<InsuranceImageVo.ImageDTO> imageBase64List = image.getImageBase64List();
+            if (imageBase64List != null && imageBase64List.size() > 0) {
+                //判断照片类型是否属于中煤影像类型,不属于则默认为01
+                String code = Arrays.stream(ZmCrawlerImageConstant.ZM_IMAGE_TYPE).collect(Collectors.toList()).contains(image.getImageCode()) ? image.getImageCode() : "01";
+                ZmCrawlerImageImportRequest imageImportRequest = new ZmCrawlerImageImportRequest(imageBase64List.size(), crawlerOrder.getBussinessNo(), code, batchId);
+                importResponse = zmCrawlerRequestComponent.importImage(imageImportRequest, imageBase64List);
+            }
+        }
+
+        //上传影像
+        //获取已上传的影像
+        String uploadedXml = zmCrawlerRequestComponent.getUploadedImages(userCode, batchId);
+        String uploadedImages = zmCrawlerRequestComponent.submitImage(parameters, userCode, importResponse, uploadedXml, crawlerOrder);
     }
 
     /**
@@ -121,6 +178,13 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
      */
     @Override
     public void downloadPolicy(OrderBase orderBase) {
+        // 1.0获取token的请求头
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        String userCode = zmCrawlerRequestComponent.getUserCode(attributionInformationVo.getUsername());
+        String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
+        //获取配置信息
+        ZmCrawlerConfigureParameters zmCrawlerConfigureParameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        BaseRequestHead head = new BaseRequestHead(authorization, zmCrawlerConfigureParameters.getSource());
 
     }
 
@@ -131,6 +195,15 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
      */
     @Override
     public void queryOrderState(OrderBase orderBase) {
+        AttributionInformationVo attributionInformationVo = orderBase.getAttributionInformationVo();
+        String authorization = zmCrawlerRequestComponent.getAuthorization(attributionInformationVo.getUsername());
+        //获取配置信息
+        ZmCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        BaseRequestHead requestHead = new BaseRequestHead(authorization, parameters.getSource());
+
+        ZmCrawlerOrderStatusRequest orderStatusRequest = new ZmCrawlerOrderStatusRequest();
+        orderStatusRequest.setHead(requestHead);
 
+        ZmCrawlerOrderStatusResponse zmCrawlerOrderStatusResponse = zmCrawlerRequestComponent.orderStatusQuery(orderStatusRequest);
     }
 }

+ 46 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZmCrawlerOrderServiceImpl.java

@@ -0,0 +1,46 @@
+package com.jzg.quote.zhongmei.crawler.service.Impl;
+
+import com.jzg.quote.zhongmei.api.repository.ZmApiOrderRepository;
+import com.jzg.quote.zhongmei.crawler.entity.po.ZmCrawlerOrder;
+import com.jzg.quote.zhongmei.crawler.repository.ZmCrawlerOrderReposiroty;
+import com.jzg.quote.zhongmei.crawler.service.ZmCrawlerOrderService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * @description: todo
+ * @author: shenwd
+ * @date: 2025/3/28 10:09
+ **/
+@Service
+@RequiredArgsConstructor
+@Transactional
+public class ZmCrawlerOrderServiceImpl implements ZmCrawlerOrderService {
+    private final ZmCrawlerOrderReposiroty zmCrawlerOrderReposiroty;
+    /**
+     * @param ordersNo
+     * @return
+     */
+    @Override
+    public ZmCrawlerOrder findByOrdersNo(String ordersNo) {
+        return zmCrawlerOrderReposiroty.findByOrdersNo(ordersNo);
+    }
+
+    /**
+     * @param ordersNo
+     */
+    @Override
+    public void deleteByOrdersNo(String ordersNo) {
+
+    }
+
+    /**
+     * @param ZmCrawlerOrder
+     * @return
+     */
+    @Override
+    public ZmCrawlerOrder save(ZmCrawlerOrder ZmCrawlerOrder) {
+        return null;
+    }
+}

+ 16 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/ZmCrawlerOrderService.java

@@ -0,0 +1,16 @@
+package com.jzg.quote.zhongmei.crawler.service;
+
+import com.jzg.quote.zhongmei.crawler.entity.po.ZmCrawlerOrder;
+
+/**
+ * @description: 中煤财险 mongodb中操作数据
+ * @author: shenwd
+ * @date: 2025/3/28 10:08
+ **/
+public interface ZmCrawlerOrderService {
+    ZmCrawlerOrder findByOrdersNo(String ordersNo);
+
+    void deleteByOrdersNo(String ordersNo);
+
+    ZmCrawlerOrder save(ZmCrawlerOrder ZmCrawlerOrder);
+}