功能描述:父子表结构,通过父表进行查询,点击父表显示子表内容,子表内容由生成条件产生,从点验、发料单中过滤数据。兼有导出功能
功能演示:
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 >= #{entity.beginDate,jdbcType=DATE}
</if>
<if test="entity.endDate != null">
AND wric.end_date <= #{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 >= #{beginDate}
</if>
<if test="endDate!=null">
and wc.fill_time <= #{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 >= #{reportIssueCheck.beginDate}
</if>
<if test="reportIssueCheck.endDate!=null">
and wc.fill_time <= #{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 <= #{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 <= #{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 >= #{reportIssueCheck.beginDate}
</if>
<if test="reportIssueCheck.endDate!=null">
and wi.issue_date <= #{reportIssueCheck.endDate}
</if>
</where>
</select>
</mapper>