《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
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
(3)修改Orders
添加各个内容对应的名称属性
注入ISupplierDao,生成Get和Set方法
(4)修改OrdersBiz对象
通过对应不同的order当中的id到别的表当中查询对应id的name并设置到对应的属性到orders当中
public List getListByPage(Orders t1, Orders t2, Object param, int firstResult, int maxResults) {
// 获取分页后的订单列表,因为刚刚Orders当中设置的值还是为空下面需要遍历orderlist为其赋值
// 获取所有所有的订单集合
List 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
height:320,width:700,title:‘订单详情’,modal:true,closed:true
" >
(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方法![在这里插入图片描述](https://img-blog.csdnimg.cn/2020111114475126.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0NzU3MDM0,size_16,color_FFFFFF,t_70#pic_center)
(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 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 ‘已入库’;
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
小米商场项目实战,别再担心面试没有实战项目:
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!
}]
});
}
//添加确认按钮
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 ‘已入库’;
总结
如果你选择了IT行业并坚定的走下去,这个方向肯定是没有一丝问题的,这是个高薪行业,但是高薪是凭自己的努力学习获取来的,这次我把P8大佬用过的一些学习笔记(pdf)都整理在本文中了
《Java中高级核心知识全面解析》
[外链图片转存中…(img-zTLiwUaf-1714678825122)]
小米商场项目实战,别再担心面试没有实战项目:
[外链图片转存中…(img-nVCqReES-1714678825122)]
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!