首页 > 其他分享 >在线客服系统历史会话搜索,访客消息筛选功能,根据访客时间、标签、活跃日期范围、消息记录搜索

在线客服系统历史会话搜索,访客消息筛选功能,根据访客时间、标签、活跃日期范围、消息记录搜索

时间:2023-04-15 23:24:21浏览次数:36  
标签:search args visitorName 会话 搜索 Query 访客

有些客户可能会有这样的需求,对历史访客会话需要能够搜索筛选。

 之前,对于历史会话列表,一直就是放那没怎么去点过。因为在聊天面板界面已经能够符合我的需求,没有那么多搜索的需求。但是,还是会有客户需要根据访客时间、标签、活跃日期范围、消息记录搜索对应的访客。

所以就针对这个需要又改造优化了一点。

 

效果图展示

 现在,可以根据客服账号,访客名称,访客标签,最后活跃日期,以及消息内容进行搜索历史访客列表

代码部分的实现,可以参考我的逻辑。注意,只是部分主要功能代码,不要照搬,重点看实现方式。

前端部分的代码可以参考下面的

                        <el-form :inline="true" :model="visitorSearch" class="demo-form-inline">
                            <el-form-item label="子账号名称">
                                <el-input v-model="visitorSearch.kefuName"></el-input>
                            </el-form-item>
                            <el-form-item label="访客名称">
                                <el-input v-model="visitorSearch.name"></el-input>
                            </el-form-item>
                            <el-form-item :label="flyLang.tag">
                                <el-select clearable="true" v-model="visitorSearch.tag">
                                    <el-option :label="item.name" :value="item.id" v-for="item in allTags" v-bind:key="item.id"></el-option>
                                </el-select>
                            </el-form-item>
                            <br>
                            <el-form-item label="活跃日期">
                                <el-date-picker
                                        value-format="yyyy-MM-dd"
                                        v-model="visitorSearch.updateTime"
                                        type="datetimerange"
                                        align="right"
                                        unlink-panels
                                        range-separator="至"
                                        start-placeholder="开始日期"
                                        end-placeholder="结束日期"
                                        :picker-options="pickerOptions">
                                </el-date-picker>
                            </el-form-item>

                            <el-form-item :label="flyLang.content">
                                <el-input v-model="visitorSearch.message"></el-input>
                            </el-form-item>
                            <el-form-item>
                                <el-button type="primary" @click="searchVisitor"  icon="el-icon-search" ></el-button>
                            </el-form-item>
                        </el-form>

 

后端部分的代码可以参考下面的

    page, _ := strconv.Atoi(c.Query("page"))
    pagesize, _ := strconv.Atoi(c.Query("pagesize"))
    entId, _ := c.Get("ent_id")
    search := ""
    args := []interface{}{}
    //通过访客名搜索
    visitorName := c.Query("visitorName")
    if tools.IsIP(visitorName) {
        search += " and client_ip = ? "
        args = append(args, visitorName)
    } else if visitorName != "" {
        search += " and (name like ? or visitor_id like ?)"
        args = append(args, "%"+visitorName+"%")
        args = append(args, "%"+visitorName+"%")
    }
    //通过客服名搜索
    kefuName := c.Query("kefuName")
    if kefuName != "" {
        search += " and to_id = ? "
        args = append(args, kefuName)
    }
    //根据活跃时间
    updateTime := c.Query("updateTime")
    if updateTime != "" {
        timeArr := strings.Split(updateTime, "~")
        search += " and updated_at>= ? and updated_at <= ? "
        args = append(args, timeArr[0], timeArr[1])
    }
    //根据tag找出visitor
    visitorTag := c.Query("visitorTag")
    var visitorIdsArr []string
    if visitorTag != "" {
        visitorTags := v2.GetVisitorTags("tag_id = ? ", visitorTag)
        for _, visitorTag := range visitorTags {
            visitorIdsArr = append(visitorIdsArr, visitorTag.VisitorId)
        }
        if len(visitorIdsArr) != 0 {
            search += " and visitor_id in (?) "
            args = append(args, visitorIdsArr)
        }
    }

    //根据内容找出visitor
    visitorMessage := c.Query("visitorMessage")
    if visitorMessage != "" {
        visitors := models.FindMessageByQuery("ent_id = ? and content like ?", entId, "%"+visitorMessage+"%")
        for _, visitor := range visitors {
            visitorIdsArr = append(visitorIdsArr, visitor.VisitorId)
        }
        if len(visitorIdsArr) != 0 {
            search += " and visitor_id in (?) "
            args = append(args, visitorIdsArr)
        }
    }

    //根据已读未读找出visitor
    //根据内容找出visitor
    readType := c.Query("readType")
    if readType != "" {
        visitors := models.FindMessageByQuery("ent_id = ? and mes_type='visitor' and status = ?", entId, readType)
        visitorIdsArr = []string{}
        for _, visitor := range visitors {
            visitorIdsArr = append(visitorIdsArr, visitor.VisitorId)
        }
        if len(visitorIdsArr) != 0 {
            search += " and visitor_id in (?) "
            args = append(args, visitorIdsArr)
        }
    }

    //排序参数
    orderBy := c.Query("orderBy")
    if orderBy == "" {
        orderBy = "updated_at desc"
    } else {
        orderBy = orderBy + " desc"
    }
    vistors := models.FindVisitorsByEntId(uint(page), uint(pagesize), fmt.Sprintf("%v", entId), orderBy, search, args...)
    count := models.CountVisitorsByEntid(fmt.Sprintf("%v", entId), search, args...)

 

标签:search,args,visitorName,会话,搜索,Query,访客
From: https://www.cnblogs.com/taoshihan/p/17322214.html

相关文章

  • 搜索功能的技术方案
    MySQL数据同步到ElasticSearch最近的创业项目涉及到搜索功能,显然,尽管MySQL有模糊查询的功能,但是它并不适合用来实现搜索功能,所以一般需要使用到ES,它常常被用来进行大数据搜索,也支持分词。同步双写方案以前我在大学时候也写过,但是使用的是同步双写的方案:即在写入MySQL的同时又写......
  • kuangbin专题一 简单搜索 迷宫问题(POJ-3984)
    迷宫问题TimeLimit:1000MS MemoryLimit:65536KDescription定义一个二维数组:intmaze[5][5]={0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1,0,};它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编......
  • kuangbin专题一 简单搜索 石油储备(HDU-1241)
    OilDepositsTimeLimit:2000/1000MS(Java/Others)MemoryLimit:65536/32768K(Java/Others)ProblemDescriptionTheGeoSurvCompgeologicsurveycompanyisresponsiblefordetectingundergroundoildeposits.GeoSurvCompworkswithonelargerectangula......
  • kuangbin专题一 简单搜索 起火迷宫(UVA-11624)
    Fire!DescriptionJoeworksinamaze.Unfortunately,portionsofthemazehavecaughtonfire,andtheownerofthemazeneglectedtocreateafireescapeplan.HelpJoeescapethemaze.GivenJoe’slocationinthemazeandwhichsquaresofthemazeareo......
  • kuangbin专题一 简单搜索 点火游戏(FZU-2150)
    FireGameDescriptionFatbrotherandMazeareplayingakindofspecial(hentai)gameonanN*Mboard(Nrows,Mcolumns).Atthebeginning,eachgridofthisboardisconsistingofgrassorjustemptyandthentheystarttofireallthegrass.Firstlyt......
  • kuangbin专题一 简单搜索 罐子(POJ-3414)
    PotsTimeLimit:1000MS MemoryLimit:65536KDescriptionYouaregiventwopots,havingthevolumeofAandBlitersrespectively.Thefollowingoperationscanbeperformed:FILL(i)fillthepoti(1≤i≤2)fromthetap;DROP(i)emptythep......
  • modelform搜索框的实现
    1.前端{%extends'utils.html'%}{%blockcontent%}<divclass="container"><divclass="panelpanel-default"><divclass="panel-heading"><h3class=&quo......
  • 删除无效的括号(广度优先搜索、字符串)、计算右侧小于当前元素的个数(树状数组、线段
    删除无效的括号(广度优先搜索、字符串)给你一个由若干括号和字母组成的字符串s,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按任意顺序返回。示例1:输入:s="()())()"输出:["(())()","()()()"]示例2:输入:s="(a)())()"输出:["(a())()","(......
  • 最优二叉搜索树问题(Java)
    最优二叉搜索树问题(Java)1、前置介绍2、算法设计思路2.1最优二叉搜索树的结构2.2一个递归算法2.3计算最优二叉搜索树的期望搜索代价3、代码实现4、复杂度分析5、参考资料1、前置介绍设S={x1,x2,…,xn}是有序集,且x1<x2<…<xn,表示有序集S的二叉搜索树利用二叉树的结......
  • LeetCode 538.把二叉搜索树转换成累加树
    1.题目:给出二叉搜索树的根节点,该树的节点值各不相同,请你将其转换为累加树(GreaterSumTree),使每个节点node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键小于节点键的节点。节点的右子树仅包含键大于节点键的......