1.5 采购订单模块

本文介绍了使用Java进行采购订单模块的开发,包括订单和明细的准备,页面效果实现,编辑父页面,更新保存订单信息,订单的编辑和删除,以及审核功能。详细讲解了事件绑定、数据传递、日期处理等关键步骤,强调了在数据库操作和页面交互中的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

订单、明细准备

tips
  • domain中选择包装类和基本类型,看是否需要用到非空状态
  • 所有DML操作的值是关联对象.id
订单
  • OrderBill 中用List集合保存明细,getItems时触发延迟加载,发额外SQL查询
status表示单据状态:0未审核,1已审核,
定义常量psf int STATUS_NORMAL=0 STATUS_AUDIT=1

贴注解:@DateTimeFormat(pattern = "yyyy-MM-dd")
  • OrderBillMapper里映射ResultMap,注意前缀
queryForList中内联查询,只有审核人是需要左外联接的,这样才可以查出未审核的订单
明细
  • OrderBillItemMapper只需要增加、删除、通过BillId查询item的方法
关联Product中属性,要关联id、name、brandName

通过Bill id关联查询时,要查出product的id,否则Mybatis会把所有数据当作一条处理
  • 单据和明细是组合关系,不能分开管理,不需要单独的service,统一在OrderBillServiceImpl中处理

页面效果

  • 点击放大镜,弹出子页面
  • 传值:点击选择该商品按钮,关闭窗口,传递商品数据
  • 页面准备:ProductController中复制一份list方法修改为selectProductList,简单修改页面
实现功能
  • 引入:artDialog/plugins/iframeTools.source.js,父窗口也要引入
  • 传值:
    1. 商品数据绑定在选择该商品按钮上,触发点击事件this,直接获取data-productinfo属性值
    根据样式selectProduct,绑定点击事件
    
    $(".selectProduct").click(function () {
        var productInfo = $(this).data("productinfo");
        $.dialog.data("productInfo",productInfo);
        console.log(productInfo);
        $.dialog.close();
    });
    
    
    data-productinfo='${item.productInfo}'
    必须使用单引号
    
    1. Product中提供getProductInfo属性,页面El才能直接取值,Map集合储存商品数据返回JSON
    public String getProductInfo(){
        Map<String,Object> map = new HashMap<>();
        map.put("id",getId());
        map.put("name",name);
        map.put("costPrice",costPrice);
        map.put("salePrice",salePrice);
        map.put("brandName",brandName);
        //将map集合转换为一个JSON字符串,然后返回
        return JSON.toJSONString(map);
    }
    

编辑父页面

事件统一绑定,用on函数
on(events,[selector],[data],fn)

events:一个或多个用空格分隔的事件类型 。
selector:一个选择器。
data:传递event.data给事件处理函数。
fn:执行函数。
  • 支持链式编程,获取当前行,信息回填找到子元素并赋值find("[tag=pid]").val(poductInfo.id);
用cloest("tr")找最近的<tr>,
用find("[tag=name]")函数+属性选择器
获取此<tr>中的后代元素:name、id、costPrice、brandName
  • 放大镜选择商品,回显:编号、品牌名称、采购价
open打开明细子页面
$.dialog.open("/product/selectProductList.do", {
回调函数接收子页面的数据
colse:function(){
var productInfo = $.dialog.data("productInfo");
currentTr.find("[tag=pid]").val(productInfo.id);
}
品牌在<span>中用
currentTr.find("[tag=brandname]").text(productInfo.brandname)设置值

细节:每次设置完成后要清空缓存值,这样未选择商品,点击关闭按钮不会回传上次选中的值。
 $.dialog.data("productInfo","");
  • 计算金额小计:数量/价格失焦事件
属性选择器,用逗号隔开:
[tag=costPrice],[tag=number]

//找元素的方式和上面一样
var currentTr = $(this).closest("tr");
//解析数字,防止非法输入,计算小计
var costPrice = parseFloat(currentTr.find("[tag=costPrice]").val()) || 0;
var number = parseFloat(currentTr.find("[tag=number]").val()) || 0;
        currentTr.find("[tag=amount]").text(costPrice * number);

  • 删除明细行:只有一行数据时,清空数据;多行数据,删除此行
只有一行数据时,清空数据
if($("#edit_table_body tr").size()==1)
多行数据,删除此行
$(this).closest("tr").remove();
添加一行明细
  • var newTr = $("#edit_table_body tr:first-child").clone();清空数据,事件已统一绑定,clone里不用加true
  • 多条数据保存
    1. 提交表单时,获取到每行元素,修改每行的表单元素的name属性的值
    设置name属性的item[]索引
    $("#editForm").submit(function(){
    //获取每行元素
    $.("#tbody tr").each(function(index, item){
    拼接有索引的item明细的name要写对,才能成功保存:name="items[0].costPrice"
    $(item).find("[tag=pid]").prop("name", "items[" + index + "].product.id");
    });
    })
    
    1. 明细的name要写对,才能成功保存:name=“items[0].costPrice”
    2. ajaxForm必须要放在下面,先改name再提交表单

更新保存订单信息

  • 明细信息封装在items集合中,saveOrUpdate不需要额外参数来接收
  • 观察浏览器提交的信息,对比数据库表单结构,将为空的信息在后台设置
  • 新增和编辑,都需要获取明细信息,计算订单总价、总数量
List<OrderBillItem> items = bill.getItems();
BigDecimal totalAmount = BigDecimal.ZERO;
BigDecimal totalNumber = BigDecimal.ZERO;
//计算订单总价、总数量
for (OrderBillItem item : items) {
    totalAmount = totalAmount.add(item.getCostPrice().multiply(item.getNumber()));
    totalNumber = totalNumber.add(item.getNumber());
}
  • 新增:设置录入人、录入时间、订单状态,保存设置明细前先保存订单
orderBillMapper.insert(bill);
for (OrderBillItem item : items) {
    item.setBillId(bill.getId());
    BigDecimal amount = item.getCostPrice().multiply(item.getNumber());
    item.setAmount(amount);
    orderBillItemMapper.insert(item);
}
  • 编辑:订单是未审核状态才操作,先删除旧的明细信息,不改变录入人、时间
if(bill.getStatus()==OrderBill.STATUS_NORMAL)
            orderBillItemMapper.deleteByBillId(bill.getId());

订单的编辑和删除

  • 订单信息的回显:查询bill的时候用selectByPrimaryKey发额外SQL查询items,不需要再写内联查询
    额外SQL:selectByBillId中product.id和item.id都要查询,否则只显示一条明细
  • 删除订单要先根据订单编号所有明细删掉,明细增加SQL:deleteByBillId

审核

  • 改变订单的状态值、审核人
  • OrderBillController增加审核方法audit,先根据id查询审核的订单,获取订单的Status,未审核的时候执行操作
  • JS特效:commonAll中审核和删除逻辑一致
  • 单独的审核查看页面:返回列表按钮设置onclick属性=“window.history.back()”
日期处理
  • 引入日期插件:My97DatePicker/WdatePicker.js
  • 日期输入框加点击事件:οnclick=“WdatePick()”;括号内可加{maxDate:new Date()},样式给Wdate出现图标
  • 引入fmt标签,带jsp的,<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>
  • 日期格式化: <fmt:formatDate value="${beginDate}" pattern=“yyyy-MM-dd”/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值