采购模块

1.采购订单的模型分析

1.数据库之间的关系
在这里插入图片描述1.2采购模块之间的关系
数据库 purchasebill purchasebillitem

purchasebill 采购主表( inputUser_id 录入人员

​ auditor_id审核人员

​ buyer_id 采购人员

​ supplier_id 供货商

​ )

1.3domain的创建
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.3 前台采购模块展示数据
purchasebill.jsp

<%--Created by IntelliJ IDEA.User: WhiteDoveDate: 2019/10/15Time: 20:05To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

Title<%@include file="/WEB-INF/head.jsp" %>


<%--弹出框对应的按钮--%>
保存关闭

<%--easyui的时候,查看默认属性与事件$.fn.{plugin}.defaults弹出框html代码--%>
交易时间:
供应商:
采购员:
添加删除
<%--查询工具栏--%>
日期 : - 状态 :查找
添加修改删除
ID交易时间供应商采购员总数量总金额状态

purchasebill.js

//供货商的处理
function formatObj(obj){if(obj){return obj.name;}return "";
}
//采购员
function formatEmp(obj){if(obj){return obj.username;}return "";
}
//formatStatus 审核的处理
function formatStatus(value){var data = {0:"待审",1:"已审","-1":"作废"}return data[value];
}$(function () {//给所有a标签都注册一个事件$("a").on("click", function () {//动态获取data-method属性对应的值var method = $(this).data("method");//method不能为空if(method){//动态触发事件itsource[method]();}});//datagrid对应的jquery对象var dg = $("#dg");//弹出框对应的jquery对象var dlg = $("#dlg");//form表单对应的jquery对象(弹出框)var purchasebillForm = $("#purchasebillForm");//编辑明细表格var gridItem = $("#gridItems");itsource = {//高级查询"search":function(){//把form表单元素,直接封装成一个json对象var jsonObj = $("#searchForm").serializeObject();//加载datagriddg.datagrid('load',jsonObj);},//删除"delete":function(){//获取选中的行var rows = dg.datagrid("getSelections");//在js中认为false的值:0  false ""  null NaN  undefinedif(!rows.length){$.messager.alert('操作错误','亲!请选中数据进行删除!','error');return;}//定义一个数组,该数组把所有的id都给装进来var ids = [];//循环数组中的所有数据$.each(rows, function (i, o) {//把id装进数组中ids.push(o.id);});$.messager.confirm('确认', '你确定要离我而去吗?', function(r){if (r){$.get("/purchasebill/delete",{"ids":ids.toString()},function(result){if(result.success){//刷新界面dg.datagrid("reload");}else{$.messager.alert('失败',result.msg,'error');}});}});},//添加按钮,弹出窗体"add":function(){//弹出窗体,居中,并且设置标题,动态修改高度dlg.dialog("open").dialog("center").dialog("setTitle","添加采购数据").dialog("resize",{height:450});//清空form表单中所有的值purchasebillForm.form("clear");//清空f表格gridItem.datagrid('loadData',[]);},//修改按钮,弹出窗体"edit":function(){//获取即将要修改的数据(单个对象)var row = dg.datagrid("getSelected");//没有选中就会返回nullif(!row){$.messager.alert('操作错误','亲!请选中数据进行修改!','error');return;}//弹出窗体,居中,设置标题  动态修改它的宽度和高度dlg.dialog("open").dialog("center").dialog("setTitle","修改采购数据").dialog("resize",{height:450});if(row.supplier){row["supplier.id"]=row.supplier.id;}if(row.buyer){row["buyer.id"]=row.buyer.id;}//回显数据purchasebillForm.form('load',row);//循环取出明细数据for (var i = 0; i < row.items.length; i++) {row.items[i].productId = row.items[i].product;}var items = $.extend([], row.items);gridItem.datagrid("loadData", items);},//保存数据"saveData":function(){var url = "/purchasebill/save";if($("#purchasebillid").val()){url = "/purchasebill/update?cmd=update";}//提交form表单purchasebillForm.form('submit', {url:url,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它会阻止你提交},success:function(data){//把json字符串转为对象var result = $.parseJSON(data);if(result.success){//关闭窗体dlg.dialog("close");//刷新界面dg.datagrid("reload");}else{$.messager.alert('操作错误',result.msg,'error');}}});}}
});$(function () {//产品productId  productColor颜色  productImage 图像 amount 小计。。。。var dg = $("#gridItems"),defaultRow = { productId: "", productColor: "", productImage: "", num: 0, price: 0, amount: 0, descs: "" },insertPosition = "bottom";var dgInit = function () {var getColumns = function () {var result = [];var normal = [{field: 'productId', title: '产品', width: 180,editor: {type: "combobox",options: {valueField:'id',textField:'name',panelHeight:'auto',url:'/util/getProduct',required: true}},formatter:function(value,row){return value.name;}},{field: 'productColor', title: '颜色', width: 180,formatter:function(value,row){if(row && row.productId){return "+row.productId.color+"'>"}}},{field: 'productImage', title: '产品图片', width: 100,formatter:function(value,row){if(row && row.productId){return ""}}},{field: 'num', title: '数量', width: 100,editor: {type: "numberbox",options: {required: true}}},{field: 'price', title: '价格', width: 100,editor: {type: "numberbox",options: {required: true}}},{field: 'amount', title: '小计', width: 100,formatter:function(value,row){if(row && row.productId){var amount = (row.num * row.price).toFixed(2);return amount;}return 0;}},{field: 'descs', title: '备注', width: 100,editor: {type: "text"}}];result.push(normal);return result;};var options = {idField: "ID",rownumbers: true,fitColumns: true,fit: true,toolbar:'#itemBtns',border: false,singleSelect: true,columns: getColumns(),//表示开启单元格编辑功能enableCellEdit: true};dg.datagrid(options);};var getInsertRowIndex = function () {return insertPosition == "top" ? 0 : dg.datagrid("getRows").length;}var buttonBindEvent = function () {$("#btnInsert").click(function () {var targetIndex = getInsertRowIndex(), targetRow = $.extend({}, defaultRow, { ID: $.util.guid() });dg.datagrid("insertRow", { index: targetIndex, row: targetRow });dg.datagrid("editCell", { index: 0, field: "Code" });});$("#btnSave").click(function () {var rows = dg.datagrid("getRows"), len = rows.length;for (var i = 0; i < len; i++) {dg.datagrid("endEdit", i);}});$("#btnRemove").click(function () {//获取选中行var row = dg.datagrid("getSelected");//获取选中行的索引 getRowIndexvar index =   dg.datagrid("getRowIndex",row);//根据索引删除行dg.datagrid("deleteRow",index);});};dgInit(); buttonBindEvent();});

1.5 高级查询
完成按照交易时间和审核状态
a)在purchasebillQuery 创建 beginDate endDate status

​ 拼接语句的方法添加代码

​ 注意:处理结束时间的问题 结束时间添加了一天

package cn.itsource.aisell.query;import cn.itsource.aisell.domain.Purchasebill;
import cn.itsource.aisell.domain.Purchasebillitem;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.github.wenhao.jpa.Specifications;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.format.annotation.DateTimeFormat;import java.util.Date;public class PurchasebillQuery extends BaseQuery{//自身的条件//开始时间private Date beginDate;//结束时间private Date endDate;//审核状态private String status;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")public Date getBeginDate() {return beginDate;}@DateTimeFormat(pattern = "yyyy-MM-dd")public void setBeginDate(Date beginDate) {this.beginDate = beginDate;}@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")public Date getEndDate() {return endDate;}@DateTimeFormat(pattern = "yyyy-MM-dd")public void setEndDate(Date endDate) {this.endDate = endDate;}public String getStatus() {return status;}public void setStatus(String status) {this.status = status;}@Overridepublic Specification createSpecification() {Specification<Purchasebill> specification = Specifications.<Purchasebill>and().ge(this.getBeginDate()!=null,"vdate", this.getBeginDate()).lt(this.getEndDate()!=null, "vdate",this.getEndDate()).eq(StringUtils.isNotBlank(this.status),"status",this.getStatus()).build();return specification;}
}

2.采购明细

2.1 具体操作
准备一个dialog,在里面添加一个from表单:

引入js文件

    <script src="/easyui/plugin/editcell/jeasyui.extensions.datagrid.getColumnInfo.js"></script><script src="/easyui/plugin/editcell/jeasyui.extensions.datagrid.editors.js"></script><script src="/easyui/plugin/editcell/jeasyui.extensions.datagrid.edit.cellEdit.js"></script><script type="text/javascript" src="/js/purchasebill.js"></script>

2.2 新增代码-封装数据
js文件:

nSubmit: 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它会阻止你提交},

后台代码:

package cn.itsource.aisell.web.controller;import cn.itsource.aisell.domain.Employee;
import cn.itsource.aisell.domain.Purchasebill;
import cn.itsource.aisell.domain.Purchasebillitem;
import cn.itsource.aisell.query.PurchasebillQuery;
import cn.itsource.aisell.service.IPurchasebillService;
import cn.itsource.aisell.util.AjaxResult;
import cn.itsource.aisell.util.PageUi;
import cn.itsource.aisell.util.UserContent;
import org.aspectj.weaver.loadtime.Aj;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.math.BigDecimal;
import java.util.Date;
import java.util.List;@Controller
@RequestMapping(("/purchasebill"))
public class PurchasebillController {@Autowiredprivate IPurchasebillService purchasebillService;@RequestMapping("/index")public String index(){return "/purchasebill";}@RequestMapping("/page")@ResponseBodypublic PageUi<Purchasebill> page(PurchasebillQuery purchasebillQuery){//查询数据 分页查询方法// List purchasebills = purchasebillService.findAll();Page page = purchasebillService.findPageByQuery(purchasebillQuery);//封装返回对象 必须要 total rowsPageUi pageUi = new PageUi(page);return pageUi;}//删除方法@RequestMapping("/delete")@ResponseBodypublic AjaxResult delete(Long[] ids){try {for (Long id : ids) {purchasebillService.delete(id);}return new AjaxResult();}catch (Exception e){e.printStackTrace();return new AjaxResult("操作失败"+e.getMessage());}}//保存方法@RequestMapping("/save")@ResponseBodypublic AjaxResult save(Purchasebill purchasebill){return saveOrUpdate(purchasebill);}//修改方法@RequestMapping("/update")@ResponseBody//把查询出来的老数据和新数据进行叠加 新数据会覆盖老数据,没有接收,就不会覆盖public AjaxResult update(@ModelAttribute("editPurchasebill") Purchasebill purchasebill){//修改代码return saveOrUpdate(purchasebill);}private 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());}}//每次访问controller数据的时候都要进入该方法//修改@ModelAttribute("editPurchasebill")public Purchasebill beforeEdit(Long id,String cmd){System.out.println("---------------------");if(id != null && "update".equals(cmd)){//根据id 查询老数据  删除和修改都要id值,只需要修改进入Purchasebill purchasebill = purchasebillService.findOne(id);purchasebill.setBuyer(null);purchasebill.setSupplier(null);purchasebill.getItems().clear();return purchasebill;}else{return null;}}}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部