فهرست منبع

报价流程完善

785834757 1 سال پیش
والد
کامیت
4b78c3bb0f
12فایلهای تغییر یافته به همراه456 افزوده شده و 46 حذف شده
  1. 40 0
      commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java
  2. 28 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/OrderStatusVo.java
  3. 6 4
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/UnderwritingVo.java
  4. 41 7
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  5. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java
  6. 30 27
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarUserInfoServiceImpl.java
  7. 23 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  8. 64 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/OrderState.java
  9. 58 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/config/OrderStateConfig.java
  10. 156 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/OrderStateListener.java
  11. 7 2
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java
  12. 2 2
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

+ 40 - 0
commons/src/main/java/com/jzg/commons/entity/orders/po/InsOrdersCarUserInfo.java

@@ -4,15 +4,23 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.jzg.commons.core.base.BaseModel;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.util.IDCardUtils;
+import com.jzg.commons.util.idgen.IdGenerate;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
 
+import java.text.DateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 
 
 @Data
 @Schema(description = "订单人员信息表")
+@NoArgsConstructor
 public class InsOrdersCarUserInfo extends BaseModel {
 
     @TableId(type = IdType.ASSIGN_ID)
@@ -88,4 +96,36 @@ public class InsOrdersCarUserInfo extends BaseModel {
     @Schema(description = "是否车主 0-否 1-是")
     private int carOwner;
 
+
+    public InsOrdersCarUserInfo(CustomerInfoVo customerInfoVo,String orderNo,Integer policyPersonType) {
+        this.setId(IdGenerate.nextId());
+        this.setOrderNo(orderNo);
+        this.setPolicyPersonType(policyPersonType); // 车主
+        this.setPersonType(Integer.parseInt(customerInfoVo.getProperty()));
+        this.setName(customerInfoVo.getName());
+        this.setIdentifyNumber(customerInfoVo.getIdentifyNumber());
+        this.setAge(customerInfoVo.getAge());
+        this.setGender(customerInfoVo.getGender());
+        this.setAddr(customerInfoVo.getAddr());
+        this.setIdentifyValidDate(LocalDate.parse(customerInfoVo.getIdentifyValidDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay());
+        this.setIdentifyValidEndDate(LocalDate.parse(customerInfoVo.getIdentifyValidEndDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay());
+        this.setMobile(customerInfoVo.getMobile());
+        this.setEmail(customerInfoVo.getEmail());
+        this.setProvinceCode(customerInfoVo.getProvinceCode());
+        this.setCityCode(customerInfoVo.getCityCode());
+        this.setCountyCode(customerInfoVo.getCountyCode());
+        this.setAge(IDCardUtils.getAgeFromIDCard(customerInfoVo.getIdentifyNumber()));
+        this.setGender(IDCardUtils.getSex(customerInfoVo.getIdentifyNumber()));
+
+        if (customerInfoVo.getProperty().equals("1")) {
+            this.setCerType(1); // 个人
+        } else {
+            this.setCerType(2); // 法人
+        }
+        this.setProvinceCode(customerInfoVo.getProvinceCode());
+        this.setCityCode(customerInfoVo.getCityCode());
+        this.setCountyCode(customerInfoVo.getCountyCode());
+
+    }
+
 }

+ 28 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/OrderStatusVo.java

@@ -0,0 +1,28 @@
+package com.jzg.quotation.commons.entity.vo.aggregated;
+
+import com.jzg.commons.entity.orders.po.InsOrders;
+import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
+import com.jzg.commons.entity.orders.po.InsOrdersCosts;
+import com.jzg.commons.entity.orders.po.InsOrdersPolicy;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.quotation.commons.entity.vo.base.OrderBase;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 订单状态查询VO
+ */
+
+@Data
+public class OrderStatusVo {
+    /**
+     * 订单交互信息
+     */
+    private OrderBase order;
+
+    /**
+     * 订单信息
+     */
+    private InsOrders insorders;
+}

+ 6 - 4
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/entity/vo/aggregated/UnderwritingVo.java

@@ -1,10 +1,7 @@
 package com.jzg.quotation.commons.entity.vo.aggregated;
 
 
-import com.jzg.commons.entity.orders.po.InsOrders;
-import com.jzg.commons.entity.orders.po.InsOrdersCarInfo;
-import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
-import com.jzg.commons.entity.orders.po.InsOrdersRisk;
+import com.jzg.commons.entity.orders.po.*;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
 import com.jzg.quotation.commons.entity.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.entity.vo.underwriting.SpecialAppointmentsVo;
@@ -54,4 +51,9 @@ public class UnderwritingVo {
      */
     private List<InsOrdersCarUserInfo> insOrdersCarUserInfoList;
 
+    /**
+     * 保单号
+     */
+    private InsOrdersPolicy policy;
+
 }

+ 41 - 7
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -10,6 +10,7 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.PtlAgreement;
+import com.jzg.commons.entity.vo.PersonAreaVo;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.commons.client.OrgClient;
 import com.jzg.quotation.commons.client.PlatformClient;
@@ -22,6 +23,7 @@ import com.jzg.quotation.summary.converter.QuoteInfoConverter;
 import com.jzg.quotation.summary.entity.po.QuoteRuleMapping;
 import com.jzg.quotation.summary.factory.CompanyFactory;
 import com.jzg.quotation.summary.service.*;
+import com.jzg.quotation.summary.state.listener.OrderStateListener;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.media.Schema;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -84,6 +86,9 @@ public class UnifyOrderManager {
     @Autowired
     InsTaskImagesService insTaskImagesService;
 
+    @Autowired
+    OrderStateListener orderStateListener;
+
 
     /**
      * 获取报价号
@@ -155,6 +160,9 @@ public class UnifyOrderManager {
             QuoteInfoConverter.converterKindInfoVo(quoteVo.getKindInfoVo(), quoteKindMappingMap.get(QuoteRuleCategory.KIND.getCode()));
         }
 
+        //更新用户的区划code
+        setUserAreaCode(quoteVo);
+
         // 生成订单
         String ordersNo = insOrdersService.generateOrders(quoteVo,companyName);
 
@@ -165,17 +173,42 @@ public class UnifyOrderManager {
         quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
         quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
         quoteResultsVo.setOrdersNo(ordersNo);
-        //如果报价成功则更新订单
-        if(quoteResultsVo.isQuoteStatus()) {
-            // 报价后更新订单
-            insOrdersService.orderAfterUpdateQuote(ordersNo, quoteResultsVo);
-        }
+
+        // 报价后更新订单
+        insOrdersService.orderAfterUpdateQuote(ordersNo, quoteResultsVo);
 
         return quoteResultsVo.isQuoteStatus() ? HttpResult.ok(quoteResultsVo) : HttpResult.error(quoteResultsVo.getErrorMessage());
 
     }
 
 
+    public void setUserAreaCode(QuoteVo quoteVo){
+        HttpResult<PersonAreaVo> ownerAddress = orgClient.queryByAddress(
+                quoteVo.getOwnersInfo().getAddr(), quoteVo.getOwnersInfo().getIdentifyNumber());
+
+        HttpResult<PersonAreaVo> insuredAddress = quoteVo.getOwnersInfo().getIdentifyNumber()
+                .equals(quoteVo.getInsuredPersonInfo().getIdentifyNumber())
+                ? ownerAddress
+                : orgClient.queryByAddress(quoteVo.getInsuredPersonInfo().getAddr(), quoteVo.getInsuredPersonInfo().getIdentifyNumber());
+
+        HttpResult<PersonAreaVo> policyAddress = quoteVo.getPolicyHolderInfo().getIdentifyNumber()
+                .equals(quoteVo.getOwnersInfo().getIdentifyNumber())
+                ? ownerAddress
+                : quoteVo.getPolicyHolderInfo().getIdentifyNumber().equals(quoteVo.getInsuredPersonInfo().getIdentifyNumber())
+                ? insuredAddress
+                : orgClient.queryByAddress(quoteVo.getPolicyHolderInfo().getAddr(), quoteVo.getPolicyHolderInfo().getIdentifyNumber());
+
+        quoteVo.getOwnersInfo().setProvinceCode(ownerAddress.getData().getProvinceCode());
+        quoteVo.getOwnersInfo().setCityCode(ownerAddress.getData().getCityCode());
+        quoteVo.getOwnersInfo().setCountyCode(ownerAddress.getData().getCountyCode());
+        quoteVo.getInsuredPersonInfo().setProvinceCode(insuredAddress.getData().getProvinceCode());
+        quoteVo.getInsuredPersonInfo().setCityCode(insuredAddress.getData().getCityCode());
+        quoteVo.getInsuredPersonInfo().setCountyCode(insuredAddress.getData().getCountyCode());
+        quoteVo.getPolicyHolderInfo().setProvinceCode(policyAddress.getData().getProvinceCode());
+        quoteVo.getPolicyHolderInfo().setCityCode(policyAddress.getData().getCityCode());
+        quoteVo.getPolicyHolderInfo().setCountyCode(policyAddress.getData().getCountyCode());
+    }
+
     @Operation(summary = "统一核保")
     @PostMapping("/underwriting")
     public HttpResult underwriting(@RequestBody UnderwritingVo underwritingVo) throws JsonProcessingException {
@@ -190,15 +223,16 @@ public class UnifyOrderManager {
         List<InsOrdersRisk> riskList = insOrdersRiskService.list(new LambdaQueryWrapper<InsOrdersRisk>()
                 .eq(InsOrdersRisk::getOrderNo, insOrders.getId()));
 
+        InsOrdersPolicy insOrdersPolicy = insOrdersPolicyService.getById(insOrders.getId());
+
         underwritingVo.setInsOrders(insOrders);
         underwritingVo.setInsOrdersCarInfo(insOrdersCarInfo);
         underwritingVo.setInsOrdersCarUserInfoList(insOrdersCarUserInfos);
         underwritingVo.setInsOrdersRiskList(riskList);
+        underwritingVo.setPolicy(insOrdersPolicy);
 
         UnderwritingResultsVo underwritingResultsVo = quoteService.underwriting(underwritingVo);
 
-
-
         // 保存核保结果
         insOrdersService.orderAfterUpdateUnderwriting(underwritingResultsVo);
 

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/InsOrdersCarUserInfoService.java

@@ -12,7 +12,7 @@ import java.time.format.DateTimeFormatter;
 import java.util.List;
 
 public interface InsOrdersCarUserInfoService extends IService<InsOrdersCarUserInfo> {
-    InsOrdersCarUserInfo createUserInfo(String orderNo, CustomerInfoVo customerInfoVo, DateTimeFormatter formatter,Integer policyPersonType);
+//    InsOrdersCarUserInfo createUserInfo(String orderNo, CustomerInfoVo customerInfoVo, DateTimeFormatter formatter,Integer policyPersonType);
 
 
     List<InsOrdersCarUserInfo> getByOrderId(String orderId);

+ 30 - 27
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersCarUserInfoServiceImpl.java

@@ -28,33 +28,36 @@ public class InsOrdersCarUserInfoServiceImpl extends ServiceImpl<InsOrdersCarUse
         baseMapper.deleteOrderNo(orderNo);
     }
 
-    @Override
-    public InsOrdersCarUserInfo createUserInfo(String orderNo, CustomerInfoVo customerInfoVo, DateTimeFormatter formatter,Integer policyPersonType) {
-        InsOrdersCarUserInfo info = new InsOrdersCarUserInfo();
-        info.setId(IdGenerate.nextId());
-        info.setOrderNo(orderNo);
-        info.setPolicyPersonType(policyPersonType); // 车主
-        info.setPersonType(Integer.parseInt(customerInfoVo.getProperty()));
-        info.setName(customerInfoVo.getName());
-        info.setIdentifyNumber(customerInfoVo.getIdentifyNumber());
-        info.setAge(customerInfoVo.getAge());
-        info.setGender(customerInfoVo.getGender());
-        info.setAddr(customerInfoVo.getAddr());
-        info.setIdentifyValidDate(LocalDate.parse(customerInfoVo.getIdentifyValidDate(), formatter).atStartOfDay());
-        info.setIdentifyValidEndDate(LocalDate.parse(customerInfoVo.getIdentifyValidEndDate(), formatter).atStartOfDay());
-        info.setMobile(customerInfoVo.getMobile());
-        info.setEmail(customerInfoVo.getEmail());
-
-        if (customerInfoVo.getProperty().equals("1")) {
-            info.setCerType(1); // 个人
-        } else {
-            info.setCerType(2); // 法人
-            info.setProvinceCode(customerInfoVo.getProvinceCode());
-            info.setCityCode(customerInfoVo.getCityCode());
-            info.setCountyCode(customerInfoVo.getCountyCode());
-        }
-        return info;
-    }
+//    @Override
+//    public InsOrdersCarUserInfo createUserInfo(String orderNo, CustomerInfoVo customerInfoVo, DateTimeFormatter formatter,Integer policyPersonType) {
+//        InsOrdersCarUserInfo info = new InsOrdersCarUserInfo();
+//        info.setId(IdGenerate.nextId());
+//        info.setOrderNo(orderNo);
+//        info.setPolicyPersonType(policyPersonType); // 车主
+//        info.setPersonType(Integer.parseInt(customerInfoVo.getProperty()));
+//        info.setName(customerInfoVo.getName());
+//        info.setIdentifyNumber(customerInfoVo.getIdentifyNumber());
+//        info.setAge(customerInfoVo.getAge());
+//        info.setGender(customerInfoVo.getGender());
+//        info.setAddr(customerInfoVo.getAddr());
+//        info.setIdentifyValidDate(LocalDate.parse(customerInfoVo.getIdentifyValidDate(), formatter).atStartOfDay());
+//        info.setIdentifyValidEndDate(LocalDate.parse(customerInfoVo.getIdentifyValidEndDate(), formatter).atStartOfDay());
+//        info.setMobile(customerInfoVo.getMobile());
+//        info.setEmail(customerInfoVo.getEmail());
+//        info.setProvinceCode(customerInfoVo.getProvinceCode());
+//        info.setCityCode(customerInfoVo.getCityCode());
+//        info.setCountyCode(customerInfoVo.getCountyCode());
+//
+//        if (customerInfoVo.getProperty().equals("1")) {
+//            info.setCerType(1); // 个人
+//        } else {
+//            info.setCerType(2); // 法人
+//            info.setProvinceCode(customerInfoVo.getProvinceCode());
+//            info.setCityCode(customerInfoVo.getCityCode());
+//            info.setCountyCode(customerInfoVo.getCountyCode());
+//        }
+//        return info;
+//    }
 
     @Override
     public List<InsOrdersCarUserInfo> getByOrderId(String orderId) {

+ 23 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.jzg.commons.constants.CompanyConstants;
 import com.jzg.commons.constants.InsuranceRisk;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.core.base.StateResult;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.InsOrdersParam;
 import com.jzg.commons.entity.dto.InsTaskImagesAdd;
@@ -37,6 +38,7 @@ import com.jzg.quotation.commons.entity.vo.orders.InsOrdersVo;
 import com.jzg.quotation.commons.utils.SnowFlakeUtil;
 import com.jzg.quotation.summary.mapper.InsOrdersMapper;
 import com.jzg.quotation.summary.service.*;
+import com.jzg.quotation.summary.state.listener.OrderStateListener;
 import lombok.RequiredArgsConstructor;
 import org.apache.commons.beanutils.BeanUtils;
 import org.springframework.stereotype.Service;
@@ -77,6 +79,8 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
     private final InsOrdersMapper insOrdersMapper;
 
+    private final OrderStateListener orderStateListener;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -379,6 +383,21 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         InsOrders insOrders = insOrdersMapper.selectOne(new LambdaQueryWrapper<InsOrders>().eq(InsOrders::getId,ordersNo));
         AssertionUtils.isFail(Objects.isNull(insOrders),"订单不存在");
 
+        if(!quoteResponse.isQuoteStatus()) {
+            StateResult stateResult = orderStateListener.quoteFail(insOrders.getOrderStatus());
+            AssertionUtils.isFail(!stateResult.isResult(),"订单状态异常");
+            if(stateResult.isResult()){
+                insOrders.setOrderStatus(String.valueOf(stateResult.getCurrentState()));
+            }
+        }else{
+            StateResult stateResult = orderStateListener.quoteSuccess(insOrders.getOrderStatus());
+            AssertionUtils.isFail(!stateResult.isResult(),"订单状态异常");
+            if(stateResult.isResult()){
+                insOrders.setOrderStatus(String.valueOf(stateResult.getCurrentState()));
+            }
+        }
+        baseMapper.updateById(insOrders);
+
         // 更新起保终保时间
         List<InsOrdersRisk> insOrdersRiskList = insOrdersRiskService.list(new LambdaQueryWrapper<InsOrdersRisk>().eq(InsOrdersRisk::getOrderNo, ordersNo));
         if(Objects.nonNull(insOrdersRiskList) && !insOrdersRiskList.isEmpty()){
@@ -442,6 +461,7 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
 
         Integer status = underwritingResultsVo.getUnderwritingStatus().getStatus();
         insOrders.setOrderStatus(String.valueOf(status));
+
         insOrdersMapper.updateById(insOrders);
     }
 
@@ -472,11 +492,11 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
         // 保存订单用户信息
         List<InsOrdersCarUserInfo> insOrdersCarUserInfoList = new ArrayList<>();
         // 添加车主信息
-        insOrdersCarUserInfoList.add(ordersCarUserInfoService.createUserInfo(insOrders.getId(), quoteVo.getOwnersInfo(), formatter,1));
+        insOrdersCarUserInfoList.add(new InsOrdersCarUserInfo(quoteVo.getOwnersInfo(), insOrders.getId(),1));
         // 添加投保人信息
-        insOrdersCarUserInfoList.add(ordersCarUserInfoService.createUserInfo(insOrders.getId(), quoteVo.getPolicyHolderInfo(), formatter,2));
+        insOrdersCarUserInfoList.add(new InsOrdersCarUserInfo(quoteVo.getPolicyHolderInfo(), insOrders.getId(),2));
         // 添加被保险人信息
-        insOrdersCarUserInfoList.add(ordersCarUserInfoService.createUserInfo(insOrders.getId(), quoteVo.getInsuredPersonInfo(), formatter,3));
+        insOrdersCarUserInfoList.add(new InsOrdersCarUserInfo(quoteVo.getInsuredPersonInfo(), insOrders.getId(),3));
         ordersCarUserInfoService.saveBatch(insOrdersCarUserInfoList);
 
         // 保存订单费用信息 ins_orders_costs

+ 64 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/OrderState.java

@@ -0,0 +1,64 @@
+package com.jzg.quotation.summary.state;
+
+/**
+ * @author quchen
+ * @date 2025/2/26 10:19
+ */
+
+public class OrderState {
+
+    public enum OrderStateEnum {
+        // 订单已提交
+        QUOTE_ING(0),
+        // 待核保
+        WAIT_AUDIT(1),
+        // 核保中
+        AUDIT_ING(2),
+        // 人工处理
+        STAFF_PROCESS(3),
+        PAY_PENDING(4),
+        UNDERWRITED(5),
+        QUOTE_FAIL(6),
+        AUDIT_FAIL(7),
+        ORDER_CLOSE(8);
+
+
+        private final int value;
+
+        OrderStateEnum(int value) {
+            this.value = value;
+        }
+
+        public int getValue() {
+            return value;
+        }
+
+        public static OrderStateEnum fromValue(int value) {
+            for (OrderStateEnum costStateEnum : OrderStateEnum.values()) {
+                if (costStateEnum.getValue() == value) {
+                    return costStateEnum;
+                }
+            }
+            return null;
+        }
+    }
+
+    public enum OrderStateEvent {
+        //报价失败事件
+        QUOTE_FAIL_EVENT,
+        //人工处理事件
+        STAFF_PROCESS_EVENT,
+        // 核保中事件
+        AUDIT_ING_EVENT,
+        // 核保成功事件 待缴费
+        PAY_PENDING_EVENT,
+        // 核保失败事件
+        AUDIT_FAILED_EVENT,
+        // 待核保事件
+        AUDIT_WAIT_EVENT,
+        // 已承保
+        UNDERWRITED_EVENT,
+        // 订单关闭
+        ORDER_CLOSE_EVENT;
+    }
+}

+ 58 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/config/OrderStateConfig.java

@@ -0,0 +1,58 @@
+package com.jzg.quotation.summary.state.config;
+
+import com.jzg.quotation.summary.state.OrderState;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.statemachine.StateMachine;
+import org.springframework.statemachine.config.StateMachineBuilder;
+import org.springframework.statemachine.config.StateMachineConfigurerAdapter;
+
+import java.util.EnumSet;
+
+/**
+ * @date 2025/2/26 10:30
+ */
+
+@Configuration
+public class OrderStateConfig extends StateMachineConfigurerAdapter<OrderState.OrderStateEnum, OrderState.OrderStateEvent> {
+
+    @Bean(name = "orderStateMachine")
+    public StateMachine<OrderState.OrderStateEnum, OrderState.OrderStateEvent> costStateMachine() throws Exception {
+        StateMachineBuilder.Builder<OrderState.OrderStateEnum, OrderState.OrderStateEvent> builder = StateMachineBuilder.builder();
+        builder.configureStates()
+                .withStates()
+                .initial(OrderState.OrderStateEnum.QUOTE_ING)
+                .states(EnumSet.allOf(OrderState.OrderStateEnum.class));
+        builder.configureTransitions()
+                .withExternal()
+                // 订单已提交 -> 待核保    报价成功
+                .source(OrderState.OrderStateEnum.QUOTE_ING).target(OrderState.OrderStateEnum.WAIT_AUDIT).event(OrderState.OrderStateEvent.AUDIT_WAIT_EVENT)
+                .and()
+                .withExternal()
+                // 订单已提交 -> 报价失败
+                .source(OrderState.OrderStateEnum.QUOTE_ING).target(OrderState.OrderStateEnum.QUOTE_FAIL).event(OrderState.OrderStateEvent.QUOTE_FAIL_EVENT)
+                .and()
+                .withExternal()
+                // 待核保 -> 核保中
+                .source(OrderState.OrderStateEnum.WAIT_AUDIT).target(OrderState.OrderStateEnum.AUDIT_ING).event(OrderState.OrderStateEvent.AUDIT_ING_EVENT)
+                .and()
+                .withExternal()
+                // 核保中 -> 待缴费  核保成功
+                .source(OrderState.OrderStateEnum.AUDIT_ING).target(OrderState.OrderStateEnum.PAY_PENDING).event(OrderState.OrderStateEvent.PAY_PENDING_EVENT)
+                .and()
+                .withExternal()
+                // 核保中 -> 人工处理
+                .source(OrderState.OrderStateEnum.AUDIT_ING).target(OrderState.OrderStateEnum.STAFF_PROCESS).event(OrderState.OrderStateEvent.STAFF_PROCESS_EVENT)
+                .and()
+                .withExternal()
+                // 核保中 -> 核保失败
+                .source(OrderState.OrderStateEnum.AUDIT_ING).target(OrderState.OrderStateEnum.AUDIT_FAIL).event(OrderState.OrderStateEvent.AUDIT_FAILED_EVENT)
+                .and()
+                .withExternal()
+                // 待缴费 -> 已承保
+                .source(OrderState.OrderStateEnum.PAY_PENDING).target(OrderState.OrderStateEnum.UNDERWRITED).event(OrderState.OrderStateEvent.UNDERWRITED_EVENT);
+
+        return builder.build();
+    }
+
+}

+ 156 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/state/listener/OrderStateListener.java

@@ -0,0 +1,156 @@
+package com.jzg.quotation.summary.state.listener;
+
+import com.jzg.commons.core.base.StateResult;
+import com.jzg.commons.entity.po.PtlAgreementCostExternal;
+import com.jzg.quotation.summary.state.OrderState;
+import jakarta.annotation.Resource;
+import org.springframework.messaging.Message;
+import org.springframework.messaging.support.MessageBuilder;
+import org.springframework.statemachine.StateMachine;
+import org.springframework.statemachine.StateMachineEventResult;
+import org.springframework.statemachine.support.DefaultStateMachineContext;
+import org.springframework.stereotype.Component;
+import reactor.core.publisher.Flux;
+import reactor.core.publisher.Mono;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+/**
+ * @author quchen
+ * @date 2025/2/26 10:57
+ */
+
+@Component
+public class OrderStateListener {
+
+    @Resource
+    private StateMachine<OrderState.OrderStateEnum, OrderState.OrderStateEvent> costStateMachine;
+
+    private synchronized boolean sendEvent(Mono<Message<OrderState.OrderStateEvent>> message) {
+        AtomicBoolean result = new AtomicBoolean(false);
+        try {
+            costStateMachine.stop(); // 停止状态机
+            Message<OrderState.OrderStateEvent> block = message.block();
+            String orderStatus = (String) block.getHeaders().get("entity");
+            costStateMachine.getStateMachineAccessor().doWithAllRegions(accessor -> {
+                accessor.resetStateMachineReactively(new DefaultStateMachineContext<>(
+                        // 目标状态
+                        OrderState.OrderStateEnum.fromValue(Integer.parseInt(orderStatus)),
+                        null, // 当前事件(可以为 null)
+                        null, // 扩展上下文(可以为 null)
+                        null  // 转换历史(通常为 null)
+                )).block();
+            });
+            Mono<Void> startMono = costStateMachine.startReactively(); //启用状态机
+            startMono.block();
+
+            Flux<StateMachineEventResult<OrderState.OrderStateEnum, OrderState.OrderStateEvent>> stateMachineEventResultFlux = costStateMachine.sendEvent(message);
+            StateMachineEventResult<OrderState.OrderStateEnum, OrderState.OrderStateEvent> eventResult = stateMachineEventResultFlux.blockFirst();
+
+            if (eventResult != null && eventResult.getResultType() == StateMachineEventResult.ResultType.ACCEPTED) {
+                result.set(true);
+            }
+        } catch (Exception e) {
+
+        } finally {
+            costStateMachine.stopReactively();
+            return result.get();
+        }
+    }
+
+    private synchronized boolean sendCostExternalEvent(Mono<Message<OrderState.OrderStateEvent>> message) {
+        AtomicBoolean result = new AtomicBoolean(false);
+        try {
+            costStateMachine.stop(); // 停止状态机
+            Message<OrderState.OrderStateEvent> block = message.block();
+            PtlAgreementCostExternal ptlAgreementCostExternal = (PtlAgreementCostExternal) block.getHeaders().get("entity");
+            costStateMachine.getStateMachineAccessor().doWithAllRegions(accessor -> {
+                accessor.resetStateMachineReactively(new DefaultStateMachineContext<>(
+                        OrderState.OrderStateEnum.fromValue(ptlAgreementCostExternal.getAuditStatus()), // 目标状态
+                        null, // 当前事件(可以为 null)
+                        null, // 扩展上下文(可以为 null)
+                        null  // 转换历史(通常为 null)
+                )).block();
+            });
+            Mono<Void> startMono = costStateMachine.startReactively(); //启用状态机
+            startMono.block();
+
+            Flux<StateMachineEventResult<OrderState.OrderStateEnum, OrderState.OrderStateEvent>> stateMachineEventResultFlux = costStateMachine.sendEvent(message);
+            StateMachineEventResult<OrderState.OrderStateEnum, OrderState.OrderStateEvent> eventResult = stateMachineEventResultFlux.blockFirst();
+
+            if (eventResult != null && eventResult.getResultType() == StateMachineEventResult.ResultType.ACCEPTED) {
+                result.set(true);
+            }
+        } catch (Exception e) {
+
+        } finally {
+            costStateMachine.stopReactively();
+            return result.get();
+        }
+    }
+
+    private StateResult callEvent(String orderStatus, OrderState.OrderStateEvent event) {
+        StateResult stateResult = new StateResult();
+        Mono<Message<OrderState.OrderStateEvent>> message = Mono.just(MessageBuilder.withPayload(event).setHeader("entity",orderStatus).build());
+        stateResult.setResult(sendEvent(message));
+        stateResult.setCurrentState(costStateMachine.getState().getId().getValue());
+        return stateResult;
+    }
+
+    /**
+     * 报价失败
+     * @param cureentStatus
+     * @return
+     */
+    public StateResult quoteFail(String cureentStatus) {
+        return callEvent(cureentStatus, OrderState.OrderStateEvent.QUOTE_FAIL_EVENT);
+    }
+
+    /**
+     * 报价成功
+     * @param currentStatus
+     * @return
+     */
+    public StateResult quoteSuccess(String currentStatus) {
+        return callEvent(currentStatus, OrderState.OrderStateEvent.AUDIT_ING_EVENT);
+    }
+
+    /**
+     * 人工处理
+     * @param currentStatus
+     * @return
+     */
+    public StateResult staffProcess(String currentStatus) {
+        return callEvent(currentStatus, OrderState.OrderStateEvent.STAFF_PROCESS_EVENT);
+    }
+
+    /**
+     * 核保成功
+     * @param currentStatus
+     * @return
+     */
+    public StateResult auditSuccess(String currentStatus){
+        return callEvent(currentStatus, OrderState.OrderStateEvent.PAY_PENDING_EVENT);
+    }
+
+    /**
+     * 核保失败
+     * @param currentStatus
+     * @return
+     */
+    public StateResult auditFail(String currentStatus){
+        return callEvent(currentStatus, OrderState.OrderStateEvent.AUDIT_FAILED_EVENT);
+    }
+
+    /**
+     * 已承保
+     * @param currentStatus
+     * @return
+     */
+    public StateResult underwrited(String currentStatus){
+        return callEvent(currentStatus, OrderState.OrderStateEvent.UNDERWRITED_EVENT);
+    }
+
+
+}
+

+ 7 - 2
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/entity/request/AuditRequest.java

@@ -18,6 +18,7 @@ import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
+import org.checkerframework.checker.units.qual.A;
 
 
 import java.util.Objects;
@@ -44,7 +45,7 @@ public class AuditRequest {
         private AuthorityDataXml authorityData;
 
         @JacksonXmlProperty(isAttribute = false, localName = "condition")
-        private Condition condition;
+        private Condition condition = new Condition();
     }
 
     @Data
@@ -256,7 +257,7 @@ public class AuditRequest {
          * 客户信息 customer
          */
         @JacksonXmlProperty(isAttribute = false, localName = "customer")
-        private Customer customer;
+        private Customer customer = new Customer();
 
 
         @Data
@@ -363,6 +364,10 @@ public class AuditRequest {
                 condition.setSyFlag("1");
             }
         });
+        condition.setCProdNoSY(condition.getSyFlag().equals("1") ? "0364" : "");
+        condition.setCProdNoJQ(condition.getJqFlag().equals("1") ? "0326" : "");
+        condition.setQuerySequenceNoSy(underwritingVo.getPolicy().getSyApplyNo());
+        condition.setQuerySequenceNoJq(underwritingVo.getPolicy().getJqApplyNo());
         condition.setCommissionPercentage("0");
         condition.setPaymode("002018");
         condition.setNgo("");

+ 2 - 2
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

@@ -152,7 +152,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
 
         //build参数
         List<String> requestInfoList = new ArrayList<>();
-        setUserAreaCode(quoteVo,orgClient);
+//        setUserAreaCode(quoteVo,orgClient);
 
         QuoteRequest quoteRequest = this.builderParams(configurationProperties, quoteVo, vehicleInfo, negotiatedPrice.toString());
         QuoteResponse quoteResponse = this.getResponse(quoteRequest,quoteVo, requestInfoList);
@@ -200,7 +200,7 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
                 if ("0".equals(statusJq) || "0".equals(statusSy)) {
                     //人工核保
                     underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
-                    underwritingResultsVo.setUnderwritingResult("人工核保");
+                    underwritingResultsVo.setUnderwritingResult("人工处理");
                 } else if ("3".equals(statusJq) || "3".equals(statusSy)) {
                     //核保退回
                     underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);