Sfoglia il codice sorgente

fix: 营销政策后台管理

luofeiyun 2 settimane fa
parent
commit
51eaaee305
18 ha cambiato i file con 1148 aggiunte e 0 eliminazioni
  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

+ 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);
+    }
+
+}