liub 4 месяцев назад
Родитель
Сommit
c7ccd87748

+ 3 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java

@@ -481,8 +481,9 @@ public class GuoRenCrawlerRequestComponent {
      */
     public GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo(String loginUserCode, String loginComCode, String proposalNo, HttpHeaders httpHeaders) {
         GuoRenCrawlerQueryPrpallProposalInfoRequest queryPrpallProposalInfoRequest = new GuoRenCrawlerQueryPrpallProposalInfoRequest(loginUserCode, loginComCode, proposalNo);
-        List<GuoRenCrawlerQueryPrpallProposalInfoData> queryPrpallProposalInfoData = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, httpHeaders);
-        return queryPrpallProposalInfoData.get(0);
+        GuoRenCrawlerBaseResponse<List<GuoRenCrawlerQueryPrpallProposalInfoData>> response = request(RequestUrl.QUERY_PRPALL_PROPOSAL_INFO, queryPrpallProposalInfoRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+        return response.getData().get(0);
     }
 
     /**

+ 4 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java

@@ -28,13 +28,12 @@ import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerInitSelectRe
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 
-import java.util.Map;
-import java.util.stream.Collectors;
-
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteProcessService {
@@ -114,8 +113,9 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         String token = guoRenCrawlerCacheComponent.getToken(username);
 //        String token = "eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3Nzg5MjY2MDB9.UYGTs0DQgbZJinMWJExUV18JhfJW23JonveQVVq6N5Muy_vu6Py8pL-AI5Ohv0BDoCCfdOD7SjLmiCqGy4uU9130O1_QlLzyxsriiBKUPXPJKbipftpqSdjYyFSgfNSIySO99hs005Ip89HnkaT34ephMA-C8jyyxGShQdNkuxI";
         if (!StringUtils.hasText(token)) {
-            throw new TokenExpireException();
+            throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }
+        log.info("国任账号登录信息:{}", token);
         headers.add(HttpHeaders.AUTHORIZATION, token);
         return headers;
     }

+ 58 - 10
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -1,43 +1,38 @@
 package com.jzg.quotation.guoren.crawler.service.impl;
 
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.core.page.HttpResult;
-import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
-import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
-import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.commons.utils.TimeProcessing;
-import com.jzg.quotation.guoren.api.entity.Response.IdentifyCodeDataResponse;
 import com.jzg.quotation.guoren.crawler.build.GuoRenCrawlerQuoteResultsVoBuild;
-import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerCacheComponent;
 import com.jzg.quotation.guoren.crawler.component.GuoRenCrawlerRequestComponent;
 import com.jzg.quotation.guoren.crawler.constant.enums.RequestUrl;
 import com.jzg.quotation.guoren.crawler.entity.GuoRenCrawlerConfigureParameters;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
 import com.jzg.quotation.guoren.crawler.entity.po.GuoRenCrawlerOrder;
 import com.jzg.quotation.guoren.crawler.entity.po.OrderCommon;
 import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCalculationPremiumRequest;
-import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerOrderService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerRequest;
 import lombok.RequiredArgsConstructor;
-import org.apache.http.util.TextUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -236,10 +231,63 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
     }
 
     @Override
-    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) throws Exception {
+    public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         OrderCommon orderCommon = getOrderCommon(orderStatusVo.getOrder());
         GuoRenCrawlerQueryPrpallProposalInfoData queryPrpallProposalInfo = guoRenCrawlerRequestComponent.queryPrpallProposalInfo(orderCommon.getUsername(), orderCommon.getComCode(), orderCommon.getBusinessNo(), orderCommon.getHttpHeaders());
-        return new OrderStatusResultVo();
+        OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
+        if (queryPrpallProposalInfo == null) {
+            return orderStatusResultVo;
+        }
+
+        // 获取订单信息
+        GuoRenCrawlerOrder guoRenCrawlerOrder = guoRenCrawlerOrderService.getById(orderStatusVo.getOrder().getOrdersNo());
+        InsOrders insOrders = orderStatusVo.getInsOrders();
+
+        List<String> proposalNos = queryPrpallProposalInfo.getProposalNo();
+        List<String> policyNos = queryPrpallProposalInfo.getPolicyNo();
+        String underWriteFlag = queryPrpallProposalInfo.getUnderWriteFlag();
+
+        // 匹配交强和商业投保单的索引(平行数组,索引一一对应)
+        int ciIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getCiPolicyNumber()) : -1;
+        int biIndex = proposalNos != null ? proposalNos.indexOf(guoRenCrawlerOrder.getBiPolicyNumber()) : -1;
+
+        // 获取交强和商业的保单号
+        String ciPolicyNo = ciIndex >= 0 && proposalNos != null && ciIndex < proposalNos.size() ? proposalNos.get(ciIndex) : null;
+        String biPolicyNo = biIndex >= 0 && proposalNos != null && biIndex < proposalNos.size() ? proposalNos.get(biIndex) : null;
+
+        boolean auditPassed = "1".equals(underWriteFlag);
+        boolean ciHasPolicy = StringUtils.hasLength(ciPolicyNo);
+        boolean biHasPolicy = StringUtils.hasLength(biPolicyNo);
+
+        // 待核保状态 → 核保通过 → 待缴费(与API版逻辑保持一致)
+        if (insOrders != null && InsOrderStatusEnum.WAIT_AUDIT.getCode().equals(insOrders.getOrderStatus())) {
+            // 单交 / 单商 / 交商 任一核保通过即转为待缴费
+            boolean jqBoo = ciIndex >= 0 && biIndex < 0 && auditPassed;
+            boolean syBoo = biIndex >= 0 && ciIndex < 0 && auditPassed;
+            boolean jqSyBoo = ciIndex >= 0 && biIndex >= 0 && auditPassed;
+            if (jqBoo || syBoo || jqSyBoo) {
+                orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(orderStatusVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                orderStatusResultVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            }
+        }
+
+        // 保单号存在 → 已承保/已出单
+        if (ciHasPolicy || biHasPolicy) {
+            if (ciHasPolicy) {
+                orderStatusResultVo.setJqPolicyno(ciPolicyNo);
+                orderStatusResultVo.setJqApplyNo(guoRenCrawlerOrder.getCiPolicyNumber());
+            }
+            if (biHasPolicy) {
+                orderStatusResultVo.setSyPolicyno(biPolicyNo);
+                orderStatusResultVo.setSyApplyNo(guoRenCrawlerOrder.getBiPolicyNumber());
+            }
+            orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
+        }
+
+        return orderStatusResultVo;
     }
 
     private OrderCommon getOrderCommon(OrderBase orderBase) {

+ 85 - 83
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -60,6 +60,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.servlet.http.HttpServletRequest;
 import lombok.RequiredArgsConstructor;
+import org.apache.http.util.TextUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -242,7 +243,7 @@ public class UnifyOrderManager {
         String systemCode = getSystemCode();
         String companyName = CompanyConstants.getCompanyNameByCode(esmInsCompanyHttpResult.getData().getCompanyCode());
 
-        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]",systemCode, esmInsCompanyHttpResult.getData().getId());
+        log.info("查询保司配置的协议:systemCode=[{}],companyId=[{}]", systemCode, esmInsCompanyHttpResult.getData().getId());
         HttpResult<List<PtlAgreement>> byCompanyId = orgClient.getByCompanyId(esmInsCompanyHttpResult.getData().getId(), systemCode);
         if (CollUtil.isEmpty(byCompanyId.getData())) {
             AssertionUtils.isFail(true, "保司未配置协议");
@@ -697,7 +698,7 @@ public class UnifyOrderManager {
     @Operation(summary = "获取订单状态")
     @PostMapping("/getOrderStatus")
     public HttpResult getOrderStatus(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
-        log.info("更新订单状态:orderStatusVo=[{}]",JSONUtil.toJsonStr(orderStatusVo));
+        log.info("更新订单状态:orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(insOrders.getCompanyId());
@@ -719,16 +720,17 @@ public class UnifyOrderManager {
         InsOrdersAccidentalDriving insOrdersAccidentalDriving = insOrdersAccidentalDrivingService.getByOrderId(insOrders.getId());
         orderStatusVo.setInsOrdersAccidentalDriving(insOrdersAccidentalDriving);
         OrderStatusResultVo orderStatusResultVo = orderStatusService.queryOrderState(orderStatusVo);
-        log.info("订单状态orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo));
+        log.info("订单状态orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo));
         // 保存状态查询结果
         insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
         // 保存支付链接
-        insOrders.setPayLink(orderStatusResultVo.getPaymentLink());
+        insOrders.setPayLink(!TextUtils.isEmpty(orderStatusResultVo.getPaymentLink()) ? orderStatusResultVo.getPaymentLink() : insOrders.getPayLink());
         insOrdersQrcodeService.updateQrCode(insOrders);
         //////////////////////////////////////////新增营销抽奖活动////////////////////////////////////////////////
         // 承保(客户)、出单(业务员)
-        if(orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED){
-            doSomethingAfterUnderwited(insOrders);
+        if (orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
+            // TODO: 本地生活逻辑未调试通畅,暂时先注掉
+            //doSomethingAfterUnderwited(insOrders);
         }
         return HttpResult.ok("状态刷新成功");
     }
@@ -744,7 +746,7 @@ public class UnifyOrderManager {
     public HttpResult<String> mockUnderwited(@RequestBody OrderStatusVo orderStatusVo) throws Exception {
         log.info("模拟承保(跳过实际付款操作). orderStatusVo=[{}]", JSONUtil.toJsonStr(orderStatusVo));
         InsOrders insOrders = insOrdersService.getById(orderStatusVo.getOrder().getOrdersNo());
-        if(!"4".equals(insOrders.getOrderStatus())){
+        if (!"4".equals(insOrders.getOrderStatus())) {
             return HttpResult.error("只能对待缴费的订单进行模拟承保");
         }
         AssertionUtils.isFail(Objects.isNull(insOrders), "订单不存在");
@@ -772,16 +774,16 @@ public class UnifyOrderManager {
         OrderStatusResultVo orderStatusResultVo = new OrderStatusResultVo();
         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
         // 保存状态查询结果
-        try{
+        try {
             // 设置订单状态为 已承保(5)
-            InsOrders insOrdersItem = new  InsOrders();
+            InsOrders insOrdersItem = new InsOrders();
             insOrdersItem.setOrderStatus("5");
             insOrdersItem.setAuditStatus(1);
             insOrdersItem.setId(insOrders.getId());
             insOrdersService.updateById(insOrdersItem);
             insOrdersService.orderAfterUpdateOrderStatus(orderStatusVo.getOrder().getOrdersNo(), orderStatusResultVo);
-        }catch (Exception e){
-            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]",JSONUtil.toJsonStr(orderStatusResultVo), e);
+        } catch (Exception e) {
+            log.error("承保后,更新状态,进行后续逻辑异常. orderStatusResultVo=[{}]", JSONUtil.toJsonStr(orderStatusResultVo), e);
         }
 
         //this.doSomethingAfterUnderwited(insOrders);
@@ -811,82 +813,81 @@ public class UnifyOrderManager {
                     continue;
                 }
 
-                    if (activity.getLocalActivityTables() == null) {
-                        continue;
+                if (activity.getLocalActivityTables() == null) {
+                    continue;
+                }
+                // 遍历所有本地活动表
+                for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
+                    // 处理 type=9 的承保规则
+                    if ("9".equals(table.getType())) {
+                        Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
+                        String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
+                        for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
+                            if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                                // 存本地记录 等绑定后更新本地记录的同步状态字段即可
+                                completeRule(null, null, userPhone, activity.getId(),
+                                        table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
+                                log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            }
+                        }
                     }
-                    // 遍历所有本地活动表
-                    for (LocalActivityTableVO table : activity.getLocalActivityTables()) {
-                        // 处理 type=9 的承保规则
-                        if ("9".equals(table.getType())) {
-                            Double totalFee = insOrdersService.queryTotalFee(insOrders.getInsOrderNo());
-                            String userPhone = insOrdersService.queryCustomerPhone(insOrders.getInsOrderNo());
-                            for (UnderwritingRuleVO underwritingRuleVO : table.getUnderwritingRules()) {
-                                if (new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMinPremium()) >= 0 && new BigDecimal(totalFee).compareTo(underwritingRuleVO.getUwMaxPremium()) <= 0) {
+                    // 处理 type=8 的出单规则
+                    if ("8".equals(table.getType())) {
+                        // 只处理本租户的出单规则
+                        if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
+                            continue;
+                        }
+                        // 查询是否在一账通绑定
+                        UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
+                        unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
+                        unifiedUserCenterDTO.setClientId(CLIENT_ID);
+                        unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
+                        HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
+                        try {
+                            unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
+                        } catch (Exception e) {
+                            log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                            log.error("业务员出单,查询用户绑定一账通接口异常", e);
+                        }
+                        if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
+                            // 判断是否满足条件
+                            // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
+                            // 统计业务员的出单次数
+                            int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                            for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                if (count >= Integer.parseInt(orderRule.getOrdNum())) {
                                     // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                    completeRule(null, null, userPhone, activity.getId(),
-                                            table.getId(), underwritingRuleVO.getUwMinPremium() + "-" + underwritingRuleVO.getUwMaxPremium(), underwritingRuleVO.getUwLotteryNum(), null, YesNoEnum.NO.getCode(), 9);
-                                    log.info("客户承保,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
+                                    completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                            table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
+
+                                    log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                 }
                             }
-                        }
-                        // 处理 type=8 的出单规则
-                        if ("8".equals(table.getType())) {
-                            // 只处理本租户的出单规则
-                            if (!baseController.getUserSystemCode().equals(table.getTenantId())) {
-                                continue;
-                            }
-                            // 查询是否在一账通绑定
-                            UnifiedUserCenterDTO unifiedUserCenterDTO = new UnifiedUserCenterDTO();
-                            unifiedUserCenterDTO.setUserId(insOrders.getRealQuoteUserId());
-                            unifiedUserCenterDTO.setClientId(CLIENT_ID);
-                            unifiedUserCenterDTO.setTenantId(baseController.getUserSystemCode());
-                            HttpResult<UnifiedUserClientVO> unifiedUserClientVOHttpResult = null;
-                            try {
-                                unifiedUserClientVOHttpResult = localLivingClient.queryBind(unifiedUserCenterDTO);
-                            } catch (Exception e) {
-                                log.info("业务员出单,查询用户绑定一账通接口异常,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                log.error("业务员出单,查询用户绑定一账通接口异常", e);
-                            }
-                            if (unifiedUserClientVOHttpResult == null || unifiedUserClientVOHttpResult.getCode() != 200 || unifiedUserClientVOHttpResult.getData() == null) {
-                                // 判断是否满足条件
-                                // 业务员累计出单次数是否大于等于本活动规定时间范围内的出单次数
-                                // 统计业务员的出单次数
-                                int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                    if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                        // 存本地记录 等绑定后更新本地记录的同步状态字段即可
-                                        completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                table.getId(), orderRule.getOrdNum(), String.valueOf(orderRule.getOrdLotteryNum()), null, YesNoEnum.NO.getCode(), 8);
-
-                                        log.info("业务员出单,满足条件插入记录,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                    }
+                        } else {
+                            Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
+                                    .stream()
+                                    .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
+                            // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
+                            if (userClientGroupMap.containsKey(CLIENT_ID)) {
+                                LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
+                                lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
+                                lotteryCounDTO.setActivityId(activity.getId());
+                                lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
+                                HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
+                                try {
+                                    lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
+                                } catch (Exception e) {
+                                    log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
+                                    log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
                                 }
-                            } else {
-                                Map<String, List<UnifiedUserClientVO>> userClientGroupMap = unifiedUserClientVOHttpResult.getData().getUserClients()
-                                        .stream()
-                                        .collect(Collectors.groupingBy(UnifiedUserClientVO::getClientId));
-                                // 首先查业务员是否在一账通绑定过本地生活  【已绑定过 远程调抽奖次数增加接口 标记已同步
-                                if (userClientGroupMap.containsKey(CLIENT_ID)) {
-                                    LotteryCounDTO lotteryCounDTO = new LotteryCounDTO();
-                                    lotteryCounDTO.setAppUserId(insOrders.getRealQuoteUserId());
-                                    lotteryCounDTO.setActivityId(activity.getId());
-                                    lotteryCounDTO.setCount(Integer.parseInt(table.getQutLotteryNum()));
-                                    HttpResult<LotteryCountVO> lotteryCountVOHttpResult = null;
-                                    try {
-                                        lotteryCountVOHttpResult = localLivingClient.addLotteryCount(lotteryCounDTO);
-                                    } catch (Exception e) {
-                                        log.info("业务员出单,远程调用本地生活抽奖次数增加接口异常,userId:{},count:{},tenantId:{}", insOrders.getRealQuoteUserId(), table.getQutLotteryNum(), baseController.getUserSystemCode());
-                                        log.error("业务员出单,远程调用本地生活抽奖次数增加异常", e);
-                                    }
-                                    if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
-                                        int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
-                                        for (OrderRuleVO orderRule : table.getOrderRules()) {
-                                            if (count >= Integer.parseInt(orderRule.getOrdNum())) {
-                                                // 记录规则完成  标记已同步
-                                                completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
-                                                        table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
-                                                log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
-                                            }
+                                if (lotteryCountVOHttpResult != null && lotteryCountVOHttpResult.getData().getSuccess()) {
+                                    int count = insOrdersService.countOrderNum(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), activity.getActivityStartTime(), activity.getActivityEndTime());
+                                    for (OrderRuleVO orderRule : table.getOrderRules()) {
+                                        if (count >= Integer.parseInt(orderRule.getOrdNum())) {
+                                            // 记录规则完成  标记已同步
+                                            completeRule(baseController.getUserSystemCode(), insOrders.getRealQuoteUserId(), null, activity.getId(),
+                                                    table.getId(), table.getQutNum(), table.getQutLotteryNum(), table.getQutLotteryMax(), YesNoEnum.YES.getCode(), 8);
+                                            log.info("业务员出单,满足条件插入记录并远程同步,userId:{},clientId:{},tenantId:{}", insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                                         }
                                     }
                                 }
@@ -896,7 +897,8 @@ public class UnifyOrderManager {
                 }
             }
         }
-        //return HttpResult.ok("状态刷新成功");
+    }
+    //return HttpResult.ok("状态刷新成功");
 
 
     @OrderOperationLog(

+ 6 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -202,6 +202,12 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
 
     @Override
     public void feeAuditAdd(InsOrders orders) {
+        // 先检查是否已存在审核记录,避免重复INSERT导致主键冲突
+        InsFeeAudit existing = this.getOne(new LambdaQueryWrapper<InsFeeAudit>().eq(InsFeeAudit::getOrderNo, orders.getId()));
+        if (existing != null) {
+            return;
+        }
+
         InsFeeAudit insFeeAudit = new InsFeeAudit();
         insFeeAudit.setOrderNo(orders.getId());
 

+ 39 - 20
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersQrcodeServiceImpl.java

@@ -55,18 +55,24 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public InsOrdersQrcode saveQrCode(InsOrders orders) {
+        // 先查询是否已存在同 ordermo 的记录(不限状态),避免 INSERT 违反唯一约束
+        InsOrdersQrcode existing = baseMapper.selectOne(
+                new LambdaQueryWrapper<>(InsOrdersQrcode.class)
+                        .eq(InsOrdersQrcode::getOrderno, orders.getId()));
+        if (existing != null) {
+            // 已存在则复用旧记录,更新为有效状态
+            existing.setQrcodeStatus(1);
+            existing.setCreatetime(LocalDateTime.now());
+            String paylink = buildJumpUrl(orders.getPayLink());
+            existing.setJumpUrl(paylink);
+            baseMapper.updateById(existing);
+            return existing;
+        }
+
+        // 不存在则新建
         InsOrdersQrcode insOrdersQrcode = new InsOrdersQrcode();
         insOrdersQrcode.setOrderno(orders.getId());
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            insOrdersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            insOrdersQrcode.setJumpUrl(paylink);
-        }
+        insOrdersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         insOrdersQrcode.setQrcodeStatus(1);
         insOrdersQrcode.setCreatetime(LocalDateTime.now());
         this.save(insOrdersQrcode);
@@ -75,17 +81,14 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
 
     @Override
     public void updateQrCode(InsOrders orders) {
-        InsOrdersQrcode ordersQrcode = baseMapper.selectOne(new LambdaQueryWrapper<>(InsOrdersQrcode.class).eq(InsOrdersQrcode::getOrderno, orders.getId()));
-        String paylink = orders.getPayLink();
-        if(isHttpUrl(orders.getPayLink())){
-            paylink = paylink.replace("{", "").replace("}", "");
-            ordersQrcode.setJumpUrl(paylink);
-        }else{
-            if(paylink.contains("data:image/jpg;base64,")){
-                paylink = paylink.replace("data:image/jpg;base64,","");
-            }
-            ordersQrcode.setJumpUrl(paylink);
+        // 查询有效的二维码记录(qrcodeStatus=1),避免拿到已销毁的记录
+        InsOrdersQrcode ordersQrcode = getIsExit(orders.getId());
+        if (ordersQrcode == null) {
+            // 不存在有效记录则新建(内部会处理已销毁记录的复用,不会违反唯一约束)
+            getOneOrSave(orders);
+            return;
         }
+        ordersQrcode.setJumpUrl(buildJumpUrl(orders.getPayLink()));
         baseMapper.updateById(ordersQrcode);
     }
 
@@ -146,6 +149,22 @@ public class InsOrdersQrcodeServiceImpl extends ServiceImpl<InsOrdersQrcodeMappe
             return false;
         }
     }
+
+    /**
+     * 构建跳转链接(去除多余字符)
+     */
+    private String buildJumpUrl(String paylink) {
+        if (StringUtils.isEmpty(paylink)) {
+            return paylink;
+        }
+        if (isHttpUrl(paylink)) {
+            return paylink.replace("{", "").replace("}", "");
+        }
+        if (paylink.contains("data:image/jpg;base64,")) {
+            return paylink.replace("data:image/jpg;base64,", "");
+        }
+        return paylink;
+    }
 }