Java全栈开发---Java ERP系统开发:商业ERP(八)采购申请

一、采购申请

1、主线业务流程

(1)采购业务流程

采购业务流程图
在这里插入图片描述

(2)类图设计

一个订单对应多个订单明细
在这里插入图片描述

2、表结构分析

(1)订单与明细

一个订单对应多个订单明细,订单明细是订单内部的一部分
在这里插入图片描述

(2)商品库存与变更记录

变更记录是商品库存的子表(一个商品库存表对应多个商品记录表)
在这里插入图片描述

3、采购申请

(1)需求分析

选中供应商,可添加多个采购的商品,自动计算每种商品的金额,显示和计算总计金额。
选择商品后自动显示采购价格,录入数量后,金额自动计算,合计数自动统计。
删除商品后,合计数自动更新。
提交数据成功后清空供应商和采购的商品列表

(2)实现的功能
  • 如何实现可编辑的数据表格?
  • 如何在数据表格中嵌入一个下拉的列表?
  • 如何实现数据表格的自动计算?
  • 怎么在下拉选择后自动读出数据,修改其它单元格?
  • 如何实现数据表格合计数统计?
  • 怎么移除一行?
  • 如何实现表单与表格数据的提交?
  • 怎么实现订单主表与从表(明细表)的同时保存?
  • 如何实现下拉的数据表格?

二、采购申请(代码实现)

1、页面搭建(采购申请)

(1)在webapp下创建orders_add.jsp文件:引入easy相关的依赖
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>采购申请</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="js/orders_add.js"></script>
</head>
<body>
	<table id="grid" > </table>
</body>
</html>
(2)创建js/orders_add.js(实现基本页面的搭建)
$(function(){
    
    //页面加载的时候就执行
	$('#grid').datagrid({
    
    //获取id为grid的对象的数据网格属性
		columns:[[//添加一行
			{
    
    field:'goodsuuid',title:'商品编号',width:100},//name为goodsuuid,value为商品编号
		    {
    
    field:'goodsname',title:'商品名称',width:100},
  		    {
    
    field:'price',title:'价格',width:100},
  		    {
    
    field:'num',title:'数量',width:100},
  		    {
    
    field:'money',title:'金额',width:100}
  		  ]],
  		  singleSelect:true,//设置当前数据表格只能单选一行数据
  		  rownumbers:true,//开启自动添加行号
  		  toolbar:[//添加按钮
	  		  {
    
    	
	  			  text:'新增',//按钮名称
	  			  iconCls:'icon-add',//按钮样式
	  			  handler:function(){
    
    
	  			  
	  			  }
	  		  },'-',{
    
    
	  			  text:'提交',//按钮名称
	  			  iconCls:'icon-save',//按钮样式
				  handler:function(){
    
    
					  
				  }
	  		  }
  		  ]
	});
});

在这里插入图片描述

(3)实现动态增加一行orders_add.jsp
$(function(){
    
    
	$('#grid').datagrid({
    
    
		columns:[[
			{
    
    field:'goodsuuid',title:'商品编号',width:100},
		    {
    
    field:'goodsname',title:'商品名称',width:100},
  		    {
    
    field:'price',title:'价格',width:100,editor:'numberbox'},
  		    {
    
    field:'num',title:'数量',width:100,editor:'numberbox'},
  		    {
    
    field:'money',title:'金额',width:100,editor:'numberbox'}
  		  ]],
  		  singleSelect:true,
  		  rownumbers:true,
  		  toolbar:[
	  		  {
    
    	
	  			  text:'新增',//按钮名称
	  			  iconCls:'icon-add',//按钮样式
	  			  handler:function(){
    
    
	  				  //增加一行,row参数:{goodsuuid:'',goodsname:'',price:''}
	  				  $('#grid').datagrid('appendRow',{
    
    num:0,money:0});//获取id为grid的对象,设置数据表格属性,为添加一行数据,行当中的数据,num为0,money为0
	  				  //获取所有的行记录,数组
	  				  var rows = $('#grid').datagrid('getRows');//获取当前数据表格当中所有的数据
	  				  //需要先设置它的编辑器,才能开启编辑状态
	  				  $('#grid').datagrid('beginEdit',rows.length-1);
	  				  //设置当前数据表格开启编译器,开启编译器的位置是当前所有的行数减一的位置
	  			  }
	  		  },'-',{
    
    
	  			  text:'提交',//按钮名称
	  			  iconCls:'icon-save',//按钮样式
				  handler:function(){
    
    
				  }
	  		  }
  		  ]
	});
});
(4)关闭其他行的编辑orders_add.jsp

声明一个全局变量初始值为-1
在这里插入图片描述
rows为所有行的数据(这里是一个数组)
获取数组的长度减一
设置其他的编译器为关闭状态是从0到倒数第二个
在这里插入图片描述

(5)在表格当中添加一些下拉列表orders_add.jsp(ComboBox)

在商品名称当中添加内容,内容的类型为combox,内部的内容为先向后台发送异步请求,从返回值当中获取名称
valueFiled属性值和textField属性名称
在这里插入图片描述

(6)设置在编辑行

在这里插入图片描述

(7)选中商品时显示相关信息

在这里插入图片描述
在这里插入图片描述

(8)计算金额
//保存当前编辑的行的索引
var existEditIndex = -1;
$(function(){
    
    
	$('#grid').datagrid({
    
    
		columns:[[
			{
    
    field:'goodsuuid',title:'商品编号',width:100,editor:{
    
    type:'numberbox',options:{
    
    
				//禁止编辑
				disabled:true
			}}},
		    {
    
    field:'goodsname',title:'商品名称',width:100,editor:{
    
    type:'combobox',options:{
    
    
		    	//在商品名称当中添加表格
		    	url:'goods_list',
		    	valueField:'name',
		    	textField:'name',
		    	onSelect:function(goods){
    
    //当对下拉列表选择的时候触发该函数,参数对应的商品(参数是通过URL向后台获取的)
		    		//获取商品编辑器
		    		var goodsuuidEditor = getEditor('goodsuuid');
		    		//target,指向真正使用的元素element,设置其值为对应商品的id
		    		$(goodsuuidEditor.target).val(goods.uuid);
		    		//获取我们的价格编辑器
		    		var priceEditor = getEditor('price');
		    		//设置为进货价格:获取对应的价格的,url:goods_list获取对应的添加到表格当中
		    		$(priceEditor.target).val(goods.inprice);
		    		//获取数量编辑器
		    		var numEditor = getEditor('num');
		    		//选中数量的输入框
		    		$(numEditor.target).select();
		    		//绑定事件
		    		bindGridEditor();
		    	}
		    }}},
  		    {
    
    field:'price',title:'价格',width:100,editor:{
    
    type:'numberbox',options:{
    
    percision:2}}},
  		    {
    
    field:'num',title:'数量',width:100,editor:'numberbox'},
  		    {
    
    field:'money',title:'金额',width:100,editor:{
    
    type:'numberbox',options:{
    
    percision:2,disabled:true}}}
  		  ]],
  		  singleSelect:true,
  		  rownumbers:true,
  		  toolbar:[
	  		  {
    
    
	  			  text:'新增',//按钮名称
	  			  iconCls:'icon-add',//按钮样式
	  			  handler:function(){
    
    
	  				  //判断是否存在编辑的行
	  				  if(existEditIndex > -1){
    
    
	  					  //关闭编辑
	  					  $('#grid').datagrid('endEdit',existEditIndex);
	  				  }
	  				  //增加一行,row参数:{goodsuuid:'',goodsname:'',price:''}
	  				  $('#grid').datagrid('appendRow',{
    
    num:0,money:0});
	  				  //获取所有的行记录,数组
	  				  var rows = $('#grid').datagrid('getRows');
	  				  //设置当前编辑行的索引
	  				  existEditIndex = rows.length-1;//当前可编辑行是总行数减一
	  				  //需要先设置它的编辑器,才能开启编辑状态
	  				  $('#grid').datagrid('beginEdit',existEditIndex);
	  			  }
	  		  },'-',{
    
    
	  			  text:'提交',//按钮名称
	  			  iconCls:'icon-save',//按钮样式
				  handler:function(){
    
    
				  }
	  		  }
  		  ],
  		  onClickRow:function(rowIndex,rowData){
    
    //点击对应行的时候触发该函数,获取行的索引以及对应的值
  			  //rowIndex:点击的行的索引值,该索引值从0开始。
  			  //rowData:对应与点击行的记录。{}行记录
  			  //关闭当前可编辑的行
  			  $('#grid').datagrid('endEdit',existEditIndex);//设置当前编辑的行关闭编辑
  			  //设置当前可编辑订单索引行
  			  existEditIndex = rowIndex;//获取行的索引是当前行的索引
  			  $('#grid').datagrid('beginEdit',existEditIndex);//开启当前选择索引行的编辑
  		  }
	});
});
/**
 * 获取当前编辑行的指定编辑器
 * @param _field
 * @returns
 */
function getEditor(_field){
    
    //通过
	return $('#grid').datagrid('getEditor',{
    
    index:existEditIndex,field:_field});
}
//计算金额
function cal(){
    
    
	//获取数量编辑器
	var numEditor = getEditor('num');
	//取得商品的数量
	var num = $(numEditor.target).val();
	var priceEditor = getEditor('price');
	//去除进货价
	var price = $(priceEditor.target).val();
	//计算金额
	var money = num * price;
	//保留两位小数
	money = money.toFixed(2);
	//获取金额的编辑器
	var moneyEditor = getEditor('money');
	//设置金额
	$(moneyEditor.target).val(money);
}
/*
 * 绑定键盘的输入事件
 */
function bindGridEditor(){
    
    
	//获取数量编辑器
	var numEditor = getEditor('num');
	$(numEditor.target).bind('keyup',function(){
    
    
		//计算金额
		cal();
	});
	//绑定价格编辑器
	var priceEditor = getEditor('price');
	$(priceEditor.target).bind('keyup',function(){
    
    
		//计算金额
		cal();
	});
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(9)显示合计金额

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(10)自动计算合计金额

在这里插入图片描述
在这里插入图片描述

(11)删除行

在这里插入图片描述
在这里插入图片描述

2、页面搭建(提交)

(1)加载供应商

在orders_add.html
在这里插入图片描述
在orders_add.js
在这里插入图片描述

(2)提交订单前端

在这里插入图片描述
在这里插入图片描述

(3)提交订单后端

Orders
在这里插入图片描述
orders.hbm.xml
inverse="true"级联更新
在这里插入图片描述

Orderdetail.java
在这里插入图片描述
orderdetail.hbm.xml
在这里插入图片描述

采购订单提交数据在这里插入图片描述
(1)修改Orders
在这里插入图片描述
(2)修改Orderdetail
在这里插入图片描述
(3)修改OrdersBiz里面
在这里插入图片描述
(4)OrdersAction
在这里插入图片描述

3、双向关联引发的问题解决

在这里插入图片描述
在这里插入图片描述

三、采购订单查询(代码实现)

1、完善上面订单显示的效果

在这里插入图片描述

(1)创建orders.js
$(function(){
    
    
	$('#grid').datagrid({
    
    
		url: 'orders_listByPage?t1.type=1',
		columns:[[
            {
    
    field:'uuid',title:'编号',width:100},
  		    {
    
    field:'createtime',title:'生成日期',width:100,formatter:formatDate},
  		    {
    
    field:'checktime',title:'审核日期',width:100,formatter:formatDate},
  		    {
    
    field:'starttime',title:'确认日期',width:100,formatter:formatDate},
  		    {
    
    field:'endtime',title:'入库日期',width:100,formatter:formatDate},
  		    {
    
    field:'creater',title:'下单员',width:100},
  		    {
    
    field:'checker',title:'审核员',width:100},
  		    {
    
    field:'starter',title:'采购员',width:100},
  		    {
    
    field:'ender',title:'库管员',width:100},
  		    {
    
    field:'supplier',title:'供应商或客户',width:100},
  		    {
    
    field:'totalmoney',title:'合计金额',width:100},
  		    {
    
    field:'state',title:'状态',width:100,formatter:getState},
  		    {
    
    field:'waybillsn',title:'运单号',width:100}
		]]
	});
});
/**
 * 日期格式化器
 * @param value
 * @returns
 */
function formatDate(value){
    
    
	return new Date(value).Format('yyyy-MM-dd');
}
/**
 * 获取订单的状态
 * @param value
 * @returns
 * 采购: 0:未审核 1:已审核, 2:已确认, 3:已入库
 */
function getState(value){
    
    
	switch(value * 1){
    
    
		case 0:return '未审核';
		case 1:return '已审核';
		case 2:return '已确认';
		case 3:return '已入库';
		default: return '';
	}
}
(2)创建orders.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>采购订单查询</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="ui/date.js"></script>
<script type="text/javascript" src="ui/request.js"></script>
<script type="text/javascript" src="js/orders.js"></script>
</head>
<body>
<table id="grid"></table>
</body>
</html>
(3)修改Orders

添加各个内容对应的名称属性
在这里插入图片描述
注入ISupplierDao,生成Get和Set方法
在这里插入图片描述

(4)修改OrdersBiz对象

通过对应不同的order当中的id到别的表当中查询对应id的name并设置到对应的属性到orders当中
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public List<Orders> getListByPage(Orders t1, Orders t2, Object param, int firstResult, int maxResults) {
    
    
		// 获取分页后的订单列表,因为刚刚Orders当中设置的值还是为空下面需要遍历orderlist为其赋值
		// 获取所有所有的订单集合
		List<Orders> ordersList = super.getListByPage(t1, t2, param, firstResult, maxResults);
		// 缓存员工的编号和员工的名称,key=员工的编号,value=员工的名称
		// (目的是从订单集合当中获取对应所有的每个订单对应的员工编号和员工姓名),应为id对应名称的重复概率很大所以需要一个MPA集合作为缓存
		Map<Long, String> empNameMap = new HashMap<Long, String>();
		// 缓存供应商的编号和供应商的名称,key=供应商的编号,value=供应商的名称
		// (目的是从订单集合当中获取对应所有的每个订单对应的供应商编号和供应商姓名),应为id对应名称的重复概率很大所以需要一个MPA集合作为缓存
		Map<Long, String> supplierNameMap = new HashMap<Long, String>();
		// 循环,获取员工的名称
		for (Orders o : ordersList) {
    
    // 遍历订单集合
			// 下面通过Orders当中的id查询对应每一个id对应的名称
			// 将对应的创建订单姓名的人放入到对应订单的姓名订单数据当中
			o.setCreaterName(getEmpName(o.getCreater(), empNameMap));
			// 设置订单审核人员的名称
			o.setCheckerName(getEmpName(o.getChecker(), empNameMap));
			o.setStarterName(getEmpName(o.getStarter(), empNameMap));
			o.setEnderName(getEmpName(o.getEnder(), empNameMap));
			// 供应商
			o.setStarterName(getSupplierName(o.getSupplieruuid(), supplierNameMap));
		}
		return ordersList;
	}
	// 获取员工的名称
	// uuid 员工编号
	// empNameMap 员工编号以及员工的名称
	// 返回员工的名称
	private String getEmpName(Long uuid, Map<Long, String> empNameMap) {
    
    
		// 通过当前集合当中的uuid获取对应的值的员工姓名
		if(null == uuid) {
    
    
			return null;
		}
		String empName = empNameMap.get(uuid);
		// 先从Map集合当中通过对应的id获取name如果有就不需要获取对应的姓名,如果没有就通过id、
		// 重新向数据库查询对应id的name并将其id】和姓名放入到map 集合当中
		if (null == empName) {
    
    
			// 如果没有找到员工的名称,则进行数据库查询
			empName = empDao.get(uuid).getName();// 通过id查询对应员工的姓名
			// 存入缓存中
			empNameMap.put(uuid, empName);// 将员工的id和姓名存入emp集合当中
		}
		return empName;
	}
	// 获取供应商的名称
	// uuid 供应商编号
	// supplierNameMap 供应商编号以及供应商的名称
	// 返回供应商的名称
	private String getSupplierName(Long uuid, Map<Long, String> supplierNameMap) {
    
    
		if(null == uuid) {
    
    
			return null;
		}
		// 通过当前集合当中的uuid获取对应的值的供应商姓名
		String supplierName = supplierNameMap.get(uuid);
		// 先从Map集合当中通过对应的id获取name如果有就不需要获取对应的姓名,如果没有就通过id、
		// 重新向数据库查询对应id的name并将其id】和姓名放入到map 集合当中
		if (null == supplierName) {
    
    
			// 如果没有找到供应商的名称,则进行数据库查询
			supplierName = supplierDao.get(uuid).getName();// 通过id查询对应供应商的姓名
			// 存入缓存中
			supplierNameMap.put(uuid, supplierName);// 将供应商的id和姓名存入emp集合当中
		}
		return supplierName;
	}
(5)修改applicationContext_biz.xml文件实现对orderBiz实现属性注入

在这里插入图片描述

(6)修改order.js文件
$(function(){
    
    
	$('#grid').datagrid({
    
    
		url: 'orders_listByPage?t1.type=1',
		columns:[[
            {
    
    field:'uuid',title:'编号',width:100},
  		    {
    
    field:'createtime',title:'生成日期',width:100,formatter:formatDate},
  		    {
    
    field:'checktime',title:'审核日期',width:100,formatter:formatDate},
  		    {
    
    field:'starttime',title:'确认日期',width:100,formatter:formatDate},
  		    {
    
    field:'endtime',title:'入库日期',width:100,formatter:formatDate},
  		    {
    
    field:'createrName',title:'下单员',width:100},
  		    {
    
    field:'checkerName',title:'审核员',width:100},
  		    {
    
    field:'starterName',title:'采购员',width:100},
  		    {
    
    field:'enderName',title:'库管员',width:100},
  		    {
    
    field:'supplierName',title:'供应商或客户',width:100},
  		    {
    
    field:'totalmoney',title:'合计金额',width:100},
  		    {
    
    field:'state',title:'状态',width:100,formatter:getState},
  		    {
    
    field:'waybillsn',title:'运单号',width:100}
		]]
	});
});
/**
 * 日期格式化器
 * @param value
 * @returns
 */
function formatDate(value){
    
    
	return new Date(value).Format('yyyy-MM-dd');
}
/**
 * 获取订单的状态
 * @param value
 * @returns
 * 采购: 0:未审核 1:已审核, 2:已确认, 3:已入库
 */
function getState(value){
    
    
	switch(value * 1){
    
    
		case 0:return '未审核';
		case 1:return '已审核';
		case 2:return '已确认';
		case 3:return '已入库';
		default: return '';
	}
}
(6)运行测试

在这里插入图片描述

2、显示订单明细(订单明细——前端实现)双击行显示订单详情

(1)修改orders.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>采购订单查询</title>
<link rel="stylesheet" type="text/css" href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<link rel="stylesheet" type="text/css" href="css/table.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="ui/date.js"></script>
<script type="text/javascript" src="ui/request.js"></script>
<script type="text/javascript" src="js/orders.js"></script>
</head>
<body>
<table id="grid"></table>
<!-- 订单详情窗口 -->
<div id="ordersDlg" class="easyui-dialog"  data-options="
	height:320,width:700,title:'订单详情',modal:true,closed:true
" >
	<table class = "hovertable" >
		<tr>
			<td class="bg" >流水号</td>
			<td></td>
			<td  class="bg">供应商</td>
			<td colspan="3"></td>
			<td  class="bg">状态</td>
			<td></td>
		</tr>
		<tr>
			<td width="10%"  class="bg">下单员</td>
			<td width="15%"></td>
			<td width="10%" class="bg">审核员</td>
			<td width="15%"></td>
			<td width="10%" class="bg">采购员</td>
			<td width="15%"></td>
			<td width="10%" class="bg">库管员</td>
			<td></td>
		</tr>
		<tr>
			<td class="bg noBorderBottom">下单日期</td>
			<td class="noBorderBottom"></td>
			<td class="bg noBorderBottom">审核日期</td>
			<td class="noBorderBottom"></td>
			<td class="bg noBorderBottom">采购日期</td>
			<td class="noBorderBottom"> </td>
			<td class="bg noBorderBottom">入库日期</td>
			<td class="noBorderBottom"></td>
		</tr>
	</table>
	<table id="itemgrid"></table>
 </div>
</body>
</html>
(2)修改orders.js添加鼠标双击事件

在这里插入图片描述
向明细表格当中加载一些数据(Hibernate当中,当在类当中定义的外键变为类的时候,并且配置了一对多的关系映射)

在这里插入图片描述

(3)在表格当中显示订单详情

在orders.html当中修改表格,添加id
在这里插入图片描述
在orders.js当中
在这里插入图片描述
测试
在这里插入图片描述
加载明细
在这里插入图片描述
加载订单明细
在这里插入图片描述

3、采购订单审核(后端)

列出所有“未审核”的采购订单,双击某一行时弹出详细窗口,点击“审核”按钮后弹出确认框,确认后提示“审核”结果。审核成功,则关闭详细窗口并刷新“未审核”列表。
如下图
在这里插入图片描述
实现思路:
订单的状态:
0: 未审核, 1:已审核, 2:已确认, 3:已入库

(1)在IOrdersBiz当中创建doCheck方法

在这里插入图片描述

(2)在OrdersBiz当中实现这个方法

在这里插入图片描述

(3)在OrdersAction当中

在这里插入图片描述

(4)修改OrdersDao

在这里插入图片描述

4、采购订单审核(前端)

修改orders,js当中的

在这里插入图片描述
在这里插入图片描述
测试点击审核
在这里插入图片描述
审核成功
在这里插入图片描述

5、采购订单确认

使用Hibernate查询出的实体对象,该对象为持久化状态,在同一个事务内,都判断对象是否被更新。如果更新了,Hibernate会自动更新数据库。
在这里插入图片描述

(1)修改IOrdersBiz

在这里插入图片描述

(2)编写对应的实现类

在这里插入图片描述

(2)在OrdersAction当中编写doStart方法

在这里插入图片描述

(3)修改order.js

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)测试订单确认

在这里插入图片描述

注意事项:http://localhost:8080/erp/orders.html??oper=doStart
下面的这段代码将?oper=doStart转换为JSON对象(实现静态传递参数)

在这里插入图片描述

四、采购订单入库(代码实现)

1、分析入库规则

在这里插入图片描述

2、入库(biz后端)

(1)在StoredetailDao当中添加条件

在这里插入图片描述

(2)在IOrderdetailBiz当中

在这里插入图片描述

(3)在实现类OrderdetailBiz当中,先实现上面的接口然后,OrderdetailBiz当中注入storedetailDao(入库明细)和storeoperDao(入库操作记录)并生成生成set方法在这里插入图片描述
(4)applicationContext_biz.xml设置对应的配置文件(实现注入)

在这里插入图片描述

(5)在实现类OrderdetailBiz当中,在deInStore方法当中

a、先在Storeoper当中定义常量
在这里插入图片描述
b、修改OrderdetailDao
在这里插入图片描述
c、OrderdetailBiz

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
全部代码

	/*
	 * 入库
	 * uuid明细编号,这个是从订单编号当中获取
	 * storeuuid 仓库编号
	 * empuuid 库管员编号
	 */
	@Override
	public void doInStore(Long uuid, Long storeuuid, Long empuuid) {
    
    
		// 一、第一步,更新订单信息
		//1、更新明细的状态,获取明细信息
		Orderdetail orderdetail =  orderdetailDao.get(uuid);//通过uuid获取订单明细
		//2、在入库前判断订单明细的状态是否为入库的状态
		if(!Orderdetail.STATE_NO_IN.equals(orderdetail.getState())) {
    
    
			throw new ErpException("亲!不能重复入库哦!");
		}
		//3、修改状态已经入库
		orderdetail.setState(Orderdetail.STATE_IN);
		//4、入库时间
		orderdetail.setEndtime(new Date());
		//5.入库管理人员
		orderdetail.setEnder(empuuid);
		//6、入到哪一个仓库当中去
		orderdetail.setStoreuuid(storeuuid);
		//以上设置的值会自动保存到数据库当中
		//第二步入库
		//1、构建查询条件 查询的条件,查询对应
		Storedetail storedetail = new Storedetail();
		storedetail.setGoodsuuid(orderdetail.getGoodsuuid());
		storedetail.setStoreuuid(storeuuid);
		//2、通常查询 检查是否在库存信息(对应订单详情的库存信息)
		List<Storedetail> storeList = storedetailDao.getList(storedetail, null, null);
		//如果通过订单明细可以查询到对应的库存信息
		if(storeList.size()>0) {
    
    
			//存在的话,则应该累加数据
			
			long num = 0;
			if(null != storeList.get(0).getNum()) {
    
    
				num = storeList.get(0).getNum().longValue();
			}
			
			//库存数量加上订单明细当中的数量,上面获取到了持久化的属性之后就自动更新到数据库
			storeList.get(0).setNum(num + orderdetail.getNum());
		}else {
    
    
			//如果不存在就插入库存的记录
			//如果查不到,就说明没有对应订单明细的库存信息,直接将订单信息添加到对应的数据库当中 
			storedetail.setNum(orderdetail.getNum());//设置当前库存信息的数量为当前订单的数量
			storedetailDao.add(storedetail);//保存到数据库当中
		}
		/*第三步增加操作记录*/
		Storeoper log = new Storeoper();//获取操作记录的对象
		//设置操作员的id
		log.setEmpuuid(empuuid);
		//设置商品id,当前商品id就是当前订单的id
		log.setGoodsuuid(orderdetail.getGoodsuuid());
		//设置数量操作记录的数量为当前订单详情的数量
		log.setNum(orderdetail.getNum());
		//设置操作时间为当前订单入库的时间
		log.setOpertime(orderdetail.getEndtime());
		//设置入库到那个仓库的记录
		log.setStoreuuid(storeuuid);
		//设置当前记录的状态为1
		log.setType(Storeoper.TYPE_IN);
		//保存到数据库当中(将操作记录保存到数据库当中)
		storeoperDao.add(log);
		/*
		 * 第四部,判断当前订单下 所有的订单是否都已经更新完成(即入库完成)
		 */
		//1、查询当前订单是否还存在,状态为0 (0为未入库)的明细
		//2、count(1) where state = 0 orderuuid = 为当前订单的uuid
		//构建查询条件
		Orderdetail queryParam = new Orderdetail();
		Orders orders = orderdetail.getOrders();//获取订单明细对应的订单信息
		queryParam.setOrders(orders);//设置订单是当前订单明细,对应的订单
		queryParam.setState(Orderdetail.STATE_NO_IN);//设置查询条件状态为0,未审核
		//3、调用getCount方法,来计算是否存在状态为0的明细
		long count = orderdetailDao.getCount(queryParam, null, null);
		if(count == 0) {
    
    
			//4、 代表的所有订单当中 的订单明细都已经入库了
			orders.setState(Orders.STATE_EDN);//设置当前订单装为结束
			orders.setEndtime(orderdetail.getEndtime());//并设置当前订单结束时间为当前订单明细 的结束时间
			orders.setEnder(empuuid);//设置库管员
			//应为在上面过去过订单 状态
			
		}

2、入库(Action后端)OrderdetailAction

在这里插入图片描述

//入库
	public void doInStore(){
    
    
		Emp loginUser = getLoginUser();
		if(null == loginUser){
    
    
			//用户没有登陆,session已失效
			write(ajaxReturn(false, "亲!您还没有登陆"));
			return;
		}
		try {
    
    
			//调用明细入库业务
			orderdetailBiz.doInStore(getId(), storeuuid, loginUser.getUuid());
			write(ajaxReturn(true, "入库成功"));
		}catch (ErpException e){
    
    
			write(ajaxReturn(false, e.getMessage()));
		} catch (Exception e) {
    
    
			write(ajaxReturn(false, "入库失败"));
			e.printStackTrace();
		}
	}

3、入库(前端)

(1) 修改orders.html

在这里插入图片描述

(2) 修改orders.js

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
全部代码

$(function(){
    
    
	var url = "orders_listByPage?t1.type=1";
	//如果是审核业务,要加上state=0,只查询出未审核的订单
	if(Request['oper'] == 'doCheck' ){
    
    
		url += "&t1.state=0";
	}
	//如果是确认业务,要加上state=1,只查询出已审核过的订单
	if(Request['oper'] == 'doStart' ){
    
    
		url += "&t1.state=1";
	}
	//如果入库业务,要加上state=2,只查询出已确认过的订单
	if(Request['oper'] == 'doInStore'){
    
    
		url += "&t1.state=2";
	}
	$('#grid').datagrid({
    
    
		url:url,
		columns:[[
            {
    
    field:'uuid',title:'编号',width:100},
  		    {
    
    field:'createtime',title:'生成日期',width:100,formatter:formatDate},
  		    {
    
    field:'checktime',title:'审核日期',width:100,formatter:formatDate},
  		    {
    
    field:'starttime',title:'确认日期',width:100,formatter:formatDate},
  		    {
    
    field:'endtime',title:'入库日期',width:100,formatter:formatDate},
  		    {
    
    field:'createrName',title:'下单员',width:100},
  		    {
    
    field:'checkerName',title:'审核员',width:100},
  		    {
    
    field:'starterName',title:'采购员',width:100},
  		    {
    
    field:'enderName',title:'库管员',width:100},
  		    {
    
    field:'supplierName',title:'供应商或客户',width:100},
  		    {
    
    field:'totalmoney',title:'合计金额',width:100},
  		    {
    
    field:'state',title:'状态',width:100,formatter:getState},
  		    {
    
    field:'waybillsn',title:'运单号',width:100}
		]],
		singleSelect:true,
		pagination:true,
		fitColums:true,
		onDblClickRow:function(rowIndex,rowData){
    
    
			//rowIndex:行的索引
			//rowData:行里的数据
			//显示详情
			$("#uuid").html(rowData.uuid);
			$("#suppliername").html(rowData.supplierName);
			$("#state").html(getState(rowData.state));
			$("#creater").html(rowData.createrName);
			$("#checker").html(rowData.checkerName);	
			$("#starter").html(rowData.starterName);
			$("#ender").html(rowData.enderName);
			$("#createtime").html(formatDate(rowData.createtime));
			$("#checktime").html(formatDate(rowData.checktime));
			$("#starttime").html(formatDate(rowData.starttime));
			$("#endtime").html(formatDate(rowData.endtime));
			//打开窗口
			//alert(JSON.stringify(rowData));
			$('#ordersDlg').dialog('open');
			//加载明细列表
			$('#itemgrid').datagrid('loadData',rowData.orderDetails);
		}
	});
	/*
	 * 明细表格
	 */
	$('#itemgrid').datagrid({
    
    
		columns:[[
			 {
    
    field:'uuid',title:'编号',width:100},
	  		 {
    
    field:'goodsuuid',title:'商品编号',width:100},
	  		 {
    
    field:'goodsname',title:'商品名称',width:100},
	  		 {
    
    field:'price',title:'价格',width:100},
	  		 {
    
    field:'num',title:'数量',width:100},
	  		 {
    
    field:'money',title:'金额',width:100},
	  		 {
    
    field:'state',title:'状态',width:100,formatter:getDetailState}
		]],
		fitColums:true,
		singleSelect:true
		
	});
	//添加审核按钮
	if(Request['oper'] == 'doCheck' ){
    
    
		$('#ordersDlg').dialog({
    
    
			toolbar:[{
    
    
				text:'审核',
				iconCls:'icon-search',
				handler:doCheck
			}]
		});
	}
	//添加确认按钮
	if(Request['oper'] == 'doStart' ){
    
    
		$('#ordersDlg').dialog({
    
    
			toolbar:[{
    
    
				text:'确认',
				iconCls:'icon-search',
				handler:doStart
			}]
		});
	}
	
	//添加双击事件
	if(Request['oper'] == 'doInStore'){
    
    
		$('#itemgrid').datagrid({
    
    
			onDblClickRow:function(rowIndex, rowData){
    
    
				//显示数据
				$('#itemuuid').val(rowData.uuid);
				$('#goodsuuid').html(rowData.goodsuuid);
				$('#goodsname').html(rowData.goodsname);
				$('#goodsnum').html(rowData.num);
				//打开入库窗口
				$('#itemDlg').dialog('open');
			}
		});
	}
	//入库窗口
	$('#itemDlg').dialog({
    
    
		width:300,
		height:200,
		title:'入库',
		modal:true,
		closed:true,
		buttons:[
		   {
    
    
			   text:'入库',
			   iconCls:'icon-save',
			   handler:doInStore
		   }
		]
	});
});
/**
 * 日期格式化器
 * @param value
 * @returns
 */
function formatDate(value){
    
    
	return new Date(value).Format('yyyy-MM-dd');
}
/**
 * 获取订单的状态
 * @param value
 * @returns
 * 采购: 0:未审核 1:已审核, 2:已确认, 3:已入库
 */
function getState(value){
    
    
	switch(value * 1){
    
    
		case 0:return '未审核';
		case 1:return '已审核';
		case 2:return '已确认';
		case 3:return '已入库';
		default: return '';
	}
}
/*
 * 获取明细订单的状态
 */
function getDetailState(value){
    
    
	switch(value * 1){
    
    
	case 0:return '未入库';
	case 1:return '已入库';
	default: return '';
	}
}

//审核
function doCheck(){
    
    
	$.messager.confirm('确认', '确认要审核吗?', function(yes){
    
    
		if(yes){
    
    
		    $.ajax({
    
    
		    	url: 'orders_doCheck?id=' + $('#uuid').html(),
		    	dataType: 'json',
		    	type: 'post',
		    	success:function(rtn){
    
    
		    		$.messager.alert('提示',rtn.message,'info',function(){
    
    
		    			if(rtn.success){
    
    
		    				//关闭窗口
		    				$('#ordersDlg').dialog('close');
		    				//刷新表格
		    				$('#grid').datagrid('reload');
		    			}
		    		});
		    	}
		    });  
		}
	});
}
//确认
function doStart(){
    
    
	$.messager.confirm('确认', '确定要确认吗?', function(yes){
    
    
		if(yes){
    
    
		    $.ajax({
    
    
		    	url: 'orders_doStart?id=' + $('#uuid').html(),
		    	dataType: 'json',
		    	type: 'post',
		    	success:function(rtn){
    
    
		    		$.messager.alert('提示',rtn.message,'info',function(){
    
    
		    			if(rtn.success){
    
    
		    				//关闭窗口
		    				$('#ordersDlg').dialog('close');
		    				//刷新表格
		    				$('#grid').datagrid('reload');
		    			}
		    		});
		    	}
		    });  
		}
	});
}
/**
 * 入库
 */
function doInStore(){
    
    
	var formdata = $('#itemForm').serializeJSON();
	if(formdata.storeuuid == ''){
    
    
		$.messager.alert('提示','请选择仓库!','info');
		return;
	}
	$.messager.confirm("确认","确认要入库吗?",function(yes){
    
    
		if(yes){
    
    
			$.ajax({
    
    
				url: 'orderdetail_doInStore',
				data: formdata,
				dataType: 'json',
				type: 'post',
				success:function(rtn){
    
    
					$.messager.alert('提示',rtn.message,'info',function(){
    
    
						if(rtn.success){
    
    
							//关闭入库窗口
							$('#itemDlg').dialog('close');
							//设置明细的状态
							$('#itemgrid').datagrid('getSelected').state = "1";
							//刷新明细列
							var data = $('#itemgrid').datagrid('getData');
							$('#itemgrid').datagrid('loadData',data);
							//如果所有明细都 入库了,应该关闭订单详情,并且刷新订单列表
							var allIn = true;
							$.each(data.rows,function(i,row){
    
    
								if(row.state * 1 == 0){
    
    
									allIn = false;
									//跳出循环
									return false;
								}
							});
							if(allIn == true){
    
    
								//关闭详情窗口
								$('#ordersDlg').dialog('close');
								//刷新订单列表
								$('#grid').datagrid('reload');
							}
						}
					});
				}
			});
		}
	});
}

4、显示当前登录用户的仓库

(1)在StoreDao当中编写:根据员工编号查询仓库

在这里插入图片描述

(2)在StoreAction当中编写:根据员工编号查询仓库

在这里插入图片描述

(3)修改orders.html

在这里插入图片描述

(4)在数据库MENU表当中添加一些数据

在这里插入图片描述

(5)测试

在这里插入图片描述

五、我的采购订单(代码实现)

1、在OrdersAction当中创建myListByPage方法

在这里插入图片描述

2、在OrdersDao当中添加 (根据订单的创建者查询)

在这里插入图片描述

3、在orders.js当中添加相应的代码

在这里插入图片描述

4、我的采购订单-整合增加订单

(1)在orders.html当中引入orders_add.js

在这里插入图片描述

(2)将orders_add.js当中的#grid替换为#ordersgrid

在这里插入图片描述

(3)在orders.html当中增加订单的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)在orders_add.js当中设置提交成功后关闭窗口,刷新页面

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/109475671