随笔7

今天在主播后台中添加客服回复统计的功能,把遇到的问题和过程整理下来:
1.首先,在菜单的数据库中添加一条"客服回复统计"的菜单数据,并添加到相应的父菜单中;写一个页面:

<!DOCTYPE html>
<html>
<head>
<#include "../inc/inc.ftl"/>
</head>
<body>
<div class="easyui-layout" data-options="fit:true,border:false" >
    <table id="dg"></table>
</div>
<div id="toolbar" style="padding:5px;height:auto">
    <form id="queryForm">
        <div>
            客服号:<input class="easyui-textbox" name="username" value="0" style="width:120px">
            时间:
            <input class="easyui-datetimebox" id="startDate" name="startDate" data-options="width:120">
            -
            <input class="easyui-datetimebox" id="endDate" name="endDate" data-options="width:120">
            <a href="javascript:void(0);" onclick="javascript:loadData();" class="easyui-linkbutton" iconCls="icon-search">Search</a>
        </div>
    </form>
</div>
</body>
</html>
<script type="text/javascript">
    $(document).ready(function () {
        $('#startDate').datetimebox('setValue', getFormatDate(1));
        $('#endDate').datetimebox('setValue',getFormatDate(-1));
        loadData();
    });
    function getFormatDate(dateNum) {
        var day1 = new Date();
        day1.setTime(day1.getTime()-24*60*60*1000*dateNum);
        var s1 = day1.getFullYear()+"-" + (day1.getMonth()+1) + "-" + day1.getDate();
        return s1;
    }
    function loadData() {
        $("#dg").datagrid({
            url:'${request.contextPath}/examine/getStatisticsReplay',
            striped: true,
            border: false,
            collapsible:false,        //是否可折叠的
            loadMsg:'正在加载数据...',
            fit: true,                //自动大小
            singleSelect:true,//是否单选
            pagination:true,//分页控件
            remoteSort: false,
            pageSize:50,
            showFooter: true,
            queryParams: $('#queryForm').serializeJSON(),
            columns:[[{
                field:'username',
                title:'客服号',
                width:110,
                halign:'center',
            },{
                field:'serviceAccid',
                title:'客服云信号',
                width:110,
                halign:'center',
            },{
                field: 'totalTime',
                title: '总时长',
                width: 100,
                halign: 'center',
               /* formatter: function (value, row, index) {
                    return (value / 60).toFixed(0);
                }*/
            },{
                field:'replayNum',
                title:'总回复数',
                width:100,
                halign:'center',
            },{
                field:'aveTime',
                title:'平均回复时长',
                width:140,
                halign:'center'
            }
            ]],
            toolbar: '#toolbar'
        });
    }

</script>

效果是这样:

栏目数和内容在

columns:

添加或删除

2.习惯性写完前端页面后写数据库操作:

在StatisticsReplayRecordMapper中写selectReplayRecord方法

public interface StatisticsReplayRecordMapper extends BaseMapper<StatisticsReplayRecord> {
    List<StatisticsReplayRecord> selectReplayRecord(@Param(value = "username") String username,
                                                    @Param(value = "startDate")String startDate,
                                                    @Param(value = "endDate")String endDate);
}

然后去相应的xml进行配置:

在调试过程中有发现只能得到id和username的数据,是因为映射没配置好

<resultMap id="BaseResultMap" type="com.yd.anchor.domain.mybatis.model.StatisticsReplayRecord">
        <result column="create_time" property="createTime" />
        <result column="modify_time" property="modifyTime" />
        <result column="service_accid" property="serviceAccid" />
        <result column="user_accid" property="userAccid" />
        <result column="interval_time" property="intervalTime" />
    </resultMap>

在mybatis中,数据库字段的映射需要自己配置,特别注意resultMap 的id和type.

在写where里面的内容时,我最初写的是create_time>#{startDate} and create_time<>#{endDate},但是出现了报错,提示的大概意思是数据库的格式不允许">"这类意思,网上描述的也很模糊,我改成了下面的语句后能正常运行

<?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.yd.anchor.domain.mybatis.mapper.StatisticsReplayRecordMapper">

    <resultMap id="BaseResultMap" type="com.yd.anchor.domain.mybatis.model.StatisticsReplayRecord">
        <result column="create_time" property="createTime" />
        <result column="modify_time" property="modifyTime" />
        <result column="service_accid" property="serviceAccid" />
        <result column="user_accid" property="userAccid" />
        <result column="interval_time" property="intervalTime" />
    </resultMap>

    <select id="selectReplayRecord" resultMap="BaseResultMap">
        select * from statistics_replay_record
        <where>
            <if test="startDate != null and startDate != '' or endDate != null and endDate != ''">
                AND create_time between #{startDate} and #{endDate}
            </if>
            <if test="username!= null and username!=''">
                and username=#{username}
            </if>
        </where>
    </select>
</mapper>

3.controller的代码省略了,直接到service层:

在写的过程中发现

StatisticsReplayRecord中的字段和我需要返回前端的数据不同,所以创建了一个新的DTO用来承载这些数据
    /**
     * 客服回复统计
     * @param username
     * @param startDate
     * @param endDate
     * @return
     */
    public  List<StatisticsReplayRecordDTO> getStatisticsReplay(String username, String startDate, String endDate){
        //根据username,startDate,endDate查询到数据封装在list中
        List<StatisticsReplayRecord> list = statisticsReplayRecordMapper.selectReplayRecord(username,startDate,endDate);
        StatisticsReplayRecordDTO dto=new StatisticsReplayRecordDTO();
        List<StatisticsReplayRecordDTO> list1 = new ArrayList<>();
        //对集合操作前判空
        if(!CollectionUtils.isEmpty(list)){
            dto.setTotalTime(0);
            dto.setUsername(list.get(0).getUsername());
            dto.setServiceAccid(list.get(0).getServiceAccid());
            dto.setReplayNum(list.size());
            //遍历循环,每循环一次加上相应的时间
            list.forEach(x->{
                dto.setTotalTime(x.getIntervalTime()+dto.getTotalTime());
            });
            //调用Math.floor去掉小数
            Double ave = Math.floor(dto.getTotalTime()/dto.getReplayNum());
            dto.setAveTime(ave);
            list1.add(dto);

        }
        return list1;
    }

大概的操作都写了注释,但是需要注意一个是在对集合操作的时候要判空,另一个是要返回list或者规定的datagrid格式,因为页面上是用easyui的datagrid接受,刚开始我直接返回dto,一直出现什么length的报错.



 

猜你喜欢

转载自www.cnblogs.com/Lukizzz/p/9544443.html