1. 采购模块
1.1 系统的采购模块
采购员去采购的产品,然后把信息录入到系统里面
1.2 采购模块的关系
数据库 purchasebill purchasebillitem
purchasebill 采购主表( inputUser_id 录入人员
auditor_id审核人员
buyer_id 采购人员
supplier_id 供货商
)
purchasebillitem 采购明细 bill_id
1.3 完成domain的创建
Purchasebill
@Entity
@Table(name = "purchasebill")
public class Purchasebill extends BaseDomain {
private Date vdate;// 交易时间 -> 需要录入(时间set的时候加上@DateTimeFormat(pattern = "yyyy-MM-dd"))
private BigDecimal totalAmount; //总金额 -> 明细计算
private BigDecimal totalNum; //总数量 -> 明细计算
private Date inputTime = new Date(); //录入时间 ->系统自动生成 当前系统时间
private Date auditorTime; //审核时间 -> 可以为空,审核时自己生成
/**
* 0待审,1已审,-1作废
*/
private Integer status = 0; //单据状态 -> 默认待审
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "supplier_id")
private Supplier supplier;// 多对一,optional非空 供应商(需要选择)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "auditor_id")
private Employee auditor;// 多对一,可以为空
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "inputUser_id")
private Employee inputUser;// 多对一,非空 录入人 -> 登录用户就是录入人
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "buyer_id")
private Employee buyer;// 多对一,非空 采购员 -> 需要
// 一般组合关系使用List
/**
* 组合关系:整体和部分 不能分开 --强级联
* 一个订单有多个明细
* cascade:ALL 强级联(支持级联保存和级联删除)
* mappedBy:让一方放弃管理 ,交给多方来维护 性能要高一点
* 双向一对多或者多对一 一方放弃管理,性能要高一点
* orphanRemoval:孤儿删除 可以通过一方删除多方 让一方解除关系 通过一方去上删除
*
*/
@OneToMany(cascade = CascadeType.ALL, mappedBy = "bill", fetch = FetchType.LAZY, orphanRemoval = true)
private List<Purchasebillitem> items = new ArrayList<Purchasebillitem>();
Purchasebillitem
@Entity
@Table(name = "purchasebillitem")
public class Purchasebillitem extends BaseDomain {
private BigDecimal price; //价格
private BigDecimal num; //数量
private BigDecimal amount; //小计 = 价格*数量
private String descs; //描述
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "product_id")
private Product product;// 多对一,非空 产品
//和订单的关系
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "bill_id")
@JsonIgnore //生成json的时候忽略这个属性
private Purchasebill bill;// 组合关系,非空
}
1.4 前台采购模块展示数据
创建purchasebill.jsp
purchasebill.js
和以前展示一样
1.5 高级查询–注意日期
完成按照交易时间和审核状态
(1) 页面在组件拷贝过去
(2)在purchasebillQuery 创建 beginDate endDate status
拼接语句的方法添加代码
注意:处理结束时间的问题 结束时间添加了一天
(3)就可以查询
2.采购明细
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tecRbpHA-1571273776589)(C:\Users\JAVA\AppData\Roaming\Typora\typora-user-images\1571129415156.png)]
(1)准备一个dialog
(2)dialog对话框里面添加一个form表单
(3)dialog对话框里面添加一个编辑表格
编辑表格–easyui扩展组件 celledit
引入js文件
把代码拷贝过来改造
注意产品的这个值
(4)写新增代码 --封装数据
onSubmit: function(params){//提交之前先做验证
//获取编辑表格所有数据
var rows = gridItem.datagrid('getRows');
for(var i=0;i<rows.length;i++){
//明细表格每个数据
var rowData = rows[i];
params["items["+i+"].product.id"] = rowData.productId.id;
params["items["+i+"].price"] = rowData.price;
params["items["+i+"].num"] = rowData.num;
params["items["+i+"].descs"] = rowData.descs;
if(!gridItem.datagrid('validateRow',i)){
alert('明细行还有问题,请编辑');
return false;
}
}
return true;//验证通过之后才返回true,否则返回false,false它会阻止你提交
},
后台代码
public AjaxResult saveOrUpdate(Purchasebill purchasebill){
try {
//计算总金额 总数量 录入时间 录入人 状态
BigDecimal totalAmount = new BigDecimal(0);
BigDecimal totalNum = new BigDecimal(0);
//从明细里面计算
List<Purchasebillitem> items = purchasebill.getItems();
for (Purchasebillitem item : items) {
//总金额
totalAmount = totalAmount.add(item.getNum().multiply(item.getPrice()));
//总数量
totalNum= totalNum.add(item.getNum());
//计算明细小计
item.setAmount(item.getNum().multiply(item.getPrice()));
//建立多方到一方 一方放弃管理 交个多方来维护外键
item.setBill(purchasebill);
}
purchasebill.setTotalAmount(totalAmount);
purchasebill.setTotalNum(totalNum);
purchasebill.setInputTime(new Date());
//获取当前登录用户
Employee employee = (Employee)UserContent.getUser();
purchasebill.setInputUser(employee);
purchasebill.setStatus(0);
//级联保存
purchasebillService.save(purchasebill);
return new AjaxResult();
} catch (Exception e) {
e.printStackTrace();
return new AjaxResult("操作失败"+e.getMessage());
}
}
(5)回显的细节问题
表格回显和下拉回显
(6)解决n-to-n的问题
设置关联对象为null