wjj il y a 2 semaines
Parent
commit
a3aab544fc

+ 10 - 5
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -1984,7 +1984,11 @@ public class Task {
                             map.setTagNames(JSON.toJSONString(names));
                             map.setOrderId(fsStoreOrder.getOrderId());
                             i = fsStoreOrderMapper.updateFsStoreOrder(map);
+
+                            //打已购标签
+                            qwExternalContactService.buyProductAddTag(fsOrderSopLog.getFsUserId(),fsStoreOrder.getPackageId());
                         }
+
                     } else if (fsOrderSopLog.getType() == 2) {
                         FsStoreOrderScrm fsStoreOrderScrm = fsStoreOrderScrmMapper.selectFsStoreOrderById(fsOrderSopLog.getOrderId());
                         if (fsStoreOrderScrm != null) {
@@ -1994,12 +1998,13 @@ public class Task {
                             i = fsStoreOrderScrmMapper.updateFsStoreOrder(map);
                         }
                     }
+                    FsOrderSopLog map = new FsOrderSopLog();
+                    map.setId(fsOrderSopLog.getId());
+                    map.setStatus(1);
+                    map.setUpdateTime(new Date());
+                    fsOrderSopLogMapper.updateFsOrderSopLog(map);
                     if (i > 0) {
-                        FsOrderSopLog map = new FsOrderSopLog();
-                        map.setId(fsOrderSopLog.getId());
-                        map.setStatus(1);
-                        map.setUpdateTime(new Date());
-                        fsOrderSopLogMapper.updateFsOrderSopLog(map);
+
                     }
                     Thread.sleep(1000);
                 } catch (Exception e) {

+ 19 - 0
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -153,6 +153,9 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
     @Autowired
     IFsCourseFinishTempService fsCourseFinishTempService;
 
+    @Autowired
+    private SopOrderLogMapper sopOrderLogMapper;
+
     // Blocking queues with bounded capacity to implement backpressure
     private final BlockingQueue<QwSopLogs> qwSopLogsQueue = new LinkedBlockingQueue<>(20000);
     private final BlockingQueue<FsCourseWatchLog> watchLogsQueue = new LinkedBlockingQueue<>(20000);
@@ -662,6 +665,8 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             content.setVideoId(e.getVideoId());
             content.setCourseType(e.getCourseType());
             content.setAiTouch(e.getAiTouch());
+            content.setIsBuy(e.getIsBuy());
+            content.setOrderSendType(e.getOrderSendType());
             return content;
         }).sorted(Comparator.comparing(e -> LocalTime.parse(e.getTime() + ":00"))).peek(e -> e.setIndex(i.getAndIncrement())).collect(Collectors.toList());
     }
@@ -713,6 +718,11 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
             sopAddTag(logVo,content,sendTime);
         }
 
+        //发送销售医生任务
+        if (content.getType()==6){
+            addSopOrderLog(logVo,content,sendTime);
+        }
+
         //当语音模板的qw_sop_temp_voice中无对应语音,就不生成qw_sop_logs记录
         if (content.getType() == 7 && content.getSetting() != null && !content.getSetting().isEmpty()) {
             if (content.getSetting().get(0).getVoiceUrl() == null) {
@@ -792,6 +802,15 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
         }
     }
 
+    private void addSopOrderLog(SopUserLogsVo logVo, QwSopTempSetting.Content content, Date sendTime){
+        SopOrderLog sopOrderLog = new SopOrderLog();
+        sopOrderLog.setOrderSendType(content.getOrderSendType());
+        sopOrderLog.setSendTime(sendTime);
+        sopOrderLog.setIsBuy(content.getIsBuy());
+        sopOrderLog.setSopId(logVo.getSopId());
+        sopOrderLogMapper.insertSopOrderLog(sopOrderLog);
+    }
+
     private QwSopLogs createBaseLog(String formattedSendTime, SopUserLogsVo logVo,
                                     QwSopRuleTimeVO ruleTimeVO, String externalContactId,
                                     String externalUserName, Long fsUserId,Integer isOfficial,

+ 6 - 0
fs-service/src/main/java/com/fs/qw/domain/QwExternalContact.java

@@ -148,4 +148,10 @@ public class QwExternalContact extends BaseEntity
     //用户是否回复  0未回复  1已回复
     private Integer isReply;
 
+    //普通商品是否已购 1未购 2已购
+    private Integer isProductBuy;
+
+    //升单商品是否已购 1未购 2已购
+    private Integer isUpsellProductBuy;
+
 }

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

@@ -548,4 +548,7 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     @Select("SELECT tag_ids FROM qw_external_contact WHERE fs_user_id = #{fsUserId}")
     List<String> selectTagsByFsUserId(Long fsUserId);
+
+    @Select("select * from qw_external_contact where fs_user_id = #{fsUserId} and status = 0 ")
+    List<QwExternalContact> selectBuyAddTagExUserBuyFsUserId(Long fsUserId);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -252,4 +252,6 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     List<QwExternalContactVO> selectQwExternalContactListVONewSys(QwExternalContactParam qwExternalContact);
 
     List<String> selectTagNameByFsUserId(Long fsUserId);
+
+    void buyProductAddTag(Long fsUserId,Long packageId);
 }

+ 63 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -5793,6 +5793,69 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return tagNames;
     }
 
+    @Override
+    public void buyProductAddTag(Long fsUserId,Long packageId) {
+        //获取绑定的外部联系人
+        List<QwExternalContact> contacts = qwExternalContactMapper.selectBuyAddTagExUserBuyFsUserId(fsUserId);
+        logger.info("外部联系人:{}",contacts);
+        if (CollectionUtils.isEmpty(contacts)) {
+            return;
+        }
+        for (QwExternalContact contact :contacts) {
+            //查询关联商品的SOP任务
+            List<QwSopVO> sops = qwSopMapper.selectContainProductSop(contact.getId());
+            logger.info("关联商品的SOP任务:{}",sops);
+            if (CollectionUtils.isEmpty(sops)) {
+                return;
+            }
+            for (QwSopVO sop : sops) {
+                try {
+                    if (sop.getProductIds().contains(packageId.toString())) {
+                        QwExternalContactAddTagParam param = new QwExternalContactAddTagParam();
+                        param.setCorpId(sop.getCorpId());
+                        param.setUserIds(Lists.newArrayList(contact.getId()));
+                        param.setTagIds(Lists.newArrayList(sop.getProductTag()));
+                        logger.info("param:{}",param);
+                        addUserTag(param);
+
+                        //更新外部联系是否已购字段
+                        QwExternalContact map = new QwExternalContact();
+                        map.setId(contact.getId());
+                        map.setIsProductBuy(2);
+                        qwExternalContactMapper.updateQwExternalContact(map);
+
+                        //更新客户营期是否已购字段
+                        SopUserLogsInfo mapLog = new SopUserLogsInfo();
+                        mapLog.setId(sop.getUserLogId());
+                        map.setIsProductBuy(2);
+                        sopUserLogsInfoMapper.updateById(mapLog);
+                    }
+                    if (sop.getUpsellProductIds().contains(packageId.toString())) {
+                        QwExternalContactAddTagParam param = new QwExternalContactAddTagParam();
+                        param.setCorpId(sop.getCorpId());
+                        param.setUserIds(Lists.newArrayList(contact.getId()));
+                        param.setTagIds(Lists.newArrayList(sop.getUpsellProductTag()));
+                        addUserTag(param);
+
+                        //更新外部联系是否已购字段
+                        QwExternalContact map = new QwExternalContact();
+                        map.setId(contact.getId());
+                        map.setIsUpsellProductBuy(2);
+                        qwExternalContactMapper.updateQwExternalContact(map);
+
+                        //更新客户营期是否已购字段
+                        SopUserLogsInfo mapLog = new SopUserLogsInfo();
+                        mapLog.setId(sop.getUserLogId());
+                        map.setIsUpsellProductBuy(2);
+                        sopUserLogsInfoMapper.updateById(mapLog);
+                    }
+                } catch (JSONException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+        }
+    }
+
 
     public Boolean getSopAiChatByRedis(String qwUserId,String corpId,String externalUserId){
 

+ 5 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopTempSetting.java

@@ -1,5 +1,6 @@
 package com.fs.qw.vo;
 
+import com.fs.common.annotation.Excel;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -45,6 +46,10 @@ public class QwSopTempSetting implements Serializable{
 
         private String delTag;
 
+        private Integer isBuy;
+
+        private Integer orderSendType;
+
         @Override
         public Content clone() {
             try {

+ 166 - 0
fs-service/src/main/java/com/fs/qw/vo/QwSopVO.java

@@ -0,0 +1,166 @@
+package com.fs.qw.vo;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QwSopVO {
+    /** id */
+    @TableId(type = IdType.UUID)
+    private String id;
+
+    /** 规则名称 */
+    @Excel(name = "规则名称")
+    private String name;
+
+    /** 状态 */
+    @Excel(name = "状态")
+    private Long status;
+
+    /** 类别 1个人 2企业微信 */
+    @Excel(name = "类别 1个人 2企业微信")
+    private Integer type;
+
+    /** qw_user主表的主键 */
+    @Excel(name = "qw_user主表的主键")
+    private String qwUserIds;
+
+    @Excel(name = "公司编号")
+    private Long companyId;
+
+    /**
+     发送类型 1定时接口发送 2 Ai接口发送 3完课 4ai新客对话
+     **/
+    private Integer sendType;
+    private Integer filterMode;
+    private String tags;
+
+    private String excludeTags;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String createTime;
+
+    private String tempId;
+
+    /**
+     * 过滤类别 1 包含全部 2 包含任意
+     */
+    private Integer filterType;
+
+    private String corpId;
+
+    private Integer expiryTime;
+
+    /**
+     *  是否开启新客户添加自动创建sop 1 否 2 是
+     */
+    private Integer isAutoSop;
+    /**
+     *   自动添加SOP的时间段
+     */
+    private String autoSopTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String stopTime;
+
+    private String createBy;
+    private Integer minConversionDay;
+    private Integer maxConversionDay;
+    private Integer minSend;
+    private Integer maxSend;
+    // 语音生成状态
+    private Integer voice;
+
+    /**
+     * 是否开启评级 1否 2是
+     */
+    private Integer isRating;
+
+    private Integer courseDay;
+
+
+    // 是否固定营期
+    private Integer isFixed;
+    // 是否只发送注册用户
+    private Integer isRegister;
+    // 进入营期打标签开始时间
+    private Integer startDayNum;
+    // 进入营期打标签结束时间
+    private Integer endDayNum;
+    // 添加的标签
+    private String addTags;
+    // 第几天开始发课
+    private Integer courseDateNum;
+    // 新课对话模板
+    private String newTemplateId;
+    private Long project;
+    // 群聊ID
+    private String chatId;
+
+
+    /**
+     * 销售id
+     */
+    @TableField(exist = false)
+    private Long userId;
+
+    /**
+     * 销售部门
+     */
+    @TableField(exist = false)
+    private List<Long> cuDeptIdList;
+
+    /**
+     * 部门类型 00 管理员 01 员工
+     */
+    @TableField(exist = false)
+    private String userType;
+
+    @TableField(exist = false)
+    private List<Long> qwUserIdList;
+
+    @Excel(name = "开启评论或者弹幕,1-开启评论;2-开启弹幕;3-都关闭")
+    private Integer openCommentStatus;
+
+    /**
+     * 是否按照营期 发送官方群发 1是 2否(否的时候按单链发)
+     */
+    private Integer isSampSend;
+
+    /**
+     * 是否关联商品 0不关联 1关联
+     */
+    private Integer isProduct;
+
+    /**
+     * 商品id
+     */
+    private String productIds;
+
+    /**
+     * 商品已购标签
+     */
+    private String productTag;
+
+    /**
+     * 升单商品id
+     */
+    private String upsellProductIds;
+
+    /**
+     * 升单商品已购标签
+     */
+    private String upsellProductTag;
+
+    //营期id
+    private String  userLogId;
+}

+ 25 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSop.java

@@ -144,4 +144,29 @@ public class QwSop implements Serializable
      * 是否按照营期 发送官方群发 1是 2否(否的时候按单链发)
      */
     private Integer isSampSend;
+
+    /**
+     * 是否关联商品 0不关联 1关联
+     */
+    private Integer isProduct;
+
+    /**
+     * 商品id
+     */
+    private String productIds;
+
+    /**
+     * 商品已购标签
+     */
+    private String productTag;
+
+    /**
+     * 升单商品id
+     */
+    private String upsellProductIds;
+
+    /**
+     * 升单商品已购标签
+     */
+    private String upsellProductTag;
 }

+ 6 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java

@@ -68,6 +68,12 @@ public class QwSopTempRules{
     @Excel(name = "排序")
     private Integer sorts;
 
+    @Excel(name = "是否购买 1未购 2购买 3升单未购 4升单已购")
+    private Integer isBuy;
+
+    @Excel(name = "1销售 2医师 3销售和医生")
+    private Integer orderSendType;
+
     @TableField(exist = false)
     private List<QwSopTempContent> settingList;
     @TableField(exist = false)

+ 6 - 0
fs-service/src/main/java/com/fs/sop/domain/SopUserLogsInfo.java

@@ -79,6 +79,12 @@ public class SopUserLogsInfo implements Serializable {
      */
     private Integer grade;
 
+    //普通商品是否已购 1未购 2已购
+    private Integer isProductBuy;
+
+    //升单商品是否已购 1未购 2已购
+    private Integer isUpsellProductBuy;
+
     /**
      * 营期时间
      */

+ 5 - 3
fs-service/src/main/java/com/fs/sop/mapper/QwSopMapper.java

@@ -8,9 +8,7 @@ import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.qw.domain.QwSopUpdateStatus;
 import com.fs.qw.result.QwFilterSopCustomersResult;
-import com.fs.qw.vo.ChatSopRuleTimeVO;
-import com.fs.qw.vo.QwSopRuleTimeVO;
-import com.fs.qw.vo.WxSopRuleTimeVO;
+import com.fs.qw.vo.*;
 import com.fs.sop.domain.QwSop;
 import com.fs.sop.params.GetSOPTaskDataParam;
 import com.fs.sop.params.QwSopAutoByTags;
@@ -431,4 +429,8 @@ public interface QwSopMapper extends BaseMapper<QwSop> {
     @DataSource(DataSourceType.SOP)
     //@Select("SELECT DISTINCT tags FROM qw_sop")
     List<String> selectSopTagIds();
+
+    @DataSource(DataSourceType.SOP)
+    @Select("SELECT s.*,i.id userLogId FROM qw_sop s LEFT JOIN sop_user_logs_info i ON s.id = i.sop_id WHERE s.is_product = 1 AND i.external_id = #{externalId} ")
+    List<QwSopVO> selectContainProductSop(@Param("externalId") Long externalId);
 }

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

@@ -348,6 +348,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="levelType != null">level_type = #{levelType},</if>
             <if test="firstTime != null">first_time = #{firstTime},</if>
             <if test="registerTime != null">register_time = #{registerTime},</if>
+            <if test="isProductBuy != null">is_product_buy = #{isProductBuy},</if>
+            <if test="isUpsellProductBuy != null">is_upsell_product_buy = #{isUpsellProductBuy},</if>
         </trim>
         where id = #{id}
     </update>

+ 5 - 0
fs-service/src/main/resources/mapper/sop/QwSopMapper.xml

@@ -477,6 +477,11 @@
             <if test="data.openCommentStatus != null">open_comment_status = #{data.openCommentStatus},</if>
             <if test="data.chatId != null">chat_id = #{data.chatId},</if>
             <if test="data.isSampSend != null">is_samp_send = #{data.isSampSend},</if>
+            <if test="data.isProduct != null">is_product = #{data.isProduct},</if>
+            <if test="data.productIds != null">product_ids = #{data.productIds},</if>
+            <if test="data.productTag != null">product_tag = #{data.productTag},</if>
+            <if test="data.upsellProductIds != null">upsell_product_ids = #{data.upsellProductIds},</if>
+            <if test="data.upsellProductTag != null">upsell_product_tag = #{data.upsellProductTag},</if>
         </trim>
         where id = #{data.id}
     </update>

+ 2 - 0
fs-service/src/main/resources/mapper/sop/SopUserLogsInfoMapper.xml

@@ -103,6 +103,8 @@
             <if test="externalId != null"> external_id = #{externalId},</if>
             <if test="fsUserId != null"> fs_user_id = #{fsUserId},</if>
             <if test="externalUserName != null"> external_user_name = #{externalUserName},</if>
+            <if test="isProductBuy != null"> is_product_buy = #{isProductBuy},</if>
+            <if test="isUpsellProductBuy != null"> is_upsell_product_buy = #{isUpsellProductBuy},</if>
         </trim>
         WHERE id = #{id}
     </update>