zoukankan      html  css  js  c++  java
  • 随笔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="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的报错.



     
  • 相关阅读:
    ubuntu>雷鸟只能收邮件不能发邮件
    ubuntu>安装jdk(转)
    ubuntu>修改root密码
    ios>Could not instantiate class named NSLayoutConstraint(转)
    ios>xcode4.5 如何找到以前的iphone模拟器(转)
    Windows7系统开始菜单改成经典样式
    ASP.NET多语言版的开发
    Dynamic repositories in LightSpeed
    Enhancing queries in dynamic repositories
    C# 4.0 Dynamic关键字全解析
  • 原文地址:https://www.cnblogs.com/Lukizzz/p/9544443.html
Copyright © 2011-2022 走看看