五、项目笔记实践

以下是具体项目,特做笔记进行记录。

学习笔记一:考核项目

简易选课系统

项目名称:简易选课系统:

项目数据库:

角色

老师:ID,编号,姓名,职称,性别

课程:ID,课程名,课程编号,课时分[10-50]

学生:ID,编号,姓名,性别,年龄

业务描述:

2> 教师进入系统:

1> 修改密码

2> 选择要教授的课程(每个老师最多只能选择教授3个课程)

3> 查看自己教授的课程下面有哪些学生。

页面和js效果确定:

页面效果如下图所示,修改密码功能、查询可以选择的课程、修改教师密码、禁用已选的课程、进行选课。




功能实现:

1.编写课程查询功能:已经被禁用掉的课程是不显示的。


2.进行选课:每个老师最多只能选择三门课,不能选择重复的课程。已选择完成,查询的下拉框会多出自己选择的课程。


3.禁用已选课程(后期bug修补):如果老师选错课程,可以禁用自己选的课程。如果有学生已经选课这门课,就不可以撤销重新选择。


4.修改密码功能: 

判断原密码是否输入正确,密码进行MD5加密存入数据库,前台输入的密码通过加密直接和数据库里的加密后的密码进行匹配。

判断新旧密码是否相同。这是前台easyui自带的功能


5.老师进行选课:根据自己选择的课程,查询出选课学生:后添加如果没有选择课程,则查询不到对应信息。


6.退出登录(后期bug修补):点击退出登录,清除session数据,退回到登录页面。

学习笔记二:财务:

财务部门根据需求,需要对部门现金的来源进行每周汇总。主要通过K8系统,盘古系统等金额来源进行汇总。方便财务进行公司资金分析和审核。其中包含加盟商月报表、代收货款表、现金查分表。

财务三张报表有很多功能相似。这里统一做笔记

知识要点一:

日期控件:My97DatePicker

此控件可以设置不能跨月查询,可以在页面框里设置,并且可以在js里直接绑定(和easyui差不多的方法。)

//开始时间日期控件绑定$("#startTime").focus(function(){    var endTime=$dp.$('endTime');    WdatePicker({        maxDate:'%y-%M-{%d-1}',        onpicked:function(){            endTime.value = "";            endTime.focus();        }    });})//结束时间$("#endTime").focus(function(){    WdatePicker({minDate:'#F{$dp.$D(\'startTime\')}',maxDate:'#F{ShowLastDate()||\'%y-%M-{%d-1}\'}'});})

知识要点二:

为了用户体验,前台尽量避免弹框提示。尽量从后台Message返回到前台一个提示信息。

加盟商月报表

项目名称:加盟商月报表

项目数据库:t_franchisees_monthly_report

业务描述:

[if !supportLists]1.[endif]每天凌晨定时跑数据;

[if !supportLists]2.[endif]期末余额每月末最后一天凌晨数据生成后自动结转为下月的期初余额;

[if !supportLists]3.[endif]报表为静态报表,只显示查询时间段内的数据,期初余额显示为当前开始时间所在月份的期初余额,查询时间不能超过一个自然月。

[if !supportLists]4.[endif]导出规则:页面设置分页,导出时,只导出当前页面勾选的数据;

5.列合计汇总。

页面和js效果确定:

页面最终效果如下图所示:主要包括:查询功能、数据导出两大功能。


初始页面如下图所示:

对比:日期控件由easyui自带的控件,变成My97DatePicker。解决当前之后的日期可以选择的问题,也解决不能跨月查询的问题。

导出功能也分为选中导出和全部数据导出。

对加盟商充值款不能进行编辑。



功能实现:

[if !supportLists]1. [endif]查询功能

[if !supportLists]A. [endif]前台数据绑定:collapsible: true, //xxxmethod: 'post', //post请求;

checkOnSelect: true,//多选; remoteSort:false, //远程排序;toolbar: '#tb',//绑定的工具; fit: true,//自适应; pageSize: 50, //显示页脚默认条数; showFooter: true, //显示页脚; pageList: [50,150,200,300,500],//页脚分页参数;frozenColumns:用于冻结列,不让移动。

colspan: 合并列,  rowspan:合并行

pagination: true, //显示分页;

this.initGrid = function() {    $('#dataList').datagrid({        frozenColumns: [[            {field: 'ck', checkbox: true},            {field: 'id', hidden: true},            {field: 'siteName', title: '部门名称',  width: 160, align:'center',  sortable: true},            {field: 'preMoney', title: '初期余额',  width: 70,   sortable: true}        ]],        columns: [            [                {field: '', title: '加盟商贷方发生额',  width: 400, colspan: 18, sortable: false},                {field: '', title: '加盟商借方发生额',  width: 1000, colspan: 32, sortable: false},                {field: 'backMoeny',title: '加盟商月末余额', width: 100, rowspan:3, remoteSortDisabled:true}            ],            [                {field: '', title: '充值项', colspan: 7, sortable: false},

……                {field: 'chargeSum', title: '合计', width: 60, rowspan:2, sortable: false}            ],            [                {field:'recharge',title:'自动充值',sortable:false},               ……                {field:'deductionsOther',title:'其他扣款',sortable:false},            ]        ]    });

[if !supportLists]B. [endif]页面编辑功能(此功能已停用)。

//保存编辑的数字;

$(function() {    var pager=$('#dataList').datagrid().datagrid('getPager');// get the pager of datagrid    pager.pagination({        buttons: [{            iconCls:'icon-save',            handler:function() {                rowname=[]            }        }]    });})


//指定的行可编辑;单击要编辑的单元格进行编辑,columns绑定的数据字段里增加如下代码—>直接引用easyui的数据网格里的”数据表格的单元编辑”


可编辑字段代码

//设置编辑之后的单元框样式变化,数据字段的代码如上。在js里设置全局数组变量rowname[],在编辑的代码里记录编辑之后的行索引。如下截取部分代码:加粗代码字段是把编辑过的索引放数组里。

var ed=$(this).datagrid('getEditor', param);if(ed){    //编辑过的行的索引放到数组里    rowname.push(param.index);    if($(ed.target).hasClass('textbox-f')){        $(ed.target).textbox('textbox').focus();    }else{        $(ed.target).focus();    }}

查询功能js代码如下,通过easyui自带的查询封装。开始月份和结束月份不能跨月查询,也不能为空。

//查询按钮$("#searchBtn").click(function(){    var startDate = $('#startTimeQ').val();    var endDate = $('#endTimeQ').val();    //时间判断不为空    if(startDate==null||startDate==""||endDate==null||endDate==""){        $.messager.alert('提示', '开始时间和结束时间不能为空');        return;    }    var options = $('#dataList').datagrid('options');    options.url = franchiseeList.URL.list;    options.queryParams = {        startTime:$('#startTimeQ').val().trim(),        endTime:$('#endTimeQ').val().trim(),        sendSuperiorSite:$('#sendSuperiorSite').combobox('getText').trim(),        siteName:$('#siteName').textbox('getText').trim()    };    $('#dataList').datagrid("load");});


后台Controller代码如下,因为不能跨月,所以要进行判断。页脚要进行统计所以加了页脚统计功能。并且把查询的结果封装到EzPage里。

@RequestMapping(value = {"/list"},method = RequestMethod.POST,produces="application/json;charset=UTF-8")@ResponseBodypublic String listFranchiseeReport(EzPageParam pageParam, FranchisessMonthlyQuery franchisessMonthlyQuery){    PageBean rs = null;    if(franchisessMonthlyQuery != null){        if(franchisessMonthlyQuery.getStartTime() !=null && franchisessMonthlyQuery.getEndTime()!= null){            if(!franchisessMonthlyQuery.getStartTime().equals("") && !franchisessMonthlyQuery.getEndTime().equals("")){                String[] start=franchisessMonthlyQuery.getStartTime().split("-");                String[] end=franchisessMonthlyQuery.getStartTime().split("-");                //判断是否跨年                if(start[0].equals(end[0]) && start[1].equals(end[1])){                    rs = service.listFranchiseeReport(PageUtils.convert(pageParam),franchisessMonthlyQuery);                    EzPage result =  PageUtils.convertPageBean(rs);                    String resultStr  = JSONUtil.object2Json(result);                    FranchiseesMonthlyReport countResult = getCountResult(result);                    //处理完结果放json里封装                    String footStr = JSONUtil.object2Json(countResult);                    //添加页尾的统计                    footStr = footStr.substring(0,footStr.length()-1)+",\"siteName\":\"统计结果\"}";                    resultStr = resultStr.substring(0,resultStr.length()-1) +",\"footer\":["+footStr+"]}";                    return  resultStr;                }            }        }    }    return null;}


[if !supportLists]C. [endif]保存修改的数据

//点击保存的数据,根据索引的数组。更新相应的行,注:行序号是索引序号+1,清除编辑完的样式,只要把数组清空,数据重新加载一下就可以了。

[if !supportLists]2. [endif]导出功能

a.导出选中数据

因为是按照部门分组求和的,所以导出的时候只能按照部门编号导出。具体前台js代码如下。

//导出选中数据按钮$("#exportSelectBtn").click(function() {    var rows = $('#dataList').datagrid('getSelections');    if(rows && rows.length >= 1) {        var siteNames = [];        for(var i=0;ivar excelForm = $("");        excelForm.find("#siteNames").val(siteNames.join(","));        var options = $('#dataList').datagrid('options');        var params = options.queryParams;        params['sort'] = options.sortName;        params['order'] = options.sortOrder;        for(var p in params){//遍历json对象的每个key/value对,p为key            excelForm.append("");        }        excelForm[0].submit();    } else {        $.messager.alert('提示', '请勾选您要导出的数据!');    }});


b.导出全部数据

把查询的条件作为请求参数,进行查询的结果就是导出全部数据。

//导出全部数据按钮$("#exportAllBtn").click(function() {    //创建一个表单提交    var excelForm = $("");    var options = $('#dataList').datagrid('options');    var params = options.queryParams;    var rows = $('#dataList').datagrid('getRows');    if(!params || $.isEmptyObject(params)||rows.length<1){        $.messager.alert('提示', '没有数据可以导出,请先查询!');        return;    }    params['sort'] = options.sortName;    params['order'] = options.sortOrder;    for(var p in params){//遍历json对象的每个key/value对,p为key        excelForm.append("");    }    excelForm[0].submit();});

后台代码如下:(请好好研究),岸伟写好的方法

@RequestMapping(value={"/excel"},method = RequestMethod.POST)public String excel(String sort,String order,FranchisessMonthlyQuery query,HttpServletResponse response){    if("null".equals(sort)){        sort  = null;    }    try {        final List list = new ArrayList();        response.reset();        response.setContentType("application/vnd.ms-excel;charset=utf-8");        response.setHeader("Content-Disposition", "attachment;filename=" + new String("加盟商月报表.xls".getBytes("UTF-8"), "iso-8859-1"));        ServletOutputStream out = response.getOutputStream();        DataField[] dataFields = new DataField[53];        dataFields [0] = new DataField("部门名称","siteName");

……        dataFields [52] = new DataField("合计","chargeSum");        list.addAll(service.listFranchiseeReport(query, sort, order));        new ExcelDataExportor(dataFields, new ExportDataSource() {            public  List getData() {                return list;            }        },out, MODE.EXCEL).export();    } catch (UnsupportedEncodingException e) {        e.printStackTrace();    } catch (IOException e) {        e.printStackTrace();    }    return null;}

总结:

加盟商月报表虽然业务描述很少,但是做的事情特别多。特别是每天定时跑数据。需要强大的数据库。几个数据库的信息抛入。

难点:还要初期余额和期末余额是选择的查询范围内的第一条和最后一条的数据。其他字段需要根据部门名称进行sum汇总。

代收货款表

项目名称:代收货款表

项目数据库:t_goods_payment_report

业务描述:

[if !supportLists]1.[endif]直营代收货款收银日期以财务对账日期为准(对账报表中运单的对账日期);

[if !supportLists]2.[endif]目的部门为加盟商的代收货款收银日期以加盟商自动结算日期为准;

[if !supportLists]3.[endif]目的部门为山东佳怡的代收货款收银日期以“退款申请_合作商代收货款进账查询”中进账日期为准;

[if !supportLists]4.[endif]查询时间不能超过一个自然月。

[if !supportLists]5.[endif]代收货款状态:

未收银:(应收单未核销)

已收银:已收银未对账(核销状态为未核销)

已对账:已对账未申请代收货款退款(核销状态为核销中,没有退款状态)已退回

已申请:已申请代收货款退款会计未审核(退款状态为已申请、已审核)

已退款:出纳确认退款(退款状态为已打款)

[if !supportLists]6.[endif]如果同一个运单出现2条或者多条数据,以已退款的状态为准,其他状态的数据也显示,但标记为红色。

可能出现原因:

 1)审批退回之后,又可以重新申请,则会出现重复单号

 2)退款之后,又出现反收银的,然后又可以重新申请了,则会出现重复单号

[if !supportLists]7.[endif]导出规则:页面设置分页,导出时,只导出当前页面勾选的数据;

[if !supportLists]8.[endif]列合计汇总。

页面和js效果确定:

页面最终效果如下图所示:主要包括:查询功能、数据导出两大功能。


虽然查询功能的条件特别多,但是不用多表链接。直接查询根据输入的信息就可以查询数据。(字段都在一张表里)

功能实现:

查询功能和导出功能。代码和实现和加盟商一样。所以就不特别做笔记

a.相同单号的,需要特别颜色标注出来。Js代码如下


现金拆分表

项目名称:现金拆分表

项目数据库:t_split_cash

业务描述:

1.每天凌晨定时跑数据;

2.报表为静态报表、日报表,只显示查询时间段内的数据,查询时间不能超过一个自然月。

3.导出规则:页面设置分页,导出时,只导出当前页面勾选的数据;

4.部门只统计直营网点;

5.剔除旺旺预付、旺旺预付到付数据;

6.当合计2!=收银合计3时,该条数据整行标红;

7.列合计汇总;

8.收银模式预留出6个字段,以便用来后期增加银行账户,暂时可以不在报表界面显示,但是导出时会存在预留字段,余额为0不会影响数据统计,可手动删除;

9.本期在途为查询期内最后一天的对账后差额,上期在途为上日本期在途结转。举例:查询3月10日到3月15日期间的现金分拆表,该期间内本期在途为3月15日的对账差额,上期在途指3月9的对账差额;

10.当天最早能查询前天(隔一天)的数据。

页面和js效果确定:

页面最终效果如下图所示:主要包括:查询功能、数据导出两大功能。额外“选中有颜色数据”功能。



功能实现:

查询功能和导出功能。代码和实现和加盟商一样。所以就不特别做笔记

在上期结余的字段,进行Controller转化的时候tSubMoney 转化成小写。绑定的时候就用小写:tsubMoney。

合并单元格:在页面合并单元格的时候,如果进行三行合并,那么就要分三级json数据绑定。最高的父级包含相关的列:

效果:合并单元格(现金拆分表)

 

选中有颜色数据:

有颜色是因为合计2 <> 合计3


选中按钮,如果有选中就取消全选。没有选中就选中有颜色数据。

//选中有颜色的按钮$("#SelectDisColorBtn").click(function() {    var rows = $('#dataList').datagrid('getSelections');    if(rows.length >= 1){      $('#dataList').datagrid('clearChecked');    }else{        var row1 = $('#dataList').datagrid('getRows');        for (var i = 0; i < row1.length; i++) {            if (row1[i].summationMoney2 != row1[i].summationMoney3) {                $('#dataList').datagrid('checkRow',i);            }        }    }});


总结:


学习笔记三:人资:

人资模块主要有人员信息表、文职薪资核算表、非文职薪资核算表。主要功能就是对薪资进行核算,减少人资的工作时间和提交人资的工作效率。

有查询、导入数据、删除、编辑、导出全部数据和导出选中数据。


注意:

[if !supportLists]1. [endif]权限配置:在配置的时候记住jsp页面要加,代码如下

<shiro:hasPermission name="/hr/unCivilianPayroll/import">导入数据 shiro:hasPermission>


数据库要加。加的时候,如果两个功能是连带关系,配置的路径要统一。数据库里用/**通配符匹配。


人资的导入模块和导入完成之后,下载错误信息的链接,没有考虑到这个问题。谨记!


[if !supportLists]2. [endif]页面改良:滚动加载

页面和财务报表的分页有些区别,财务页面是进行分页设置。而人资为了提高查询速率。设置了滚动加载的设置。页面效果如下:



Js前台代码:

remoteSort: false,rownumbers:true,view:bufferview,//实现滚动加载更多数据loadMsg:'',//这样就不会显示遮掩层

这里的bufferview是重写easyui的滚动方法,easyui自带的是scrollview在加载的时候会清除掉之前的数据,每次只能加载设置的默认多少条数据。

页脚合计显示:

//修改分页显示var pager = $('#dataList').datagrid('getPager');    //得到DataGrid页面pager.pagination({showPageList:false,layout:[], displayMsg:'一共{total}条记录  '})


[if !supportLists]3. [endif]页面排序

之前在页面加了排序,因为排序功能是对数据库进行操作,所以很影响性能。所以就把排序给去掉,增加性能。

人员信息表

人员信息表的模块,页面如下:


项目名称:人员信息表

项目数据库:t_person_information

业务描述:

1导入规则:核算工资必须首先导入该信息,在薪资核算信息导入之前,员工信息可以多次导入,但是信息表中已存在的工号则不可以重复导入,如果导入的信息中有重复工号,只导入第一条员工信息。没有成功导入的员工信息,会以一个Excel表格形式返回。

2导出规则:导出时,导出全部的数据,如果有查询条件,则导出通过条件过滤后全部的数据,与分页信息无关。

3查询条件:可以按照月份和员工姓名、工号查询某个月的某些员工的指定月份的信息,未导入的月份信息是不能查询到的,月份默认为上个月


4删除规则:在薪资核算信息导入之前,员工信息可以进行删除,如果导入的信息有多条信息错误,可以先将其批量删除,然后再将正确的信息重新导入。

5修改改则:在薪资核算信息导入之前,员工信息可以进行修改,如果导入的信息某一条数据错误,可以选中点击编辑,只能单条编辑。

功能实现:

导入功能:

导入功能的页面模板如下,在人资传数据之前先下载公司给定的模板。在exce1表格中填好数据。进行上传。上传有错误信息和重复信息都会生成错误的excel返回给上传人员。


导入数据的excel模板:


只有一张sheet表,所以进行判断还比较容易。

前台代码部分:

导入信息模块:显示进程导航条messager.progress({});

$('#uploadPlanForm').form('submit',{    url:staffList.URL.importExcel,    onSubmit:function(){        if($(this).form('enableValidation').form('validate')){            $.messager.progress({                title:'提示',                msg:'正在上传,请稍候...'            });            return true;        }        return false;    },    success:function(data){        $.messager.progress('close');        var data = eval('(' + data + ')'); // change the JSON string to javascript object        if(data.type == 'success'){            $.msgbox({msg:data.text,icon:data.type});            $('#dataList').datagrid("reload");            $('#uploadPlanDialog').dialog('close');        }else if(data.type =='warning'){            $('#dataList').datagrid("reload");            $('#uploadPlanDialog').dialog('close');            $('#errormsg').html(data.text);            $('#excelDialog').dialog("open");        }    },onLoadError:function(){        $.messager.progress('close');        $.msgbox({msg:'上传失败!',icon:'error'});    }});

通过submit进行提交。


导入错误数据模块:


后台代码:Controller里对应的方法,在server里进行传入字段值的判断,不能为负,不能超过31天,不能非数字字段插入。

删除功能:

删除功能的逻辑,人员表要判断是否核算过数据,核算过就不能对人员信息进行删除和编辑。主要是判断数据库里的reStatus字段是否为1,如果为1则可以进行修改和删除。

[if !supportLists]1. [endif]判断是否核算reStatus为1可删除,为0不可删除。

[if !supportLists]2. [endif]根据传入的ID数组进行批量删除。

@RequestMapping(value = "/delete/{ids}", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")@ResponseBodypublic MessageBox deletePayroll(@PathVariable String ids) {       /*判断是否可以修改,recStatus为1可以修改,0不可修改*/        for (String i : item) {            long staffid = Long.parseLong(i);            if (service.getById(staffid).getRecStatus() != 1) {                return MessageBox.getErrorMsg("工号为" + service.getById(staffid).getEmployeeNo() + "的员工信息不能删除");            }        }    return MessageBox.getErrorMsg("删除数据失败");}


编辑功能:

编辑功能

1.判断是否核算reStatus为1可修改,为0不可修改。

2.如果修改工号,判断工号是否存在,存在不可修改,不存在可以修改(等于新增人员)。

3.更新人员信息。

PersonInformation personInf = service.getById(personForm.getId());if (service.getById(personForm.getId()).getRecStatus() == 1) {    /*判断工号是否已经存在,已存在不可修改*/    if (personInf.getId().equals(personForm.getId())) {        if (personInf.getEmployeeNo().equals(personForm.getEmployeeNo())) {           /*进行修改*/                      

        } else {            StaffQuery staffQuery = new StaffQuery();            staffQuery.setEmployeeNo(personForm.getEmployeeNo());            staffQuery.setYearandMonth(personForm.getYearMonth());            Long count = service.countNo(staffQuery);     //查询该日期是否存在该工号            if (count < 1) {

            }            return MessageBox.getErrorMsg("工号已存在,不可修改!");        }    }}

导入,导出不做过多介绍。


总结:

人员信息表,导入还是比较简单的。Excel表格的模板也比较简单,只有把对应数据复制到信息下面就可以了。

文职薪资核算表

项目名称:文职薪资核算表

项目数据库:t_person_civilian

业务描述:

[if !supportLists]1.[endif]导出规则:导出时,导出全部的数据,如果有查询条件,则导出通过条件过滤后全部的数据,与分页信息无关。在确认核算前导出数据,只能导出不需系统计算的字段的值,需要系统计算的字段值是空的。

[if !supportLists]2.[endif]导入规则:导入前必须确保当月人员信息以及基本工资信息已经导入。在确认核算前工资明细数据可以多次导入,但是已经导入的数据则不可以重复导入,如果导入的信息中有重复工号,只导入第一条员工信息。没有成功导入的员工信息,会以一个Excel表格形式返回。

[if !supportLists]3.[endif]编辑规则:如果导入数据有个别数据错误,则可以通过编辑功能,选中某一条数据进行编辑,将数据修改正确。但是一旦确认核算后,则不可以再修改数据了。

[if !supportLists]4.[endif]删除规则:如果大量数据错误,则可以通过批量删除,将错误数据全部删除,然后再讲修改正确之后的数据重新导入。。

[if !supportLists]5.[endif]查询条件:可以按照月份和员工姓名、工号、部门、岗位查询薪资核算信息,月份默认选择上个月,未导入的月份信息是不能查询到的

[if !supportLists]6.[endif]数字需要扣除的金额,均为负数,需要增加的金额为正数。最终导入后,金额默认四舍五入,保留两位数。

[if !supportLists]7.[endif]确认核算:在确认核算之前,表中所有需要系统计算的数据均不显示,确认核算后,才会将所有需要计算的数据显示出来。

功能实现:

导入功能:

导入的excel模板如下:每个sheet对应要导入的字段。



主要是在上传的时候,把工资计算字段给算出来。调用了些的公共方法:CivilianCount


编辑功能:

[if !supportLists]1. [endif]填入信息,根据提示的框,输入正确的数字。

其中差错奖罚、应收账款、考勤奖罚金额可能为正可能为负

其他扣款、旷工扣款、资金占用费、资产盘点扣款、理赔扣款、PDA扣款金额为负数



[if !supportLists]2. [endif]编辑完系统重新计算薪资,

非文职薪资核算表

项目名称:非文职薪资核算表

项目数据库:t_person_uncivilian

业务描述:

 

功能实现:

 

导入功能:

编辑功能:


总结:

人资的报表,主要在导入功能,对excel文档的字段匹配和判断。

Excel文档的兼容性不是太好,所以对模板的要求很高,数据导入之后对数据进行计算。最后算出工资。人资可以进行编辑,修改,删除,导出等操作。


数据库:

链接1:121.40.102.32:3306      用户名:root 密码:Cl0udlead123

链接2:192.168.1.142 3306      用户名:root 密码:Cl0udlead123


大达报表系统


1.生成合并头的excel表格的功能

2.页面使用图标,背景切割技术。

3.field以后用list,进行add插入条目


5.9号记录:

发现在配置文档是,静态文档加载不了。包括js,css,和图片。


解决办法:在spring-mvc.xml里配置

       

cors是在4.3之后才有的。要在开头引用


这样web.xml里就不用配置了。

你可能感兴趣的:(五、项目笔记实践)