今天在主播后台中添加客服回复统计的功能,把遇到的问题和过程整理下来:
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="120px"> 时间: <input class="easyui-datetimebox" id="startDate" name="startDate" data-options="120"> - <input class="easyui-datetimebox" id="endDate" name="endDate" data-options="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:'客服号', 110, halign:'center', },{ field:'serviceAccid', title:'客服云信号', 110, halign:'center', },{ field: 'totalTime', title: '总时长', 100, halign: 'center', /* formatter: function (value, row, index) { return (value / 60).toFixed(0); }*/ },{ field:'replayNum', title:'总回复数', 100, halign:'center', },{ field:'aveTime', title:'平均回复时长', 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的报错.