Prechádzať zdrojové kódy

feat: 添加个保投保

luofeiyun 4 dní pred
rodič
commit
15b39fe386
21 zmenil súbory, kde vykonal 558 pridanie a 21 odobranie
  1. 5 4
      ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/InsuranceStatusEnum.java
  2. 10 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/insurance/InsuranceController.java
  3. 69 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/TradeVisitorController.java
  4. 32 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/vo/VisitorPageReqVO.java
  5. 92 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/vo/VisitorRespVO.java
  6. 5 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/insurance/InsuranceDO.java
  7. 3 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeVisitorDO.java
  8. 14 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/insurance/InsuranceMapper.java
  9. 5 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java
  10. 21 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeVisitorMapper.java
  11. 9 8
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/InsuranceApplyJob.java
  12. 1 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/InsuranceJob.java
  13. 7 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceService.java
  14. 127 4
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceServiceImpl.java
  15. 7 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/notify/NotifyServiceImpl.java
  16. 4 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderService.java
  17. 16 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeVisitorService.java
  18. 13 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java
  19. 35 0
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeVisitorServiceImpl.java
  20. 59 1
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtilBak.java
  21. 24 0
      ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeVisitorMapper.xml

+ 5 - 4
ship-module-trade/ship-module-trade-api/src/main/java/com/yc/ship/module/trade/enums/InsuranceStatusEnum.java

@@ -9,10 +9,11 @@ import java.util.Arrays;
 @Getter
 public enum InsuranceStatusEnum implements ArrayValuable<Integer> {
 
-    INSURE(0, "投保中"),
-    SUCCESS(1, "成功"),
-    FAIL(2, "失败"),
-    CANCELLED(3, "已退保");
+    NOT_INSURE(0, "未投保"),
+    INSURE(1, "投保中"),
+    SUCCESS(2, "成功"),
+    FAIL(3, "失败"),
+    CANCELLED(4, "已退保");
 
     private final String name;
     private final Integer value;

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

@@ -78,6 +78,15 @@ public class InsuranceController {
         return success(true);
     }
 
+    @GetMapping("/applyInsuranceNew")
+    @Operation(summary = "申请投保新(个保)")
+    @OperateLog(type = API)
+    @PreAuthorize("@ss.hasPermission('trade:insurance:apply')")
+    public CommonResult<Boolean> applyInsuranceNew(@RequestParam("id") Long id) {
+        insuranceService.applyInsuranceNew(id);
+        return success(true);
+    }
+
     @GetMapping("/queryEpolicy")
     @Operation(summary = "根据id获取电子保单")
     @OperateLog(type = API)
@@ -91,7 +100,7 @@ public class InsuranceController {
     @GetMapping("/cancel")
     @Operation(summary = "退保")
     @OperateLog(type = API)
-    @PreAuthorize("@ss.hasPermission('trade:insurance:apply')")
+    @PreAuthorize("@ss.hasPermission('trade:insurance:cancel')")
     public CommonResult<Boolean>  cancelInsurance(@RequestParam("id") Long id){
         insuranceService.applyCancelInsurance(id);
         return success(true);

+ 69 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/TradeVisitorController.java

@@ -0,0 +1,69 @@
+package com.yc.ship.module.trade.controller.admin.visitor;
+
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
+import com.yc.ship.framework.common.util.collection.MapUtils;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import com.yc.ship.module.product.controller.admin.pricevoyage.vo.PriceVoyageSaveReqVO;
+import com.yc.ship.module.trade.controller.admin.insurance.vo.InsuranceRespVO;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorPageReqVO;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorRespVO;
+import com.yc.ship.module.trade.dal.dataobject.insurance.InsuranceDO;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
+import com.yc.ship.module.trade.service.insurance.InsuranceService;
+import com.yc.ship.module.trade.service.order.TradeOrderService;
+import com.yc.ship.module.trade.service.order.TradeVisitorService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+/**
+ * 游客信息
+ */
+
+@Tag(name = "管理后台 - 订单游客信息")
+@RestController
+@RequestMapping("/trade/visitor")
+@Validated
+public class TradeVisitorController {
+
+    @Resource
+    private TradeVisitorService tradeVisitorService;
+
+
+    @GetMapping("/page")
+    @Operation(summary = "获得订单游客信息分页")
+    @PreAuthorize("@ss.hasPermission('trade:visitor:query')")
+    public CommonResult<PageResult<VisitorRespVO>> getInsurancePage(@Valid VisitorPageReqVO pageReqVO) {
+        PageResult<VisitorRespVO> pageResult = tradeVisitorService.getVisitorPage(pageReqVO);
+        return success(pageResult);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得订单游客信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('trade:insurance:query')")
+    public CommonResult<TradeVisitorDO> getVisitor(@RequestParam("id") Long id) {
+        TradeVisitorDO visitor = tradeVisitorService.getVisitor(id);
+        return success(visitor);
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新游客信息")
+    @PreAuthorize("@ss.hasPermission('trade:insurance:update')")
+    public CommonResult<Boolean> updateVisitor(@Valid @RequestBody TradeVisitorDO updateReqVO) {
+        tradeVisitorService.updateVisitor(updateReqVO);
+        return success(true);
+    }
+}

+ 32 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/vo/VisitorPageReqVO.java

@@ -0,0 +1,32 @@
+package com.yc.ship.module.trade.controller.admin.visitor.vo;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 订单游客信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class VisitorPageReqVO extends PageParam {
+
+    @Schema(description = "游轮ID")
+    private Long shipId;
+
+    @Schema(description = "航次ID")
+    private Long voyageId;
+
+    @Schema(description = "订单号")
+    private String orderNo;
+
+    @Schema(description = "游客姓名")
+    private String name;
+
+    @Schema(description = "证件号")
+    private String credentialNo;
+
+    @Schema(description = "投保状态")
+    private Integer isInsure;
+}

+ 92 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/visitor/vo/VisitorRespVO.java

@@ -0,0 +1,92 @@
+package com.yc.ship.module.trade.controller.admin.visitor.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.yc.ship.framework.desensitize.core.slider.annotation.IdCardDesensitize;
+import com.yc.ship.framework.desensitize.core.slider.annotation.MobileDesensitize;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
+import com.yc.ship.module.trade.enums.CredentialTypeEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 订单游客信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class VisitorRespVO {
+
+    @Schema(description = "主键")
+    private Long id;
+
+    @Schema(description = "订单ID")
+    private Long orderId;
+
+    /**
+     * 游客姓名
+     */
+    @Schema(description = "游客姓名")
+    private String name;
+
+    /**
+     * 性别
+     */
+    @Schema(description = "性别")
+    private Integer gender;
+
+    /**
+     * 证件号
+     */
+    @Schema(description = "证件号")
+    @IdCardDesensitize
+    private String credentialNo;
+
+    /**
+     * 国籍
+     */
+    @Schema(description = "国籍")
+    private String nationality;
+
+    /**
+     * 证件类型
+     * 关联 {@link CredentialTypeEnum}
+     */
+    @Schema(description = "证件类型")
+    private Integer credentialType;
+
+    /**
+     * 手机号
+     */
+    @MobileDesensitize
+    @Schema(description = "手机号")
+    private String mobile;
+
+    @Schema(description = "保险编号")
+    private String policyNo;
+
+    /**
+     * 是否投保 0否 1是
+     */
+    @Schema(description = "投保状态")
+    private Integer isInsure;
+
+    @Schema(description = "投保信息")
+    private String insureMsg;
+
+    @Schema(description = "年龄", example = "")
+    private Integer age;
+
+    @Schema(description = "订单号")
+    private String orderNo;
+
+    @Schema(description = "订单状态")
+    private Integer orderStatus;
+
+    @Schema(description = "航次名称")
+    private String voyageName;
+
+    @Schema(description = "保险ID")
+    private Long insuranceId;
+
+}

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/insurance/InsuranceDO.java

@@ -33,6 +33,11 @@ public class InsuranceDO extends TenantBaseDO {
      * 订单ID
      */
     private Long orderId;
+
+    /**
+     * 游客ID
+     */
+    private Long visitorId;
     /**
      * 旅行社订单id
      */

+ 3 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/dataobject/order/TradeVisitorDO.java

@@ -103,6 +103,9 @@ public class TradeVisitorDO extends TenantSyncDO {
      */
     private Integer isInsure;
 
+    @Schema(description = "投保信息")
+    private String insureMsg;
+
     @Schema(description = "是否推送实名制系统")
     private Integer isPush;
 

+ 14 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/insurance/InsuranceMapper.java

@@ -12,6 +12,8 @@ import com.yc.ship.module.trade.dal.dataobject.insurance.InsuranceDO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.List;
+
 /**
  * 订单保险信息 Mapper
  *
@@ -55,4 +57,16 @@ public interface InsuranceMapper extends BaseMapperX<InsuranceDO> {
     default void deleteByOrderId(Long orderId) {
         delete(new LambdaQueryWrapper<InsuranceDO>().eq(InsuranceDO::getOrderId, orderId));
     }
+
+    default void deleteByVisitorId(Long id) {
+        delete(new LambdaQueryWrapper<InsuranceDO>().eq(InsuranceDO::getVisitorId, id));
+    }
+
+    default InsuranceDO selectByVisitorId(Long id) {
+        return selectOne(new LambdaQueryWrapper<InsuranceDO>().eq(InsuranceDO::getVisitorId, id).last("limit 1"));
+    }
+
+    default List<InsuranceDO> selectListByVisitorIds(List<Long> visitorIds) {
+        return selectList(new LambdaQueryWrapper<InsuranceDO>().in(InsuranceDO::getVisitorId, visitorIds));
+    }
 }

+ 5 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -1,5 +1,6 @@
 package com.yc.ship.module.trade.dal.mysql.order;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
@@ -257,4 +258,8 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
     List<Map<String, Object>> queryOrderVisitorMobile(@Param("day") int day,@Param("direction") int direction);
 
     List<Map<String, Object>> getTradeJz();
+
+    default TradeOrderDO selectByOrderNo(String orderNo) {
+        return selectOne(new LambdaQueryWrapper<TradeOrderDO>().eq(TradeOrderDO::getOrderNo, orderNo).last("LIMIT 1"));
+    }
 }

+ 21 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/dal/mysql/order/TradeVisitorMapper.java

@@ -4,12 +4,16 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.mapper.BaseMapperX;
+import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.tenant.core.aop.TenantIgnore;
 import com.yc.ship.module.product.api.dto.OrderRoomUseDTO;
 import com.yc.ship.module.trade.controller.admin.order.vo.order.*;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorPageReqVO;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorRespVO;
 import com.yc.ship.module.trade.controller.app.otc.vo.AppItineraryPersonVO;
 import com.yc.ship.module.trade.controller.app.otc.vo.AppPersonDescVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
+import com.yc.ship.module.trade.enums.InsuranceStatusEnum;
 import com.yc.ship.module.trade.service.order.bo.TradeVisitorBO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -17,6 +21,7 @@ import org.apache.ibatis.annotations.Update;
 
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 游客 Mapper
@@ -104,4 +109,20 @@ public interface TradeVisitorMapper extends BaseMapperX<TradeVisitorDO> {
     default List<TradeVisitorDO> selectListByOrderId(Long orderId) {
         return selectList(new LambdaQueryWrapper<TradeVisitorDO>().eq(TradeVisitorDO::getOrderId, orderId));
     }
+
+    default void updateInsuranceById(Long visitorId, Integer insuranceStatus, String resMsg) {
+        update(new TradeVisitorDO().setIsInsure(insuranceStatus).setInsureMsg(resMsg), new LambdaQueryWrapper<TradeVisitorDO>().eq(TradeVisitorDO::getId, visitorId));
+    }
+
+    /**
+     * 查询未投保的游客Id
+     * @param orderIdList
+     * @return
+     */
+    default List<Long> selectNotInsureByOrderIds(List<Long> orderIdList) {
+        return selectList(new LambdaQueryWrapper<TradeVisitorDO>().eq(TradeVisitorDO::getIsInsure, InsuranceStatusEnum.NOT_INSURE).in(TradeVisitorDO::getOrderId, orderIdList))
+                .stream().map(TradeVisitorDO::getId).collect(Collectors.toList());
+    }
+
+    IPage<VisitorRespVO> selectVisitorPage(IPage<VisitorRespVO> page, @Param("vo") VisitorPageReqVO vo);
 }

+ 9 - 8
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/InsuranceApplyJob.java

@@ -6,6 +6,7 @@ import com.yc.ship.framework.tenant.core.util.TenantUtils;
 import com.yc.ship.module.trade.service.insurance.InsuranceService;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import com.yc.ship.module.trade.service.order.TradeOrderService;
+import com.yc.ship.module.trade.service.order.TradeVisitorService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
@@ -26,6 +27,9 @@ public class InsuranceApplyJob implements JobHandler {
     @Resource
     private TradeOrderService tradeOrderService;
 
+    @Resource
+    private TradeVisitorService tradeVisitorService;
+
     @Resource
     private TradeOrderRepositoryService tradeOrderRepositoryService;
 
@@ -38,16 +42,13 @@ public class InsuranceApplyJob implements JobHandler {
         log.info("开始执行保险购买定时任务");
         TenantUtils.execute(1L, () -> {
             List<Long> orderIdList = tradeOrderService.getCanBuyInsuranceOrder();
-            orderIdList.stream().forEach(orderId -> {
-                log.info("开始执行保险购买定时任务,订单id{}", orderId);
+            List<Long> visitorIdList = tradeVisitorService.getNotInsureByOrderIds(orderIdList);
+            visitorIdList.stream().forEach(visitorId -> {
+                log.info("开始执行保险购买定时任务,visitorId{}", visitorId);
                 try {
-                    boolean b = insuranceService.applyInsurance(orderId);
-                    if(b) {
-                        //更新订单投保状态为投保中
-                        tradeOrderRepositoryService.updateOrderInsureStatus(orderId, 0);
-                    }
+                    insuranceService.applyInsuranceNew(visitorId);
                 }catch (Exception e) {
-                    log.error("保险购买定时任务异常,订单id{}", orderId, e);
+                    log.error("保险购买定时任务异常,游客id{}", visitorId, e);
                 }
             });
         });

+ 1 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/job/InsuranceJob.java

@@ -27,7 +27,7 @@ public class InsuranceJob implements JobHandler {
     @Override
     public String execute(String param) {
         log.info("开始执行保单查询定时任务");
-        TenantUtils.execute(1L, () -> insuranceService.queryInsuranceQuey());
+//        TenantUtils.execute(1L, () -> insuranceService.queryInsuranceQuey());
         log.info("结束执行保单查询定时任务");
         return "success";
     }

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

@@ -72,4 +72,11 @@ public interface InsuranceService {
      * 保险查询后处理保险数据和订单保险状态
      */
     void handleInsuranceQuery(BigDecimal amount, String policyNo, Long orderId, String status, String service, String msg);
+
+    /**
+     * 申请投保新(个保)
+     */
+    void applyInsuranceNew(Long id);
+
+    List<InsuranceDO> getListByVisitorIds(List<Long> visitorIds);
 }

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

@@ -14,6 +14,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
 import com.yc.ship.framework.mybatis.core.util.MyBatisUtils;
 import com.yc.ship.module.infra.api.config.ConfigApi;
@@ -26,6 +27,7 @@ import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeOrderRespVO
 import com.yc.ship.module.trade.controller.admin.order.vo.order.TradeVisitorRespVO;
 import com.yc.ship.module.trade.dal.dataobject.insurance.InsuranceDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
 import com.yc.ship.module.trade.dal.mysql.insurance.InsuranceMapper;
 import com.yc.ship.module.trade.dal.mysql.order.TradeOrderMapper;
 import com.yc.ship.module.trade.dal.mysql.order.TradeVisitorMapper;
@@ -43,10 +45,7 @@ import org.springframework.validation.annotation.Validated;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception0;
@@ -385,6 +384,130 @@ public class InsuranceServiceImpl implements InsuranceService {
         tradeOrderMapper.update(new LambdaUpdateWrapper<TradeOrderDO>().set(TradeOrderDO::getIsInsure, insuranceStatus).eq(TradeOrderDO::getOrderNo, insuranceDO.getInsuranceNo()));
     }
 
+    @Override
+    public void applyInsuranceNew(Long id) {
+        TradeVisitorDO tradeVisitorDO = tradeVisitorMapper.selectById(id);
+        Integer isInsure = tradeVisitorDO.getIsInsure();
+        if(isInsure != null ) {
+            if(isInsure == InsuranceStatusEnum.SUCCESS.getValue()) {
+                throw exception0(500, "该订单已投保成功");
+            }else if(isInsure == InsuranceStatusEnum.INSURE.getValue()) {
+                throw exception0(500, "该订单正在投保中");
+            }
+        }
+        TradeOrderDO orderDO = tradeOrderMapper.selectById(tradeVisitorDO.getOrderId());
+        VoyageDO voyage = voyageService.getVoyage(orderDO.getVoyageId());
+        InsuranceDO insuranceDO = new InsuranceDO();
+        Long insuranceId = IdWorker.getId(insuranceDO);
+
+        InsuranceApplyReqDTO insuranceApplyReqDTO = new InsuranceApplyReqDTO();
+        // 个保 - apply; 团保 - applyTeam
+        insuranceApplyReqDTO.setService("apply");
+        // 回调地址
+        insuranceApplyReqDTO.setReplyUrl(notifyUrl);
+        // 使用在线支付时填1, 不使用在线支付填0
+        insuranceApplyReqDTO.setOnlinePayInd("0");
+
+        //订单对象, 一个订单下可以有一批被保险人
+        InsuranceOrderInfoDTO insuranceOrderInfoDTO = new InsuranceOrderInfoDTO();
+
+        //投保人信息
+        insuranceOrderInfoDTO.setExternalOrderNo(insuranceId.toString());
+        insuranceOrderInfoDTO.setExternalPolicyNumber(insuranceId.toString());
+        //TODO: 当前写死
+        insuranceOrderInfoDTO.setProductNo(configApi.getConfigValueByKey("insuranceConfig.product_no"));
+        insuranceOrderInfoDTO.setBeginDate(DateUtil.format(voyage.getBoardingTime(), "yyyy-MM-dd"));
+        insuranceOrderInfoDTO.setEndDate(DateUtil.format(voyage.getLeaveTime(), "yyyy-MM-dd"));
+        insuranceOrderInfoDTO.setCurrencyCode("CNY");
+        insuranceOrderInfoDTO.setBizType(0);
+        insuranceOrderInfoDTO.setApplicantType(1);
+        insuranceOrderInfoDTO.setApplicant(configApi.getConfigValueByKey("insuranceConfig.applicant"));
+        insuranceOrderInfoDTO.setApplicantCertificateType(6);
+        insuranceOrderInfoDTO.setApplicantCertificateNo(configApi.getConfigValueByKey("insuranceConfig.applicant_certificate_no"));
+        insuranceOrderInfoDTO.setApplicantBirthday("1990-01-01");
+        insuranceOrderInfoDTO.setApplicantSex(1);
+
+        //销售人信息
+        insuranceOrderInfoDTO.setSellCorp("营销中心");
+        insuranceOrderInfoDTO.setSellDept("营销中心");
+        insuranceOrderInfoDTO.setSellUser("营销中心");
+        insuranceApplyReqDTO.setOrder(insuranceOrderInfoDTO);
+
+        //被保人对象列表, 其下可多位被保险人, 他们在同个订单下
+        List<InsuredDTO> insuredList = new ArrayList<>();
+        InsuredDTO insuredDTO = new InsuredDTO();
+        insuredDTO.setExternalPolicyNumber(tradeVisitorDO.getId().toString());
+        String name = tradeVisitorDO.getName();
+        insuredDTO.setInsuredName(name);
+        if(9 == tradeVisitorDO.getCredentialType()) {
+            if(PinyinUtil.isChinese(name.charAt(0))) {
+                String pinyin = PinyinUtil.getPinyin(name, " ");
+                insuredDTO.setInsuredName(pinyin);
+                insuredDTO.setFirstName(pinyin.substring(0, pinyin.indexOf(" ")));
+                insuredDTO.setLastName(pinyin.substring(pinyin.indexOf(" ") + 1));
+            }else {
+                insuredDTO.setInsuredName(name);
+                if(name.contains("/")) {
+                    insuredDTO.setFirstName(name.substring(0, name.indexOf("/")));
+                    insuredDTO.setLastName(name.substring(name.indexOf("/") + 1));
+                }else {
+                    insuredDTO.setFirstName(name.substring(0, name.indexOf(" ")));
+                    insuredDTO.setLastName(name.substring(name.indexOf(" ") + 1));
+                }
+            }
+        }
+        insuredDTO.setCertificateType(transCredentialType(tradeVisitorDO.getCredentialType()));
+        insuredDTO.setCertificateNo(tradeVisitorDO.getCredentialNo());
+        insuredDTO.setBirthday(tradeVisitorDO.getBirthday());
+        insuredDTO.setSex(tradeVisitorDO.getGender());
+        insuredDTO.setRelation(2); //不是保单持有人,只是被保险人
+        insuredList.add(insuredDTO);
+        insuranceApplyReqDTO.setInsureds(insuredList);
+
+//        //验证投保信息
+//        CommonResult commonResult = insuranceUtil.validateInsuranceRequest(insuranceApplyReqDTO);
+//        if (!commonResult.isSuccess()) {
+//            throw exception0(commonResult.getCode(), commonResult.getMsg());
+//        }
+        // 开始投保
+        insuranceDO.setOrderId(orderDO.getId());
+        insuranceDO.setVisitorId(tradeVisitorDO.getId());
+        insuranceDO.setInsuranceStatus(InsuranceStatusEnum.INSURE.getValue());
+        insuranceDO.setInsuredNum(1);
+        insuranceDO.setInsuranceNo(orderDO.getOrderNo());
+        insuranceDO.setTenantId(voyage.getTenantId());
+        insuranceDO.setRationType(insuranceOrderInfoDTO.getProductNo());
+        insuranceDO.setInsuranceEffectDate(voyage.getBoardingTime());
+        insuranceDO.setId(id);
+        CommonResult commonResult = insuranceUtil.sendInsuranceApply(insuranceApplyReqDTO);
+        if (!commonResult.isSuccess()) {
+            log.error("投保失败:{}", commonResult.getMsg());
+            InsuranceDO insuranceDO1 = insuranceMapper.selectByVisitorId(id);
+            if(insuranceDO1 != null) {
+                insuranceDO1.setInsuranceStatus(InsuranceStatusEnum.FAIL.getValue());
+                insuranceDO1.setResMsg(commonResult.getMsg());
+                insuranceMapper.updateById(insuranceDO1);
+            }else {
+                insuranceDO.setInsuranceStatus(InsuranceStatusEnum.FAIL.getValue());
+                insuranceDO.setResMsg(commonResult.getMsg());
+                insuranceMapper.insert(insuranceDO);
+            }
+            throw exception0(commonResult.getCode(), commonResult.getMsg());
+        }
+        //保存投保信息
+        insuranceMapper.deleteByVisitorId(id);
+        insuranceDO.setResMsg(String.valueOf(commonResult.getCheckedData()));
+        insuranceMapper.insert(insuranceDO);
+    }
+
+    @Override
+    public List<InsuranceDO> getListByVisitorIds(List<Long> visitorIds) {
+        if(CollectionUtils.isAnyEmpty(visitorIds)) {
+            return Collections.emptyList();
+        }
+        return insuranceMapper.selectListByVisitorIds(visitorIds);
+    }
+
     @Override
     public void queryInsuranceByOrderId(Long id) {
         InsuranceDO insuranceDO = insuranceMapper.selectById(id);

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

@@ -7,6 +7,7 @@ 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.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.mysql.insurance.InsuranceMapper;
+import com.yc.ship.module.trade.dal.mysql.order.TradeVisitorMapper;
 import com.yc.ship.module.trade.enums.InsuranceStatusEnum;
 import com.yc.ship.module.trade.service.order.TradeOrderRepositoryService;
 import org.springframework.stereotype.Service;
@@ -27,6 +28,9 @@ public class NotifyServiceImpl implements NotifyService {
     private TradeOrderRepositoryService tradeOrderRepositoryService;
     @Resource
     private NotifyMessageSendApi notifyMessageSendApi;
+
+    @Resource
+    private TradeVisitorMapper tradeVisitorMapper;
     @Override
     public Boolean notifyInsurance(NotifyInsuranceReqVO reqVO) {
         TenantUtils.execute(1L, () -> {
@@ -42,9 +46,9 @@ public class NotifyServiceImpl implements NotifyService {
             if("SUCCESS".equals(status)) {
                 insuranceDO.setPolicyNo(policyNo);
                 insuranceDO.setElectronicPolicy(downloadUrl);
-                if("applyTeam".equals(service)) {
+                if("apply".equals(service)) {
                     insuranceDO.setInsuranceStatus(InsuranceStatusEnum.SUCCESS.getValue());
-                }else if ("cancelTeam".equals(service)) {
+                }else if ("cancel".equals(service)) {
                     insuranceDO.setInsuranceStatus(InsuranceStatusEnum.CANCELLED.getValue());
                 }
 //            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -68,6 +72,7 @@ public class NotifyServiceImpl implements NotifyService {
             }
             insuranceMapper.updateById(insuranceDO);
             tradeOrderRepositoryService.updateOrderInsureStatus(insuranceDO.getOrderId(),insuranceDO.getInsuranceStatus());
+            tradeVisitorMapper.updateInsuranceById(insuranceDO.getVisitorId(), insuranceDO.getInsuranceStatus(), insuranceDO.getResMsg());
         });
         return true;
     }

+ 4 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeOrderService.java

@@ -107,4 +107,8 @@ public interface TradeOrderService {
      * @return
      */
     List<Long> getCanBuyInsuranceOrder();
+
+    TradeOrderDO getByOrderNo(String orderNo);
+
+    List<TradeOrderDO> getListByIds(List<Long> orderIds);
 }

+ 16 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/TradeVisitorService.java

@@ -1,5 +1,8 @@
 package com.yc.ship.module.trade.service.order;
 
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorPageReqVO;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorRespVO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
 
 import java.util.List;
@@ -7,4 +10,17 @@ import java.util.List;
 public interface TradeVisitorService {
 
     List<TradeVisitorDO> getShipByOrderIds(List<Long> orderIds);
+
+    /**
+     * 获取未投保的游客ID
+     * @param orderIdList
+     * @return
+     */
+    List<Long> getNotInsureByOrderIds(List<Long> orderIdList);
+
+    PageResult<VisitorRespVO> getVisitorPage(VisitorPageReqVO pageReqVO);
+
+    TradeVisitorDO getVisitor(Long id);
+
+    void updateVisitor(TradeVisitorDO updateReqVO);
 }

+ 13 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeOrderServiceImpl.java

@@ -1466,6 +1466,19 @@ public class TradeOrderServiceImpl implements TradeOrderService {
         return tradeOrderMapper.selectCanBuyInsuranceOrder();
     }
 
+    @Override
+    public TradeOrderDO getByOrderNo(String orderNo) {
+        return tradeOrderMapper.selectByOrderNo(orderNo);
+    }
+
+    @Override
+    public List<TradeOrderDO> getListByIds(List<Long> orderIds) {
+        if(CollectionUtils.isAnyEmpty(orderIds)) {
+            return Collections.emptyList();
+        }
+        return tradeOrderMapper.selectByIds(orderIds);
+    }
+
     private String formatStatus(Integer status, LocalDateTime boardingTime) {
         String statusDesc = "";
         switch (status) {

+ 35 - 0
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/order/impl/TradeVisitorServiceImpl.java

@@ -1,10 +1,20 @@
 package com.yc.ship.module.trade.service.order.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.PageUtils;
+import com.yc.ship.framework.mybatis.core.util.MyBatisUtils;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorPageReqVO;
+import com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorRespVO;
+import com.yc.ship.module.trade.dal.dataobject.order.TradeOrderDO;
 import com.yc.ship.module.trade.dal.dataobject.order.TradeVisitorDO;
 import com.yc.ship.module.trade.dal.mysql.order.TradeVisitorMapper;
+import com.yc.ship.module.trade.service.order.TradeOrderService;
 import com.yc.ship.module.trade.service.order.TradeVisitorService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -12,6 +22,9 @@ import javax.annotation.Resource;
 import java.util.Collections;
 import java.util.List;
 
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.yc.ship.module.trade.enums.ErrorCodeConstants.ORDER_NOT_EXIST;
+
 /**
  * 游客数据
  */
@@ -30,4 +43,26 @@ public class TradeVisitorServiceImpl implements TradeVisitorService {
         }
         return tradeVisitorMapper.selectShipByOrderIds(orderIds);
     }
+
+    @Override
+    public List<Long> getNotInsureByOrderIds(List<Long> orderIdList) {
+        return tradeVisitorMapper.selectNotInsureByOrderIds(orderIdList);
+    }
+
+    @Override
+    public PageResult<VisitorRespVO> getVisitorPage(VisitorPageReqVO pageReqVO) {
+        IPage<VisitorRespVO> page = MyBatisUtils.buildPage(pageReqVO);
+        IPage<VisitorRespVO> ipage = tradeVisitorMapper.selectVisitorPage(page, pageReqVO);
+        return new PageResult<>(ipage.getRecords(), ipage.getTotal());
+    }
+
+    @Override
+    public TradeVisitorDO getVisitor(Long id) {
+        return tradeVisitorMapper.selectById(id);
+    }
+
+    @Override
+    public void updateVisitor(TradeVisitorDO updateReqVO) {
+        tradeVisitorMapper.updateById(updateReqVO);
+    }
 }

+ 59 - 1
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtilBak.java

@@ -8,6 +8,10 @@ import com.yc.ship.module.infra.api.config.ConfigApi;
 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 okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.ResponseBody;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.http.*;
 import org.springframework.stereotype.Component;
@@ -16,11 +20,13 @@ import org.springframework.util.MultiValueMap;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
+import java.io.FileOutputStream;
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception0;
 
@@ -54,6 +60,8 @@ public class InsuranceUtilBak {
 
     public final String QUERY_URL = "/policy/querystatus.do"; // 保单状态查询接口
 
+    public final String DOWNLOAD_URL = "/policy/downloadpdf.do"; // 保单下载接口
+
     public final String APPID = "449ddc34";   // appId
 
     public final String KEY = "2HVEZB4Z"; // key
@@ -300,6 +308,55 @@ public class InsuranceUtilBak {
         }
     }
 
+    public void downloadInsurance(String orderNo) {
+        try {
+            Map<String, String> request = new LinkedHashMap<>();
+            request.put("appId", APPID);
+            request.put("policyNo", orderNo);
+            request.put("key", KEY);
+            String sign = MD5Util.md5(APPID + orderNo + KEY);
+
+            MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
+            params.add("appId", APPID);
+            params.add("policyNo", orderNo);
+            params.add("sign", sign);
+            String apiUrl = HOST + DOWNLOAD_URL + "?appId=" + APPID + "&policyNo=" + orderNo + "&sign=" + sign;
+            log.error("发送下载请求到阳光系统: {}", apiUrl);
+            // 指定接口地址
+            // 创建 OkHttp 客户端对象
+            OkHttpClient client = new OkHttpClient.Builder()
+                    .connectTimeout(15, TimeUnit.SECONDS) // 设置连接超时时间为15秒
+                    .readTimeout(15, TimeUnit.SECONDS) // 设置读取超时时间为15秒
+                    .build();
+            // 创建请求对象
+            Request request1 = new Request.Builder()
+                    .url(apiUrl)
+                    .build();
+            // 发起请求
+            Response response = client.newCall(request1).execute();
+            // 获取响应体
+            ResponseBody responseBody = response.body();
+            // 创建输出流
+            FileOutputStream outputStream = new FileOutputStream("D:/example.pdf");
+            // 将响应体的数据写入输出流,生成 PDF 文件
+            byte[] buffer = new byte[1024];
+            int len = 0;
+            while ((len = responseBody.byteStream().read(buffer)) != -1) {
+                outputStream.write(buffer, 0, len);
+            }
+            // 关闭流
+            responseBody.byteStream().close();
+            outputStream.close();
+            //{"phase":"INSURE","externalOrderNo":"tys-20261001-YC-14",
+            // "paiedAmount":"10.00","total":"1","insuredCount":"1","insureProcessingCount":"0",
+            // "cancelledCount":"0","cancelProcessingCount":"0","refundedAmount":"0.0",
+            // "cipher":"26e2e422d370653274ee74ef3edc7f93","policies":[{"externalPolicyNumber":"2037220248460828673",
+            // "service":"applyTeam","status":"SUCCESS","msg":"投保成功","policyNo":"HW61927008L7JB7J8Q00"}]}
+        } catch (Exception e) {
+            log.error("发送下载请求失败", e);
+        }
+    }
+
     public CommonResult queryInsuranceNew(String orderNo,Long orderId) {
         try {
             if(StringUtils.isBlank(orderNo)) {
@@ -329,7 +386,8 @@ public class InsuranceUtilBak {
 
     public static void main(String[] args) {
         InsuranceUtilBak insuranceUtil = new InsuranceUtilBak();
-        CommonResult commonResult = insuranceUtil.queryInsurance("2042633797007175681");
+        CommonResult commonResult = insuranceUtil.queryInsurance("2043342644000714753");
+//        insuranceUtil.downloadInsurance("PEAK20264205QA00A00009");
         System.out.println(commonResult);
 
 

+ 24 - 0
ship-module-trade/ship-module-trade-biz/src/main/resources/mapper/order/TradeVisitorMapper.xml

@@ -503,4 +503,28 @@
             AND (t1.mobile = #{keyword} or t1.credential_no = #{keyword})
         </if>
     </select>
+    <select id="selectVisitorPage" resultType="com.yc.ship.module.trade.controller.admin.visitor.vo.VisitorRespVO">
+        select t3.policy_no,t3.id insurance_id, t1.id,t1.order_id,t1.`name`,t1.gender,t1.credential_no,t1.nationality,t1.credential_type,t1.mobile,t1.is_insure,t1.insure_msg,t1.age,t2.order_no,t2.order_status,t4.id voyage_id,t4.name voyage_name from trade_visitor t1 LEFT JOIN trade_order t2 on t1.order_id = t2.id and t2.deleted = 0 LEFT JOIN trade_insurance t3 on t1.id = t3.visitor_id and t3.deleted = 0 LEFT JOIN product_voyage t4 on t2.voyage_id = t4.id and t4.deleted = 0
+        where t1.deleted = 0  and t2.order_status in (1,6,13,14) and t4.id is not null
+        <if test="vo.orderNo != null and vo.orderNo != ''">
+            and t2.order_no = #{vo.orderNo}
+        </if>
+        <if test="vo.voyageId != null and vo.voyageId != ''">
+            and t4.id = #{vo.voyageId}
+        </if>
+          <if test="vo.shipId != null and vo.shipId != ''">
+            and t4.ship_id = #{vo.shipId}
+        </if>
+        <if test="vo.credentialNo != null and vo.credentialNo != ''">
+            and t1.credential_no = #{vo.credentialNo}
+        </if>
+        <if test="vo.name != null and vo.name != ''">
+            and t1.name like concat('%',#{vo.name},'%')
+        </if>
+        <if test="vo.isInsure != null and vo.isInsure != ''">
+            and t1.is_insure = #{vo.isInsure}
+        </if>
+
+        order by t1.create_time asc
+    </select>
 </mapper>