8-13智能商贸

本文详细讲解了智能商贸中采购单的模型设计,包括如何建立采购订单模型并进行CRUD操作,重点讨论了采购单明细表格的处理难点,如明细数据操作、查询策略、时间处理和弹出对话框的加载。此外,还解决了表单样式、回显问题及n-to-n关联问题。

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

1.课程介绍
1. 采购订单模型设计(了解)
2. 建立采购订单模型(掌握)
3. 对采购订单进行CRUD(掌握)
明细数据的操作(难点)

一,采购单模型设计

判断数据库联系
如果是下拉列表:一般是多对一,一对一
如果是复选框:一般是多对多,一对多
采购单组合关系
主表

@Entity
@Table(name="purchasebill")
public class Purchasebill extends BaseDomain {

    private Date vdate; // 交易时间 前台传过来
    private BigDecimal totalAmount; //订单总金额 --后台计算出来
    private BigDecimal totalNum; //订单数量 --后台计算出来
    private Date inputtime = new Date();//采购单录入时间 -- 后台生成
    private Date auditortime; //审核时间 --- 后台生成
    private Integer status = 0; //单据状态 0 表示待审核 1 表示审核 -1表作废
    //private Long supplierId;
   @ManyToOne(fetch = FetchType.LAZY,optional = false)
   @JoinColumn(name="supplier_id")
   private Supplier supplier;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name="auditor_id")
    private Employee auditor;//审核人 录入可以为null

    @ManyToOne(fetch = FetchType.LAZY,optional = false)
    @JoinColumn(name="inputUser_id")
    private Employee inputUser;//录入人 不能为null 当前登陆用户

    @ManyToOne(fetch = FetchType.LAZY,optional = false)
    @JoinColumn(name="buyer_id")
    private Employee buyer;//采购员

    //明細  强级联  orphanRemoval 一方解除关系 去删除
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "bill",
    orphanRemoval = true)
    private List<Purchasebillitem> items = new ArrayList<>();

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
    public Date getVdate() {
        return vdate;
    }

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    public void setVdate(Date vdate) {
        this.vdate = vdate;
    }

    public BigDecimal getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(BigDecimal totalAmount) {
        this.totalAmount = totalAmount;
    }

    public BigDecimal getTotalNum() {
        return totalNum;
    }

    public void setTotalNum(BigDecimal totalNum) {
        this.totalNum = totalNum;
    }

    public Date getInputtime() {
        return inputtime;
    }

    public void setInputtime(Date inputtime) {
        this.inputtime = inputtime;
    }

    public Date getAuditortime() {
        return auditortime;
    }

    public void setAuditortime(Date auditortime) {
        this.auditortime = auditortime;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }

    public Supplier getSupplier() {
        return supplier;
    }

    public void setSupplier(Supplier supplier) {
        this.supplier = supplier;
    }

    public Employee getAuditor() {
        return auditor;
    }

    public void setAuditor(Employee auditor) {
        this.auditor = auditor;
    }

    public Employee getInputUser() {
        return inputUser;
    }

    public void setInputUser(Employee inputUser) {
        this.inputUser = inputUser;
    }

    public Employee getBuyer() {
        return buyer;
    }

    public void setBuyer(Employee buyer) {
        this.buyer = buyer;
    }

    public List<Purchasebillitem> getItems() {
        return items;
    }

    public void setItems(List<Purchasebillitem> items) {
        this.items = items;
    }
}

采购明细表

@Entity
@Table(name="purchasebillitem")
public class Purchasebillitem extends BaseDomain {
        private BigDecimal price;//产品价格
        private BigDecimal num;//产品数量

        private BigDecimal amount;//产品小计
        private String descs; //产品描述
        // private Long productId;
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(name="product_id")
        private Product product;

        //订单 bill_id
       @ManyToOne(fetch = FetchType.LAZY,optional = false)
       @JoinColumn(name="bill_id")
       @JsonIgnore //返回页面 不展示出来
       private Purchasebill bill;


    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public BigDecimal getNum() {
        return num;
    }

    public void setNum(BigDecimal num) {
        this.num = num;
    }

    public BigDecimal getAmount() {
        return amount;
    }

    public void setAmount(BigDecimal amount) {
        this.amount = amount;
    }

    public String getDescs() {
        return descs;
    }

    public void setDescs(String descs) {
        this.descs = descs;
    }

    public Product getProduct() {
        return product;
    }

    public void setProduct(Product product) {
        this.product = product;
    }

    public Purchasebill getBill() {
        return bill;
    }

    public void setBill(Purchasebill bill) {
        this.bill = bill;
    }
}

订单明细表展示页面

<table id="purchasebillGrid" class="easyui-datagrid" data-options="fit:true,fixed:true,fitColumns:true,toolbar:'#tb',singleSelect:true";
       url="/purchasebill/page"
       iconCls="icon-save"
       rownumbers="true" pagination="true">
    <thead>
    <tr>
        <th width="20"  field="vdate">交易时间</th>
        <th width="20"  field="supplier" data-options="formatter:formatObj">供应商</th>
        <th width="20"  field="buyer"  data-options="formatter:formatEmp">采购员</th>
        <th width="20"  field="totalNum">总数量</th>
        <th width="20"  field="totalAmount" >总金额</th>
        <th width="20"  field="status" data-options="formatter:formatStatus" >状态</th>
    </tr>
    </thead>
</table>

处理明细单审核状态

function formatStatus(action) {
    var data = {
        0:"<div style='color:red;'>待审</div>",
        1:"<div style='color: green'>已审</div>",
        "-1":"<div><s>作废</s></div>"
    };
    return data[action];
}

展示效果
高级查询,
因为只查询到集体的天数,所以只能查到一条数据,
因此我们把时间往后加一天处理,注意1.结束时间是不能成功获取查询的值.
如果是月底,时间会自动添加到下一个月

 @Override
    public Specification createSpecification() {

        Date tempDate = null;
        if(this.endDate!=null){
            tempDate =  DateUtils.addDays(this.endDate,1 );
            System.out.println(tempDate);
        }

        Specification<Purchasebill> spe = Specifications.<Purchasebill>and().
                ge(this.beginDate != null, "vdate",this.beginDate ).
                lt(this.endDate!=null,"vdate",tempDate).
                eq(this.status!=null && !"".equals(this.status),"status",this.status)
                .build();

        return spe;
    }

弹出采购对话框
加载采购员 和 供应商

<tr>
                <td>供应商:</td>
                <td><input class="easyui-combobox" type="text" name="supplier.id"
                           data-options="panelHeight:'auto',valueField:'id',textField:'name',url:'/util/findAllSupplier'"
                ></input></td>
            </tr>
            <tr>
                <td>采购员:</td>
                <td><input class="easyui-combobox" type="text" name="buyer.id"  data-options="valueField:'id',textField:'username',url:'/util/findAllBuyer'"></input></td>
            </tr>

二,采购单明细表格处理(难点)

表单样式可以从网上下载,也可以应课件准备好的

<div id="purchasebillDialog" class="easyui-dialog" data-options="closed:true,modal:true" title="功能操作" style="width:800px">
    <div style="padding:10px 60px 20px 40px">
        <form id="purchasebillForm" class="easyui-form" method="post" data-options="">
            <input type="hidden" id="purchasebillId" name="id" >
            <table cellpadding="5">
                <tr>
                    <td>交易时间:</td>
                    <td><input class="easyui-datebox"name="vdate" data-options="required:true"></input></td>
                </tr>
                <tr>
                    <td>供应商:</td>
                    <td>
                        <input class="easyui-combobox" name="supplier.id"
                               data-options="valueField:'id',textField:'name',panelHeight:'auto',url:'/util/findAllSupplier'">
                    </td>
                </tr>
                <tr>
                    <td>采购员:</td>
                    <td>
                        <input class="easyui-combobox" name="buyer.id"
                               data-options="valueField:'id',textField:'username',url:'/util/getBuyer'">
                    </td>
                </tr>
            </table>
        </form>
        <div style="text-align:center;padding:5px">
            <a href="javascript:void(0)" class="easyui-linkbutton" data-method="save">提交</a>
            <a href="javascript:void(0)" class="easyui-linkbutton" onclick="$('#purchasebillDialog').dialog('close')">取消</a>
        </div>
    </div>
</div>

明细单保存
准备额外参数

 //保存方法 --提交表单的数据到后台
            purchasebillForm.form('submit', {
                    url:url,
                    onSubmit: function(param){
                        //提交 封装 items
                        //得到明细表格所有的数据 price num descs
                        var rows = $("#gridItem").datagrid('getRows');
                        for(var i=0;i<rows.length;i++){
                            var rowData = rows[i];
                            param["items["+i+"].descs"] = rowData.descs;
                            param["items["+i+"].price"] = rowData.price;
                            param["items["+i+"].num"] = rowData.num;
                            param["items["+i+"].product.id"] = rowData.productId.id;
                        }

                        // 提交之前的验证
                       return purchasebillForm.form('validate');

解决修改回显问题
准备一个临时副本存放数据,
用的时候才拿出来,这样就不会出现明明没有删除操作,数据却显示不出来的问题

 edit:function(){
            //选择一条数据进行修改
            var row = purchasebillGrid.datagrid('getSelected');
            if(row){
                //弹出对话框
                purchasebillDialog.dialog('center').dialog('open');
               //供货商
                if(row.supplier){
                    row["supplier.id"] = row.supplier.id;
                }
                //供货商
                if(row.buyer){
                    row["buyer.id"] = row.buyer.id;
                }
                for(var i=0;i<row.items.length;i++){
                    var item = row.items[i];
                    item["productId"] = item.product;
                }


                var items = $.extend([], row.items);
                //明细表格回显
                $("#gridItem").datagrid('loadData',items);
                //修改 -- 回显示数据
                purchasebillForm.form('load',row);
            }else{
                //提示用户
                $.messager.alert('温馨提示:','请选中一条数据进行修改','info');
                return;
            }

最后解决n to n问题
设置关联对象为null,在每次用之前清理一次
就不会出现n-to-n问题了

purchasebill.setBuyer(null);
purchasebill.setSupplier(null);
purchasebill.getItems().clear();
内容概要:本文档提供了关于“微型车间生产线的设计与生产数据采集试验研究”的毕业设计复现代码,涵盖从论文结构生成、机械结构设计、PLC控制系统设计、生产数据采集与分析系统、有限元分析、进度管理、文献管理和论文排版系统的完整实现。通过Python代码和API调用,详细展示了各个模块的功能实现和相互协作。例如,利用SolidWorks API设计机械结构,通过PLC控制系统模拟生产流程,使用数据分析工具进行生产数据的采集和异常检测,以及利用进度管理系统规划项目时间表。 适合人群:具有机械工程、自动化控制或计算机编程基础的学生或研究人员,尤其是从事智能制造领域相关工作的人员。 使用场景及目标:①帮助学生或研究人员快速搭建和理解微型车间生产线的设计与实现;②提供完整的代码框架,便于修改和扩展以适应不同的应用场景;③作为教学或科研项目的参考资料,用于学习和研究智能制造技术。 阅读建议:此资源不仅包含详细的代码实现,还涉及多个学科领域的知识,如机械设计、电气控制、数据分析等。因此,在学习过程中,建议读者结合实际操作,逐步理解每个模块的功能和原理,并尝试调整参数以观察不同设置下的系统表现。同时,可以参考提供的文献资料,深入研究相关理论和技术背景。
本次的学生体质健康信息管理网站,按照用户的角色可以分为教师与学生,后台设置管理员角色来对学生的信息进行管理。,设计如下: 1、后台管理系统 后台管理系统主要是为该系统的管理员提供信息管理服务的系统,具体包括的功能模块如下: (1)管理员信息管理 (2)教师信息管理 (3)学生信息管理 (4)健康信息统计(图形化进行健康,亚健康等学生的信息数量统计) 2、教师角色的功能模块设计 教师角色所需要的功能模块主要包括了如下的一些内容: (1)个人资料修改 (2)学生体质健康管理:录入相关数据,包括但不限于身高、体重、肺活量、视力等生理指标以及运动能力、身体成分、骨密度等健康指标,并且设置健康,亚健康状态 (3)学生健康建议:根据体质信息,进行学生健康的建议 (4)健康预警:对健康出问题的学生,进行健康预警 (5)饮食和锻炼情况管理,查看 3、学生角色 学生角色可以通过该信息网站看到个人的基本信息,能够看到教师给与学生的健康建议等,功能模块设计如下: (1)个人资料修改 (2)我的健康建议查看 (3)我的健康预警 (4)饮食和锻炼情况管理,记录平时的饮食和锻炼情况 完整前后端源码,部署后可正常运行! 环境说明 开发语言:Java后端 框架:ssm,mybatis JDK版本:JDK1.8+ 数据库:mysql 5.7+ 数据库工具:Navicat11+ 开发软件:eclipse/idea Maven包:Maven3.3+ 部署容器:tomcat7.5+
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值