4 コミット b5f18671d3 ... c4ca69553f

作者 SHA1 メッセージ 日付
  luofeiyun c4ca69553f fix: 处理库存操作时涉及虚拟库存的问题 2 週間 前
  luofeiyun e748c38698 Merge branch 'main' of http://117.174.100.38:3000/lishiqiang/ship-ota-server into main1 2 週間 前
  luofeiyun 1a00d9a521 fix: 保险购买报错问题 2 週間 前
  luofeiyun 51eaaee305 fix: 营销政策后台管理 2 週間 前
23 ファイル変更1199 行追加46 行削除
  1. 11 0
      ship-module-marketing/ship-module-marketing-biz/pom.xml
  2. 154 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/PolicyController.java
  3. 54 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyPageReqVO.java
  4. 84 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyRespVO.java
  5. 55 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicySaveReqVO.java
  6. 26 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyUsableReqVO.java
  7. 95 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/PolicyDetailController.java
  8. 37 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailPageReqVO.java
  9. 43 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailRespVO.java
  10. 30 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailSaveReqVO.java
  11. 84 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/dataobject/policy/PolicyDO.java
  12. 54 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/dataobject/policydetail/PolicyDetailDO.java
  13. 36 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policy/PolicyMapper.java
  14. 51 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/mysql/policydetail/PolicyDetailMapper.java
  15. 61 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyService.java
  16. 136 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policy/PolicyServiceImpl.java
  17. 58 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policydetail/PolicyDetailService.java
  18. 79 0
      ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policydetail/PolicyDetailServiceImpl.java
  19. 34 28
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java
  20. 7 0
      ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageServiceImpl.java
  21. 0 2
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/controller/admin/insurance/InsuranceController.java
  22. 2 13
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/service/insurance/InsuranceServiceImpl.java
  23. 8 3
      ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtil.java

+ 11 - 0
ship-module-marketing/ship-module-marketing-biz/pom.xml

@@ -37,6 +37,17 @@
             <artifactId>module-system-api</artifactId>
             <version>1.0.0</version>
         </dependency>
+        <dependency>
+            <groupId>com.yc.ship</groupId>
+            <artifactId>ship-module-resource-biz</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.yc.ship</groupId>
+            <artifactId>ship-module-product-biz</artifactId>
+            <version>1.0.0</version>
+        </dependency>
 
         <!-- 业务组件 -->
         <dependency>

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

@@ -0,0 +1,154 @@
+package com.yc.ship.module.marketing.controller.admin.policy;
+
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
+import com.yc.ship.framework.common.util.collection.MapUtils;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.module.marketing.service.policydetail.PolicyDetailService;
+import com.yc.ship.module.product.controller.admin.distributorDiscount.vo.DistributorDiscountCountryRespVO;
+import com.yc.ship.module.resource.dal.dataobject.ship.ResourceShipDO;
+import com.yc.ship.module.resource.service.ship.ResourceShipService;
+import com.yc.ship.module.system.api.area.AreaApi;
+import com.yc.ship.module.system.api.area.dto.AreaCountryDTO;
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+
+import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.yc.ship.module.marketing.controller.admin.policy.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policy.PolicyDO;
+import com.yc.ship.module.marketing.service.policy.PolicyService;
+
+@Tag(name = "管理后台 - 营销政策")
+@RestController
+@RequestMapping("/marketing/policy")
+@Validated
+public class PolicyController {
+
+    @Resource
+    private PolicyService policyService;
+
+    @Resource
+    private PolicyDetailService policyDetailService;
+
+    @Resource
+    private ResourceShipService resourceShipService;
+
+    @Resource
+    private AreaApi areaApi;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建营销政策")
+    @PreAuthorize("@ss.hasPermission('marketing:policy:create')")
+    public CommonResult<Long> createPolicy(@Valid @RequestBody PolicySaveReqVO createReqVO) {
+        return success(policyService.createPolicy(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新营销政策")
+    @PreAuthorize("@ss.hasPermission('marketing:policy:update')")
+    public CommonResult<Boolean> updatePolicy(@Valid @RequestBody PolicySaveReqVO updateReqVO) {
+        policyService.updatePolicy(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除营销政策")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('marketing:policy:delete')")
+    public CommonResult<Boolean> deletePolicy(@RequestParam("id") Long id) {
+        policyService.deletePolicy(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得营销政策")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('marketing:policy:query')")
+    public CommonResult<PolicyRespVO> getPolicy(@RequestParam("id") Long id) {
+        PolicyDO policy = policyService.getPolicy(id);
+        PolicyRespVO policyRespVO = BeanUtils.toBean(policy, PolicyRespVO.class);
+        List<PolicyDetailDO> policyDetails = policyDetailService.getByPolicyId(id);
+        Set<Long> voyageIds = CollectionUtils.convertSet(policyDetails, PolicyDetailDO::getVoyageId);
+        policyRespVO.setVoyageIds(new ArrayList<>(voyageIds));
+        Set<Long> rooModelIds = CollectionUtils.convertSet(policyDetails, PolicyDetailDO::getRoomModelId);
+        policyRespVO.setRoomModelIds(new ArrayList<>(rooModelIds));
+        return success(policyRespVO);
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得营销政策分页")
+    @PreAuthorize("@ss.hasPermission('marketing:policy:query')")
+    public CommonResult<PageResult<PolicyRespVO>> getPolicyPage(@Valid PolicyPageReqVO pageReqVO) {
+        PageResult<PolicyDO> pageResult = policyService.getPolicyPage(pageReqVO);
+        PageResult<PolicyRespVO> result = BeanUtils.toBean(pageResult, PolicyRespVO.class);
+        List<PolicyRespVO> list = result.getList();
+        List<Long> shipIds = CollectionUtils.convertList(list, PolicyRespVO::getShipId);
+        List<ResourceShipDO> shipList = resourceShipService.getList(shipIds);
+        Map<Long, ResourceShipDO> shipDOMap = CollectionUtils.convertMap(shipList, ResourceShipDO::getId);
+        list.stream().forEach(policyRespVO -> {
+            MapUtils.findAndThen(shipDOMap, policyRespVO.getShipId(), resourceShipDO -> {
+                policyRespVO.setShipName(resourceShipDO.getName());
+            });
+        });
+        return success(result);
+    }
+
+    // 获取可以使用的营销政策
+    @GetMapping("/get-usable-policy")
+    @Operation(summary = "获取可以使用的营销政策")
+    public CommonResult<List<PolicyRespVO>> getUsablePolicy(@Validated PolicyUsableReqVO reqVO) {
+        List<PolicyDO> list = policyService.getUsablePolicy(reqVO);
+        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')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPolicyExcel(@Valid PolicyPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<PolicyDO> list = policyService.getPolicyPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "营销政策.xls", "数据", PolicyRespVO.class,
+                        BeanUtils.toBean(list, PolicyRespVO.class));
+    }
+
+}

+ 54 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyPageReqVO.java

@@ -0,0 +1,54 @@
+package com.yc.ship.module.marketing.controller.admin.policy.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.yc.ship.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 营销政策分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PolicyPageReqVO extends PageParam {
+
+    @Schema(description = "政策名称", example = "王五")
+    private String name;
+
+    @Schema(description = "游轮ID", example = "7920")
+    private Long shipId;
+
+    @Schema(description = "有效期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] effectiveTime;
+
+    @Schema(description = "优惠间数")
+    private BigDecimal discountNum;
+
+    @Schema(description = "剩余优惠间数")
+    private BigDecimal surplusNum;
+
+    @Schema(description = "提前天数")
+    private Integer earlyDays;
+
+    @Schema(description = "优惠方式(1金额2折扣)", example = "2")
+    private Integer discountType;
+
+    @Schema(description = "优惠金额或者折扣", example = "3756")
+    private BigDecimal discount;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "政策说明")
+    private String instructions;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 84 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicyRespVO.java

@@ -0,0 +1,84 @@
+package com.yc.ship.module.marketing.controller.admin.policy.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+import com.yc.ship.framework.excel.core.annotations.DictFormat;
+import com.yc.ship.framework.excel.core.convert.DictConvert;
+
+@Schema(description = "管理后台 - 营销政策 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PolicyRespVO {
+
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26730")
+    @ExcelProperty("ID")
+    private Long id;
+
+    @Schema(description = "政策名称", example = "王五")
+    @ExcelProperty("政策名称")
+    private String name;
+
+    @Schema(description = "游轮ID", example = "7920")
+    @ExcelProperty("游轮ID")
+    private Long shipId;
+
+    @Schema(description = "游轮名称")
+    @ExcelProperty("游轮名称")
+    private String shipName;
+
+    @Schema(description = "航次ID列表")
+    private List<Long> voyageIds;
+
+    @Schema(description = "房型ID列表")
+    private List<Long> roomModelIds;
+
+
+    @Schema(description = "有效期")
+    @ExcelProperty("有效期")
+    private LocalDateTime effectiveTime;
+
+    @Schema(description = "优惠间数")
+    @ExcelProperty("优惠间数")
+    private BigDecimal discountNum;
+
+    @Schema(description = "剩余优惠间数")
+    @ExcelProperty("剩余优惠间数")
+    private BigDecimal surplusNum;
+
+    @Schema(description = "提前天数")
+    @ExcelProperty("提前天数")
+    private Integer earlyDays;
+
+    @Schema(description = "优惠方式(1金额2折扣)", example = "2")
+    @ExcelProperty("优惠方式(1金额2折扣)")
+    private Integer discountType;
+
+    @Schema(description = "优惠金额或者折扣", example = "3756")
+    @ExcelProperty("优惠金额或者折扣")
+    private BigDecimal discount;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty(value = "状态", converter = DictConvert.class)
+    @DictFormat("common_status") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+    private Integer status;
+
+    @Schema(description = "政策说明")
+    @ExcelProperty("政策说明")
+    private String instructions;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "区域IDS")
+    private List<Long> areaIds;
+
+    @Schema(description = "国籍IDS")
+    private List<Integer> countryIds;
+
+}

+ 55 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policy/vo/PolicySaveReqVO.java

@@ -0,0 +1,55 @@
+package com.yc.ship.module.marketing.controller.admin.policy.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 营销政策新增/修改 Request VO")
+@Data
+public class PolicySaveReqVO {
+
+    @Schema(description = "ID", example = "26730")
+    private Long id;
+
+    @Schema(description = "政策名称", example = "王五")
+    private String name;
+
+    @Schema(description = "游轮ID", example = "7920")
+    private Long shipId;
+
+    @Schema(description = "航次ID列表")
+    private List<Long> voyageIds;
+
+    @Schema(description = "房型ID列表")
+    private List<Long> roomModelIds;
+
+    @Schema(description = "有效期")
+    private LocalDateTime effectiveTime;
+
+    @Schema(description = "优惠间数")
+    private BigDecimal discountNum;
+
+    @Schema(description = "提前天数")
+    private Integer earlyDays;
+
+    @Schema(description = "优惠方式(1金额2折扣)", example = "2")
+    private Integer discountType;
+
+    @Schema(description = "优惠金额或者折扣", example = "3756")
+    private BigDecimal discount;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "政策说明")
+    private String instructions;
+
+    @Schema(description = "区域IDS")
+    private List<Long> areaIds;
+
+}

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

@@ -0,0 +1,26 @@
+package com.yc.ship.module.marketing.controller.admin.policy.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import java.util.List;
+
+@Schema(description = "管理后台 - 营销政策获取可以使用的 Request VO")
+@Data
+public class PolicyUsableReqVO {
+
+
+    @Schema(description = "航次ID", example = "7920")
+    @NotBlank(message = "航次ID不能为空")
+    private Long voyageId;
+
+    @Schema(description = "房型ID", example = "7920")
+    @NotEmpty(message = "房型ID不能为空")
+    private List<Long> roomModelIds;
+
+    @Schema(description = "国家ID", example = "7920")
+    @NotEmpty(message = "国籍ID不能为空")
+    private List<Long> CountryIds;
+}

+ 95 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/PolicyDetailController.java

@@ -0,0 +1,95 @@
+package com.yc.ship.module.marketing.controller.admin.policydetail;
+
+import org.springframework.web.bind.annotation.*;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import javax.validation.constraints.*;
+import javax.validation.*;
+import javax.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.CommonResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+import static com.yc.ship.framework.common.pojo.CommonResult.success;
+
+import com.yc.ship.framework.excel.core.util.ExcelUtils;
+
+import com.yc.ship.framework.apilog.core.annotation.ApiAccessLog;
+import static com.yc.ship.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.yc.ship.module.marketing.controller.admin.policydetail.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.module.marketing.service.policydetail.PolicyDetailService;
+
+@Tag(name = "管理后台 - 政策详情")
+@RestController
+@RequestMapping("/marketing/policy-detail")
+@Validated
+public class PolicyDetailController {
+
+    @Resource
+    private PolicyDetailService policyDetailService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建政策详情")
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:create')")
+    public CommonResult<Long> createPolicyDetail(@Valid @RequestBody PolicyDetailSaveReqVO createReqVO) {
+        return success(policyDetailService.createPolicyDetail(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新政策详情")
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:update')")
+    public CommonResult<Boolean> updatePolicyDetail(@Valid @RequestBody PolicyDetailSaveReqVO updateReqVO) {
+        policyDetailService.updatePolicyDetail(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除政策详情")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:delete')")
+    public CommonResult<Boolean> deletePolicyDetail(@RequestParam("id") Long id) {
+        policyDetailService.deletePolicyDetail(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得政策详情")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:query')")
+    public CommonResult<PolicyDetailRespVO> getPolicyDetail(@RequestParam("id") Long id) {
+        PolicyDetailDO policyDetail = policyDetailService.getPolicyDetail(id);
+        return success(BeanUtils.toBean(policyDetail, PolicyDetailRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得政策详情分页")
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:query')")
+    public CommonResult<PageResult<PolicyDetailRespVO>> getPolicyDetailPage(@Valid PolicyDetailPageReqVO pageReqVO) {
+        PageResult<PolicyDetailDO> pageResult = policyDetailService.getPolicyDetailPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, PolicyDetailRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出政策详情 Excel")
+    @PreAuthorize("@ss.hasPermission('marketing:policy-detail:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportPolicyDetailExcel(@Valid PolicyDetailPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<PolicyDetailDO> list = policyDetailService.getPolicyDetailPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "政策详情.xls", "数据", PolicyDetailRespVO.class,
+                        BeanUtils.toBean(list, PolicyDetailRespVO.class));
+    }
+
+}

+ 37 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailPageReqVO.java

@@ -0,0 +1,37 @@
+package com.yc.ship.module.marketing.controller.admin.policydetail.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.yc.ship.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.yc.ship.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 政策详情分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class PolicyDetailPageReqVO extends PageParam {
+
+    @Schema(description = "政策ID", example = "19009")
+    private Long policyId;
+
+    @Schema(description = "游轮ID", example = "7173")
+    private Long shipId;
+
+    @Schema(description = "航次ID", example = "13069")
+    private Long voyageId;
+
+    @Schema(description = "房型ID", example = "16253")
+    private Long roomModelId;
+
+    @Schema(description = "区域IDS", example = "4141")
+    private String areaId;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 43 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailRespVO.java

@@ -0,0 +1,43 @@
+package com.yc.ship.module.marketing.controller.admin.policydetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 政策详情 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class PolicyDetailRespVO {
+
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5755")
+    @ExcelProperty("ID")
+    private Long id;
+
+    @Schema(description = "政策ID", example = "19009")
+    @ExcelProperty("政策ID")
+    private Long policyId;
+
+    @Schema(description = "游轮ID", example = "7173")
+    @ExcelProperty("游轮ID")
+    private Long shipId;
+
+    @Schema(description = "航次ID", example = "13069")
+    @ExcelProperty("航次ID")
+    private Long voyageId;
+
+    @Schema(description = "房型ID", example = "16253")
+    @ExcelProperty("房型ID")
+    private Long roomModelId;
+
+    @Schema(description = "区域IDS", example = "4141")
+    @ExcelProperty("区域IDS")
+    private String areaId;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 30 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/controller/admin/policydetail/vo/PolicyDetailSaveReqVO.java

@@ -0,0 +1,30 @@
+package com.yc.ship.module.marketing.controller.admin.policydetail.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import javax.validation.constraints.*;
+
+@Schema(description = "管理后台 - 政策详情新增/修改 Request VO")
+@Data
+public class PolicyDetailSaveReqVO {
+
+    @Schema(description = "ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5755")
+    private Long id;
+
+    @Schema(description = "政策ID", example = "19009")
+    private Long policyId;
+
+    @Schema(description = "游轮ID", example = "7173")
+    private Long shipId;
+
+    @Schema(description = "航次ID", example = "13069")
+    private Long voyageId;
+
+    @Schema(description = "房型ID", example = "16253")
+    private Long roomModelId;
+
+    @Schema(description = "区域IDS", example = "4141")
+    private String areaId;
+
+}

+ 84 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/dataobject/policy/PolicyDO.java

@@ -0,0 +1,84 @@
+package com.yc.ship.module.marketing.dal.dataobject.policy;
+
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 营销政策 DO
+ *
+ * @author 管理员
+ */
+@TableName(value = "marketing_policy", autoResultMap = true)
+@KeySequence("marketing_policy_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PolicyDO extends TenantBaseDO {
+
+    /**
+     * ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    /**
+     * 政策名称
+     */
+    private String name;
+    /**
+     * 游轮ID
+     */
+    private Long shipId;
+    /**
+     * 有效期
+     */
+    private LocalDateTime effectiveTime;
+    /**
+     * 优惠间数
+     */
+    private BigDecimal discountNum;
+    /**
+     * 剩余优惠间数
+     */
+    private BigDecimal surplusNum;
+    /**
+     * 提前天数
+     */
+    private Integer earlyDays;
+    /**
+     * 优惠方式(1金额2折扣)
+     */
+    private Integer discountType;
+    /**
+     * 优惠金额或者折扣
+     */
+    private BigDecimal discount;
+    /**
+     * 状态
+     *
+     * 枚举 {@link TODO common_status 对应的类}
+     */
+    private Integer status;
+    /**
+     * 政策说明
+     */
+    private String instructions;
+
+    /**
+     * 区域IDS
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<Long> areaIds;
+
+}

+ 54 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/dal/dataobject/policydetail/PolicyDetailDO.java

@@ -0,0 +1,54 @@
+package com.yc.ship.module.marketing.dal.dataobject.policydetail;
+
+import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.yc.ship.framework.tenant.core.db.TenantBaseDO;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.yc.ship.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 政策详情 DO
+ *
+ * @author 管理员
+ */
+@TableName(value = "marketing_policy_detail", autoResultMap = true)
+@KeySequence("marketing_policy_detail_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PolicyDetailDO extends TenantBaseDO {
+
+    /**
+     * ID
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    private Long id;
+    /**
+     * 政策ID
+     */
+    private Long policyId;
+    /**
+     * 游轮ID
+     */
+    private Long shipId;
+    /**
+     * 航次ID
+     */
+    private Long voyageId;
+    /**
+     * 房型ID
+     */
+    private Long roomModelId;
+    /**
+     * 区域IDS
+     */
+    @TableField(typeHandler = JacksonTypeHandler.class)
+    private List<Long> areaIds;
+
+}

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

@@ -0,0 +1,36 @@
+package com.yc.ship.module.marketing.dal.mysql.policy;
+
+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;
+import com.yc.ship.module.marketing.dal.dataobject.policy.PolicyDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.yc.ship.module.marketing.controller.admin.policy.vo.*;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+/**
+ * 营销政策 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface PolicyMapper extends BaseMapperX<PolicyDO> {
+
+    default PageResult<PolicyDO> selectPage(PolicyPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PolicyDO>()
+                .likeIfPresent(PolicyDO::getName, reqVO.getName())
+                .eqIfPresent(PolicyDO::getShipId, reqVO.getShipId())
+                .eqIfPresent(PolicyDO::getStatus, reqVO.getStatus())
+                .orderByDesc(PolicyDO::getId));
+    }
+
+    default List<PolicyDO> selectList(List<Long> policyIds) {
+        return selectList(new LambdaQueryWrapperX<PolicyDO>()
+                .inIfPresent(PolicyDO::getId, policyIds)
+                .ge(PolicyDO::getEffectiveTime, LocalDateTime.now())
+                .gt(PolicyDO::getSurplusNum, BigDecimal.ZERO));
+    }
+}

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

@@ -0,0 +1,51 @@
+package com.yc.ship.module.marketing.dal.mysql.policydetail;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+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;
+import com.yc.ship.module.marketing.controller.admin.policy.vo.PolicyUsableReqVO;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.yc.ship.module.marketing.controller.admin.policydetail.vo.*;
+
+/**
+ * 政策详情 Mapper
+ *
+ * @author 管理员
+ */
+@Mapper
+public interface PolicyDetailMapper extends BaseMapperX<PolicyDetailDO> {
+
+    default PageResult<PolicyDetailDO> selectPage(PolicyDetailPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<PolicyDetailDO>()
+                .eqIfPresent(PolicyDetailDO::getPolicyId, reqVO.getPolicyId())
+                .orderByDesc(PolicyDetailDO::getId));
+    }
+
+    default void deleteByPolicyId(Long policyId) {
+        delete(new LambdaQueryWrapperX<PolicyDetailDO>().eq(PolicyDetailDO::getPolicyId, policyId));
+    }
+
+    default List<PolicyDetailDO> selectByPolicyId(Long policyId) {
+        return selectList(new LambdaQueryWrapperX<PolicyDetailDO>().eq(PolicyDetailDO::getPolicyId, policyId));
+    }
+
+    /**
+     * 获取可以使用的政策详情
+     * @param voyageId 航次ID
+     * @param roomModelIds 房型ID
+     * @return
+     */
+    default List<PolicyDetailDO> selectList(Long voyageId, List<Long> roomModelIds) {
+        return selectList(new LambdaQueryWrapperX<PolicyDetailDO>()
+                .eq(PolicyDetailDO::getVoyageId, voyageId)
+                .in(PolicyDetailDO::getRoomModelId, roomModelIds));
+    }
+
+    default List<PolicyDetailDO> selectByPolicyIds(List<Long> policyIds) {
+        return selectList(new LambdaQueryWrapperX<PolicyDetailDO>().in(PolicyDetailDO::getPolicyId, policyIds));
+    }
+}

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

@@ -0,0 +1,61 @@
+package com.yc.ship.module.marketing.service.policy;
+
+import java.util.*;
+import javax.validation.*;
+import com.yc.ship.module.marketing.controller.admin.policy.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policy.PolicyDO;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+
+/**
+ * 营销政策 Service 接口
+ *
+ * @author 管理员
+ */
+public interface PolicyService {
+
+    /**
+     * 创建营销政策
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createPolicy(@Valid PolicySaveReqVO createReqVO);
+
+    /**
+     * 更新营销政策
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updatePolicy(@Valid PolicySaveReqVO updateReqVO);
+
+    /**
+     * 删除营销政策
+     *
+     * @param id 编号
+     */
+    void deletePolicy(Long id);
+
+    /**
+     * 获得营销政策
+     *
+     * @param id 编号
+     * @return 营销政策
+     */
+    PolicyDO getPolicy(Long id);
+
+    /**
+     * 获得营销政策分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 营销政策分页
+     */
+    PageResult<PolicyDO> getPolicyPage(PolicyPageReqVO pageReqVO);
+
+    /**
+     * 获取可以使用的营销政策
+     * @param reqVO
+     * @return
+     */
+    List<PolicyDO> getUsablePolicy(PolicyUsableReqVO reqVO);
+}

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

@@ -0,0 +1,136 @@
+package com.yc.ship.module.marketing.service.policy;
+
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.module.marketing.dal.mysql.policydetail.PolicyDetailMapper;
+import com.yc.ship.module.product.dal.dataobject.voyage.VoyageDO;
+import com.yc.ship.module.product.service.voyage.VoyageService;
+import com.yc.ship.module.system.api.area.AreaApi;
+import com.yc.ship.module.system.api.area.dto.AreaCountryDTO;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.yc.ship.module.marketing.controller.admin.policy.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policy.PolicyDO;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+
+import com.yc.ship.module.marketing.dal.mysql.policy.PolicyMapper;
+
+/**
+ * 营销政策 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class PolicyServiceImpl implements PolicyService {
+
+    @Resource
+    private PolicyMapper policyMapper;
+
+    @Resource
+    private PolicyDetailMapper policyDetailMapper;
+
+    @Resource
+    private AreaApi areaApi;
+
+    @Resource
+    private VoyageService voyageService;
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Long createPolicy(PolicySaveReqVO createReqVO) {
+        // 插入
+        PolicyDO policy = BeanUtils.toBean(createReqVO, PolicyDO.class);
+        policy.setSurplusNum(createReqVO.getDiscountNum());
+        policyMapper.insert(policy);
+        handlePolicyDetail(policy.getId(), createReqVO);
+        // 返回
+        return policy.getId();
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void updatePolicy(PolicySaveReqVO updateReqVO) {
+        // 更新
+        PolicyDO updateObj = BeanUtils.toBean(updateReqVO, PolicyDO.class);
+        policyMapper.updateById(updateObj);
+        handlePolicyDetail(updateObj.getId(), updateReqVO);
+    }
+
+    @Override
+    public void deletePolicy(Long id) {
+        // 删除
+        policyMapper.deleteById(id);
+        policyDetailMapper.deleteByPolicyId(id);
+    }
+
+    private void handlePolicyDetail(Long policyId, PolicySaveReqVO reqVO) {
+        policyDetailMapper.deleteByPolicyId(policyId);
+        List<Long> voyageIds = reqVO.getVoyageIds();
+        List<Long> roomModelIds = reqVO.getRoomModelIds();
+        List<Long> areaIds = reqVO.getAreaIds();
+        List<PolicyDetailDO> policyDetailDOList = new ArrayList<>();
+        voyageIds.stream().forEach(voyageId -> {
+            roomModelIds.stream().forEach(roomModelId -> {
+                PolicyDetailDO policyDetailDO = new PolicyDetailDO();
+                policyDetailDO.setShipId(reqVO.getShipId());
+                policyDetailDO.setPolicyId(policyId);
+                policyDetailDO.setVoyageId(voyageId);
+                policyDetailDO.setRoomModelId(roomModelId);
+                policyDetailDO.setAreaIds(areaIds);
+                policyDetailDOList.add(policyDetailDO);
+            });
+        });
+        if(policyDetailDOList.size() > 0) {
+            policyDetailMapper.insertBatch(policyDetailDOList);
+        }
+    }
+
+
+    @Override
+    public PolicyDO getPolicy(Long id) {
+        return policyMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<PolicyDO> getPolicyPage(PolicyPageReqVO pageReqVO) {
+        return policyMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<PolicyDO> getUsablePolicy(PolicyUsableReqVO reqVO) {
+        //获取区域列表
+        List<Long> countryIds = reqVO.getCountryIds();
+        List<AreaCountryDTO> areaCountryDTOS = areaApi.getAreaCountryListByCountryIds(countryIds);
+        Set<Long> areaIds = CollectionUtils.convertSet(areaCountryDTOS, AreaCountryDTO::getAreaId);
+        VoyageDO voyage = voyageService.getVoyage(reqVO.getVoyageId());
+        List<PolicyDetailDO> policyDetails = policyDetailMapper.selectList(reqVO.getVoyageId(), reqVO.getRoomModelIds());
+        List<PolicyDetailDO> policyDetailDOList = new ArrayList<>();
+        policyDetails.stream().forEach(policyDetailDO -> {
+           areaIds.stream().forEach(areaId -> {
+               if(policyDetailDO.getAreaIds() != null && policyDetailDO.getAreaIds().contains(areaId)) {
+                   policyDetailDOList.add(policyDetailDO);
+                   return;
+               }
+           });
+        });
+        List<Long> policyIds = CollectionUtils.convertList(policyDetailDOList, 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;
+    }
+
+}

+ 58 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policydetail/PolicyDetailService.java

@@ -0,0 +1,58 @@
+package com.yc.ship.module.marketing.service.policydetail;
+
+import java.util.*;
+import javax.validation.*;
+import com.yc.ship.module.marketing.controller.admin.policydetail.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+
+/**
+ * 政策详情 Service 接口
+ *
+ * @author 管理员
+ */
+public interface PolicyDetailService {
+
+    /**
+     * 创建政策详情
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createPolicyDetail(@Valid PolicyDetailSaveReqVO createReqVO);
+
+    /**
+     * 更新政策详情
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updatePolicyDetail(@Valid PolicyDetailSaveReqVO updateReqVO);
+
+    /**
+     * 删除政策详情
+     *
+     * @param id 编号
+     */
+    void deletePolicyDetail(Long id);
+
+    /**
+     * 获得政策详情
+     *
+     * @param id 编号
+     * @return 政策详情
+     */
+    PolicyDetailDO getPolicyDetail(Long id);
+
+    /**
+     * 获得政策详情分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 政策详情分页
+     */
+    PageResult<PolicyDetailDO> getPolicyDetailPage(PolicyDetailPageReqVO pageReqVO);
+
+    List<PolicyDetailDO> getByPolicyId(Long id);
+
+    List<PolicyDetailDO> getByPolicyIds(List<Long> policyIds);
+}

+ 79 - 0
ship-module-marketing/ship-module-marketing-biz/src/main/java/com/yc/ship/module/marketing/service/policydetail/PolicyDetailServiceImpl.java

@@ -0,0 +1,79 @@
+package com.yc.ship.module.marketing.service.policydetail;
+
+import com.yc.ship.framework.common.util.collection.CollectionUtils;
+import org.springframework.stereotype.Service;
+import javax.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import com.yc.ship.module.marketing.controller.admin.policydetail.vo.*;
+import com.yc.ship.module.marketing.dal.dataobject.policydetail.PolicyDetailDO;
+import com.yc.ship.framework.common.pojo.PageResult;
+import com.yc.ship.framework.common.pojo.PageParam;
+import com.yc.ship.framework.common.util.object.BeanUtils;
+
+import com.yc.ship.module.marketing.dal.mysql.policydetail.PolicyDetailMapper;
+
+import static com.yc.ship.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.yc.ship.module.marketing.enums.ErrorCodeConstants.*;
+
+/**
+ * 政策详情 Service 实现类
+ *
+ * @author 管理员
+ */
+@Service
+@Validated
+public class PolicyDetailServiceImpl implements PolicyDetailService {
+
+    @Resource
+    private PolicyDetailMapper policyDetailMapper;
+
+    @Override
+    public Long createPolicyDetail(PolicyDetailSaveReqVO createReqVO) {
+        // 插入
+        PolicyDetailDO policyDetail = BeanUtils.toBean(createReqVO, PolicyDetailDO.class);
+        policyDetailMapper.insert(policyDetail);
+        // 返回
+        return policyDetail.getId();
+    }
+
+    @Override
+    public void updatePolicyDetail(PolicyDetailSaveReqVO updateReqVO) {
+        // 更新
+        PolicyDetailDO updateObj = BeanUtils.toBean(updateReqVO, PolicyDetailDO.class);
+        policyDetailMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deletePolicyDetail(Long id) {
+        // 删除
+        policyDetailMapper.deleteById(id);
+    }
+
+
+    @Override
+    public PolicyDetailDO getPolicyDetail(Long id) {
+        return policyDetailMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<PolicyDetailDO> getPolicyDetailPage(PolicyDetailPageReqVO pageReqVO) {
+        return policyDetailMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<PolicyDetailDO> getByPolicyId(Long policyId) {
+        return policyDetailMapper.selectByPolicyId(policyId);
+    }
+
+    @Override
+    public List<PolicyDetailDO> getByPolicyIds(List<Long> policyIds) {
+        if(CollectionUtils.isAnyEmpty(policyIds)) {
+            return Collections.emptyList();
+        }
+        return policyDetailMapper.selectByPolicyIds(policyIds);
+    }
+
+}

+ 34 - 28
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/api/VoyageApiImpl.java

@@ -29,6 +29,7 @@ import com.yc.ship.module.product.service.voyagestockdistribute.VoyageStockDistr
 import com.yc.ship.module.product.utils.ProductRedisUtils;
 import com.yc.ship.module.trade.enums.TradeOrderStatusEnum;
 import lombok.extern.slf4j.Slf4j;
+import me.zhyd.oauth.utils.UuidUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.stereotype.Service;
@@ -93,8 +94,10 @@ public class VoyageApiImpl implements VoyageApi {
         //现在给整个航次的库存加锁
         String lockKey = String.format(ProductRedisKeyConstants.STOCK_REDIS_KEY_PREFIX, voyageId);
         RLock lock = redissonClient.getLock(lockKey);
+        //用来控制redis缓存
         try {
             lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
             //分销商下单,当前阶段不考虑门店下单
@@ -102,14 +105,14 @@ public class VoyageApiImpl implements VoyageApi {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
                 //先返还初定扣的库存,使用修改前一步订单的 ID
-                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 log.info("先还该订单的库存-orderId: {}", reqDTO.getOrderId());
                 if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
                     log.info("如果是修改就还修改前的订单的库存-oldOrderId: {}", reqDTO.getOldOrderId());
-                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 }
                 //再去扣初定的库存
-                preReduceStockDistributor(reqDTO);
+                preReduceStockDistributor(reqDTO, uuid);
             }
         } finally {
             if (lock.isHeldByCurrentThread() && lock.isLocked()) {
@@ -129,15 +132,16 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
             //分销商下单,当前阶段不考虑门店下单
             if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
-                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
-                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                    preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 }
             }
         } finally {
@@ -158,6 +162,7 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
             //分销商下单,当前阶段不考虑门店下单
@@ -165,16 +170,16 @@ public class VoyageApiImpl implements VoyageApi {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
                 //先返还初定扣的库存
-                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                preCancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 if(reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
                     if(reqDTO.getOldOrderStatus() != null && reqDTO.getOldOrderStatus().equals(TradeOrderStatusEnum.YD.getStatus())) {
-                        preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                        preCancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                     }else {
-                        cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                        cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                     }
                 }
                 //再去扣确定的库存
-                reduceStockDistributor(reqDTO);
+                reduceStockDistributor(reqDTO, uuid);
             }
         } catch (Exception e) {
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -197,15 +202,16 @@ public class VoyageApiImpl implements VoyageApi {
         RLock lock = redissonClient.getLock(lockKey);
         try {
             lock.lock(60, TimeUnit.SECONDS);
+            String uuid = UuidUtils.getUUID();
             //判断是分销商还是门店下单 1:分销商,2:门店
             Integer type = reqDTO.getType();
             //分销商下单,当前阶段不考虑门店下单
             if (Objects.equals(type, DistributorOrStoreEnum.DISTRIBUTOR.getValue())) {
                 //分销商下单只扣分销商库存,默认是OTA,默认OTC只能门店下单
                 //初定扣分销商库存
-                cancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                cancelReduceStockDistributor(reqDTO.getOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 if (reqDTO.getOldOrderId() != null && !reqDTO.getOldOrderId().equals(reqDTO.getOrderId())) {
-                    cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList());
+                    cancelReduceStockDistributor(reqDTO.getOldOrderId(), reqDTO.getType(),reqDTO.getOrderRoomList(), uuid);
                 }
             }
         } finally {
@@ -219,7 +225,7 @@ public class VoyageApiImpl implements VoyageApi {
      * 确定状态时取消订单还库存
      * roomUseDTOList 需要退的房间
      */
-    private void cancelReduceStockDistributor(Long orderId, Integer type,List<OrderRoomUseDTO> roomUseDTOList) {
+    private void cancelReduceStockDistributor(Long orderId, Integer type,List<OrderRoomUseDTO> roomUseDTOList, String uuid) {
         if (orderId == null) {
             return;
         }
@@ -249,7 +255,7 @@ public class VoyageApiImpl implements VoyageApi {
             stockDO.setBookNum(stockDO.getBookNum().subtract(totalNum));
             //更新航次总库存
             voyageStockMapper.updateById(stockDO);
-            productRedisUtils.set(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, stockDO);
+            productRedisUtils.set(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, stockDO);
             //删除航次库存操作记录
             voyageStockLogMapper.deleteById(voyageStockLogDO);
         } else {
@@ -295,7 +301,7 @@ public class VoyageApiImpl implements VoyageApi {
                 }
             });
             voyageStockDetailMapper.updateBatch(stockDetailList);
-            productRedisUtils.set(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, stockDetailList);
+            productRedisUtils.set(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, stockDetailList);
 
 
             //2:还分销商库存
@@ -314,7 +320,7 @@ public class VoyageApiImpl implements VoyageApi {
                         item.setBookNum(item.getBookNum() == null ? BigDecimal.ZERO : item.getBookNum().subtract(totalNumMap.get(key)));
                     });
                     voyageStockDistributeNewMapper.updateBatch(list);
-                    productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, list);
+                    productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId + "_" + uuid, list);
                 }
             }
             // 删除库存详情初定记录
@@ -326,7 +332,7 @@ public class VoyageApiImpl implements VoyageApi {
     /**
      * 确定时扣库存,有限扣实际库存,不足再扣虚拟库存
      */
-    private void reduceStockDistributor(ReduceStockReqDTO reqDTO) {
+    private void reduceStockDistributor(ReduceStockReqDTO reqDTO, String uuid) {
         //航次库存操作日志
         VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO();
         //航次库存详情操作日志
@@ -353,7 +359,7 @@ public class VoyageApiImpl implements VoyageApi {
         voyageStockLogDO.setDistributorId(distributorId);
         voyageStockLogDO.setStoreId(storeId);
         // 获取航次总库存
-        VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, VoyageStockDO.class, 1);
+        VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, VoyageStockDO.class, 1);
         if (stockDO == null) {
             stockDO = voyageStockMapper.selectById(voyageId);
         }
@@ -366,7 +372,7 @@ public class VoyageApiImpl implements VoyageApi {
 
         //航次库存详情
         //航次库存详情
-        List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, VoyageStockDetailDO.class, 1);
+        List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, VoyageStockDetailDO.class, 1);
         if (CollectionUtils.isAnyEmpty(stockDetailList)) {
             stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
         }
@@ -377,7 +383,7 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setDistributorId(distributorId);
         //先获取非共享库存(分销商库存)
         detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());
-        List<VoyageStockDistributeNewRespVO> distributeNewResps = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, VoyageStockDistributeNewRespVO.class, 1);
+        List<VoyageStockDistributeNewRespVO> distributeNewResps = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId + "_" + uuid, VoyageStockDistributeNewRespVO.class, 1);
         if (CollectionUtils.isAnyEmpty(distributeNewResps)) {
             distributeNewResps = voyageStockDistributeNewService.getDetail(detailReqVO);
         }
@@ -624,7 +630,7 @@ public class VoyageApiImpl implements VoyageApi {
     /**
      * 初定取消还分销商库存
      */
-    private void preCancelReduceStockDistributor(Long orderId, Integer type,List<OrderRoomUseDTO> orderRoomUseDTOList) {
+    private void preCancelReduceStockDistributor(Long orderId, Integer type,List<OrderRoomUseDTO> orderRoomUseDTOList, String uuid) {
         if (orderId == null) {
             return;
         }
@@ -655,7 +661,7 @@ public class VoyageApiImpl implements VoyageApi {
             stockDO.setBookNum(stockDO.getBookNum().subtract(totalNum));
             //更新航次总库存
             voyageStockMapper.updateById(stockDO);
-            productRedisUtils.set(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, stockDO);
+            productRedisUtils.set(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, stockDO);
             //删除航次库存操作记录
             voyageStockLogMapper.deleteById(voyageStockLogDO);
         } else {
@@ -694,7 +700,7 @@ public class VoyageApiImpl implements VoyageApi {
             }
         });
         voyageStockDetailMapper.updateBatch(stockDetailList);
-        productRedisUtils.set(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, stockDetailList);
+        productRedisUtils.set(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, stockDetailList);
 
 
         //2:还分销商库存
@@ -725,7 +731,7 @@ public class VoyageApiImpl implements VoyageApi {
                 });
                 log.info("进入初定还分销商库存详情操作,分销商库存还之后详情-distributeNewRespList:{}", JSONArray.toJSONString(distributeNewRespList));
                 voyageStockDistributeNewMapper.updateBatch(list);
-                productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, list);
+                productRedisUtils.set(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId + "_" + uuid, list);
             }
         }
         // 删除库存详情初定记录
@@ -737,7 +743,7 @@ public class VoyageApiImpl implements VoyageApi {
     /**
      * 初定扣分销商库存
      */
-    private void preReduceStockDistributor(ReduceStockReqDTO reqDTO) {
+    private void preReduceStockDistributor(ReduceStockReqDTO reqDTO, String uuid) {
         log.info("进入初定扣库存操作-orderId:{}", reqDTO.getOrderId());
         //航次库存操作日志
         VoyageStockLogDO voyageStockLogDO = new VoyageStockLogDO();
@@ -765,7 +771,7 @@ public class VoyageApiImpl implements VoyageApi {
         voyageStockLogDO.setDistributorId(distributorId);
         voyageStockLogDO.setStoreId(storeId);
         // 获取航次总库存
-        VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId, VoyageStockDO.class, 1);
+        VoyageStockDO stockDO = productRedisUtils.get(ProductRedisKeyConstants.STOCK_TOTAL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, VoyageStockDO.class, 1);
         if (stockDO == null) {
             stockDO = voyageStockMapper.selectById(voyageId);
         }
@@ -776,7 +782,7 @@ public class VoyageApiImpl implements VoyageApi {
         BigDecimal shareNum = stockDO.getShareNum();
 
         //航次库存详情
-        List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId, VoyageStockDetailDO.class, 1);
+        List<VoyageStockDetailDO> stockDetailList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DETAIL_REDIS_KEY_PREFIX + voyageId + "_" + uuid, VoyageStockDetailDO.class, 1);
         if (CollectionUtils.isAnyEmpty(stockDetailList)) {
             stockDetailList = voyageStockDetailMapper.selectListByVoyageId(voyageId);
         }
@@ -787,7 +793,7 @@ public class VoyageApiImpl implements VoyageApi {
         detailReqVO.setDistributorId(distributorId);
         //先获取非共享库存(分销商库存)
         detailReqVO.setEnableShare(YesOrNoEnum.NO.getType());
-        List<VoyageStockDistributeNewRespVO> distributeNewRespList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId, VoyageStockDistributeNewRespVO.class, 1);
+        List<VoyageStockDistributeNewRespVO> distributeNewRespList = productRedisUtils.getList(ProductRedisKeyConstants.STOCK_DISTRIBUTOR_REDIS_KEY_PREFIX + voyageId + "_" + distributorId + "_" + uuid, VoyageStockDistributeNewRespVO.class, 1);
         if (CollectionUtils.isAnyEmpty(distributeNewRespList)) {
             distributeNewRespList = voyageStockDistributeNewService.getDetail(detailReqVO);
         }
@@ -857,9 +863,9 @@ public class VoyageApiImpl implements VoyageApi {
                 } else {
                     voyageStockDetailLogDO.setVirtualNum(item.getVirtualNum());
                     voyageStockDetailLogDO.setRealNum(useNum.subtract(item.getVirtualNum()));
-                    item.setVirtualNum(BigDecimal.ZERO);
                     // 扣实际房间数
                     item.setRealTotalNum(item.getRealTotalNum().subtract(useNum.subtract(item.getVirtualNum())));
+                    item.setVirtualNum(BigDecimal.ZERO);
                 }
                 // 加预定房间数
                 if (item.getBookNum() != null) {

+ 7 - 0
ship-module-product/ship-module-product-biz/src/main/java/com/yc/ship/module/product/service/voyage/VoyageServiceImpl.java

@@ -368,10 +368,17 @@ public class VoyageServiceImpl implements VoyageService {
                 priceRoomModelList.forEach(priceRoomModelDO -> {
                     priceRoomModelDO.setObjectId(priceVoyageId);
                     List<PriceRoomModelTypeDO> roomModelTypeList = priceRoomModelDO.getRoomModelTypeList();
+                    if(CollectionUtils.isAnyEmpty(roomModelTypeList)) {
+                        return;
+                    }
                     roomModelTypeList.forEach(roomModelType -> {
                         roomModelType.setObjectId(priceVoyageId);
                         PriceSingleSettingDO singleSetting = roomModelType.getSingleSetting();
+                        if(singleSetting == null) {
+                            return;
+                        }
                         singleSetting.setObjectId(priceVoyageId);
+
                     });
                 });
                 priceVoyageSaveReqVO.setRoomModelList(priceRoomModelList);

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

@@ -78,8 +78,6 @@ public class InsuranceController {
         return success(true);
     }
 
-    @PostMapping("/notif")
-
     @GetMapping("/queryEpolicy")
     @Operation(summary = "根据id获取电子保单")
     @OperateLog(type = API)

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

@@ -1,7 +1,6 @@
 package com.yc.ship.module.trade.service.insurance;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.http.HttpUtil;
@@ -10,7 +9,6 @@ import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
-import com.yc.ship.framework.common.exception.ServiceException;
 import com.yc.ship.framework.common.pojo.CommonResult;
 import com.yc.ship.framework.common.pojo.PageResult;
 import com.yc.ship.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -21,8 +19,6 @@ 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.InsuredRespDTO;
-import com.yc.ship.module.trade.controller.admin.insurance.vo.HccResult;
 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;
@@ -32,15 +28,10 @@ import com.yc.ship.module.trade.dal.dataobject.insurance.InsuranceDO;
 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;
-import com.yc.ship.module.trade.enums.CardTypeEnum;
-import com.yc.ship.module.trade.enums.CredentialTypeEnum;
 import com.yc.ship.module.trade.enums.InsuranceStatusEnum;
-import com.yc.ship.module.trade.service.order.TradeOrderService;
-import com.yc.ship.module.trade.utils.CommonUUCodeUtils;
 import com.yc.ship.module.trade.utils.InsuranceRequestHelper;
 import com.yc.ship.module.trade.utils.InsuranceUtil;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Value;
@@ -49,9 +40,6 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.time.ZoneId;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -157,7 +145,7 @@ public class InsuranceServiceImpl implements InsuranceService {
         insuranceOrderInfoDTO.setBeginDate(DateUtil.format(voyage.getBoardingTime(), "yyyy-MM-dd"));
         insuranceOrderInfoDTO.setEndDate(DateUtil.format(voyage.getLeaveTime(), "yyyy-MM-dd"));
         insuranceOrderInfoDTO.setCurrencyCode("CNY");
-        insuranceOrderInfoDTO.setBizType(1);
+        insuranceOrderInfoDTO.setBizType(0);
         insuranceOrderInfoDTO.setApplicantType(1);
         insuranceOrderInfoDTO.setApplicant("宜昌长江国际旅行社有限公司");
         insuranceOrderInfoDTO.setApplicantCertificateType(6);
@@ -195,6 +183,7 @@ public class InsuranceServiceImpl implements InsuranceService {
         // 开始投保
         CommonResult commonResult = insuranceUtil.sendInsuranceApply(insuranceApplyReqDTO);
         if(!commonResult.isSuccess()) {
+            Object checkedData = commonResult.getCheckedData();
             throw exception0(commonResult.getCode(),commonResult.getMsg());
         }
         //保存投保信息

+ 8 - 3
ship-module-trade/ship-module-trade-biz/src/main/java/com/yc/ship/module/trade/utils/InsuranceUtil.java

@@ -93,12 +93,17 @@ public class InsuranceUtil {
             }
 
             log.info("阳光系统响应内容: {}", responseBody);
+            JSONObject responseBodyJson = JSONObject.parseObject(responseBody);
 
             if (response.getStatusCode() == HttpStatus.OK) {
-                // 返回阳光系统的原始响应内容
-                return CommonResult.success(responseBody);
+                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);
+                return CommonResult.error(500, "阳光系统投保返回错误: " + response.getStatusCode() + responseBody);
             }
 
         } catch (Exception e) {