Bladeren bron

update: 营销规则\推送记录模块

lwh 2 weken geleden
bovenliggende
commit
bc0406c6a6
15 gewijzigde bestanden met toevoegingen van 936 en 0 verwijderingen
  1. 36 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/rule/PageMktRuleDTO.java
  2. 52 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/rule/SaveMktRuleDTO.java
  3. 81 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtKeyword.java
  4. 105 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtPushRecord.java
  5. 117 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtRule.java
  6. 68 0
      pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/vo/rule/PageMktRuleVO.java
  7. 27 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/controller/MktMgmtPushRecordController.java
  8. 57 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/controller/MktMgmtRuleController.java
  9. 15 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtKeywordMapper.java
  10. 15 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtPushRecordMapper.java
  11. 15 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtRuleMapper.java
  12. 11 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/MktMgmtPushRecordService.java
  13. 39 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/MktMgmtRuleService.java
  14. 21 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/impl/MktMgmtPushRecordServiceImpl.java
  15. 277 0
      pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/impl/MktMgmtRuleServiceImpl.java

+ 36 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/rule/PageMktRuleDTO.java

@@ -0,0 +1,36 @@
+package com.pig4cloud.pig.marketing.api.dto.rule;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 分页查询营销规则入参
+ */
+@Data
+@Schema(description = "分页查询营销规则入参")
+public class PageMktRuleDTO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "每页显示条数", example = "10")
+	private long size = 10;
+
+	@Schema(description = "当前页", example = "1")
+	private long current = 1;
+
+	@Schema(description = "ip", example = "192.168.1.1")
+	private String ip;
+
+	@Schema(description = "关键字")
+	private String keyword;
+
+	@Schema(description = "域名")
+	private String domain;
+}

+ 52 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/dto/rule/SaveMktRuleDTO.java

@@ -0,0 +1,52 @@
+package com.pig4cloud.pig.marketing.api.dto.rule;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 新增/修改营销规则入参
+ */
+@Data
+@Schema(description = "新增/修改营销规则入参")
+public class SaveMktRuleDTO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "id")
+	private Long id;
+
+	@Schema(description = "规则名称")
+	@NotBlank(message = "规则名称不能为空")
+	private String ruleName;
+
+	@Schema(description = "关键字")
+	@NotEmpty(message = "关键字不能为空")
+	private List<String> keyword;
+
+	@Schema(description = "ip")
+	private String ip;
+
+	@Schema(description = "域名")
+	private String domain;
+
+	@Schema(description = "推送内容")
+	@NotBlank(message = "推送内容不能为空")
+	private String pushContent;
+
+	@Schema(description = "推送频率")
+	@NotBlank(message = "推送频率不能为空")
+	private String pushFrequency;
+
+	@Schema(description = "备注")
+	private String remark;
+}

+ 81 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtKeyword.java

@@ -0,0 +1,81 @@
+package com.pig4cloud.pig.marketing.api.entity;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.time.LocalDateTime;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 关键字
+ */
+@Data
+@TableName("mkt_mgmt_keyword")
+@Schema(description = "关键字")
+@EqualsAndHashCode(callSuper = true)
+public class MktMgmtKeyword extends Model<MktMgmtKeyword> {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@TableId(value = "id")
+	@Schema(description = "id")
+	private Long id;
+
+	/**
+	 * 规则ID
+	 */
+	@Schema(description = "规则ID")
+	private Long ruleId;
+
+	/**
+	 * 关键字
+	 */
+	@Schema(description = "关键字")
+	private String keyword;
+
+	/**
+	 * 删除标记
+	 */
+	@TableLogic
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "删除标记,1:已删除,0:正常")
+	private String delFlag;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建人")
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "修改人")
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建时间")
+	private LocalDateTime createTime;
+
+	/**
+	 * 更新时间
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "更新时间")
+	private LocalDateTime updateTime;
+}

+ 105 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtPushRecord.java

@@ -0,0 +1,105 @@
+package com.pig4cloud.pig.marketing.api.entity;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.time.LocalDateTime;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销推送记录
+ */
+@Data
+@TableName("mkt_mgmt_push_record")
+@Schema(description = "营销推送记录")
+@EqualsAndHashCode(callSuper = true)
+public class MktMgmtPushRecord extends Model<MktMgmtPushRecord> {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@TableId(value = "id")
+	@Schema(description = "id")
+	private Long id;
+
+	/**
+	 * 规则名称
+	 */
+	@Schema(description = "规则名称")
+	private String ruleName;
+
+	/**
+	 * 推送内容
+	 */
+	@Schema(description = "推送内容")
+	private String pushContent;
+
+	/**
+	 * 推送频率
+	 */
+	@Schema(description = "推送频率")
+	private String pushFrequency;
+
+	/**
+	 * 推送状态
+	 */
+	@Schema(description = "推送状态")
+	private Boolean pushStatus;
+
+	/**
+	 * 触发条件
+	 */
+	@Schema(description = "触发条件")
+	private String triggerCondition;
+
+	/**
+	 * 推送详情
+	 */
+	@Schema(description = "推送详情")
+	private String pushDetail;
+
+	/**
+	 * 删除标记
+	 */
+	@TableLogic
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "删除标记,1:已删除,0:正常")
+	private String delFlag;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建人")
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "修改人")
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建时间")
+	private LocalDateTime createTime;
+
+	/**
+	 * 更新时间
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "更新时间")
+	private LocalDateTime updateTime;
+}

+ 117 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/entity/MktMgmtRule.java

@@ -0,0 +1,117 @@
+package com.pig4cloud.pig.marketing.api.entity;
+
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.time.LocalDateTime;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销管理规则
+ */
+@Data
+@TableName("mkt_mgmt_rule")
+@Schema(description = "营销管理规则")
+@EqualsAndHashCode(callSuper = true)
+public class MktMgmtRule extends Model<MktMgmtRule> {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@TableId(value = "id")
+	@Schema(description = "id")
+	private Long id;
+
+	/**
+	 * 规则名称
+	 */
+	@Schema(description = "规则名称")
+	private String ruleName;
+
+	/**
+	 * ip模式
+	 */
+	@Schema(description = "ip模式,1-单IP,2-IP段")
+	private Integer ipMode;
+
+	/**
+	 * 起始IP地址
+	 */
+	@Schema(description = "起始IP地址")
+	private String startIp;
+
+	/**
+	 * 结束IP地址
+	 */
+	@Schema(description = "结束IP地址")
+	private String endIp;
+
+	/**
+	 * 域名
+	 */
+	@Schema(description = "域名")
+	private String domain;
+
+	/**
+	 * 推送内容
+	 */
+	@Schema(description = "推送内容")
+	private String pushContent;
+
+	/**
+	 * 推送频率
+	 */
+	@Schema(description = "推送频率")
+	private String pushFrequency;
+
+	/**
+	 * 备注
+	 */
+	@Schema(description = "备注")
+	private String remark;
+
+	/**
+	 * 删除标记
+	 */
+	@TableLogic
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "删除标记,1:已删除,0:正常")
+	private String delFlag;
+
+	/**
+	 * 创建人
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建人")
+	private String createBy;
+
+	/**
+	 * 修改人
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "修改人")
+	private String updateBy;
+
+	/**
+	 * 创建时间
+	 */
+	@TableField(fill = FieldFill.INSERT)
+	@Schema(description = "创建时间")
+	private LocalDateTime createTime;
+
+	/**
+	 * 更新时间
+	 */
+	@TableField(fill = FieldFill.UPDATE)
+	@Schema(description = "更新时间")
+	private LocalDateTime updateTime;
+}

+ 68 - 0
pig-marketing/pig-marketing-api/src/main/java/com/pig4cloud/pig/marketing/api/vo/rule/PageMktRuleVO.java

@@ -0,0 +1,68 @@
+package com.pig4cloud.pig.marketing.api.vo.rule;
+
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: TODO
+ */
+@Data
+@Schema(description = "分页查询营销规则列表出参")
+public class PageMktRuleVO implements Serializable {
+
+	@Serial
+	private static final long serialVersionUID = 1L;
+
+	@Schema(description = "id")
+	private Long id;
+
+	/**
+	 * 规则名称
+	 */
+	@Schema(description = "规则名称")
+	private String ruleName;
+
+	/**
+	 * 关键词
+	 */
+	@Schema(description = "关键词")
+	private List<String> keyword;
+
+	/**
+	 * ip
+	 */
+	@Schema(description = "ip")
+	private String ip;
+
+	/**
+	 * 域名
+	 */
+	@Schema(description = "域名")
+	private String domain;
+
+	/**
+	 * 推送内容
+	 */
+	@Schema(description = "推送内容")
+	private String pushContent;
+
+	/**
+	 * 推送频率
+	 */
+	@Schema(description = "推送频率")
+	private String pushFrequency;
+
+	/**
+	 * 备注
+	 */
+	@Schema(description = "备注")
+	private String remark;
+
+}

+ 27 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/controller/MktMgmtPushRecordController.java

@@ -0,0 +1,27 @@
+package com.pig4cloud.pig.marketing.controller;
+
+
+import com.pig4cloud.pig.marketing.service.MktMgmtPushRecordService;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.AllArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销推送记录
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/push")
+@Tag(description = "marketingPush", name = "营销推送记录")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class MktMgmtPushRecordController {
+
+	private final MktMgmtPushRecordService mktMgmtPushRecordService;
+
+
+}

+ 57 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/controller/MktMgmtRuleController.java

@@ -0,0 +1,57 @@
+package com.pig4cloud.pig.marketing.controller;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.common.core.util.R;
+import com.pig4cloud.pig.marketing.api.dto.app.ModMarketingAppsIpDTO;
+import com.pig4cloud.pig.marketing.api.dto.rule.PageMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.dto.rule.SaveMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.vo.rule.PageMktRuleVO;
+import com.pig4cloud.pig.marketing.service.MktMgmtRuleService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.AllArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销管理规则
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/rule")
+@Tag(description = "marketingRule", name = "营销规则")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class MktMgmtRuleController {
+
+	private final MktMgmtRuleService mktMgmtRuleService;
+
+
+	@PostMapping("/save")
+	@Operation(summary = "新增/修改营销规则")
+	public R<String> saveRule(@Valid @RequestBody SaveMktRuleDTO reqDto) {
+		mktMgmtRuleService.saveMktRule(reqDto);
+		return R.ok();
+	}
+
+	@GetMapping("/del")
+	@Operation(summary = "删除营销规则")
+	public R<Boolean> delRule(@Valid @NotEmpty(message = "id列表不能为空") @RequestParam List<Long> ids) {
+		return R.ok(mktMgmtRuleService.delMktRuleByIds(ids));
+	}
+
+	@PostMapping("/page")
+	@Operation(summary = "分页查询营销规则")
+	public R<Page<PageMktRuleVO>> pageRule(@Valid @RequestBody PageMktRuleDTO reqDto) {
+		Page<PageMktRuleVO> result = mktMgmtRuleService.pageMktRule(reqDto);
+		return R.ok(result);
+	}
+}

+ 15 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtKeywordMapper.java

@@ -0,0 +1,15 @@
+package com.pig4cloud.pig.marketing.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pig4cloud.pig.marketing.api.entity.MktMgmtKeyword;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 关键字Mapper
+ */
+@Mapper
+public interface MktMgmtKeywordMapper extends BaseMapper<MktMgmtKeyword> {
+}

+ 15 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtPushRecordMapper.java

@@ -0,0 +1,15 @@
+package com.pig4cloud.pig.marketing.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pig4cloud.pig.marketing.api.entity.MktMgmtPushRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销推送记录Mapper
+ */
+@Mapper
+public interface MktMgmtPushRecordMapper extends BaseMapper<MktMgmtPushRecord> {
+}

+ 15 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/mapper/MktMgmtRuleMapper.java

@@ -0,0 +1,15 @@
+package com.pig4cloud.pig.marketing.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.pig4cloud.pig.marketing.api.entity.MktMgmtRule;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销管理规则Mapper
+ */
+@Mapper
+public interface MktMgmtRuleMapper extends BaseMapper<MktMgmtRule> {
+}

+ 11 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/MktMgmtPushRecordService.java

@@ -0,0 +1,11 @@
+package com.pig4cloud.pig.marketing.service;
+
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销推送记录Service
+ */
+
+public interface MktMgmtPushRecordService {
+}

+ 39 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/MktMgmtRuleService.java

@@ -0,0 +1,39 @@
+package com.pig4cloud.pig.marketing.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.marketing.api.dto.rule.PageMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.dto.rule.SaveMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.vo.rule.PageMktRuleVO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销管理规则Service
+ */
+
+public interface MktMgmtRuleService {
+
+	/**
+	 * 保存/修改营销规则
+	 * @param reqDto 入参
+	 */
+	void saveMktRule(@Valid SaveMktRuleDTO reqDto);
+
+	/**
+	 * 删除营销规则
+	 * @param ids ids
+	 * @return Boolean
+	 */
+	Boolean delMktRuleByIds(List<Long> ids);
+
+	/**
+	 * 分页查询营销规则
+	 * @param reqDto 入参
+	 * @return Page
+	 */
+	Page<PageMktRuleVO> pageMktRule(@Valid PageMktRuleDTO reqDto);
+}

+ 21 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/impl/MktMgmtPushRecordServiceImpl.java

@@ -0,0 +1,21 @@
+package com.pig4cloud.pig.marketing.service.impl;
+
+
+import com.pig4cloud.pig.marketing.mapper.MktMgmtPushRecordMapper;
+import com.pig4cloud.pig.marketing.service.MktMgmtPushRecordService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销推送记录Service实现类
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class MktMgmtPushRecordServiceImpl implements MktMgmtPushRecordService {
+
+	private final MktMgmtPushRecordMapper mktMgmtPushRecordMapper;
+}

+ 277 - 0
pig-marketing/pig-marketing-biz/src/main/java/com/pig4cloud/pig/marketing/service/impl/MktMgmtRuleServiceImpl.java

@@ -0,0 +1,277 @@
+package com.pig4cloud.pig.marketing.service.impl;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.pig4cloud.pig.common.core.exception.BusinessException;
+import com.pig4cloud.pig.marketing.api.dto.rule.PageMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.dto.rule.SaveMktRuleDTO;
+import com.pig4cloud.pig.marketing.api.entity.MktMgmtKeyword;
+import com.pig4cloud.pig.marketing.api.entity.MktMgmtRule;
+import com.pig4cloud.pig.marketing.api.vo.rule.PageMktRuleVO;
+import com.pig4cloud.pig.marketing.mapper.MktMgmtKeywordMapper;
+import com.pig4cloud.pig.marketing.mapper.MktMgmtRuleMapper;
+import com.pig4cloud.pig.marketing.service.MktMgmtRuleService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author: lwh
+ * @date: 2025-08-31
+ * @description: 营销管理规则Service实现类
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class MktMgmtRuleServiceImpl implements MktMgmtRuleService {
+
+	private final MktMgmtRuleMapper mktMgmtRuleMapper;
+
+	private final MktMgmtKeywordMapper mktMgmtKeywordMapper;
+
+	/**
+	 * 保存/修改营销规则
+	 * @param reqDto 入参
+	 */
+	@Override
+	@Transactional
+	public void saveMktRule(SaveMktRuleDTO reqDto) {
+		if (reqDto.getId() == null) {
+			// 新增规则
+			MktMgmtRule rule = new MktMgmtRule();
+			BeanUtils.copyProperties(reqDto, rule);
+			mktMgmtRuleMapper.insert(rule);
+
+			// 保存关键字
+			List<String> keywords = reqDto.getKeyword();
+
+			for (String keyword : keywords) {
+				MktMgmtKeyword mktMgmtKeyword = new MktMgmtKeyword();
+				mktMgmtKeyword.setKeyword(keyword);
+				mktMgmtKeyword.setRuleId(rule.getId());
+				mktMgmtKeywordMapper.insert(mktMgmtKeyword);
+			}
+		}else {
+			// 1. 更新主规则信息
+			MktMgmtRule mktMgmtRule = mktMgmtRuleMapper.selectById(reqDto.getId());
+			if (mktMgmtRule == null) {
+				throw new BusinessException("规则不存在");
+			}
+			MktMgmtRule rule = new MktMgmtRule();
+			BeanUtils.copyProperties(reqDto, rule);
+			mktMgmtRuleMapper.updateById(rule);
+
+			// 2. 处理关键字(先删除旧的,再添加新的)
+			Long ruleId = reqDto.getId();
+			List<String> newKeywords = reqDto.getKeyword();
+			newKeywords = newKeywords == null ? Collections.emptyList() : newKeywords;
+
+			List<MktMgmtKeyword> oldKeywords = mktMgmtKeywordMapper.selectList(Wrappers.<MktMgmtKeyword>lambdaQuery()
+					.eq(MktMgmtKeyword::getRuleId, ruleId));
+			Set<String> oldKeywordSet = oldKeywords.stream()
+					.map(MktMgmtKeyword::getKeyword)
+					.collect(Collectors.toSet());
+
+			// 2. 提取新关键字集合
+			Set<String> newKeywordSet = new HashSet<>(newKeywords);
+
+			// 3. 处理需要删除的关键字
+			List<Long> needDeleteIds = oldKeywords.stream()
+					.filter(keyword -> !newKeywordSet.contains(keyword.getKeyword()))
+					.map(MktMgmtKeyword::getId)
+					.toList();
+			if (!needDeleteIds.isEmpty()) {
+				mktMgmtKeywordMapper.deleteByIds(needDeleteIds);
+			}
+			// 4. 处理需要新增的关键字(存在于新列表但不存在于旧列表)
+			List<String> needAddKeywords = newKeywordSet.stream()
+					.filter(keyword -> !oldKeywordSet.contains(keyword))
+					.toList();
+			if (!needAddKeywords.isEmpty()) {
+				for (String keyword : needAddKeywords) {
+					MktMgmtKeyword mktMgmtKeyword = new MktMgmtKeyword();
+					mktMgmtKeyword.setKeyword(keyword);
+					mktMgmtKeyword.setRuleId(ruleId);
+					mktMgmtKeywordMapper.insert(mktMgmtKeyword);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * 删除营销规则
+	 * @param ids ids
+	 * @return Boolean
+	 */
+	@Override
+	@Transactional
+	public Boolean delMktRuleByIds(List<Long> ids) {
+		int i = mktMgmtRuleMapper.deleteByIds(ids);
+		int delete = mktMgmtKeywordMapper.delete(Wrappers.<MktMgmtKeyword>lambdaQuery()
+				.in(MktMgmtKeyword::getRuleId, ids));
+
+		return i > 0 && delete > 0;
+	}
+
+	/**
+	 * 分页查询营销规则
+	 * @param reqDto 入参
+	 * @return Page
+	 */
+//	@Override
+	public Page<PageMktRuleVO> pageMktRule2(PageMktRuleDTO reqDto) {
+		Page<MktMgmtRule> page = new Page<>(reqDto.getCurrent(), reqDto.getSize());
+		// 1、根据入参条件查询规则
+		// 1.1、关键字模糊查询
+		// 1.2、IP模糊查询,包括IP段,如192.168.1.10,如果数据库中有192.168.1.1/10(192.168.1.1~192.168.1.10)也是符合条件
+		// 1.3、域名模糊查询
+
+		// 根据ruleId查询关键字
+
+
+		return null;
+	}
+
+//	@Override
+	public Page<PageMktRuleVO> pageMktRule3(PageMktRuleDTO reqDto) {
+		// 初始化分页参数
+		Page<MktMgmtRule> page = new Page<>(reqDto.getCurrent(), reqDto.getSize());
+
+		// 构建查询条件
+		QueryWrapper<MktMgmtRule> queryWrapper = new QueryWrapper<>();
+		// 过滤已删除的数据
+		queryWrapper.eq("del_flag", "0");
+
+		// 1.1 关键字模糊查询(关联关键字表)
+		if (StringUtils.hasText(reqDto.getKeyword())) {
+			// 使用子查询关联关键字表,查询包含该关键字的规则ID
+			queryWrapper.inSql("id",
+					"SELECT DISTINCT rule_id FROM mkt_mgmt_keyword WHERE keyword LIKE CONCAT('%', #{keyword}, '%') AND del_flag = '0'");
+		}
+
+		// 1.2 IP模糊查询(支持IP段匹配)
+		if (StringUtils.hasText(reqDto.getIp())) {
+			queryWrapper.like("ip", reqDto.getIp());
+		}
+
+		// 1.3 域名模糊查询
+		if (StringUtils.hasText(reqDto.getDomain())) {
+			queryWrapper.like("domain", reqDto.getDomain());
+		}
+
+		// 执行分页查询
+		Page<MktMgmtRule> rulePage = mktMgmtRuleMapper.selectPage(page, queryWrapper);
+
+		// 转换为VO并补充关键字信息
+		IPage<PageMktRuleVO> iPage = rulePage.convert(rule -> {
+			PageMktRuleVO vo = new PageMktRuleVO();
+			BeanUtils.copyProperties(rule, vo);
+
+			// 查询当前规则关联的所有关键字
+			QueryWrapper<MktMgmtKeyword> keywordQuery = new QueryWrapper<>();
+			keywordQuery.eq("rule_id", rule.getId())
+					.eq("del_flag", "0");
+			List<MktMgmtKeyword> keywords = mktMgmtKeywordMapper.selectList(keywordQuery);
+			// 提取关键字字符串列表
+			List<String> keywordList = keywords.stream()
+					.map(MktMgmtKeyword::getKeyword)
+					.collect(Collectors.toList());
+			vo.setKeyword(keywordList);
+
+			return vo;
+		});
+
+		Page<PageMktRuleVO> result = new Page<>(iPage.getCurrent(), iPage.getSize(), iPage.getTotal());
+		result.setRecords(iPage.getRecords());
+		result.setPages(iPage.getPages());
+		result.setTotal(iPage.getTotal());
+		result.setSize(iPage.getSize());
+		result.setCurrent(iPage.getCurrent());
+		return result;
+	}
+
+	@Override
+	public Page<PageMktRuleVO> pageMktRule(PageMktRuleDTO reqDto) {
+		Page<MktMgmtRule> page = new Page<>(reqDto.getCurrent(), reqDto.getSize());
+
+		// 构建查询条件
+		QueryWrapper<MktMgmtRule> queryWrapper = new QueryWrapper<>();
+
+		// 1.1、关键字模糊查询 - 通过关联查询关键字表
+		if (StringUtils.hasText(reqDto.getKeyword())) {
+			// 先查询包含该关键字的规则ID
+			List<MktMgmtKeyword> keywords = mktMgmtKeywordMapper.selectList(
+					Wrappers.<MktMgmtKeyword>lambdaQuery()
+							.like(MktMgmtKeyword::getKeyword, reqDto.getKeyword())
+			);
+
+			if (!keywords.isEmpty()) {
+				List<Long> ruleIds = keywords.stream()
+						.map(MktMgmtKeyword::getRuleId)
+						.distinct()
+						.collect(Collectors.toList());
+				queryWrapper.in("id", ruleIds);
+			} else {
+				// 如果没有找到匹配的关键字,返回空结果
+				return new Page<>();
+			}
+		}
+
+		// 1.2、IP模糊查询,包括IP段
+		// 1.2、IP匹配逻辑 - 支持单IP和IP段匹配
+		if (StringUtils.hasText(reqDto.getIp())) {
+			String inputIp = reqDto.getIp();
+		}
+
+		// 1.3、域名模糊查询
+		if (StringUtils.hasText(reqDto.getDomain())) {
+			queryWrapper.like("domain", reqDto.getDomain());
+		}
+
+		// 按创建时间倒序排列
+		queryWrapper.orderByDesc("create_time");
+
+		// 执行分页查询
+		Page<MktMgmtRule> rulePage = mktMgmtRuleMapper.selectPage(page, queryWrapper);
+
+		// 转换为VO对象
+		Page<PageMktRuleVO> resultPage = new Page<>(reqDto.getCurrent(), reqDto.getSize());
+		resultPage.setTotal(rulePage.getTotal());
+		resultPage.setPages(rulePage.getPages());
+
+		List<PageMktRuleVO> voList = rulePage.getRecords().stream().map(rule -> {
+			PageMktRuleVO vo = new PageMktRuleVO();
+			BeanUtils.copyProperties(rule, vo);
+
+			// 查询该规则对应的关键字列表
+			List<MktMgmtKeyword> keywords = mktMgmtKeywordMapper.selectList(
+					Wrappers.<MktMgmtKeyword>lambdaQuery()
+							.eq(MktMgmtKeyword::getRuleId, rule.getId())
+			);
+
+			List<String> keywordList = keywords.stream()
+					.map(MktMgmtKeyword::getKeyword)
+					.collect(Collectors.toList());
+			vo.setKeyword(keywordList);
+
+			return vo;
+		}).collect(Collectors.toList());
+
+		resultPage.setRecords(voList);
+
+		return resultPage;
+	}
+}