Ver Fonte

修改分享收集手机号二维码提交手机号逻辑+销售端新增根据进粉天数打标签

cgp há 4 dias atrás
pai
commit
7c3e06fadc

+ 151 - 2
fs-admin/src/main/java/com/fs/his/task/StoreTask.java

@@ -1,16 +1,30 @@
 package com.fs.his.task;
 
 
+
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
 import com.fs.hisStore.vo.FsStoreOrderScrmPhoneAndOrderNumVO;
-import com.fs.qw.mapper.FsCompanyCustomerMapper;
+import com.fs.qw.domain.QuickTagTask;
+import com.fs.qw.domain.QuickTagTaskLog;
+import com.fs.qw.domain.QwExternalContact;
+import com.fs.qw.mapper.*;
+import com.fs.qwApi.domain.QwResult;
+import com.fs.qwApi.param.QwEditUserTagParam;
+import com.fs.qwApi.service.QwApiService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.List;
 
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 商城小程序相关定时任务
+ * */
 @Slf4j
 @Component("StoreTask")
 public class StoreTask {
@@ -20,6 +34,18 @@ public class StoreTask {
 
     @Autowired
     private FsCompanyCustomerMapper fsCompanyCustomerMapper;
+
+    @Autowired
+    private QuickTagTaskMapper quickTagTaskMapper;
+
+    @Autowired
+    private QuickTagTaskLogMapper quickTagTaskLogMapper;
+
+    @Autowired
+    private QwExternalContactMapper qwExternalContactMapper;
+
+    @Autowired
+    private QwApiService qwApiService;
     
     /**
      * 同步客户信息表客户的有效下单数
@@ -34,4 +60,127 @@ public class StoreTask {
         //根据手机号批量更新客户信息表客户有效下单数
         int updateResult=fsCompanyCustomerMapper.updateCompanyUserBuyCountByUserPhone(fsStoreOrderScrmPhoneAndOrderNumVOS);
     }
+
+    /**
+     * 简洁版自动打标签定时任务
+     */
+    public void quickTagTask() {
+        log.info("========== 简洁版自动打标签任务开始 ==========");
+        // 查询所有任务(若需状态过滤,可添加条件)
+        QuickTagTask query = new QuickTagTask();
+        List<QuickTagTask> taskList = quickTagTaskMapper.selectQuickTagTaskList(query);
+        if (CollectionUtils.isEmpty(taskList)) {
+            log.info("无自动打标签任务,结束");
+            return;
+        }
+
+        // 遍历每个任务,单个任务异常不影响其他任务
+        for (QuickTagTask task : taskList) {
+            try {
+                executeSingleTask(task);
+            } catch (Exception e) {
+                log.error("执行任务失败,任务ID: {}, 任务详情: {}", task.getId(), task, e);
+            }
+        }
+        log.info("========== 简洁版自动打标签任务结束 ==========");
+    }
+
+    /**
+     * 执行单个打标签任务
+     */
+    private void executeSingleTask(QuickTagTask task) {
+        log.info("开始执行任务 ID: {}, corpId: {}", task.getId(), task.getCorpId());
+
+        // 1. 校验必要参数
+        Integer executionDays = task.getExecutionDays();
+        if (executionDays == null || executionDays < 0) {
+            log.warn("任务 {} 执行天数为空或无效,跳过", task.getId());
+            return;
+        }
+        String tagIdStr = task.getTagId();
+        if (StringUtils.isEmpty(tagIdStr)) {
+            log.warn("任务 {} 未配置标签,跳过", task.getId());
+            return;
+        }
+        List<String> tagIds = Arrays.stream(tagIdStr.split(","))
+                .filter(StringUtils::isNotBlank)
+                .collect(Collectors.toList());
+        if (tagIds.isEmpty()) {
+            log.warn("任务 {} 标签列表为空,跳过", task.getId());
+            return;
+        }
+
+        // 2. 计算触发日期范围(查询过去某一天的客户)
+        Date zeroToday = DateUtils.truncate(new Date(), Calendar.DAY_OF_MONTH);
+        // 目标日期:今天减去 executionDays 天
+        Date targetDate = DateUtils.addDays(zeroToday, -executionDays);
+        // 查询范围:targetDate 00:00:00 ~ targetDate 23:59:59
+        Date startTime = targetDate;
+        Date endTime = DateUtils.addDays(targetDate, 1); // 加1天即为第二天的零点
+
+        // 3. 查询该时间段内新增的客户
+        List<QwExternalContact> contactList = qwExternalContactMapper.selectQwExternalContactListByCreateTime(startTime, endTime);
+        if (CollectionUtils.isEmpty(contactList)) {
+            log.info("任务 {} 在 {} 至 {} 期间无新增客户", task.getId(), startTime, endTime);
+            return;
+        }
+
+        log.info("任务 {} 命中 {} 个客户,开始逐个打标签", task.getId(), contactList.size());
+        int successCount = 0;
+        int failCount = 0;
+
+        // 4. 遍历客户逐个打标签(单个失败不影响其他)
+        for (QwExternalContact contact : contactList) {
+            boolean apiSuccess = false;
+            String errorMsg = null;
+            try {
+                // 4.1 调用企微API打标签
+                QwEditUserTagParam param = new QwEditUserTagParam();
+                param.setUserid(contact.getUserId());
+                param.setExternal_userid(contact.getExternalUserId());
+                param.setAdd_tag(tagIds);
+
+                QwResult result = qwApiService.editUserTag(param, task.getCorpId());
+                if (result != null && result.getErrcode() == 0) {
+                    apiSuccess = true;
+                    log.debug("客户 {} 打标签成功", contact.getExternalUserId());
+                } else {
+                    errorMsg = result != null ? result.getErrmsg() : "API返回空";
+                    log.warn("客户 {} 打标签失败: errcode={}, errmsg={}",
+                            contact.getExternalUserId(),
+                            result != null ? result.getErrcode() : "null",
+                            errorMsg);
+                }
+            } catch (Exception e) {
+                errorMsg = e.getMessage();
+                log.error("客户 {} 打标签发生异常", contact.getExternalUserId(), e);
+            }
+
+            // 4.2 记录日志(无论成败均记录,可扩展表字段存储状态和错误信息)
+            try {
+                QuickTagTaskLog logEntry = new QuickTagTaskLog();
+                logEntry.setAutoTagId(task.getId());
+                logEntry.setType(1); // 可定义为常量 TagLogType.ADD_FRIEND
+                logEntry.setQwUserid(contact.getQwUserId());
+                logEntry.setExternalUserId(contact.getExternalUserId());
+                logEntry.setAddTime(contact.getCreateTime()); // 记录客户原始添加时间
+                logEntry.setCompanyId(contact.getCompanyId());
+                logEntry.setCorpId(task.getCorpId());
+                logEntry.setStatus(apiSuccess ? 1 : 0);
+                logEntry.setErrorMsg(apiSuccess ? null : errorMsg);
+                quickTagTaskLogMapper.insertQuickTagTaskLog(logEntry);
+            } catch (Exception e) {
+                // 日志插入失败不应影响打标签业务,仅记录错误
+                log.error("插入打标签日志失败,客户: {}, 任务: {}", contact.getExternalUserId(), task.getId(), e);
+            }
+
+            if (apiSuccess) {
+                successCount++;
+            } else {
+                failCount++;
+            }
+        }
+
+        log.info("任务 {} 执行完成,成功: {}, 失败: {}", task.getId(), successCount, failCount);
+    }
 }

+ 86 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QuickTagTaskController.java

@@ -0,0 +1,86 @@
+package com.fs.company.controller.qw;
+
+import com.fs.company.domain.CompanyUser;
+import com.fs.framework.security.LoginUser;
+import com.fs.framework.security.SecurityUtils;
+import com.fs.qw.domain.QuickTagTask;
+import com.fs.qw.service.IQuickTagTaskService;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.core.page.TableDataInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+/**
+ * 简洁版自动打标签任务 Controller
+ */
+@RestController
+@RequestMapping("/qw/quickTagTask")
+public class QuickTagTaskController extends BaseController {
+
+    @Autowired
+    private IQuickTagTaskService quickTagTaskService;
+
+    /**
+     * 查询任务列表(分页)
+     */
+    @GetMapping("/list")
+    public TableDataInfo list(QuickTagTask quickTagTask) {
+        startPage();
+        List<QuickTagTask> list = quickTagTaskService.selectQuickTagTaskList(quickTagTask);
+        return getDataTable(list);
+    }
+
+    /**
+     * 根据ID获取任务详细信息
+     */
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable Long id) {
+        return AjaxResult.success(quickTagTaskService.selectQuickTagTaskById(id));
+    }
+
+    /**
+     * 新增任务
+     */
+    @PostMapping
+    public AjaxResult add(@RequestBody QuickTagTask quickTagTask) {
+        //获取当前登录销售
+        Long companyUserId;
+        try {
+            LoginUser loginUser = SecurityUtils.getLoginUser();
+            CompanyUser companyUser = loginUser.getUser();
+            companyUserId=companyUser.getUserId();
+        }catch (Exception e) {
+            return AjaxResult.error("登录信息已过期,请重新登录");
+        }
+        quickTagTask.setCreateBy(companyUserId);
+        return toAjax(quickTagTaskService.insertQuickTagTask(quickTagTask));
+    }
+
+    /**
+     * 修改任务
+     */
+    @PutMapping
+    public AjaxResult edit(@RequestBody QuickTagTask quickTagTask) {
+        //获取当前登录销售
+        Long companyUserId;
+        try {
+            LoginUser loginUser = SecurityUtils.getLoginUser();
+            CompanyUser companyUser = loginUser.getUser();
+            companyUserId=companyUser.getUserId();
+        }catch (Exception e) {
+            return AjaxResult.error("登录信息已过期,请重新登录");
+        }
+        quickTagTask.setUpdateBy(companyUserId);
+        return toAjax(quickTagTaskService.updateQuickTagTask(quickTagTask));
+    }
+
+    /**
+     * 删除任务(支持单个或批量)
+     */
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(quickTagTaskService.deleteQuickTagTaskByIds(ids));
+    }
+}

+ 58 - 0
fs-service/src/main/java/com/fs/qw/domain/QuickTagTask.java

@@ -0,0 +1,58 @@
+package com.fs.qw.domain;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 简洁版自动打标签任务实体类
+ * 对应表 qw_quick_tag_task
+ */
+@Data
+public class QuickTagTask {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 公司主体ID */
+    private String corpId;
+
+    /** 进粉后触发打标签天数 */
+    private Integer executionDays;
+
+    /** 配置的标签ID(逗号分隔) */
+    private String tagId;
+
+    /** 备注 */
+    private String remark;
+
+    /** 创建人 */
+    private Long createBy;
+
+    /** 创建时间 */
+    private Date createTime;
+
+    /** 更新人 */
+    private Long updateBy;
+
+    /** 更新时间 */
+    private Date updateTime;
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("corpId", getCorpId())
+                .append("executionDays", getExecutionDays())
+                .append("tagId", getTagId())
+                .append("remark", getRemark())
+                .append("createBy", getCreateBy())
+                .append("createTime", getCreateTime())
+                .append("updateBy", getUpdateBy())
+                .append("updateTime", getUpdateTime())
+                .toString();
+    }
+}

+ 62 - 0
fs-service/src/main/java/com/fs/qw/domain/QuickTagTaskLog.java

@@ -0,0 +1,62 @@
+package com.fs.qw.domain;
+
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.util.Date;
+
+/**
+ * 简洁版打标签日志实体类
+ * 对应表 qw_quick_tag_task_logs
+ */
+@Data
+public class QuickTagTaskLog {
+    private static final long serialVersionUID = 1L;
+
+    /** 主键ID */
+    private Long id;
+
+    /** 自动添加标签主表id */
+    private Long autoTagId;
+
+    /** 类型 */
+    private Integer type;
+
+    /** 所属员工id */
+    private Long qwUserid;
+
+    /** 客户id */
+    private String externalUserId;
+
+    /** 添加好友时间/加入群聊时间 */
+    private Date addTime;
+
+    /** 公司id */
+    private Long companyId;
+
+    /** 企业CorpID */
+    private String corpId;
+
+    /** 状态:0失败 1成功 */
+    private Integer status;
+
+    /** 错误信息 */
+    private String errorMsg;
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+                .append("id", getId())
+                .append("autoTagId", getAutoTagId())
+                .append("type", getType())
+                .append("qwUserid", getQwUserid())
+                .append("externalUserId", getExternalUserId())
+                .append("addTime", getAddTime())
+                .append("companyId", getCompanyId())
+                .append("corpId", getCorpId())
+                .append("status", getStatus())
+                .append("errorMsg", getErrorMsg())
+                .toString();
+    }
+}

+ 59 - 0
fs-service/src/main/java/com/fs/qw/mapper/QuickTagTaskLogMapper.java

@@ -0,0 +1,59 @@
+package com.fs.qw.mapper;
+
+import com.fs.qw.domain.QuickTagTaskLog;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+/**
+ * 简洁版打标签日志 Mapper 接口
+ */
+public interface QuickTagTaskLogMapper {
+
+    /**
+     * 根据条件分页查询日志列表
+     *
+     * @param quickTagTaskLog 查询条件
+     * @return 日志集合
+     */
+    List<QuickTagTaskLog> selectQuickTagTaskLogList(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 根据ID查询日志
+     *
+     * @param id 日志ID
+     * @return 日志对象
+     */
+    QuickTagTaskLog selectQuickTagTaskLogById(Long id);
+
+    /**
+     * 新增日志
+     *
+     * @param quickTagTaskLog 日志对象
+     * @return 影响行数
+     */
+    int insertQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 修改日志
+     *
+     * @param quickTagTaskLog 日志对象
+     * @return 影响行数
+     */
+    int updateQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 删除日志
+     *
+     * @param id 日志ID
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskLogById(Long id);
+
+    /**
+     * 批量删除日志
+     *
+     * @param ids 需要删除的数据ID数组
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskLogByIds(Long[] ids);
+}

+ 58 - 0
fs-service/src/main/java/com/fs/qw/mapper/QuickTagTaskMapper.java

@@ -0,0 +1,58 @@
+package com.fs.qw.mapper;
+
+import com.fs.qw.domain.QuickTagTask;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+/**
+ * 简洁版自动打标签任务 Mapper 接口
+ */
+public interface QuickTagTaskMapper {
+    /**
+     * 根据条件分页查询任务列表
+     *
+     * @param quickTagTask 查询条件
+     * @return 任务集合
+     */
+    List<QuickTagTask> selectQuickTagTaskList(QuickTagTask quickTagTask);
+
+    /**
+     * 根据ID查询任务
+     *
+     * @param id 任务ID
+     * @return 任务对象
+     */
+    QuickTagTask selectQuickTagTaskById(Long id);
+
+    /**
+     * 新增任务
+     *
+     * @param quickTagTask 任务对象
+     * @return 影响行数
+     */
+    int insertQuickTagTask(QuickTagTask quickTagTask);
+
+    /**
+     * 修改任务
+     *
+     * @param quickTagTask 任务对象
+     * @return 影响行数
+     */
+    int updateQuickTagTask(QuickTagTask quickTagTask);
+
+    /**
+     * 删除任务
+     *
+     * @param id 任务ID
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskById(Long id);
+
+    /**
+     * 批量删除任务
+     *
+     * @param ids 需要删除的数据ID数组
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskByIds(Long[] ids);
+}

+ 6 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -22,6 +22,7 @@ import org.springframework.stereotype.Repository;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -573,4 +574,9 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "and remark_mobiles LIKE concat('%',#{phone},'%') " +
             "limit 1")
     QwExternalContact queryQwUserIdIsAddContact(@Param("qwUserId") Long qwUserId, @Param("phone") String phone, @Param("addWay") int addWay);
+
+    /**
+     *  根据创建日期范围查询企微客户列表
+     * */
+    List<QwExternalContact> selectQwExternalContactListByCreateTime(Date startTime, Date endTime);
 }

+ 58 - 0
fs-service/src/main/java/com/fs/qw/service/IQuickTagTaskLogService.java

@@ -0,0 +1,58 @@
+package com.fs.qw.service;
+
+import com.fs.qw.domain.QuickTagTaskLog;
+import java.util.List;
+
+/**
+ * 简洁版打标签日志 Service 接口
+ */
+public interface IQuickTagTaskLogService {
+
+    /**
+     * 查询日志列表
+     *
+     * @param quickTagTaskLog 查询条件
+     * @return 日志集合
+     */
+    List<QuickTagTaskLog> selectQuickTagTaskLogList(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 根据ID查询日志
+     *
+     * @param id 日志ID
+     * @return 日志对象
+     */
+    QuickTagTaskLog selectQuickTagTaskLogById(Long id);
+
+    /**
+     * 新增日志
+     *
+     * @param quickTagTaskLog 日志对象
+     * @return 影响行数
+     */
+    int insertQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 修改日志
+     *
+     * @param quickTagTaskLog 日志对象
+     * @return 影响行数
+     */
+    int updateQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog);
+
+    /**
+     * 删除日志
+     *
+     * @param id 日志ID
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskLogById(Long id);
+
+    /**
+     * 批量删除日志
+     *
+     * @param ids 需要删除的数据ID数组
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskLogByIds(Long[] ids);
+}

+ 58 - 0
fs-service/src/main/java/com/fs/qw/service/IQuickTagTaskService.java

@@ -0,0 +1,58 @@
+package com.fs.qw.service;
+
+import com.fs.qw.domain.QuickTagTask;
+import java.util.List;
+
+/**
+ * 简洁版自动打标签任务 Service 接口
+ */
+public interface IQuickTagTaskService {
+
+    /**
+     * 查询任务列表
+     *
+     * @param quickTagTask 查询条件
+     * @return 任务集合
+     */
+    List<QuickTagTask> selectQuickTagTaskList(QuickTagTask quickTagTask);
+
+    /**
+     * 根据ID查询任务
+     *
+     * @param id 任务ID
+     * @return 任务对象
+     */
+    QuickTagTask selectQuickTagTaskById(Long id);
+
+    /**
+     * 新增任务
+     *
+     * @param quickTagTask 任务对象
+     * @return 影响行数
+     */
+    int insertQuickTagTask(QuickTagTask quickTagTask);
+
+    /**
+     * 修改任务
+     *
+     * @param quickTagTask 任务对象
+     * @return 影响行数
+     */
+    int updateQuickTagTask(QuickTagTask quickTagTask);
+
+    /**
+     * 删除任务
+     *
+     * @param id 任务ID
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskById(Long id);
+
+    /**
+     * 批量删除任务
+     *
+     * @param ids 需要删除的数据ID数组
+     * @return 影响行数
+     */
+    int deleteQuickTagTaskByIds(Long[] ids);
+}

+ 51 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QuickTagTaskLogServiceImpl.java

@@ -0,0 +1,51 @@
+package com.fs.qw.service.impl;
+
+import com.fs.qw.domain.QuickTagTaskLog;
+import com.fs.qw.mapper.QuickTagTaskLogMapper;
+import com.fs.qw.service.IQuickTagTaskLogService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 简洁版打标签日志 Service 实现
+ */
+@Slf4j
+@Service
+public class QuickTagTaskLogServiceImpl implements IQuickTagTaskLogService {
+
+    @Autowired
+    private QuickTagTaskLogMapper quickTagTaskLogMapper;
+
+    @Override
+    public List<QuickTagTaskLog> selectQuickTagTaskLogList(QuickTagTaskLog quickTagTaskLog) {
+        return quickTagTaskLogMapper.selectQuickTagTaskLogList(quickTagTaskLog);
+    }
+
+    @Override
+    public QuickTagTaskLog selectQuickTagTaskLogById(Long id) {
+        return quickTagTaskLogMapper.selectQuickTagTaskLogById(id);
+    }
+
+    @Override
+    public int insertQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog) {
+        return quickTagTaskLogMapper.insertQuickTagTaskLog(quickTagTaskLog);
+    }
+
+    @Override
+    public int updateQuickTagTaskLog(QuickTagTaskLog quickTagTaskLog) {
+        return quickTagTaskLogMapper.updateQuickTagTaskLog(quickTagTaskLog);
+    }
+
+    @Override
+    public int deleteQuickTagTaskLogById(Long id) {
+        return quickTagTaskLogMapper.deleteQuickTagTaskLogById(id);
+    }
+
+    @Override
+    public int deleteQuickTagTaskLogByIds(Long[] ids) {
+        return quickTagTaskLogMapper.deleteQuickTagTaskLogByIds(ids);
+    }
+}

+ 57 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QuickTagTaskServiceImpl.java

@@ -0,0 +1,57 @@
+package com.fs.qw.service.impl;
+
+import com.fs.common.utils.DateUtils;
+import com.fs.qw.domain.QuickTagTask;
+import com.fs.qw.mapper.QuickTagTaskMapper;
+import com.fs.qw.service.IQuickTagTaskService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 简洁版自动打标签任务 Service 实现
+ */
+@Slf4j
+@Service
+public class QuickTagTaskServiceImpl implements IQuickTagTaskService {
+
+    @Autowired
+    private QuickTagTaskMapper quickTagTaskMapper;
+
+    @Override
+    public List<QuickTagTask> selectQuickTagTaskList(QuickTagTask quickTagTask) {
+        return quickTagTaskMapper.selectQuickTagTaskList(quickTagTask);
+    }
+
+    @Override
+    public QuickTagTask selectQuickTagTaskById(Long id) {
+        return quickTagTaskMapper.selectQuickTagTaskById(id);
+    }
+
+    @Override
+    public int insertQuickTagTask(QuickTagTask quickTagTask) {
+        Date nowDate = DateUtils.getNowDate();
+        quickTagTask.setCreateTime(nowDate);
+        return quickTagTaskMapper.insertQuickTagTask(quickTagTask);
+    }
+
+    @Override
+    public int updateQuickTagTask(QuickTagTask quickTagTask) {
+        Date nowDate = DateUtils.getNowDate();
+        quickTagTask.setUpdateTime(nowDate);
+        return quickTagTaskMapper.updateQuickTagTask(quickTagTask);
+    }
+
+    @Override
+    public int deleteQuickTagTaskById(Long id) {
+        return quickTagTaskMapper.deleteQuickTagTaskById(id);
+    }
+
+    @Override
+    public int deleteQuickTagTaskByIds(Long[] ids) {
+        return quickTagTaskMapper.deleteQuickTagTaskByIds(ids);
+    }
+}

+ 113 - 0
fs-service/src/main/resources/mapper/qw/QuickTagTaskLogMapper.xml

@@ -0,0 +1,113 @@
+<?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.fs.qw.mapper.QuickTagTaskLogMapper">
+
+    <resultMap type="com.fs.qw.domain.QuickTagTaskLog" id="QuickTagTaskLogResult">
+        <id     property="id"             column="id"              />
+        <result property="autoTagId"      column="auto_tag_id"     />
+        <result property="type"           column="type"            />
+        <result property="qwUserid"       column="qw_userid"       />
+        <result property="externalUserId" column="external_user_id"/>
+        <result property="addTime"        column="add_time"        />
+        <result property="companyId"      column="company_id"      />
+        <result property="corpId"         column="corp_id"         />
+        <result property="status"         column="status"          />
+        <result property="errorMsg"       column="error_msg"       />
+    </resultMap>
+
+    <sql id="selectQuickTagTaskLogVo">
+        select id, auto_tag_id, type, qw_userid, external_user_id,
+               add_time, company_id, corp_id, status, error_msg
+        from qw_quick_tag_task_logs
+    </sql>
+
+    <select id="selectQuickTagTaskLogList" parameterType="com.fs.qw.domain.QuickTagTaskLog" resultMap="QuickTagTaskLogResult">
+        <include refid="selectQuickTagTaskLogVo"/>
+        <where>
+            <if test="autoTagId != null">
+                AND auto_tag_id = #{autoTagId}
+            </if>
+            <if test="type != null">
+                AND type = #{type}
+            </if>
+            <if test="qwUserid != null">
+                AND qw_userid = #{qwUserid}
+            </if>
+            <if test="externalUserId != null and externalUserId != ''">
+                AND external_user_id = #{externalUserId}
+            </if>
+            <if test="companyId != null">
+                AND company_id = #{companyId}
+            </if>
+            <if test="corpId != null and corpId != ''">
+                AND corp_id = #{corpId}
+            </if>
+            <if test="status != null">
+                AND status = #{status}
+            </if>
+            <!-- addTime 不加入范围查询,如需可按需扩展 -->
+        </where>
+        order by id desc
+    </select>
+
+    <select id="selectQuickTagTaskLogById" parameterType="Long" resultMap="QuickTagTaskLogResult">
+        <include refid="selectQuickTagTaskLogVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertQuickTagTaskLog" parameterType="com.fs.qw.domain.QuickTagTaskLog" useGeneratedKeys="true" keyProperty="id">
+        insert into qw_quick_tag_task_logs
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="autoTagId != null">auto_tag_id,</if>
+            <if test="type != null">type,</if>
+            <if test="qwUserid != null">qw_userid,</if>
+            <if test="externalUserId != null and externalUserId != ''">external_user_id,</if>
+            <if test="addTime != null">add_time,</if>
+            <if test="companyId != null">company_id,</if>
+            <if test="corpId != null and corpId != ''">corp_id,</if>
+            <if test="status != null">status,</if>
+            <if test="errorMsg != null and errorMsg != ''">error_msg,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="autoTagId != null">#{autoTagId},</if>
+            <if test="type != null">#{type},</if>
+            <if test="qwUserid != null">#{qwUserid},</if>
+            <if test="externalUserId != null and externalUserId != ''">#{externalUserId},</if>
+            <if test="addTime != null">#{addTime},</if>
+            <if test="companyId != null">#{companyId},</if>
+            <if test="corpId != null and corpId != ''">#{corpId},</if>
+            <if test="status != null">#{status},</if>
+            <if test="errorMsg != null and errorMsg != ''">#{errorMsg},</if>
+        </trim>
+    </insert>
+
+    <update id="updateQuickTagTaskLog" parameterType="com.fs.qw.domain.QuickTagTaskLog">
+        update qw_quick_tag_task_logs
+        <set>
+            <if test="autoTagId != null">auto_tag_id = #{autoTagId},</if>
+            <if test="type != null">type = #{type},</if>
+            <if test="qwUserid != null">qw_userid = #{qwUserid},</if>
+            <if test="externalUserId != null and externalUserId != ''">external_user_id = #{externalUserId},</if>
+            <if test="addTime != null">add_time = #{addTime},</if>
+            <if test="companyId != null">company_id = #{companyId},</if>
+            <if test="corpId != null and corpId != ''">corp_id = #{corpId},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="errorMsg != null and errorMsg != ''">error_msg = #{errorMsg},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteQuickTagTaskLogById" parameterType="Long">
+        delete from qw_quick_tag_task_logs where id = #{id}
+    </delete>
+
+    <delete id="deleteQuickTagTaskLogByIds" parameterType="Long">
+        delete from qw_quick_tag_task_logs where id in
+        <foreach collection="array" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 96 - 0
fs-service/src/main/resources/mapper/qw/QuickTagTaskMapper.xml

@@ -0,0 +1,96 @@
+<?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.fs.qw.mapper.QuickTagTaskMapper">
+
+    <resultMap type="com.fs.qw.domain.QuickTagTask" id="QuickTagTaskResult">
+        <id     property="id"            column="id"          />
+        <result property="corpId"        column="corp_id"     />
+        <result property="executionDays" column="execution_days" />
+        <result property="tagId"         column="tag_id"      />
+        <result property="remark"        column="remark"      />
+        <result property="createBy"      column="create_by"   />
+        <result property="createTime"    column="create_time" />
+        <result property="updateBy"      column="update_by"   />
+        <result property="updateTime"    column="update_time" />
+    </resultMap>
+
+    <sql id="selectQuickTagTaskVo">
+        select id, corp_id, execution_days, tag_id, remark,
+               create_by, create_time, update_by, update_time
+        from qw_quick_tag_task
+    </sql>
+
+    <select id="selectQuickTagTaskList" parameterType="com.fs.qw.domain.QuickTagTask" resultMap="QuickTagTaskResult">
+        <include refid="selectQuickTagTaskVo"/>
+        <where>
+            <if test="corpId != null and corpId != ''">
+                AND corp_id = #{corpId}
+            </if>
+            <if test="executionDays != null">
+                AND execution_days = #{executionDays}
+            </if>
+            <if test="tagId != null and tagId != ''">
+                AND FIND_IN_SET(#{tagId}, tag_id) > 0
+            </if>
+        </where>
+        order by create_time desc
+    </select>
+
+    <select id="selectQuickTagTaskById" parameterType="Long" resultMap="QuickTagTaskResult">
+        <include refid="selectQuickTagTaskVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertQuickTagTask" parameterType="com.fs.qw.domain.QuickTagTask" useGeneratedKeys="true" keyProperty="id">
+        insert into qw_quick_tag_task
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="corpId != null and corpId != ''">corp_id,</if>
+            <if test="executionDays != null">execution_days,</if>
+            <if test="tagId != null and tagId != ''">tag_id,</if>
+            <if test="remark != null and remark != ''">remark,</if>
+            <if test="createBy != null and createBy != ''">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null and updateBy != ''">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="corpId != null and corpId != ''">#{corpId},</if>
+            <if test="executionDays != null">#{executionDays},</if>
+            <if test="tagId != null and tagId != ''">#{tagId},</if>
+            <if test="remark != null and remark != ''">#{remark},</if>
+            <if test="createBy != null and createBy != ''">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null and updateBy != ''">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+    <update id="updateQuickTagTask" parameterType="com.fs.qw.domain.QuickTagTask">
+        update qw_quick_tag_task
+        <set>
+            <if test="corpId != null and corpId != ''">corp_id = #{corpId},</if>
+            <if test="executionDays != null">execution_days = #{executionDays},</if>
+            <if test="tagId != null and tagId != ''">tag_id = #{tagId},</if>
+            <if test="remark != null and remark != ''">remark = #{remark},</if>
+            <if test="createBy != null and createBy != ''">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </set>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteQuickTagTaskById" parameterType="Long">
+        delete from qw_quick_tag_task where id = #{id}
+    </delete>
+
+    <delete id="deleteQuickTagTaskByIds" parameterType="Long">
+        delete from qw_quick_tag_task where id in
+        <foreach collection="array" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+</mapper>

+ 7 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -808,5 +808,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </update>
 
+    <select id="selectQwExternalContactListByCreateTime"  resultType="QwExternalContact">
+        SELECT *
+        FROM qw_external_contact
+        where create_time &gt;= #{startTime}
+          AND create_time &lt; #{endTime}
+    </select>
+
 
 </mapper>

+ 26 - 7
fs-user-app/src/main/java/com/fs/app/controller/ShareMaterialController.java

@@ -12,12 +12,15 @@ import com.fs.his.dto.CollectionUserPhoneDTO;
 import com.fs.his.dto.ShareQRCRedPackageDto;
 import com.fs.his.service.IFsShareMaterialService;
 import com.fs.his.service.IFsUserService;
+import com.fs.hisStore.domain.FsUserScrm;
 import com.fs.qw.service.IFsCompanyQrcPhoneService;
 import com.fs.qw.service.IFsCompanyQrcRedPackageRecordService;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Date;
+
 
 /**
  * 分享素材Controller
@@ -57,7 +60,7 @@ public class ShareMaterialController extends AppBaseController
      * 提交收集的客户手机号
      */
     @PostMapping("/submitPhone")
-    public R submitPhone(@RequestBody CollectionUserPhoneDTO param){
+    public R submitPhone(@RequestBody CollectionUserPhoneDTO param) {
         final WxMaService wxService = WxMaConfiguration.getMaService(param.getAppId());
         try {
             WxMaJscode2SessionResult session = wxService.getUserService().getSessionInfo(param.getCode());
@@ -65,17 +68,33 @@ public class ShareMaterialController extends AppBaseController
             WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), param.getEncryptedData(), param.getIv());
             String phoneNumber = phoneNoInfo.getPhoneNumber();
             param.setUserPhone(phoneNumber);
-            long userId;
             try {
-                userId = Long.parseLong(getUserId());
-            }catch (Exception e){
+                // 修改用户
+                FsUser user = userService.selectFsUserByUnionid(session.getUnionid());
+                if (user != null) {
+                    param.setUserId(user.getUserId());
+                } else {
+                    //写入
+                    user = new FsUser();
+                    user.setPhone(phoneNoInfo.getPhoneNumber());
+                    user.setNickName(phoneNoInfo.getPhoneNumber() != null ? "微信用户" + phoneNoInfo.getPhoneNumber().substring(phoneNoInfo.getPhoneNumber().length() - 4) : "微信用户");
+                    user.setAvatar("https://hos-1309931967.cos.ap-chongqing.myqcloud.com/fs/20230725/a848605591384ec29d49773dd58d9345.jpg");
+                    user.setStatus(1);
+                    user.setMaOpenId(session.getOpenid());
+                    user.setCreateTime(new Date());
+                    if (session.getUnionid() != null) {
+                        user.setUnionId(session.getUnionid());
+                    }
+                    userService.insertFsUser(user);
+                    param.setUserId(user.getUserId());
+                }
+            } catch (Exception e) {
                 return R.error("用户登录信息获取异常");
             }
-            param.setUserId(userId);
             int result = companyQrcPhoneService.submitPhone(param);
-            return result>0?R.ok():R.error("提交失败");
+            return result > 0 ? R.ok() : R.error("提交失败");
         } catch (WxErrorException e) {
-            return R.error("授权失败,"+e.getMessage());
+            return R.error("授权失败," + e.getMessage());
         }
 
     }