【前端】記一次完整的Web頁面的實現過程--統計報表

功能描述:父子表結構,通過父表進行查詢,點擊父表顯示子表內容,子表內容由生成條件產生,從點驗、發料單中過濾數據。兼有導出功能

功能演示:

JSP:report-issue-check.jsp

<%--
  Created by IntelliJ IDEA.
  User: hucon
  Date: 2019-04-28
  Time: 上午 11:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="fns" uri="/WEB-INF/tlds/fns.tld" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags"%>

<c:set var="ctx" value="${pageContext.request.contextPath}" />

<style>
    .double-row>td>div.datagrid-cell{padding: 5px 8px;}
    .double-row>td[field="_expander"]>div.datagrid-cell{padding: 0 5px;}
</style>

<div class="easyui-layout" data-options="fit:true">
    <div data-options="region:'center'" class="layui-container">
        <div class="tools">
            <a id="btn-add" href="#" class="easyui-linkbutton" data-options="iconCls:'fa-icon fa fa-plus-square',plain:'true'">新增</a>
            <a id="btn-edit" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'fa-icon fa fa-edit',plain:'true'">編輯</a>
            <a id="btn-del" href="#" class="easyui-linkbutton" data-options="iconCls:'fa-icon fa fa-trash',plain:'true'">刪除</a>
        </div>
        <div class="layui-row layui-col-space10">
            <div class="layui-col-sm12">
                <div class="layui-row layui-col-space10">
                    <div class="layui-col-sm12">
                        <div class="box-info">
                            <div class="box-info-body">
                                點驗收發支存統計表:
                                顯示所有:
                                <a href="#" id="btn-all"  class="easyui-checkbox" data-options="checked:true"></a>
                                <a href="#" id="btn-date-week" data-type=1 class="easyui-linkbutton date-select selected" data-options="plain:true">按周</a>
                                <a href="#" id="btn-date-month" data-type=2 class="easyui-linkbutton date-select" data-options="plain:true">按月</a>
                                <a href="#" id="btn-date-year" data-type=3 class="easyui-linkbutton date-select" data-options="plain:true">按年</a>
                                時間段:
                                <input id="begin-date" class="easyui-datebox" style="width:120px"> ~ <input id="end-date"  class="easyui-datebox" style="width:120px">
                                項目部:
                                <input id="belong-project" class="easyui-combotree" style="width:160px">
                                編號:
                                <input id="report-no" class="easyui-textbox" style="width:160px">
                                <a href="#" id="btn-search" class="easyui-linkbutton info" data-options="iconCls:'fa-icon fa fa-search'">搜索</a>
                                <a href="#" id="btn-refresh" class="easyui-linkbutton" data-options="plain:true, iconCls:'fa-icon fa fa-refresh'">重置</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <div class="layui-row layui-col-space10">
            <div class="layui-col-sm12">
                <div class="box-info">
                    <div class="box-info-body">
                        <table id="tt" class="easyui-datagrid"  style="width: 100%;"></table>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

<div id="dlg" class="easyui-window" title="點驗收發收支存統計" data-options="modal:true,closed:true,collapsible:false,minimizable:false,border:'thin',shadow:false" style="width:1200px;height:680px;padding:5px;">
    <div class="easyui-layout" data-options="fit:true">
        <div data-options="region:'center'" style="overflow-x: hidden">
            <form id="edit-form" method="post" >
                <div class="layui-row layui-col-space10">
                    <div class="layui-col-sm12">
                        <div class="box-info">
                            <div class="box-info-header" style="text-align: right">
                                <div name="no" id="form-reportNo" class="easyui-textbox" data-options="label:'統計編號:',editable:false,width:'40%'"></div>
                                <a id="form-btn-submit" href="#" class="easyui-linkbutton info"  data-options="iconCls:'fa-icon fa fa-save'">保存</a>
                                <a id="form-btn-reset" href="#" class="easyui-linkbutton" data-options="plain:true,iconCls:'fa-icon fa fa-refresh'">重置</a>
                            </div>
                            <div class="box-info-body">
                                <div class="layui-row layui-col-space12">
                                    <div class="layui-col-sm4">
                                        <div name="officeId" id="form-OrgName" class="easyui-combotree" data-options="label:'編制單位:',editable:false,width:'99%'"></div>
                                    </div>
                                    <div class="layui-col-sm4">
                                        <div name="beginDate" id="form-begin-date" class="easyui-datebox" data-options="label:'起始日期:',width:'99%',required:true"></div>
                                    </div>
                                    <div class="layui-col-sm4">
                                        <div name="endDate" id="form-end-date" class="easyui-datebox" data-options="label:'截止日期:',width:'99%',required:true"></div>
                                    </div>
                                </div>
                            </div>
                            <div class="layui-row layui-col-space5">
                                <table title="點驗收發收支存" id="form-tt" class="easyui-datagrid" data-options="width:'100%',marginTop:'5px',minHeight:'300px'"></table>
                                <div id="form-tb">
                                    <a id="form-btn-new" href="javascript:void(0);" class="easyui-linkbutton" iconCls="fa-icon fa fa-add" data-options="plain:true">生成</a>
                                    <a id="form-btn-export" href="javascript:void(0);" class="easyui-linkbutton" iconCls="fa-icon fa fa-export" data-options="plain:true">導出</a>
                                </div>
                            </div>
                            <div class="layui-row layui-col-space10">
                                <div style="display: inline-block;height: 85px">
                                    <div style="display: inline-block;height: 85px;vertical-align: middle">附件:</div>
                                    <input type="hidden" id="pics"><input type="hidden" id="files">
                                    <div style="display: inline-block">
                                        <a id="pic-add-btn" href="#"  class="easyui-linkbutton pic-add-button info" style="width: 80px;height: 80px;float: left;padding: 5px;margin:10px 0 5px 32px;" data-options="iconCls:'fa-icon fa fa-image',size:'',iconAlign:'top'"></a>
                                        <div id="custom-pic-preview" class="pic-preview" style="float: right;margin-left: 10px"></div>
                                        <input type="hidden" id="custom-pics" class="pics" name="pics" value="">
                                    </div>
                                </div>
                            </div>
                            <div id="edit-id" name="id" class="easyui-textbox" type="hidden" ></div>
                        </div>
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

<script type="text/javascript">
    require(['${ctx}/assets/js/app/trace/report-issue-check.js']);
</script>

JS:report-issue-check.js


define(function(require, exports, module){

    var $ = require('jquery');
    var Util = require('../../util/util.js');
    var util= require('util');
    var dataGridUrl = $CONFIG.base_url+'/api/report/issue/check/list';

    // 定義表格
    var conf = {
        options:{
            pagination:true,
            idField:'id',
            url:dataGridUrl,
            rownumbers: false,
            singleSelect:true,
            method:'get',
            rowStyler: function(index,row){
                return {class:'double-row'};
            },
            columns:[[
                {field:'no',title:'統計表編號',width:'15%',
                    formatter:function (value,row,index) {
                        var str='<a href="javascript:void(0)" class="issue-check-detail" style="cursor:pointer;color:blue">'+value+'</a>';
                        return str;
                    }
                },
                {field:'projectName',title:'項目名稱',width:'15%', halign:'center', align:'center'},
                {field:'beginDate',title:'開始時間',width:'15%', halign:'center', align:'center'},
                {field:'endDate',title:'截止時間',width:'15%', halign:'center', align:'center'},
                {field:'officeName',title:'編制單位',width:'15%', halign:'center', align:'center'},
                {field:'createdByName',title:'編制用戶',width:'15%', halign:'center', align:'center'},
                {field:'pics',title:'附件',width:'10%',align:'left',
                    formatter:function (value, row, index) {
                        return value?util.showPics(value):''
                    }
                }
            ]],
            onLoadSuccess:function (data) {
                $('#btn-search').linkbutton('enable');
                $('#btn-search').linkbutton({'text':'搜索'});

                // 詳情
                $('.issue-check-detail').click(function () {
                    setTimeout(function () {
                        editForm();
                    },10);
                });
            },
        },
    };
    var dg = $('#tt').datagrid('subgrid', conf);

    // 加載新增表格
    $('#dlg').window({
        onOpen:function(){
            $('#form-tt').datagrid({
                toolbar:'#form-tb',
                rownumbers:true,
                showFooter:true,
                // singleSelect:true,
                emptyMsg:"<div style='text-align: left;padding-left: 30px'>無數據顯示</div>",
                columns: [[
                    {field:'officeName',title:'項目名稱',width:'10%',align:'left'
                    },
                    {field:'materialName',title:'物資名稱',width:'8%',align:'left'
                    },
                    {field:'code',title:'規格型號',width:'8%',align:'left'
                    },
                    {field:'unit',title:'單位',width:'6%',align:'left'
                    },
                    {field:'checkNum',title:'點驗數量',width:'8%',align:'left'
                    },
                    {field:'checkFee',title:'點驗金額(不含稅)',width:'14%',align:'left'
                    },
                    {field:'issueNum',title:'發料數量',width:'8%',align:'left'
                    },
                    {field:'issueFee',title:'發料金額(不含稅)',width:'14%',align:'left'
                    },
                    {field:'storageNum',title:'庫存數量',width:'8%',align:'left',
                        formatter:function (value, row, index) {
                            return row.checkNum-row.issueNum;
                        }
                    },
                    {field:'fee',title:'庫存金額(不含稅)',width:'14%',align:'left',
                        formatter:function (value, row, index) {
                            return row.checkFee-row.issueFee;
                        }
                    },
                    {field:'memo',title:'備註',width:'10%',align:'left',
                        editor:{type:'textbox'}
                    }
                ]],
                onBeginEdit:function (index,row) {
                    $('.easyui-checkbox').checkbox({width:'18px', height:'18px'});
                },
                onLoadSuccess:function (index) {

                    if(index.rows){
                        for(let i=0;i<index.total;i++){
                            $('#form-tt').datagrid('beginEdit',i);
                        }
                    }
                },

            });
        }
    });

    var checkState = true;

    //全部顯示
    $("#btn-all").checkbox('options').onChange=function(){
        checkState = !checkState;
        exports.loadList();
    };

    // 項目部
    $('#belong-project').combotree({
        method:'get',
        url:$CONFIG.base_url+'/api/user/office/tree?type=own&userId='+$CONFIG.uid,
        lines:true,
        panelWidth:300,
        panelAlign:'left'
    });
    $('#belong-project').combotree('setValue',$CONFIG.office);

    // 編號
    $("#report-no").textbox({
        prompt:'輸入統計單號'
    });

    exports.loadList = function(){
        //卡一下日期
        var begin=$('#begin-date').datebox('getValue').replace(/-/g,'/'),end=$('#end-date').datebox('getValue').replace(/-/g,'/');
        var fbegin=new Date(begin),fend=new Date(end);
        var num=parseInt(fend-fbegin);
        if(num<0){
            $.messager.alert({
                shadow:false,
                border:'thin',
                title:'提示',
                msg:'結束日期不能小於開始日期'
            });
            return;
        }

        var beginDate = checkState==true?null:$('#begin-date').datebox('getValue');
        var endDate= checkState==true?null:$('#end-date').datebox('getValue');
        var params = {
            beginDate:beginDate,
            endDate:endDate,
            officeId:$('#belong-project').combotree('getValue'),
            no:$('#report-no').textbox('getValue'),
        };
        $('#tt').datagrid({
            url: '/api/report/issue/check/list',
            queryParams:params,
        });

    };

    // 初始化日期
    $('#begin-date').datebox({editable: false});
    $('#end-date').datebox({editable: false});
    $('#begin-date').datebox('setValue', Util.getWeekStartDate());
    $('#end-date').datebox('setValue', Util.getWeekEndDate());

    // 日期類型
    $('.date-select').click(function () {
        $('.date-select').removeClass('selected');
        $(this).addClass('selected');
        var type = $(this).data('type');

        if(type == 1){
            $('#begin-date').datebox('setValue', Util.getWeekStartDate());
            $('#end-date').datebox('setValue', Util.getWeekEndDate());
        }else if(type == 2){
            $('#begin-date').datebox('setValue', Util.getMonthStartDate());
            $('#end-date').datebox('setValue', Util.getMonthEndDate());
        }else if(type == 3){
            $('#begin-date').datebox('setValue', Util.getYearStartDate());
            $('#end-date').datebox('setValue', Util.getYearEndDate());
        }

        exports.loadList();
    })


    /*==========================================頁面操作事件=======================================================*/
    // 搜索
    $("#btn-search").click(function(){
        exports.loadList();
    });

    //新增
    $('#btn-add').click(function () {
        //清空form-tt數據
        $('#form-tt').datagrid({data:{rows:[]}});
        $('#edit-form').form('clear');
        $('#dlg').window('open');
    });

    //重置
    $('#btn-refresh').click(function () {
        $('#begin-date').datebox('clear');
        $('#end-date').datebox('clear');
        $('#belong-project').textbox('clear');
        $('#report-no').textbox('clear');

        exports.loadList();
    });

    //導出
    $("#btn-export").click(function(){
        //導出數據功能
    });

    // 編輯
    $('#btn-edit').click(function () {
       editForm();
    });

    function editForm(){
        let row=$('#tt').datagrid('getSelected');
        if(!row){
            util.alertMsg('請選擇要編輯的數據!','提示');
            return
        }
        //清空數據
        $('#edit-form').form('clear');
        $('#form-tt').datagrid('loadData',[]);
        $('.pic-preview').empty();

        //加載數據
        $('#edit-form').form('load',row);

        //編輯纔會有edit值
        $('#edit-id').textbox('setValue',row.id);

        // 顯示附件
        util.attach.thumbnailView(row.pics);

        //先打開窗口再加載數據
        $('#dlg').window('open');
        $('#form-tt').datagrid('loadData',row.details);

        for(var i=0,len = row.details.length;i<len;i++){
            $('#form-tt').datagrid('beginEdit',i);
        }
    }

    /*==========================================頁面彈出層操作事件=====================================*/

    // 生成統計表
    $("#form-btn-new").click(function (){

        var officeId = $("#form-OrgName").combotree('getValue');
        var beginDate = $("#form-begin-date").datebox('getText');
        var endDate = $("#form-end-date").datebox('getText');

        if(officeId.length>0 && beginDate.length>0 && endDate.length>0){
            var posting = $.get($CONFIG.base_url + "/api/report/issue/check/new", {officeId:officeId,beginDate:beginDate,endDate:endDate});
            posting.done(function(data) {
                //編號
                $("#form-reportNo").textbox("setValue",data.result.no);
                //數據
                $('#form-tt').datagrid('loadData',data.result.details);
                var rows = $('#form-tt').datagrid('getRows');
                for(var i=0; i<rows.length; i++) {
                    $('#form-tt').datagrid('beginEdit', i);
                }
            });
        }
    });


    // 保存
    function submit() {
        util.preventClick('#form-btn-submit');
        $('#edit-form').form('submit',{
            url:$CONFIG.base_url+'/api/report/issue/check/save',
            onSubmit:function(params){
                let rows=$('#form-tt').datagrid('getRows');
                let row=$('#tt').datagrid('getSelected');
                if(!rows.length){
                    util.alertMsg('材料爲空');
                    util.reverseClick('#form-btn-submit',submit);
                    return false;
                }

                params['projectName'] = $('#form-OrgName').combotree('getValue');
                params['officeId'] = $CONFIG.office;
                params['createdBy'] = $CONFIG.uid;

                if(rows&&rows.length){
                    for(let i=0,len=rows.length;i<len;i++){
                        $('#form-tt').datagrid('endEdit', i);

                        params['details['+i+'].officeId'] = rows[i].officeId;
                        params['details['+i+'].materialName'] = rows[i].materialName;
                        params['details['+i+'].code'] = rows[i].code;
                        params['details['+i+'].unit'] = rows[i].unit;
                        params['details['+i+'].checkNum'] = rows[i].checkNum;
                        params['details['+i+'].checkFee'] = rows[i].checkFee;
                        params['details['+i+'].issueNum'] = rows[i].issueNum;
                        params['details['+i+'].issueFee'] = rows[i].issueFee;
                        params['details['+i+'].storageNum'] = rows[i].storageNum;
                        params['details['+i+'].memo'] = rows[i].memo;
                    }
                }

                let formCheck=$('#edit-form').form('enableValidation').form('validate');
                if(!formCheck){
                    util.reverseClick('#form-btn-submit',submit);
                }

                return formCheck;
            },
            success:function(data){
                if(!data){
                    util.alertMsg('無權限或出現錯誤,請聯繫管理員!');
                }
                $('#dlg').window('close');
                $('#tt').datagrid('clearSelections');
                $('#tt').datagrid('reload');
                $('#project-tree').tree('reload');

                util.reverseClick('#form-btn-submit',submit);
            }
        });
        exports.loadList();
    };

    $('#form-btn-submit').click(function () {
        util.preventClick('#form-btn-submit');
        submit();
    });

    // 刪除
    $('#btn-del').click(function () {
        util.deleteRows('#tt',$CONFIG.base_url+'/api/report/issue/check/del');
    })

    // 上傳附件
    util.attach.upload();
    // 刪除附件
    util.attach.del();

    // 導出
    $("#form-btn-export").click(function(){
        var colKeys = $('#form-tt').datagrid('getColumnFields')
        var colNames=[];
        for(var i=0;i<colKeys.length;i++)
        {
            var col = $('#form-tt').datagrid( "getColumnOption" , colKeys[i] );
            colNames.push(col.title);
        }

        var getting = $.get($CONFIG.base_url + "/api/report/issue/check/export?allForbidden=1", {
            reportId:$('#edit-id').textbox('getValue'),
            colNames: colNames,
            colKeys: colKeys,
            excelName: '點驗收發收支存統計'
        });
        $(this).linkbutton({'text':"處理中,請稍等…"});
        $(this).linkbutton('disable');
        getting.done(function(e) {
            window.location.href = $CONFIG.base_url + "/commons/attachment/download/" + e.rsid;
            $("#btn-export").linkbutton('enable');
            $("#btn-export").linkbutton({'text':"導出"});
        });
    });

});

Controller:ReportController


/**
 * Created by hucong on 2019-04-28.
 */
@Controller
@RequestMapping("/api/report")
public class ReportController extends BaseController{

    @Autowired
    private ReportIssueCheckService reportIssueCheckService;

    @Autowired
    private SerializeService serializeService;

    /**
     * 點驗收發收支存統計表
     */
    @RequestMapping(value = "/issue/check/list",produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
    public ResponseEntity<?> issueCheckList(ReportIssueCheck reportIssueCheck, TableInput input){

        MyPage<ReportIssueCheck> page = new MyPage<>(reportIssueCheck,input);
        page.setOfficeIds(UserUtils.getOfficeIds());
        page = new MyPage(reportIssueCheckService.selectByPage(page));

        return new ResponseEntity(page, HttpStatus.OK);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @RequestMapping(value = "/issue/check/detail/list",produces = MediaType.APPLICATION_JSON_VALUE, method = RequestMethod.GET)
    public ResponseEntity<?> issueCheckListDetail(@RequestParam(value="id", required=true) Integer reportId){
        //用於延遲加載數據
        MyPage<ReportCostBookDetail> details = new MyPage(reportIssueCheckService.selectById(reportId));

        return new ResponseEntity(details, HttpStatus.OK);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })//壓制警告、不捕獲異常
    @RequestMapping(value = "/issue/check/save",produces = MediaType.APPLICATION_JSON_VALUE,  method = RequestMethod.POST)
    public ResponseEntity<?> issueCheckSave(ReportIssueCheck reportIssueCheck) {

        reportIssueCheckService.save(reportIssueCheck);

        return new ResponseEntity("true", HttpStatus.OK);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @RequestMapping(value = "/issue/check/del",produces = MediaType.APPLICATION_JSON_VALUE,method = RequestMethod.POST)
    public ResponseEntity<?> issueCheckDelete(@RequestParam(value="id", required=true) Integer id) {

        ReportIssueCheck entity = reportIssueCheckService.selectByKey(id);
        reportIssueCheckService.delete(entity);

        return new ResponseEntity("true", HttpStatus.OK);
    }

    @SuppressWarnings({ "unchecked", "rawtypes" })
    @RequestMapping(value = "/issue/check/new",produces = MediaType.APPLICATION_JSON_VALUE,method = RequestMethod.GET)
    public ResponseEntity<?> issueCheckNew(@RequestParam(value = "officeId", required = true) int officeId,
                                    @RequestParam(value = "beginDate", required = true) Date beginDate,
                                    @RequestParam(value = "endDate", required = true) Date endDate) {

        Map<String, Object> map = Maps.newHashMap();

        //初始化
        ReportIssueCheck reportIssueCheck = new ReportIssueCheck();
        reportIssueCheck.setBeginDate(beginDate);
        reportIssueCheck.setEndDate(endDate);
        reportIssueCheck.setOfficeId(officeId);
        reportIssueCheck.setOfficeIds(UserUtils.getOwnOfficeIds(officeId));
        reportIssueCheck.setDelFlag(ReportCostBook.DEL_FLAG_NORMAL);
        reportIssueCheck.setNo(serializeService.reportIssueCheckSerialNo());

        //統計出入庫數據--以入庫材料種類爲準
        List<Map<String, Object>> materials = reportIssueCheckService.getMaterialsInfo(reportIssueCheck);

        List<ReportIssueCheckDetail> details = new ArrayList<ReportIssueCheckDetail>();

        for (Map<String, Object> row: materials){
            ReportIssueCheckDetail detail = new ReportIssueCheckDetail();

            detail.setReportId(reportIssueCheck.getId());
            detail.setMaterialName(row.get("materialName").toString());
            detail.setCode(row.get("materialCode").toString());
            detail.setUnit(row.get("materialUnit").toString());
            detail.setOfficeName(row.get("officeName").toString());
            detail.setOfficeId(Integer.valueOf(row.get("officeId").toString()));
            detail.setMaterialDetailId(Integer.valueOf(row.get("materialDetailId").toString()));
            //點驗數量、點驗金額
            detail.setCheckNum((int)Double.parseDouble(reportIssueCheckService.sumCheckStorage(reportIssueCheck,detail).get("checkNum").toString()));
            detail.setCheckFee(Double.parseDouble(reportIssueCheckService.sumCheckStorage(reportIssueCheck,detail).get("checkFee").toString()));
            //發料數量、發料金額
            detail.setIssueNum((int)Double.parseDouble(reportIssueCheckService.sumIssueStorage(reportIssueCheck,detail).get("issueNum").toString()));
            detail.setIssueFee(Double.parseDouble(reportIssueCheckService.sumIssueStorage(reportIssueCheck,detail).get("issueFee").toString()));
            details.add(detail);
        }

        reportIssueCheck.setDetails(details);

        map.put("result", reportIssueCheck);
        return new ResponseEntity(map, HttpStatus.OK);
    }

    //點驗收發導出
    @SuppressWarnings({ "unchecked", "rawtypes" })
    @RequestMapping(value = "/issue/check/export",produces = MediaType.APPLICATION_JSON_VALUE,method = RequestMethod.GET)
    public ResponseEntity<?> issueCheckExport(@RequestParam(value = "reportId", required = true) Integer id,
                                                @RequestParam(value = "colNames[]", required = true) String[] colNames,
                                                @RequestParam(value = "colKeys[]", required = true) String[] colKeys,
                                                @RequestParam(value = "excelName", required = false) String excelName)  throws Exception{
        Map<String, Object> resultMap = Maps.newHashMap();

        MyPage<ReportIssueCheck> myPage = new MyPage(reportIssueCheckService.selectById(id));

        Page<ReportIssueCheck> page = new Page<>();
        page.setPageNo(1);
        page.setPageSize(-1);
        List<ReportIssueCheck> rows = myPage.getRows();

        page.setRows(rows);
        Attachment attachment = generateExcel(colNames, colKeys, page,excelName);

        resultMap.put("result", "success");
        resultMap.put("rsid", attachment.getId());

        return new ResponseEntity(resultMap, HttpStatus.OK);
    }
}

Service接口:ReportService.java

/**
 * Created by hucong on 2019-04-28.
 * 點驗收發統計
 */
public interface ReportIssueCheckService extends MyBaseService<ReportIssueCheck> {

    public List<ReportIssueCheck> selectByPage(MyPage<ReportIssueCheck> page);

    public List<ReportIssueCheckDetail> selectById(int id);

    public void delete(ReportIssueCheck reportIssueCheck);

    public int save(ReportIssueCheck reportIssueCheck);

    public List<Map<String, Object>> getMaterialsInfo(ReportIssueCheck reportIssueCheck);

    public Map<String, Object> sumCheckStorage(ReportIssueCheck reportIssueCheck,ReportIssueCheckDetail reportIssueCheckDetail);

    public Map<String, Object> sumIssueStorage(ReportIssueCheck reportIssueCheck,ReportIssueCheckDetail reportIssueCheckDetail);
}

Service實現:ReportIssueCheckServiceImpl.java


/**
 * Created by hucong on 2019-04-28.
 */
@Service
public class ReportIssueCheckServiceImpl extends MyBaseServiceImpl<ReportIssueCheck> implements ReportIssueCheckService {

    @Autowired
    private ReportIssueCheckMapper reportIssueCheckMapper;

    @Autowired
    private ReportIssueCheckDetailMapper reportIssueCheckDetailMapper;

    @Autowired
    private CheckDetailMapper checkDetailMapper;

    @Autowired
    private IssueDetailMapper issueDetailMapper;

    //批量插入詳情
    @Autowired
    private InsertListMapper<ReportIssueCheckDetail> insertListMapper;

    @Override
    public List<ReportIssueCheck> selectByPage(MyPage<ReportIssueCheck> page) {
        PageHelper.startPage(page.getPageNum(),page.getPageSize());
        List<ReportIssueCheck> list = reportIssueCheckMapper.selectByPage(page);
        if (list!=null&&list.size()>0){
            list.forEach(reportIssueCheck -> {
                List<ReportIssueCheckDetail> details = reportIssueCheckDetailMapper.selectById(reportIssueCheck.getId());
                reportIssueCheck.setDetails(details);
            });
        }
        return list;
    }

    @Override
    public List<ReportIssueCheckDetail> selectById(int id) {
        List<ReportIssueCheckDetail> list = reportIssueCheckDetailMapper.selectById(id);
        return list;
    }

    //頭表採用將del_flag置爲1的方式,詳情采用刪除後插入的方式
    @Override
    public void delete(ReportIssueCheck reportIssueCheck) {
        //先得到明細再刪除頭表
        List<ReportIssueCheckDetail> details = reportIssueCheckDetailMapper.selectById(reportIssueCheck.getId());
        //刪除頭表
        reportIssueCheck.setDelFlag(reportIssueCheck.DEL_FLAG_DELETE);
        updateNotNull(reportIssueCheck);
        //遍歷明細表並刪除
        if (details!=null&&details.size()>0){
            details.forEach(reportIssueCheckDetail -> {
                reportIssueCheckDetail.setDelFlag(reportIssueCheckDetail.DEL_FLAG_DELETE);
            });
            reportIssueCheckDetailMapper.deleteById(reportIssueCheck.getId());
            insertListMapper.insertList(details);
        }

    }

    //增、改
    @Override
    public int save(ReportIssueCheck reportIssueCheck) {
        if (reportIssueCheck.getId()!=null){
            updateNotNull(reportIssueCheck);
            reportIssueCheckDetailMapper.deleteById(reportIssueCheck.getId());
        }
        else{
            //新增,得到頭表id
            super.save(reportIssueCheck);
        }
        //通過頭表id設置明細關聯id
        if(reportIssueCheck.getDetails()!=null&&reportIssueCheck.getDetails().size()>0){
            reportIssueCheck.getDetails().forEach(reportIssueCheckDetail -> {
                reportIssueCheckDetail.setReportId(reportIssueCheck.getId());
            });
        }
        //執行明細插入(前端卡控,不存在明細爲空的情況)
        return insertListMapper.insertList(reportIssueCheck.getDetails());
    }

    @Override
    public List<Map<String, Object>> getMaterialsInfo(ReportIssueCheck reportIssueCheck){
        return checkDetailMapper.findCheckMaterials(reportIssueCheck);
    }

    @Override
    public Map<String, Object> sumCheckStorage(ReportIssueCheck reportIssueCheck,ReportIssueCheckDetail detail){
        return checkDetailMapper.sumCheckStorage(reportIssueCheck,detail);
    }

    @Override
    public Map<String, Object> sumIssueStorage(ReportIssueCheck reportIssueCheck,ReportIssueCheckDetail detail){
        return issueDetailMapper.sumIssueStorage(reportIssueCheck,detail);
    }
}

實體類:ReportIssueCheck.java

/**
 * Created by hucong on 2019-04-28.
 */
@Data
@Table(name = "wz_report_issue_check")
public class ReportIssueCheck extends BaseEntity {
    private String no;    //統計單號
    private String projectName; //項目名稱
    @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
    private Date beginDate;   //開始日期
    @JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
    private Date endDate; //截止時間
    private Integer officeId; //項目編碼
    private String pics; //附件

    @Transient
    private List<ReportIssueCheckDetail> details;

    @Transient
    private String officeIds;
    @Transient
    private String officeName;
    @Transient
    private String createdByName;
}

實體類:ReportIssueCheckDetail.java

/**
 * Created by hucong on 2019-04-28.
 */
@Data
@Table(name = "wz_report_issue_check_detail")
public class ReportIssueCheckDetail extends BaseEntity {
    private Integer reportId;  //報表id
    private String belongOfficeName; //所屬項目名稱
    private Integer officeId;  //項目名稱
    private String materialName; //物資名稱
    private String code; //規格型號
    private String unit; //單位
    private Integer checkNum; //點驗數量
    private Double checkFee;  //點驗不含稅金額
    private Integer issueNum; //發料數量
    private Double issueFee;  //發料不含稅金額
    private Integer storageNum; //庫存數量
    private Double fee; //金額
    private String memo; //備註

    @Transient
    private String officeName;
    @Transient
    private Integer materialDetailId;

}

/*---------------------------------------------------------------------------------------------------------------------------------------------------------------*/

SQL部分:Mybatis

頭表查詢:ReportIssueCheckMapper.java

/**
 * Created by hucong on 2019-04-28.
 */
@Repository
public interface ReportIssueCheckMapper extends MyMapper<ReportIssueCheck>{

    List<ReportIssueCheck> selectByPage(MyPage<ReportIssueCheck> page);
}

頭表查詢SQL:ReportIssueCheckMapper.xml

<?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.thon.mapper.ReportIssueCheckMapper" >
    <!-- 根據實體類查詢,各字段採用like方式查找,不包括created_date字段 -->
    <select id="selectByPage" parameterType="com.thon.utils.MyPage" resultType="ReportIssueCheck">
        SELECT wric.*,
        soa.name as projectName,
        so.name as officeName,
        su.name as createdByName
        FROM wz_report_issue_check wric
        LEFT JOIN sys_office so on wric.office_id = so.id
        left join sys_user su on wric.created_by=su.id
        left  join sys_office soa on wric.project_name = soa.id
        <where>
            1=1
            <if test="entity.createdBy!= null">
                AND wric.created_by = #{entity.createdBy, jdbcType=INTEGER}
            </if>
            <if test="entity.no != null and entity.no != ''">
                AND wric.no LIKE CONCAT('%', #{entity.no, jdbcType=VARCHAR},'%')
            </if>
            <if test="entity.delFlag != null">
                AND wric.del_flag = #{entity.delFlag, jdbcType=INTEGER}
            </if>
            <if test="entity.officeIds != null and entity.officeIds != ''">
                AND wric.office_id IN (${officeIds})
            </if>
            <if test="entity.beginDate != null">
                AND wric.begin_date &gt;= #{entity.beginDate,jdbcType=DATE}
            </if>
            <if test="entity.endDate != null">
                AND wric.end_date &lt;= #{entity.endDate,jdbcType=DATE}
            </if>

        </where>

    </select>

</mapper>

詳情查詢:ReportIssueCheckDetailMapper.java

/**
 * Created by hucong on 2019-04-28.
 */
@Repository
public interface ReportIssueCheckDetailMapper extends MyMapper<ReportIssueCheckDetail> {

    List<ReportIssueCheckDetail> selectById(Integer id);

    void deleteById(Integer id);
}

詳情查詢SQL:ReportIssueCheckDetailMapper.xml

<?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.thon.mapper.ReportIssueCheckDetailMapper">

    <select id="selectById" resultType="ReportIssueCheckDetail">
        select wricd.*,
        so.name as officeName
        from wz_report_issue_check_detail wricd
        LEFT JOIN sys_office so on wricd.office_id = so.id
        <where>
            wricd.del_flag=0
            and wricd.report_id=#{id,jdbcType=INTEGER}
        </where>
    </select>


    <delete id="deleteById"  >
        delete from wz_report_issue_check_detail
        where report_id=#{id,jdbcType=INTEGER}
    </delete>

</mapper>

點驗詳情:CheckDetailMapper.java

/**
 * @author mimizzz
 * @date 2019-04-10
 */

@Repository
public interface CheckDetailMapper extends MyMapper<CheckDetail> {

	List<Map<String, Object>> findCheckMaterials(ReportIssueCheck reportIssueCheck);

	Map<String, Object> sumCheckStorage(@Param("reportIssueCheck") ReportIssueCheck reportIssueCheck, @Param("detail") ReportIssueCheckDetail detail);

	Map<String, Object> sumRawFeeByPurchaseType(@Param("reportPurchaseType") ReportPurchaseType reportPurchaseType, @Param("detail") ReportPurchaseTypeDetail detail, @Param("purchaseType") String purchaseType);

	Map<String, Object> sumTurnoverFeeByPurchaseType(@Param("reportPurchaseType") ReportPurchaseType reportPurchaseType, @Param("detail") ReportPurchaseTypeDetail detail, @Param("purchaseType") String purchaseType);

}

點驗詳情SQL:CheckDetailMapper.xml

<?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.thon.mapper.CheckDetailMapper">

    <select id="findCheckMaterials"  resultType="Map">
        SELECT distinct tmd.name as materialName,
        tmd.type as materialCode,
        tmd.unit as materialUnit,
        tmd.office_id as officeId,
        so.name as officeName,
        wcd.material_detail_id as materialDetailId

        FROM wz_check wc
        left JOIN wz_check_detail wcd on wc.id = wcd.check_id
        left join tc_material_detail tmd on wcd.material_detail_id = tmd.id
        left join sys_office so on wc.office_id = so.id
        <where>
            1=1 AND wc.del_flag = 0 AND wcd.del_flag = 0
            <if test="beginDate!=null">
                and wc.fill_time &gt;= #{beginDate}
            </if>
            <if test="endDate!=null">
                and wc.fill_time &lt;= #{endDate}
            </if>
            <if test="officeIds!=null">
                and wc.office_id in (${officeIds})
            </if>
            and !ISNULL(tmd.name)
        </where>

    </select>

    <select id="sumCheckStorage"  resultType="Map">
        select COALESCE(SUM(wcd.number),0) as checkNum,
        COALESCE(SUM(wcd.material_un_taxed_fee),0) as checkFee
        FROM wz_check wc
        LEFT JOIN wz_check_detail wcd on wc.id = wcd.check_id

        <where>
            1=1 AND wc.del_flag = 0 AND wcd.del_flag = 0
            <if test="detail.materialDetailId!=null">
                and wcd.material_detail_id = #{detail.materialDetailId}
            </if>
            <if test="reportIssueCheck.beginDate!=null">
                and wc.fill_time &gt;= #{reportIssueCheck.beginDate}
            </if>
            <if test="reportIssueCheck.endDate!=null">
                and wc.fill_time &lt;= #{reportIssueCheck.endDate}
            </if>
        </where>

    </select>

    <select id="sumRawFeeByPurchaseType"  resultType="Map">
        SELECT COALESCE(SUM(wcd.material_un_taxed_fee),0) AS fee
        FROM wz_check_detail wcd
        LEFT JOIN wz_check wc on wcd.check_id = wc.id and wc.del_flag = 0

        <where>
            1=1 AND wc.del_flag = 0 and wcd.del_flag = 0
            <if test="detail.officeId!=null">
                AND wc.office_id = #{detail.officeId}
            </if>
            <if test="reportPurchaseType.beginDate!=null">
                AND wc.fill_time >= #{reportPurchaseType.beginDate}
            </if>
            <if test="reportPurchaseType.endDate!=null">
                AND wc.fill_time &lt;= #{reportPurchaseType.endDate}
            </if>
            <if test="purchaseType!=null">
                AND wc.purchase_type = #{purchaseType}
            </if>
            AND wcd.material_detail_id not in (select tmd.id
            FROM tc_material_subject tms
            LEFT JOIN tc_material tm on tms.id = tm.subject_id
            LEFT JOIN tc_material_detail tmd on tm.id = tmd.material_id
            WHERE tms.name like CONCAT('%','週轉材料','%')
            AND !ISNULL(tmd.id))
        </where>

    </select>

    <select id="sumTurnoverFeeByPurchaseType"  resultType="Map">
        SELECT COALESCE(SUM(wcd.material_un_taxed_fee),0) AS fee
        FROM wz_check_detail wcd
        LEFT JOIN wz_check wc on wcd.check_id = wc.id and wc.del_flag = 0

        <where>
            1=1 AND wc.del_flag = 0 and wcd.del_flag = 0
            <if test="detail.officeId!=null">
                AND wc.office_id = #{detail.officeId}
            </if>
            <if test="reportPurchaseType.beginDate!=null">
                AND wc.fill_time >= #{reportPurchaseType.beginDate}
            </if>
            <if test="reportPurchaseType.endDate!=null">
                AND wc.fill_time &lt;= #{reportPurchaseType.endDate}
            </if>
            <if test="purchaseType!=null">
                AND wc.purchase_type = #{purchaseType}
            </if>
            AND wcd.material_detail_id in (select tmd.id
            FROM tc_material_subject tms
            LEFT JOIN tc_material tm on tms.id = tm.subject_id
            LEFT JOIN tc_material_detail tmd on tm.id = tmd.material_id
            WHERE tms.name like CONCAT('%','週轉材料','%')
            AND !ISNULL(tmd.id))
        </where>

    </select>

</mapper>

發料詳情:IssueDetailMapper.java

/**
 * @author mimizzz
 * @date 2019-04-18
 */

@Repository
public interface IssueDetailMapper extends MyMapper<IssueDetail> {
	Map<String, Object> sumIssueStorage(@Param("reportIssueCheck") ReportIssueCheck reportIssueCheck, @Param("detail") ReportIssueCheckDetail detail);
}

發料詳情SQL:IssueDetailMapper.xml

<?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.thon.mapper.IssueDetailMapper" >

  <select id="sumIssueStorage"  resultType="Map">
    select COALESCE(SUM(wid.number),0) as issueNum,
    COALESCE(SUM(wid.fee),0) as issueFee
    FROM wz_issue wi
    LEFT JOIN wz_issue_detail wid on wi.id = wid.issue_id

    <where>
      1=1 AND wi.del_flag = 0 AND wid.del_flag = 0
      <if test="detail.materialDetailId!=null">
        and wid.material_detail_id = #{detail.materialDetailId}
      </if>
      <if test="reportIssueCheck.beginDate!=null">
        and wi.issue_date &gt;= #{reportIssueCheck.beginDate}
      </if>
      <if test="reportIssueCheck.endDate!=null">
        and wi.issue_date &lt;= #{reportIssueCheck.endDate}
      </if>
    </where>

  </select>

</mapper>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章