helixiao 1 жил өмнө
parent
commit
84b1d58687
19 өөрчлөгдсөн 1066 нэмэгдсэн , 0 устгасан
  1. 130 0
      linkwe-api/src/main/java/com/linkwechat/controller/WeIntelligentMarkController.java
  2. 56 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/config/AsyncTaskConfig.java
  3. 33 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/controller/ScheduledIntelligentController.java
  4. 70 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocaOrder.java
  5. 13 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocalAppUser.java
  6. 61 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocalAppUserLevel.java
  7. 59 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/WeCustViewRecord.java
  8. 16 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/LocalAppUserLevelMapper.java
  9. 12 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/LocalOrderMapper.java
  10. 9 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/WeCustViewRecordMapper.java
  11. 363 0
      linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/scheduled/ScheduledIntelligentService.java
  12. 77 0
      linkwe-service/src/main/java/com/linkwechat/domain/WeIntelligentMark.java
  13. 21 0
      linkwe-service/src/main/java/com/linkwechat/domain/weIntelligentMark/dto/WeIntelligentMarkPageDto.java
  14. 29 0
      linkwe-service/src/main/java/com/linkwechat/domain/weIntelligentMark/vo/WeIntelligentMarkVo.java
  15. 8 0
      linkwe-service/src/main/java/com/linkwechat/mapper/WeKfMsgMapper.java
  16. 15 0
      linkwe-service/src/main/java/com/linkwechat/mapper/weIntelligentMarkMapper.java
  17. 22 0
      linkwe-service/src/main/java/com/linkwechat/service/IWeIntelligentMarkService.java
  18. 67 0
      linkwe-service/src/main/java/com/linkwechat/service/impl/WeIntelligentMarkServiceImpl.java
  19. 5 0
      linkwe-service/src/main/resources/mapper/wecom/weIntelligentMarkMapper.xml

+ 130 - 0
linkwe-api/src/main/java/com/linkwechat/controller/WeIntelligentMarkController.java

@@ -0,0 +1,130 @@
+package com.linkwechat.controller;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.linkwechat.common.core.controller.BaseController;
+import com.linkwechat.common.core.domain.AjaxResult;
+import com.linkwechat.common.core.page.TableDataInfo;
+import com.linkwechat.common.utils.SecurityUtils;
+import com.linkwechat.domain.WeIntelligentMark;
+import com.linkwechat.domain.kh.BehaviorType;
+import com.linkwechat.domain.weIntelligentMark.dto.WeIntelligentMarkPageDto;
+import com.linkwechat.service.IWeIntelligentMarkService;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import lombok.extern.slf4j.Slf4j;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+ /**
+ * @Description: 智能打标
+ * @Author: jeecg-boot
+ * @Date:   2025-09-01
+ * @Version: V1.0
+ */
+@Slf4j
+@Api(tags="智能打标")
+@RestController
+@RequestMapping("/mark")
+public class WeIntelligentMarkController extends BaseController {
+	@Autowired
+	private IWeIntelligentMarkService weIntelligentMarkService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param weIntelligentMarkPageDto
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-分页列表查询", notes="智能打标-分页列表查询")
+	@GetMapping(value = "/list")
+	public TableDataInfo queryPageList(WeIntelligentMarkPageDto weIntelligentMarkPageDto) {
+		startPage();
+		LambdaQueryWrapper<WeIntelligentMark> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+		if (weIntelligentMarkPageDto.getActionName() != null){
+			lambdaQueryWrapper.like(WeIntelligentMark::getActionName, weIntelligentMarkPageDto.getActionName());
+		}
+		if (weIntelligentMarkPageDto.getTagId() != null){
+			lambdaQueryWrapper.like(WeIntelligentMark::getTagId, weIntelligentMarkPageDto.getTagId());
+		}
+
+		List<WeIntelligentMark> list =weIntelligentMarkService.queryPageList(lambdaQueryWrapper);
+
+		return getDataTable(list);
+	}
+	
+	/**
+	 * 添加
+	 *
+	 * @param WeIntelligentMark
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-添加", notes="智能打标-添加")
+	@PostMapping(value = "/add")
+	public AjaxResult add(@RequestBody WeIntelligentMark WeIntelligentMark) {
+		WeIntelligentMark.setCreateTime(new Date());
+		WeIntelligentMark.setCreateBy(String.valueOf(SecurityUtils.getUserId()));
+		weIntelligentMarkService.save(WeIntelligentMark);
+		return AjaxResult.success("添加成功!");
+	}
+	
+	/**
+	 * 编辑
+	 *
+	 * @param WeIntelligentMark
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-编辑", notes="智能打标-编辑")
+	@PostMapping(value = "/edit")
+	public AjaxResult edit(@RequestBody WeIntelligentMark WeIntelligentMark) {
+		weIntelligentMarkService.updateById(WeIntelligentMark);
+		return AjaxResult.success("编辑成功!");
+	}
+	
+	/**
+	 * 通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-通过id删除", notes="智能打标-通过id删除")
+	@DeleteMapping(value = "/delete")
+	public AjaxResult delete(@RequestParam(name="id",required=true) String id) {
+		weIntelligentMarkService.removeById(id);
+		return AjaxResult.success("删除成功!");
+	}
+	
+	/**
+	 * 批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-批量删除", notes="智能打标-批量删除")
+	@DeleteMapping(value = "/deleteBatch")
+	public AjaxResult deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.weIntelligentMarkService.removeByIds(Arrays.asList(ids.split(",")));
+		return AjaxResult.success("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	@ApiOperation(value="智能打标-通过id查询", notes="智能打标-通过id查询")
+	@GetMapping(value = "/queryById")
+	public AjaxResult queryById(@RequestParam(name="id",required=true) String id) {
+		WeIntelligentMark WeIntelligentMark = weIntelligentMarkService.queryById(id);
+		return AjaxResult.success(WeIntelligentMark);
+	}
+
+
+}

+ 56 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/config/AsyncTaskConfig.java

@@ -0,0 +1,56 @@
+package com.linkwechat.coal.modules.bdshdb.customer.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 异步任务配置类:定义asyncTaskExecutor线程池,开启异步支持
+ */
+@Configuration
+@EnableAsync // 必须添加此注解,否则@Async无效
+public class AsyncTaskConfig {
+
+    /**
+     * 定义名为"asyncTaskExecutor"的线程池Bean
+     * 线程池参数需根据业务场景调整(核心线程数、最大线程数、队列容量等)
+     */
+    @Bean(name = "asyncTaskExecutor") // Bean名称与@Async("asyncTaskExecutor")对应
+    public Executor asyncTaskExecutor() {
+        // 1. 创建线程池实例(Spring提供的ThreadPoolTaskExecutor,基于JDK的ThreadPoolExecutor封装)
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+
+        // 2. 核心线程数:线程池长期保持的最小线程数(即使空闲也不销毁,除非设置allowCoreThreadTimeOut=true)
+        // 建议值:CPU核心数 * 2(或根据任务类型调整,IO密集型任务可适当增大)
+        executor.setCorePoolSize(4);
+
+        // 3. 最大线程数:线程池允许创建的最大线程数(核心线程满+队列满后,才会创建新线程直到最大线程数)
+        executor.setMaxPoolSize(8);
+
+        // 4. 队列容量:核心线程满后,任务会先放入此队列排队(而非直接创建新线程)
+        // 队列容量过大可能导致任务堆积,过小可能频繁触发最大线程数扩容
+        executor.setQueueCapacity(20);
+
+        // 5. 线程空闲时间:非核心线程空闲超过此时间(单位:秒)会被销毁,释放资源
+        executor.setKeepAliveSeconds(60);
+
+        // 6. 线程名称前缀:日志中可通过线程名快速识别该线程池的线程(便于问题排查)
+        executor.setThreadNamePrefix("Async-Schedule-");
+
+        // 7. 任务拒绝策略:当线程池(最大线程满+队列满)无法接收新任务时的处理方式
+        // 常用策略:
+        // - AbortPolicy(默认):直接抛出RejectedExecutionException,中断任务提交
+        // - CallerRunsPolicy:由提交任务的主线程自己执行(避免任务丢失,适合非核心任务)
+        // - DiscardPolicy:默默丢弃任务,不抛异常(不推荐,可能丢失数据)
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+
+        // 8. 初始化线程池:必须调用initialize(),否则线程池不会生效
+        executor.initialize();
+
+        return executor;
+    }
+}

+ 33 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/controller/ScheduledIntelligentController.java

@@ -0,0 +1,33 @@
+package com.linkwechat.coal.modules.bdshdb.customer.controller;
+
+import com.linkwechat.coal.modules.bdshdb.customer.scheduled.ScheduledIntelligentService;
+import com.linkwechat.common.core.domain.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@Slf4j
+@RestController
+@RequestMapping("/intelligent")
+@Api(tags = "智能打标")
+public class ScheduledIntelligentController {
+
+
+    @Resource
+    private ScheduledIntelligentService intelligentService;
+
+    /**
+     * 测试智能打标定时任务
+     * @return
+     */
+    @GetMapping("/scheduled")
+    public AjaxResult ScheduledIntelligent() {
+        intelligentService.scheduledIntelligent();
+        return AjaxResult.success("打标成功!");
+    }
+
+
+}

+ 70 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocaOrder.java

@@ -0,0 +1,70 @@
+package com.linkwechat.coal.modules.bdshdb.customer.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("local_order")
+@ApiModel(value="local_order对象", description="订单表")
+public class LocaOrder{
+
+	/**id*/
+	@ApiModelProperty(value = "主键id")
+	@TableId(value = "id")
+	private String id;
+
+
+	/**订单号*/
+	@ApiModelProperty(value = "订单号")
+	@TableField(value = "order_id")
+	private String orderId;
+
+
+	/**订单状态 0-待使用 1-已使用 2-待评价 3-已过期 4-售后中*/
+	@ApiModelProperty(value = "订单状态 0-待使用 1-已使用 2-待评价 3-已过期 4-售后中 5 待付款")
+	@TableField(value = "state")
+	private String state;
+
+
+	/**下单时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@ApiModelProperty(value = "下单时间")
+	@TableField(value = "buy_time")
+	private Date buyTime;
+
+
+	/**支付时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+	@DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+	@TableField(exist = false)
+	private Date payTime;
+
+	/**用户id*/
+	@ApiModelProperty(value = "用户id")
+	@TableField(value = "user_id")
+	private String userId;
+
+	@ApiModelProperty(value = "订单售价")
+	@TableField(value = "order_price")
+	private BigDecimal orderPrice;
+
+
+}

+ 13 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocalAppUser.java

@@ -70,4 +70,17 @@ public class LocalAppUser {
     @JsonFormat(pattern = "yyyy-MM-dd")
     @TableField("create_time")
     private Date createTime;
+
+    /**
+     * 登录时间
+     */
+    @DateTimeFormat("yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("login_time")
+    private Date loginTime;
+    /**
+     * 等级id
+     */
+    @TableField("level_id")
+    private String levelId;
 }

+ 61 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/LocalAppUserLevel.java

@@ -0,0 +1,61 @@
+package com.linkwechat.coal.modules.bdshdb.customer.domain.entity;
+
+import java.io.Serializable;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.*;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * @Description: 用户等级管理
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("local_app_user_level")
+@ApiModel(value="local_app_user_level对象", description="用户等级管理")
+public class LocalAppUserLevel implements Serializable {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private String id;
+	/**等级名称 */
+    @ApiModelProperty(value = "等级名称 ")
+	private String levelName;
+	/**等级级别 */
+    @ApiModelProperty(value = "等级级别 ")
+	private String level;
+	/**创建者*/
+    @ApiModelProperty(value = "创建者")
+	private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**修改者*/
+    @ApiModelProperty(value = "修改者")
+	private String updateBy;
+	/**修改时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "修改时间")
+	private Date updateTime;
+	/**是否删除(0,:否 1:是)*/
+	@TableLogic(value = "0", delval = "1")
+    @ApiModelProperty(value = "是否删除(0,:否 1:是)")
+	private Integer delFlag;
+	/**备注*/
+    @ApiModelProperty(value = "备注")
+	private String remark;
+}

+ 59 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/domain/entity/WeCustViewRecord.java

@@ -0,0 +1,59 @@
+package com.linkwechat.coal.modules.bdshdb.customer.domain.entity;
+
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@TableName("we_cust_view_record")
+public class WeCustViewRecord {
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @TableField("id")
+    private String id;
+
+    //活动id
+    @TableField("act_id")
+    private String actId;
+
+    //活动类型
+    @TableField("act_type")
+    private String actType;
+
+    //创建人id
+    @TableField("create_user_id")
+    private String createUserId;
+
+    //创建人电话
+    @TableField("create_user_phone")
+    private String createUserPhone;
+
+    //创建人昵称
+    @TableField("create_user_nick_name")
+    private String createUserNickName;
+
+    //创建时间
+    @DateTimeFormat("yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @TableField("create_time")
+    private Date createTime;
+
+    //活动名称
+    @TableField("act_name")
+    private String actName;
+
+}

+ 16 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/LocalAppUserLevelMapper.java

@@ -0,0 +1,16 @@
+package com.linkwechat.coal.modules.bdshdb.customer.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocalAppUserLevel;
+
+/**
+ * @Description: 用户等级管理
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+public interface LocalAppUserLevelMapper extends BaseMapper<LocalAppUserLevel> {
+
+
+
+}

+ 12 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/LocalOrderMapper.java

@@ -0,0 +1,12 @@
+package com.linkwechat.coal.modules.bdshdb.customer.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocaOrder;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface LocalOrderMapper extends BaseMapper<LocaOrder> {
+
+
+
+}

+ 9 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/mapper/WeCustViewRecordMapper.java

@@ -0,0 +1,9 @@
+package com.linkwechat.coal.modules.bdshdb.customer.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.WeCustViewRecord;
+
+public interface WeCustViewRecordMapper extends BaseMapper<WeCustViewRecord> {
+
+
+}

+ 363 - 0
linkwe-chinacoal/src/main/java/com/linkwechat/coal/modules/bdshdb/customer/scheduled/ScheduledIntelligentService.java

@@ -0,0 +1,363 @@
+package com.linkwechat.coal.modules.bdshdb.customer.scheduled;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocaOrder;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocalAppUser;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.LocalAppUserLevel;
+import com.linkwechat.coal.modules.bdshdb.customer.domain.entity.WeCustViewRecord;
+import com.linkwechat.coal.modules.bdshdb.customer.mapper.LocalAppUserLevelMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.mapper.LocalAppUserMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.mapper.LocalOrderMapper;
+import com.linkwechat.coal.modules.bdshdb.customer.mapper.WeCustViewRecordMapper;
+import com.linkwechat.domain.WeCustomer;
+import com.linkwechat.domain.WeIntelligentMark;
+import com.linkwechat.domain.WeKfMsg;
+import com.linkwechat.domain.WeTag;
+import com.linkwechat.domain.customer.WeMakeCustomerTag;
+import com.linkwechat.mapper.WeCustomerMapper;
+import com.linkwechat.mapper.WeKfMsgMapper;
+import com.linkwechat.mapper.WeTagMapper;
+import com.linkwechat.mapper.weIntelligentMarkMapper;
+import com.linkwechat.service.IWeCustomerService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class ScheduledIntelligentService {
+
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
+    @Resource
+    private WeCustomerMapper weCustomerMapper;
+
+    @Resource
+    private weIntelligentMarkMapper weIntelligentMarkMapper;
+    //打标签
+    @Resource
+    private IWeCustomerService weCustomerService;
+
+    @Resource
+    private WeTagMapper weTagMapper;
+
+    @Resource
+    private LocalAppUserMapper localAppUserMapper;
+
+    @Resource
+    private LocalOrderMapper localOrderMapper;
+
+    @Resource
+    private LocalAppUserLevelMapper localAppUserLevelMapper;
+
+    @Resource
+    private WeKfMsgMapper weKfMsgMapper;
+
+    @Resource
+    private WeCustViewRecordMapper weCustViewRecordMapper;
+
+
+    @Async("asyncTaskExecutor")
+    @Scheduled(cron = "0 0 23 * * *") //每天23:00, 每天执行
+    @Transactional(rollbackFor = Exception.class)
+    public void scheduledIntelligent() {
+        // 打印执行信息(包含线程名,验证是否异步)  15513573860 乐意
+        String currentTime = LocalDateTime.now().format(DATE_FORMATTER);
+        log.info("【异步任务1】执行开始时间:{},执行线程:{}", currentTime, Thread.currentThread().getName());
+        //获取智能打标列表
+        List<WeIntelligentMark> markList = weIntelligentMarkMapper.selectList(new LambdaQueryWrapper<WeIntelligentMark>()
+                .orderByAsc(WeIntelligentMark::getActionId));
+
+        markList.forEach(s -> {
+            String actionId = s.getActionId();
+            WeTag weTag1 = weTagMapper.selectOne(new LambdaQueryWrapper<WeTag>().eq(WeTag::getTagId, s.getTagId()));
+            if ("ACT001".equals(actionId)) { //好友添加
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                log.info("----------定时任务操作企业客户数量:-----------" + weCustomerList.size());
+                //查询企业客户未打添加好友标签的人员,打标签
+                List<WeCustomer> customerList = weCustomerList.stream().filter(weCustomer -> weCustomer.getTrackState() == 1)
+                        .collect(Collectors.toList());
+                if (customerList.size() > 0) {
+                    customerList.forEach(c -> {
+                        List<String> list = getStrings(c);
+                        if (!list.contains(weTag1.getTagId())) {
+                            extracted(weTag1, c, list);
+                            log.info("新客户:" + c.getCustomerName() + "----------首次添加标签打标成功!-----------");
+                        }
+                    });
+                }
+            } else if ("ACT003".equals(actionId)) {//链接点击
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(t -> {
+                    //查看客户是否有这个标签
+                    List<String> list = getStrings(t);
+                    if (!list.contains(weTag1.getTagId())) {
+                        LocalAppUser localAppUser = getLocalAppUser(t);
+                        if (localAppUser != null) {
+                            //客户点击的所有活动链接数据
+                            List<WeCustViewRecord> weCustViewRecords = weCustViewRecordMapper.selectList(new LambdaQueryWrapper<WeCustViewRecord>()
+                                    .eq(WeCustViewRecord::getCreateUserId, localAppUser.getId()));
+                            if (weCustViewRecords.size() > 0) {
+                                Map<String, List<WeCustViewRecord>> listMap = weCustViewRecords.stream()
+                                        .collect(Collectors.groupingBy(WeCustViewRecord::getActId));
+                                if (CollectionUtils.isNotEmpty(listMap)) {
+                                    for (List<WeCustViewRecord> recordList : listMap.values()) {
+
+                                        List<WeCustViewRecord> collect = recordList.stream()
+                                                .filter(record -> {
+                                                    // 避免record为null或viewTime为null导致空指针
+                                                    if (record == null || record.getCreateTime() == null) {
+                                                        return false;
+                                                    }
+                                                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                                                    //起始时间
+                                                    Date recordTime = recordList.get(0).getCreateTime();
+                                                    String format1 = sdf.format(recordTime);
+                                                    Date parse1 = null;
+                                                    try {
+                                                        parse1 = sdf.parse(format1);
+                                                    } catch (ParseException e) {
+                                                        throw new RuntimeException(e);
+                                                    }
+                                                    Calendar calendar = Calendar.getInstance();
+                                                    calendar.setTime(recordTime);
+                                                    calendar.add(Calendar.HOUR_OF_DAY, 24);
+                                                    Date result = calendar.getTime();
+                                                    String format = sdf.format(result);
+                                                    Date parse = null;
+                                                    try {
+                                                        parse = sdf.parse(format);
+                                                    } catch (ParseException e) {
+                                                        throw new RuntimeException(e);
+                                                    }
+                                                    // 时间匹配:大于等于起始时间 且 小于等于结束时间
+                                                    return !recordTime.before(parse1) && !recordTime.after(parse);
+                                                })
+                                                .collect(Collectors.toList());
+                                        if (collect.size() > Integer.parseInt(s.getMarkRules1())) {
+                                            extracted(weTag1, t, list);
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                });
+            } else if ("ACT010".equals(actionId)) {//历史消费行为
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(t -> {
+                    //打过标签,不再打此标签
+                    List<String> list = getStrings(t);
+                    if (!list.contains(weTag1.getTagId())) {
+                        LocalAppUser localAppUser = getLocalAppUser(t);
+                        if (localAppUser != null) {
+                            List<LocaOrder> locaOrders = localOrderMapper.selectList(new LambdaQueryWrapper<LocaOrder>()
+                                    .eq(LocaOrder::getUserId, localAppUser.getId()).ne(LocaOrder::getState, "1"));
+                            if (locaOrders.size() > 0) {
+                                BigDecimal reduce = locaOrders.stream().map(order -> Optional.ofNullable(order.getOrderPrice()).orElse(BigDecimal.ZERO)).reduce(BigDecimal.ZERO, BigDecimal::add);
+                                String markRules1 = s.getMarkRules1();
+                                BigDecimal bigDecimal = new BigDecimal(markRules1);
+                                //订单金额超过规则值
+                                if (reduce.compareTo(bigDecimal) > 0) {
+                                    //查询客户已有的标签信息
+                                    extracted(weTag1, t, list);
+                                }
+                            }
+                        } else {
+                            log.info("------------生活平台{" + t.getCustomerName() + "}用户不存在!历史消费标签未打成功!------------");
+                        }
+                    }
+                });
+            } else if ("ACT006".equals(actionId)) {//沉默行为
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(w -> {
+                    List<String> list = getStrings(w);
+                    //查询每个用户生活平台30天内是否登陆
+                    LocalAppUser localAppUser = getLocalAppUser(w);
+                    if (localAppUser != null && localAppUser.getLoginTime() != null) {
+                        Date loginTime = localAppUser.getLoginTime();
+                        Calendar calendar = Calendar.getInstance();
+                        calendar.setTime(loginTime);
+                        calendar.add(Calendar.DATE, 30);
+                        //30天后的时间
+                        Date result = calendar.getTime();
+                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                        String format = sdf.format(result);
+                        Date parse = null;
+                        try {
+                            parse = sdf.parse(format);
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        //当前时间
+                        Date date = new Date();
+                        String date1 = sdf.format(date);
+                        Date parse1 = null;
+                        try {
+                            parse1 = sdf.parse(date1);
+                        } catch (ParseException e) {
+                            throw new RuntimeException(e);
+                        }
+                        boolean before = parse.before(parse1);
+                        if (before) {
+                            if (!list.contains(weTag1.getTagId())) {
+                                //打客户已有的标签和沉睡标签
+                                extracted(weTag1, w, list);
+                            }
+                        } else {
+                            if (list.contains(weTag1.getTagId())) {
+                                //用户已登录,取掉沉睡用户标签
+                                list.remove(weTag1.getTagId());
+                                extracted2(weTag1, w, list);
+                            }
+                        }
+                    } else {
+                        log.info("------------生活平台{" + w.getCustomerName() + "}用户不存在,或者无登录时间!沉默客户30天标签未打成功!------------");
+                    }
+                });
+            } else if ("ACT005".equals(actionId)) {//首次消费下单
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(t -> {
+                    //客户已经搭过首次消费下单标签,不在打此标签
+                    List<String> list = getStrings(t);
+                    if (!list.contains(weTag1.getTagId())) {
+                        LocalAppUser localAppUser = getLocalAppUser(t);
+                        if (localAppUser != null) {
+                            List<LocaOrder> locaOrders = localOrderMapper.selectList(new LambdaQueryWrapper<LocaOrder>()
+                                    .eq(LocaOrder::getUserId, localAppUser.getId()).ne(LocaOrder::getState, 1));
+                            if (locaOrders.size() > 0) {
+                                extracted(weTag1, t, list);
+                            }
+                        } else {
+                            log.info("------------生活平台{" + t.getCustomerName() + "}用户不存在!首次消费下单标签未打成功!------------");
+                        }
+                    }
+
+                });
+            } else if ("ACT008".equals(actionId)) {//会员钻石等级变动
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(t -> {
+                    List<String> list = getStrings(t);
+                    if (!list.contains(weTag1.getTagId())) {
+                        LocalAppUser localAppUser = getLocalAppUser(t);
+                        if (localAppUser != null && StringUtils.isNotBlank(localAppUser.getLevelId())) {
+                            LocalAppUserLevel localAppUserLevel = localAppUserLevelMapper.selectById(localAppUser.getLevelId());
+                            if (localAppUserLevel.getLevelName().equals("钻石")) {
+                                extracted(weTag1, t, list);
+                            }
+                        } else {
+                            log.info("------------生活平台{" + t.getCustomerName() + "}用户不存在!会员钻石等级变动标签未打成功!------------");
+                        }
+                    }
+                });
+            } else if ("ACT009".equals(actionId)) {//关键词互动
+                List<WeCustomer> weCustomerList = getWeCustomers();
+                weCustomerList.forEach(t -> {
+                    List<String> list = getStrings(t);
+                    String[] split = s.getMarkRules1().split(",");
+                    Date date = new Date();
+                    date.setHours(0);
+                    date.setMinutes(0);
+                    date.setSeconds(1);
+                    List<WeKfMsg> weKfMsgList = weKfMsgMapper.selectList(new LambdaQueryWrapper<WeKfMsg>()
+                            .eq(WeKfMsg::getExternalUserid, t.getExternalUserid())
+                            .eq(WeKfMsg::getOrigin, 3)
+                            .eq(WeKfMsg::getDelFlag, 0)
+                            .eq(WeKfMsg::getMsgType, "text")
+                            .like(WeKfMsg::getContent, split[0])
+                            .or().like(WeKfMsg::getContent, split[1])
+                            .or().like(WeKfMsg::getContent, split[2])
+                            .gt(WeKfMsg::getCreateTime, date));
+                    if (weKfMsgList.size() > 0) {
+                        if (!list.contains(weTag1.getTagId())) {
+                            extracted(weTag1, t, list);
+                        }
+                    } else {
+                        if (list.contains(weTag1.getTagId())) {
+                            //取掉敏感词标签
+                            list.remove(weTag1.getTagId());
+                            extracted2(weTag1, t, list);
+                        }
+                    }
+                });
+            }
+
+        });
+
+        String endTime = LocalDateTime.now().format(DATE_FORMATTER);
+        log.info("【异步任务1】执行结束时间:{},执行线程:{}", endTime, Thread.currentThread().getName());
+    }
+
+    private LocalAppUser getLocalAppUser(WeCustomer t) {
+        return localAppUserMapper.selectOne(new LambdaQueryWrapper<LocalAppUser>()
+                .eq(LocalAppUser::getUserType, "1").eq(LocalAppUser::getPhone, t.getPhone()));
+    }
+
+    private List<WeCustomer> getWeCustomers() {
+        return weCustomerMapper.selectList(new LambdaQueryWrapper<WeCustomer>()
+                .eq(WeCustomer::getDelFlagBa, 0)
+                .isNotNull(WeCustomer::getPhone)
+                .ne(WeCustomer::getPhone, ""));
+    }
+
+    private List<String> getStrings(WeCustomer t) {
+        String tagIds = t.getTagIds();
+        String[] split = tagIds.split(",");
+        return new ArrayList<>(Arrays.asList(split));
+    }
+
+    private void extracted(WeTag weTag, WeCustomer t, List<String> list) {
+        List<WeTag> weTagList = new ArrayList<>();
+        WeMakeCustomerTag weMakeCustomerTag = new WeMakeCustomerTag();
+        if (list.size() > 0) {
+            //查询客户已有的标签信息
+            List<WeTag> weTagList2 = weTagMapper.selectList(new LambdaQueryWrapper<WeTag>().in(WeTag::getTagId, list));
+            //已有标签
+            weTagList.addAll(weTagList2);
+        }
+        //新赠标签
+        weTagList.add(weTag);
+        weMakeCustomerTag.setAddTag(weTagList);
+
+        weMakeCustomerTag.setExternalUserid(t.getExternalUserid());
+        weMakeCustomerTag.setUserId(t.getAddUserId());
+        //打标签
+        weCustomerService.makeLabel(weMakeCustomerTag);
+        log.info("客户:" + t.getCustomerName() + "---智能打标成功---标签为" + weTag.getName());
+    }
+
+    private void extracted2(WeTag weTag, WeCustomer t, List<String> list) {
+        List<WeTag> weTagList = new ArrayList<>();
+        WeMakeCustomerTag weMakeCustomerTag = new WeMakeCustomerTag();
+        if (list.size() > 0) {
+            //查询客户已有的标签信息
+            List<WeTag> weTagList2 = weTagMapper.selectList(new LambdaQueryWrapper<WeTag>().in(WeTag::getTagId, list));
+            //已有标签
+            weTagList.addAll(weTagList2);
+        }
+        weMakeCustomerTag.setAddTag(weTagList);
+
+        weMakeCustomerTag.setExternalUserid(t.getExternalUserid());
+        weMakeCustomerTag.setUserId(t.getAddUserId());
+        //打标签
+        weCustomerService.makeLabel(weMakeCustomerTag);
+        log.info("客户:" + t.getCustomerName() + "---智能打标成功---删除标签为" + weTag.getName());
+    }
+
+
+}

+ 77 - 0
linkwe-service/src/main/java/com/linkwechat/domain/WeIntelligentMark.java

@@ -0,0 +1,77 @@
+package com.linkwechat.domain;
+
+import java.util.Date;
+import java.util.List;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.springframework.format.annotation.DateTimeFormat;
+
+/**
+ * @Description: 智能打标
+ * @Author: jeecg-boot
+ * @Date:   2025-09-01
+ * @Version: V1.0
+ */
+@Data
+@TableName("we_Intelligent_mark")
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value="we_Intelligent_mark对象", description="智能打标")
+public class WeIntelligentMark {
+    
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+	private Long id;
+	/**行为类型id*/
+	@ApiModelProperty(value = "行为类型id")
+	private String actionId;
+	/**行为类型名称*/
+    @ApiModelProperty(value = "行为类型名称")
+	private String actionName;
+//	/**类型:1.好友添加  2.链接点击 3.消费行为 4.沉默行为
+//	5.会员等级变动  6.关键词互动  7.消费行为*/
+//    @ApiModelProperty(value = "类型:1.好友添加  2.链接点击 3.消费行为 4.沉默行为 5.会员等级变动  6.关键词互动  7.消费行为")
+//	private Integer type;
+	/**规则值*/
+    @ApiModelProperty(value = "规则值1")
+	private String markRules1;
+	/**标签组Id*/
+	@ApiModelProperty(value = "标签组Id")
+	private String tagGroupId;
+
+	@ApiModelProperty(value = "标签组Id")
+	private String tagGroupName;
+	/**标签Id*/
+    @ApiModelProperty(value = "标签Id")
+	private String tagId;
+
+	/**创建人名称*/
+    @ApiModelProperty(value = "创建人名称")
+	private String createBy;
+	/**创建时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	/**更新人名称*/
+    @ApiModelProperty(value = "更新人名称")
+	private String updateBy;
+	/**更新时间*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新时间")
+	private Date updateTime;
+
+	@TableField(exist = false)
+	private List<WeTag> tagList;
+}

+ 21 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weIntelligentMark/dto/WeIntelligentMarkPageDto.java

@@ -0,0 +1,21 @@
+package com.linkwechat.domain.weIntelligentMark.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class WeIntelligentMarkPageDto {
+
+    @ApiModelProperty(value = "行为类型名称")
+    private String actionName;
+
+    @ApiModelProperty(value = "标签id")
+    private String tagId;;
+
+    @ApiModelProperty(value = "页数")
+    private Integer pageNo;
+
+    @ApiModelProperty(value = "条数")
+    private Integer pageSize;
+
+}

+ 29 - 0
linkwe-service/src/main/java/com/linkwechat/domain/weIntelligentMark/vo/WeIntelligentMarkVo.java

@@ -0,0 +1,29 @@
+package com.linkwechat.domain.weIntelligentMark.vo;
+
+import com.linkwechat.domain.WeTag;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class WeIntelligentMarkVo {
+
+    @ApiModelProperty(value = "主键")
+    private Long id;
+    /**行为类型名称*/
+    @ApiModelProperty(value = "行为类型名称")
+    private String name;
+    /**类型:1.好友添加  2.链接点击 3.消费行为 4.沉默行为
+     5.会员等级变动  6.关键词互动  7.消费行为*/
+    @ApiModelProperty(value = "类型:1.好友添加  2.链接点击 3.消费行为 4.沉默行为 5.会员等级变动  6.关键词互动  7.消费行为")
+    private Integer type;
+    /**规则值*/
+    @ApiModelProperty(value = "规则值1")
+    private String markRules1;
+    /**标签Id*/
+    @ApiModelProperty(value = "标签Id")
+    private List<WeTag> tagList;
+
+
+}

+ 8 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/WeKfMsgMapper.java

@@ -0,0 +1,8 @@
+package com.linkwechat.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.WeKfMsg;
+
+public interface WeKfMsgMapper extends BaseMapper<WeKfMsg> {
+
+}

+ 15 - 0
linkwe-service/src/main/java/com/linkwechat/mapper/weIntelligentMarkMapper.java

@@ -0,0 +1,15 @@
+package com.linkwechat.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.linkwechat.domain.WeIntelligentMark;
+
+/**
+ * @Description: 智能打标
+ * @Author: jeecg-boot
+ * @Date:   2025-09-01
+ * @Version: V1.0
+ */
+public interface weIntelligentMarkMapper extends BaseMapper<WeIntelligentMark> {
+
+}

+ 22 - 0
linkwe-service/src/main/java/com/linkwechat/service/IWeIntelligentMarkService.java

@@ -0,0 +1,22 @@
+package com.linkwechat.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.linkwechat.domain.WeIntelligentMark;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.linkwechat.domain.weIntelligentMark.dto.WeIntelligentMarkPageDto;
+
+import java.util.List;
+
+/**
+ * @Description: 智能打标
+ * @Author: jeecg-boot
+ * @Date:   2025-09-01
+ * @Version: V1.0
+ */
+public interface IWeIntelligentMarkService extends IService<WeIntelligentMark> {
+
+    List<WeIntelligentMark> queryPageList(LambdaQueryWrapper<WeIntelligentMark> lambdaQueryWrapper);
+
+    WeIntelligentMark queryById(String id);
+}

+ 67 - 0
linkwe-service/src/main/java/com/linkwechat/service/impl/WeIntelligentMarkServiceImpl.java

@@ -0,0 +1,67 @@
+package com.linkwechat.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.linkwechat.domain.WeIntelligentMark;
+import com.linkwechat.domain.WeTag;
+import com.linkwechat.domain.weIntelligentMark.dto.WeIntelligentMarkPageDto;
+import com.linkwechat.mapper.WeTagMapper;
+import com.linkwechat.mapper.weIntelligentMarkMapper;
+import com.linkwechat.service.IWeIntelligentMarkService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description: 智能打标
+ * @Author: jeecg-boot
+ * @Date:   2025-09-01
+ * @Version: V1.0
+ */
+@Service
+public class WeIntelligentMarkServiceImpl extends ServiceImpl<weIntelligentMarkMapper, WeIntelligentMark> implements IWeIntelligentMarkService {
+    @Resource
+    private WeTagMapper weTagMapper;
+
+
+
+    @Override
+    public List<WeIntelligentMark> queryPageList(LambdaQueryWrapper<WeIntelligentMark> lambdaQueryWrapper) {
+        List<WeIntelligentMark> records = baseMapper.selectList(lambdaQueryWrapper);
+
+        if (records.size() > 0) {
+            records.forEach(this::extracted);
+        }
+        return records;
+    }
+
+    @Override
+    public WeIntelligentMark queryById(String id) {
+        WeIntelligentMark weIntelligentMark = baseMapper.selectById(id);
+        extracted(weIntelligentMark);
+        return weIntelligentMark;
+    }
+
+    private void extracted(WeIntelligentMark s) {
+        String tagId = s.getTagId();
+        String[] split = tagId.split(",");
+        List<WeTag> weTagList = new ArrayList<>();
+        //查询每个标签名称
+        for (String value : split) {
+            WeTag weTag = weTagMapper.selectOne(new LambdaQueryWrapper<WeTag>().eq(WeTag::getDelFlag, 0).eq(WeTag::getTagId, value));
+            WeTag weTag1 = new WeTag();
+            weTag1.setTagId(value);
+            weTag1.setName(weTag.getName());
+            weTagList.add(weTag1);
+
+        }
+        s.setTagList(weTagList);
+    }
+}

+ 5 - 0
linkwe-service/src/main/resources/mapper/wecom/weIntelligentMarkMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.linkwechat.mapper.weIntelligentMarkMapper">
+
+</mapper>