Selaa lähdekoodia

Merge remote-tracking branch 'origin/main'

lishiqiang 1 viikko sitten
vanhempi
commit
7b9964094f
17 muutettua tiedostoa jossa 254 lisäystä ja 98 poistoa
  1. 27 2
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/PolicyController.java
  2. 1 1
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyUsableReqVO.java
  3. 3 1
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policy/PolicyMapper.java
  4. 5 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policydetail/PolicyDetailMapper.java
  5. 7 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyService.java
  6. 17 1
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyServiceImpl.java
  7. 24 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuranceCancelReqDTO.java
  8. 24 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuranceOrderInfoCancelDTO.java
  9. 21 0
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuredCancelDTO.java
  10. 4 3
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/api/insurance/InsuranceApiImpl.java
  11. 3 3
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/insurance/InsuranceController.java
  12. 3 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/notify/NotifyController.java
  13. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceService.java
  14. 34 81
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceServiceImpl.java
  15. 11 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/notify/NotifyServiceImpl.java
  16. 67 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtil.java
  17. 2 1
      ship-server-web/src/main/resources/application.yaml

+ 27 - 2
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/PolicyController.java

@@ -114,9 +114,9 @@ public class PolicyController {
     }
 
     // 获取可以使用的营销政策
-    @GetMapping("/get-usable-policy")
+    @PostMapping("/get-usable-policy")
     @Operation(summary = "获取可以使用的营销政策")
-    public CommonResult<List<PolicyRespVO>> getUsablePolicy(@Validated PolicyUsableReqVO reqVO) {
+    public CommonResult<List<PolicyRespVO>> getUsablePolicy(@Validated @RequestBody PolicyUsableReqVO reqVO) {
         List<PolicyDO> list = policyService.getUsablePolicy(reqVO);
         List<PolicyRespVO> result = BeanUtils.toBean(list, PolicyRespVO.class);
         result.stream().forEach(policyRespVO -> {
@@ -138,6 +138,31 @@ public class PolicyController {
         return success(result);
     }
 
+    // 获取可以使用的营销政策
+    @GetMapping("/get-usable-policy-new")
+    @Operation(summary = "获取可以使用的营销政策")
+    public CommonResult<List<PolicyRespVO>> getUsablePolicyNew(Long voyageId) {
+        List<PolicyDO> list = policyService.getUsablePolicyByVoyageId(voyageId);
+        List<PolicyRespVO> result = BeanUtils.toBean(list, PolicyRespVO.class);
+        result.stream().forEach(policyRespVO -> {
+            List<Long> areaIds = policyRespVO.getAreaIds();
+            List<AreaCountryDTO> areaCountryDTOS = areaApi.getAreaCountryListByAreaIds(areaIds);
+            List<Integer> countryIds = CollectionUtils.convertList(areaCountryDTOS, AreaCountryDTO::getCountryId);
+            policyRespVO.setCountryIds(countryIds);
+        });
+        List<Long> policyIds = CollectionUtils.convertList(list, PolicyDO::getId);
+        List<PolicyDetailDO> policyDetails = policyDetailService.getByPolicyIds(policyIds);
+        Map<Long, List<PolicyDetailDO>> longListMap = CollectionUtils.convertMultiMap(policyDetails, PolicyDetailDO::getPolicyId);
+        result.stream().forEach(policyRespVO -> {
+            List<PolicyDetailDO> policyDetailDOList = longListMap.get(policyRespVO.getId());
+            List<Long> voyageIds = CollectionUtils.convertList(policyDetailDOList, PolicyDetailDO::getVoyageId);
+            policyRespVO.setVoyageIds(voyageIds);
+            List<Long> roomModelIds = CollectionUtils.convertList(policyDetailDOList, PolicyDetailDO::getRoomModelId);
+            policyRespVO.setRoomModelIds(roomModelIds);
+        });
+        return success(result);
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出营销政策 Excel")
     @PreAuthorize("@ss.hasPermission('marketing:policy:export')")

+ 1 - 1
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyUsableReqVO.java

@@ -22,5 +22,5 @@ public class PolicyUsableReqVO {
 
     @Schema(description = "国家ID", example = "7920")
     @NotEmpty(message = "国籍ID不能为空")
-    private List<Long> CountryIds;
+    private List<Long> countryIds;
 }

+ 3 - 1
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policy/PolicyMapper.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.marketing.dal.mysql.policy;
 
+import com.yc.ship.framework.common.enums.CommonStatusEnum;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
@@ -31,6 +32,7 @@ public interface PolicyMapper extends BaseMapperX<PolicyDO> {
         return selectList(new LambdaQueryWrapperX<PolicyDO>()
                 .inIfPresent(PolicyDO::getId, policyIds)
                 .ge(PolicyDO::getEffectiveTime, LocalDateTime.now())
-                .gt(PolicyDO::getSurplusNum, BigDecimal.ZERO));
+                .gt(PolicyDO::getSurplusNum, BigDecimal.ZERO)
+                .eq(PolicyDO::getStatus, CommonStatusEnum.ENABLE.getStatus()));
     }
 }

+ 5 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policydetail/PolicyDetailMapper.java

@@ -8,6 +8,7 @@ import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
 import com.yc.ship.module.marketing.controller.admin.policy.vo.PolicyUsableReqVO;
 import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import org.apache.ibatis.annotations.Mapper;
 import com.yc.ship.module.marketing.controller.admin.policydetail.vo.*;
 
@@ -48,4 +49,8 @@ public interface PolicyDetailMapper extends BaseMapperX<PolicyDetailDO> {
     default List<PolicyDetailDO> selectByPolicyIds(List<Long> policyIds) {
         return selectList(new LambdaQueryWrapperX<PolicyDetailDO>().in(PolicyDetailDO::getPolicyId, policyIds));
     }
+
+    default List<PolicyDetailDO> selectListByVoyageId(Long voyageId) {
+        return selectList(new LambdaQueryWrapperX<PolicyDetailDO>().eq(PolicyDetailDO::getVoyageId, voyageId));
+    }
 }

+ 7 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyService.java

@@ -58,4 +58,11 @@ public interface PolicyService {
      * @return
      */
     List<PolicyDO> getUsablePolicy(PolicyUsableReqVO reqVO);
+
+    /**
+     * 根据航次ID获取可以使用的营销政策
+     * @param voyageId
+     * @return
+     */
+    List<PolicyDO> getUsablePolicyByVoyageId(Long voyageId);
 }

+ 17 - 1
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyServiceImpl.java

@@ -128,7 +128,23 @@ public class PolicyServiceImpl implements PolicyService {
         List<PolicyDO> policyList = policyMapper.selectList(policyIds);
         List<PolicyDO> result = policyList.stream().filter(policyDO -> {
             LocalDateTime boardingTime = voyage.getBoardingTime();
-            return boardingTime.plusDays(policyDO.getEarlyDays() * -1L).compareTo(LocalDateTime.now()) < 0;
+            return boardingTime.plusDays(policyDO.getEarlyDays() * -1L).compareTo(LocalDateTime.now()) > 0;
+        }).collect(Collectors.toList());
+        return result;
+    }
+
+    @Override
+    public List<PolicyDO> getUsablePolicyByVoyageId(Long voyageId) {
+        VoyageDO voyage = voyageService.getVoyage(voyageId);
+        List<PolicyDetailDO> policyDetails = policyDetailMapper.selectListByVoyageId(voyageId);
+        List<Long> policyIds = CollectionUtils.convertList(policyDetails, PolicyDetailDO::getPolicyId);
+        if(CollectionUtils.isAnyEmpty(policyIds)) {
+            return Collections.emptyList();
+        }
+        List<PolicyDO> policyList = policyMapper.selectList(policyIds);
+        List<PolicyDO> result = policyList.stream().filter(policyDO -> {
+            LocalDateTime boardingTime = voyage.getBoardingTime();
+            return boardingTime.plusDays(policyDO.getEarlyDays() * -1L).compareTo(LocalDateTime.now()) > 0;
         }).collect(Collectors.toList());
         return result;
     }

+ 24 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuranceCancelReqDTO.java

@@ -0,0 +1,24 @@
+package com.yc.ship.module.trade.api.insurance.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.List;
+
+@Schema(description = "RPC 服务 - Insurance 退保 Request DTO")
+@Data
+public class InsuranceCancelReqDTO {
+
+    /** 服务类型 */
+    private String service;
+
+    /** 回调URL */
+    private String replyUrl;
+
+    /** 订单信息 */
+    private InsuranceOrderInfoCancelDTO order;
+
+    /** 被保险人信息列表 */
+    private List<InsuredCancelDTO> insureds;
+
+}

+ 24 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuranceOrderInfoCancelDTO.java

@@ -0,0 +1,24 @@
+package com.yc.ship.module.trade.api.insurance.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+@Schema(description = "RPC 服务 - Insurance 投保订单信息 Request DTO")
+@Data
+public class InsuranceOrderInfoCancelDTO {
+
+    /** 必填 - 字符串 - 贵方的订单号 */
+    @Schema(description = "贵方的订单号")
+    @NotBlank
+    private String externalOrderNo;
+    /** 必填 - 字符串 - 起保日期时间 yyyy-MM-dd */
+    @Schema(description = "开始日期")
+    private String beginDate;
+
+    /** 必填 - 字符串 - 止保日期时间 yyyy-MM-dd */
+    @Schema(description = "结束日期")
+    private String endDate;
+
+}

+ 21 - 0
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/api/insurance/dto/InsuredCancelDTO.java

@@ -0,0 +1,21 @@
+package com.yc.ship.module.trade.api.insurance.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "RPC 服务 - Insurance 退保时的被保人 Request DTO")
+@Data
+public class InsuredCancelDTO {
+    /**
+     *        //必填 - 贵方系统中的投保单号,此处值需与投保时的值相同
+     *   	  //个保时,需与投保请求中insureds[i].externalPolicyNumber相同
+     *   	  //团保时,需与投保请求中order.externalPolicyNumber相同
+     */
+    @Schema(description = "贵方系统中的投保单号,此处值需与投保时的值相同")
+    private String externalPolicyNumber;
+
+    /**
+     *  //必填 - 保单号
+     */
+   private String policyNum;
+}

+ 4 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/api/insurance/InsuranceApiImpl.java

@@ -11,7 +11,6 @@ import javax.annotation.Resource;
 import java.util.List;
 
 /**
- * @author le'yang
  */
 @RestController
 @Validated
@@ -29,7 +28,9 @@ public class InsuranceApiImpl implements InsuranceApi {
 
     @Override
     public CommonResult<Boolean> cancelInsurance(List<Long> ticketIdList) {
-        insuranceService.applyCancelInsurance(ticketIdList);
-        return CommonResult.success(true);
+        // TODO: 待实现
+//        insuranceService.applyCancelInsurance(ticketIdList);
+//        return CommonResult.success(true);
+        return null;
     }
 }

+ 3 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/insurance/InsuranceController.java

@@ -88,12 +88,12 @@ public class InsuranceController {
     }
 
 
-    @PostMapping("/cancel")
+    @PutMapping("/cancel")
     @Operation(summary = "退保")
     @OperateLog(type = API)
     @PreAuthorize("@ss.hasPermission('trade:insurance:apply')")
-    public CommonResult<Boolean>  cancelInsurance(@RequestBody List<Long> ticketIdList){
-        insuranceService.applyCancelInsurance(ticketIdList);
+    public CommonResult<Boolean>  cancelInsurance(@RequestParam("orderId") Long orderId){
+        insuranceService.applyCancelInsurance(orderId);
         return success(true);
     }
 }

+ 3 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/notify/NotifyController.java

@@ -25,8 +25,9 @@ public class NotifyController {
     private NotifyService notifyService;
 
     @PostMapping("/insurance")
-    public Boolean insuranceNotify(@RequestBody NotifyInsuranceReqVO reqVO) {
+    public String insuranceNotify(@RequestBody NotifyInsuranceReqVO reqVO) {
         log.info("收到保险通知:{}", JSONObject.toJSONString(reqVO));
-        return notifyService.notifyInsurance(reqVO);
+        notifyService.notifyInsurance(reqVO);
+        return "SUCCESS";
     }
 }

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceService.java

@@ -54,7 +54,7 @@ public interface InsuranceService {
     /**
      * 取消投保
      */
-    void applyCancelInsurance(List<Long> insuranceIdList);
+    void applyCancelInsurance(Long orderId);
 
     /**
      * 查询电子保单

+ 34 - 81
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceServiceImpl.java

@@ -16,9 +16,7 @@ import com.yc.ship.framework.mybatis.core.util.MyBatisUtils;
 import com.yc.ship.module.infra.api.config.ConfigApi;
 import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
 import com.yc.ship.module.product.service.voyage.VoyageService;
-import com.yc.ship.module.trade.api.insurance.dto.InsuranceApplyReqDTO;
-import com.yc.ship.module.trade.api.insurance.dto.InsuranceOrderInfoDTO;
-import com.yc.ship.module.trade.api.insurance.dto.InsuredDTO;
+import com.yc.ship.module.trade.api.insurance.dto.*;
 import com.yc.ship.module.trade.controller.admin.insurance.vo.InsuranceData;
 import com.yc.ship.module.trade.controller.admin.insurance.vo.InsurancePageReqVO;
 import com.yc.ship.module.trade.controller.admin.insurance.vo.InsuranceRespVO;
@@ -183,7 +181,6 @@ public class InsuranceServiceImpl implements InsuranceService {
         // 开始投保
         CommonResult commonResult = insuranceUtil.sendInsuranceApply(insuranceApplyReqDTO);
         if(!commonResult.isSuccess()) {
-            Object checkedData = commonResult.getCheckedData();
             throw exception0(commonResult.getCode(),commonResult.getMsg());
         }
         //保存投保信息
@@ -229,89 +226,45 @@ public class InsuranceServiceImpl implements InsuranceService {
     /**
      * 退保
      *
-     * @param orderIdList
+     * @param orderId
      */
     @Override
     @Transactional
-    public void applyCancelInsurance(List<Long> orderIdList) {
-        try {
-            List<InsuranceDO> insuranceList = this.getInsuranceByOrder(orderIdList);
-            if (CollUtil.isNotEmpty(insuranceList)) {
-                for (InsuranceDO insuranceDB : insuranceList) {
-
-                    JSONObject head = this.getCommonHead(insuranceDB.getRationType(), insuranceDB.getRiskCode(), "SURRENDER");
-                    JSONObject cancelInsurance = new JSONObject();
-                    //订单号
-                    cancelInsurance.set("orderNo", insuranceDB.getInsuranceNo());
-                    //要进行注销的保单号
-                    cancelInsurance.set("policyNo", insuranceDB.getPolicyNo());
-                    //渠道标识
-                    cancelInsurance.set("sysFlag", configApi.getConfigValueByKey("insurance.sysflag"));
-                    //交易码
-                    cancelInsurance.set("taCode", configApi.getConfigValueByKey("insurance.taCode"));
-                    //保单退保时间
-                    cancelInsurance.set("surrenderTime", System.currentTimeMillis() + "");
-                    cancelInsurance.set("centerFlag", "JDX");
-                    List<JSONObject> writeOffPolicys = new ArrayList<>();
-                    writeOffPolicys.add(cancelInsurance);
-
-                    JSONObject request = new JSONObject();
-                    request.set("head", head);
-                    request.set("writeOffPolicys", writeOffPolicys);
-
-                    JSONObject insuranceRequest = new JSONObject();
-                    insuranceRequest.set("appKey", configApi.getConfigValueByKey("insurance.appKey"));
-                    insuranceRequest.set("timestamp", System.currentTimeMillis() + "");
-                    insuranceRequest.set("serviceName", "writeOff");
-                    insuranceRequest.set("version", configApi.getConfigValueByKey("insurance.version"));
-                    insuranceRequest.set("encryptType", ENCRYPT_TYPE);
-                    insuranceRequest.set("bizContent", JSONUtil.toJsonStr(request));
-                    String publicKey = configApi.getConfigValueByKey("insurance.publicKey");
-                    String privateKey = configApi.getConfigValueByKey("insurance.privateKey");
-                    //加密加签
-                    InsuranceRequestHelper.encryptAndSign(insuranceRequest, publicKey, privateKey);
-                    String url = configApi.getConfigValueByKey("insurance.url");
-
-                    RLock lock = redissonClient.getLock(INSURANCE_CANCEL_KEY + insuranceDB.getOrderId());
-                    try {
-                        if (lock.tryLock(10, 30, TimeUnit.SECONDS)) {
-                            log.error("保险开具申请 data=" + JSONUtil.toJsonStr(insuranceRequest));
-                            String result = HttpUtil.createPost(url + "/writeOff").contentType("application/json").body(JSONUtil.toJsonStr(insuranceRequest)).timeout(15000).execute().body();
-                            log.error("保险开具申请 result=" + result);
-                            JSONObject insuranceResponse = JSONUtil.parseObj(result);
-                            InsuranceRequestHelper.checkSignAndDecrypt(insuranceResponse, publicKey, privateKey);
-                            // 0:失败 1:成功
-                            if (insuranceResponse != null && "200".equals(insuranceResponse.get("code"))) {
-                                String data = insuranceResponse.get("data").toString();
-                                if (data != null) {
-                                    InsuranceData insuranceData = JSONUtil.toBean(data, InsuranceData.class);
-
-                                    if (insuranceData != null && "SUCCESS".equalsIgnoreCase(insuranceData.getHccResults().get(0).getCode())) {
-                                        insuranceDB.setInsuranceStatus(InsuranceStatusEnum.CANCELLED.getValue());
-                                        insuranceMapper.updateById(insuranceDB);
-                                    }
-                                }
-                            }
+    public void applyCancelInsurance(Long orderId) {
+        TradeOrderRespVO orderInfo = tradeOrderMapper.getOrderInfo(orderId);
+        VoyageDO voyage = voyageService.getVoyage(orderInfo.getVoyageId());
 
-                        } else {
-                            log.error("保险取消异常:未获取到锁" );
-                            throw exception(INSURE_CANCEL_FAILED);
-                        }
-                    } catch (Exception e) {
-                        log.error("保险取消异常,:", e);
-                        throw exception(INSURE_CANCEL_FAILED);
-                    } finally {
-                        if (lock.isLocked() && lock.isHeldByCurrentThread()) {
-                            lock.unlock();
-                        }
-                    }
+        //获取投保记录,投保保单号
+        InsuranceDO insuranceDO = insuranceMapper.selectByOrderId(orderId);
 
-                }
-            }
+        InsuranceCancelReqDTO insuranceCancelReqDTO = new InsuranceCancelReqDTO();
+        insuranceCancelReqDTO.setService("cancel");
+        insuranceCancelReqDTO.setReplyUrl(notifyUrl);
 
-        } catch (Exception e) {
-            e.printStackTrace();
-            throw exception(INSURE_CANCEL_FAILED);
+        //订单对象, 一个订单下可以有一批被保险人
+        InsuranceOrderInfoCancelDTO insuranceOrderInfoDTO = new InsuranceOrderInfoCancelDTO();
+
+        insuranceOrderInfoDTO.setExternalOrderNo(orderInfo.getOrderNo());
+        insuranceOrderInfoDTO.setBeginDate(DateUtil.format(voyage.getBoardingTime(), "yyyy-MM-dd"));
+        insuranceOrderInfoDTO.setEndDate(DateUtil.format(voyage.getLeaveTime(), "yyyy-MM-dd"));
+        insuranceCancelReqDTO.setOrder(insuranceOrderInfoDTO);
+
+        List<InsuredCancelDTO> insuredList = new ArrayList<>();
+        InsuredCancelDTO insuredDTO = new InsuredCancelDTO();
+        insuredDTO.setExternalPolicyNumber(orderInfo.getId().toString());
+        insuredDTO.setExternalPolicyNumber(insuranceDO.getInsuranceNo());
+        insuredList.add(insuredDTO);
+        insuranceCancelReqDTO.setInsureds(insuredList);
+
+        //验证投保信息
+//        CommonResult commonResult = insuranceUtil.validateInsuranceRequest(insuranceApplyReqDTO);
+//        if(!commonResult.isSuccess()) {
+//            throw exception0(commonResult.getCode(),commonResult.getMsg());
+//        }
+        // 开始投保
+        CommonResult commonResult = insuranceUtil.sendInsuranceCancel(insuranceCancelReqDTO);
+        if(!commonResult.isSuccess()) {
+            throw exception0(commonResult.getCode(),commonResult.getMsg());
         }
     }
 

+ 11 - 2
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/notify/NotifyServiceImpl.java

@@ -1,6 +1,7 @@
 package com.yc.ship.module.trade.service.notify;
 
 import cn.hutool.core.date.LocalDateTimeUtil;
+import com.yc.ship.framework.common.util.date.DateUtils;
 import com.yc.ship.module.trade.controller.admin.notify.vo.NotifyInsuranceReqVO;
 import com.yc.ship.module.trade.dal.dataobject.insurance.InsuranceDO;
 import com.yc.ship.module.trade.dal.mysql.insurance.InsuranceMapper;
@@ -8,6 +9,8 @@ import com.yc.ship.module.trade.enums.InsuranceStatusEnum;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
 
 /**
  * 第三方调用通知的具体处理业务
@@ -25,12 +28,18 @@ public class NotifyServiceImpl implements NotifyService {
         String downloadUrl = reqVO.getDownloadUrl();
         String successDate = reqVO.getSuccessDate();
         Long orderId = Long.valueOf(externalPolicyNumber);
+        String service = reqVO.getService();
         if("SUCCESS".equals(status)) {
             InsuranceDO insuranceDO = insuranceMapper.selectByOrderId(orderId);
             insuranceDO.setPolicyNo(policyNo);
             insuranceDO.setElectronicPolicy(downloadUrl);
-            insuranceDO.setInsuranceStatus(InsuranceStatusEnum.SUCCESS.getValue());
-            insuranceDO.setInsuranceEffectDate(LocalDateTimeUtil.parse(successDate));
+            if("applyTeam".equals(service)) {
+                insuranceDO.setInsuranceStatus(InsuranceStatusEnum.SUCCESS.getValue());
+            }else if ("cancel".equals(service)) {
+                insuranceDO.setInsuranceStatus(InsuranceStatusEnum.CANCELLED.getValue());
+            }
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+            insuranceDO.setInsuranceEffectDate(LocalDateTime.parse(successDate,formatter));
             insuranceMapper.updateById(insuranceDO);
         }
         return true;

+ 67 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtil.java

@@ -3,6 +3,7 @@ package com.yc.ship.module.trade.utils;
 import com.alibaba.fastjson.JSONObject;
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.module.trade.api.insurance.dto.InsuranceApplyReqDTO;
+import com.yc.ship.module.trade.api.insurance.dto.InsuranceCancelReqDTO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.*;
 import org.springframework.stereotype.Component;
@@ -187,4 +188,70 @@ public class InsuranceUtil {
             throw exception0(500,"发送校验请求失败: " + e.getMessage(), e);
         }
     }
+
+    /**
+     * 发送退保请求
+     * 将退保请求发送到阳光系统
+     * @param request 退保请求
+     * @return 退保响应
+     */
+    public CommonResult sendInsuranceCancel(InsuranceCancelReqDTO request) {
+        try {
+            String reqJson = JSONObject.toJSONString(request);
+            String sign = SignUtil.generateMD5Sign(APPID, reqJson, KEY);
+
+            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+            params.add("appId", APPID);
+            params.add("req", reqJson);
+            params.add("sign", sign);
+
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
+
+            HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(params, headers);
+
+            log.info("发送退保请求到阳光系统: {}", HOST + RECEIVE_URL);
+            log.info("请求参数: appId={}, req={}, sign={}", APPID, reqJson, sign);
+
+            // 发送请求并获取响应
+            ResponseEntity<byte[]> response = restTemplate.exchange(
+                    HOST + RECEIVE_URL,
+                    HttpMethod.POST,
+                    entity,
+                    byte[].class
+            );
+
+            log.info("阳光系统响应状态码: {}", response.getStatusCode());
+
+            // 手动处理响应字节流,确保使用UTF-8编码
+            byte[] responseBytes = response.getBody();
+            String responseBody = null;
+            if (responseBytes != null) {
+                try {
+                    responseBody = new String(responseBytes, "UTF-8");
+                } catch (UnsupportedEncodingException e) {
+                    log.error("解析响应内容编码失败", e);
+                    responseBody = new String(responseBytes);
+                }
+            }
+
+            log.info("阳光系统响应内容: {}", responseBody);
+            JSONObject responseBodyJson = JSONObject.parseObject(responseBody);
+
+            if (response.getStatusCode() == HttpStatus.OK) {
+                String status = responseBodyJson.getString("status");
+                if("FAIL".equals(status)) {
+                    return CommonResult.error(500, "阳光系统退保返回错误: " + response.getStatusCode() + responseBody);
+                }else {
+                    return CommonResult.success(responseBody);
+                }
+            } else {
+                return CommonResult.error(500, "阳光系统退保返回错误: " + response.getStatusCode() + responseBody);
+            }
+
+        } catch (Exception e) {
+            log.error("发送退保请求失败", e);
+            return CommonResult.error(500,"发送退保请求失败: " + e.getMessage());
+        }
+    }
 }

+ 2 - 1
ship-server-web/src/main/resources/application.yaml

@@ -294,7 +294,7 @@ yudao:
       - /travl-app-api/trade/deposiPayNotify
       - /travl-app-api/trade/refundNotify
       - /travl-app-api/system/sms/callback/aliyun
-      - /${yudao.web.admin-url}/notify/** # 统一消息服务,接收消息的接口,不需要登录
+      - /${yudao.web.admin-url}/notify/* # 统一消息服务,接收消息的接口,不需要登录
     ignore-visit-urls:
       - /admin-api/system/user/profile/**
     ignore-tables:
@@ -323,6 +323,7 @@ yudao:
       - trade_order_jz
       - ota_distributor_region
       - ota_region
+      - trade_insurance
     ignore-caches:
       - user_role_ids
       - permission_menu_ids