------------------------ Chanpin.java ------------------------
package com.kucun.data.entity;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.*;
/**
* 产品类
* @author Administrator
*
*/
@Entity
@Table(name="chanpin", uniqueConstraints = {
@UniqueConstraint(columnNames = "bianhao")
})
@JsonSerialize(using = FullEntitySerializer.class)
public class Chanpin implements EntityBasis {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// 关联订单产品
@OneToMany(
mappedBy = "chanpin",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY
)
private List<Dingdan_chanpin> dingdan_chanpin;
private String bianhao;
@OneToMany(
mappedBy = "chanpin",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
orphanRemoval = true
)
private List<Chanpin_zujian> chanpin_zujian;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBianhao() {
return bianhao;
}
public void setBianhao(String bianhao) {
this.bianhao = bianhao;
}
public List<Dingdan_chanpin> getDingdan_chanpin() {
return dingdan_chanpin;
}
public void setDingdan_chanpin(List<Dingdan_chanpin> dingdan_chanpin) {
this.dingdan_chanpin = dingdan_chanpin;
}
public List<Chanpin_zujian> getChanpin_zujian() {
return chanpin_zujian;
}
public void setChanpin_zujian(List<Chanpin_zujian> chanpin_zujian) {
this.chanpin_zujian = chanpin_zujian;
}
}
------------------------ Chanpin_zujian.java ------------------------
package com.kucun.data.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 产品组件关联类
* @author Administrator
*
*/
@Entity
@Table(name="chanpin_zujian")
@JsonSerialize(using = FullEntitySerializer.class)
public class Chanpin_zujian implements EntityBasis {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
// 关联到产品
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chanpin_id")
private Chanpin chanpin;
// 关联到组件
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "zujian_id")
private Zujian zujian;
// 关联到板材
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "bancai_id")
private Bancai bancai;
private Double one_howmany;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Chanpin getChanpin() {
return chanpin;
}
public void setChanpin(Chanpin chanpin) {
this.chanpin = chanpin;
}
public Zujian getZujian() {
return zujian;
}
public void setZujian(Zujian zujian) {
this.zujian = zujian;
}
public Bancai getBancai() {
return bancai;
}
public void setBancai(Bancai bancai) {
this.bancai = bancai;
}
public Double getOne_howmany() {
return one_howmany;
}
public void setOne_howmany(Double one_howmany) {
this.one_howmany = one_howmany;
}
public Chanpin_zujian() {
super();
// TODO Auto-generated constructor stub
}
}
------------------------ Dingdan.java ------------------------
package com.kucun.data.entity;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 订单
* @author Administrator
*
*/
@Entity
@Table(name="dingdan", uniqueConstraints = {
@UniqueConstraint(columnNames = "number")
})
@JsonSerialize(using = FullEntitySerializer.class)
public class Dingdan implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//订单号
private String number;
private Date xiadan;
private Date jiaohuo;
@OneToMany(
mappedBy = "dingdan",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
orphanRemoval = true
)
private List<Dingdan_chanpin> dingdan_chanpin;
// 优化订单与订单组件关联
@OneToMany(
mappedBy = "dingdan",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY,
orphanRemoval = true
)
private List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians;
public Date getXiadan() {
return xiadan;
}
public void setXiadan(Date xiadan) {
this.xiadan = xiadan;
}
public Date getJiaohuo() {
return jiaohuo;
}
public void setJiaohuo(Date jiaohuo) {
this.jiaohuo = jiaohuo;
}
public List<Dingdan_chanpin_zujian> getDingdan_chanpins_zujians() {
return dingdan_chanpins_zujians;
}
public void setDingdan_chanpins_zujians(List<Dingdan_chanpin_zujian> dingdan_chanpins_zujians) {
this.dingdan_chanpins_zujians = dingdan_chanpins_zujians;
}
public List<Dingdan_chanpin> getDingdan_chanpin() {
return dingdan_chanpin;
}
public void setDingdan_chanpin(List<Dingdan_chanpin> dingdan_chanpins) {
this.dingdan_chanpin = dingdan_chanpins;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Dingdan(Integer id, String number) {
super();
this.id = id;
this.number = number;
}
public Dingdan() {
super();
// TODO Auto-generated constructor stub
}
}
------------------------ Dingdan_chanpin.java ------------------------
package com.kucun.data.entity;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 订单和产品关联
* @author Administrator
*
*/
@Entity
@Table(name="dingdan_chanpin")
@JsonSerialize(using = FullEntitySerializer.class)
public class Dingdan_chanpin implements EntityBasis {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
//产品信息
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dingdan_id") // 指
private Dingdan dingdan;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chanpin_id") // 指
private Chanpin chanpin;
private Integer shuliang;//产品数量;
public Chanpin getChanpin() {
return chanpin;
}
public void setChanpin(Chanpin chanpin) {
this.chanpin = chanpin;
}
public Integer getShuliang() {
return shuliang;
}
public void setShuliang(Integer shuliang) {
this.shuliang = shuliang;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Dingdan getDingdan() {
return dingdan;
}
public void setDingdan(Dingdan dingdan) {
this.dingdan = dingdan;
}
public Chanpin getChanping() {
return chanpin;
}
public void setChanping(Chanpin chanping) {
this.chanpin = chanping;
}
}
------------------------ Dingdan_chanpin_zujian.java ------------------------
package com.kucun.data.entity;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 一个订单中的产品组件订购板材数量
* @author Administrator
*
*/
@Entity
@JsonSerialize(using = FullEntitySerializer.class)
public class Dingdan_chanpin_zujian implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "dingdan_id") // 指定外键列
private Dingdan dingdan;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chanpin_zujian_id") // 指定外键列
private Chanpin_zujian chanpin_zujian; // 修改为单数形式
//板材
@ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "bancai_id")
private Bancai bancai;
//订购数
private Integer shuliang ;
public Dingdan_chanpin_zujian() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Dingdan getDingdan() {
return dingdan;
}
public void setDingdan(Dingdan dingdan) {
this.dingdan = dingdan;
}
public Bancai getBancai() {
return bancai;
}
public void setBancai(Bancai bancai) {
this.bancai = bancai;
}
public Chanpin_zujian getChanpin_zujian() {
return chanpin_zujian;
}
public void setChanpin_zujian(Chanpin_zujian chanpin_zujian) {
this.chanpin_zujian = chanpin_zujian;
}
public Integer getShuliang() {
return shuliang;
}
public void setShuliang(Integer shuliang) {
this.shuliang = shuliang;
}
}
------------------------ EntityBasis.java ------------------------
package com.kucun.data.entity;
public interface EntityBasis {
Integer getId();
void setId(Integer id);
}
------------------------ Information.java ------------------------
package com.kucun.data.entity;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 通信类
* @author Administrator
*
*/
public class Information {
private static final ObjectMapper mapper = new ObjectMapper();
private Integer Status ;
private String text;
private Object data;
public Integer getStatus() {
return Status;
}
public void setStatus(Integer status) {
Status = status;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Information(Integer status, String text, Object data) {
super();
Status = status;
this.text = text;
this.data = data;
}
@SuppressWarnings({"unchecked","rawtypes"})
public Information(Integer status, String text, String data, Class T) throws Exception {
super();
Status = status;
this.text = text;
this.data = fromJson(data,T);
}
public Information() {
super();
// TODO Auto-generated constructor stub
}
public String DataJson() throws JsonProcessingException {
// Java对象转JSON
return mapper.writeValueAsString(this);
}
@SuppressWarnings("unchecked")
public <T> T fromJson(String json, Class<T> clazz) throws Exception {
data= mapper.readValue(json, clazz);
return (T) data;
}
public static Information NewSuccess(Object data) {
return new Information(200, "success", data);
}
public static Information NewSuccess(String data) {
return new Information(200, "success", data);
}
public static Information Newfail(Integer status,String text,Object data) {
return new Information(status, "success", data);
}
public static Information NewFail(int i, String string) {
// TODO Auto-generated method stub
return new Information(i,string,null);
}
public static Information NewFail( String string) {
// TODO Auto-generated method stub
return new Information(400,string,null);
}
}
------------------------ Jinhuo.java ------------------------
package com.kucun.data.entity;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
@Entity
@JsonSerialize(using = FullEntitySerializer.class)
public class Jinhuo implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne
private Dingdan dingdan;
@ManyToOne
private Chanpin chanpin;
@ManyToOne
private Zujian zujian;
@ManyToOne
private Bancai bancai;
private Integer shuliang;
private Date date;
@ManyToOne
private User user;
public Jinhuo(Integer id, Dingdan dingdan, Chanpin chanpin, Zujian zujian, Bancai bancai, Integer shuliang,
Date date, User user) {
super();
this.id = id;
this.dingdan = dingdan;
this.chanpin = chanpin;
this.zujian = zujian;
this.bancai = bancai;
this.shuliang = shuliang;
this.date = date;
this.user = user;
}
public Jinhuo() {
super();
// TODO Auto-generated constructor stub
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Dingdan getDingdan() {
return dingdan;
}
public void setDingdan(Dingdan dingdan) {
this.dingdan = dingdan;
}
public Chanpin getChanpin() {
return chanpin;
}
public void setChanpin(Chanpin chanpin) {
this.chanpin = chanpin;
}
public Zujian getZujian() {
return zujian;
}
public void setZujian(Zujian zujian) {
this.zujian = zujian;
}
public Bancai getBancai() {
return bancai;
}
public void setBancai(Bancai bancai) {
this.bancai = bancai;
}
public Integer getShuliang() {
return shuliang;
}
public void setShuliang(Integer shuliang) {
this.shuliang = shuliang;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
------------------------ Kucun.java ------------------------
package com.kucun.data.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 库存
* @author Administrator
*
*/
@Entity
@JsonSerialize(using = FullEntitySerializer.class)
public class Kucun implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
private Integer shuliang;
@OneToOne(fetch = FetchType.LAZY) // 正确映射 Bancai 实体
@JoinColumn(name = "bancai_id", referencedColumnName = "id")
private Bancai bancai;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Bancai getBancai() {
return bancai;
}
public void setBancai(Bancai bancai) {
this.bancai = bancai;
}
public Integer getShuliang() {
return shuliang;
}
public void setShuliang(Integer shuliang) {
this.shuliang = shuliang;
}
public Kucun(Integer id, Bancai bancai, Integer shuliang) {
super();
this.id = id;
this.bancai = bancai;
this.shuliang = shuliang;
}
public Kucun() {
super();
// TODO Auto-generated constructor stub
}
}
------------------------ Mupi.java ------------------------
package com.kucun.data.entity;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Type;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 木皮
* @author Administrator
*
*/
@Entity
@Table(name="mupi", uniqueConstraints = {
@UniqueConstraint(columnNames = "name")
})
@JsonSerialize(using = FullEntitySerializer.class)
public class Mupi extends SimpleEntity implements EntityBasis{
/**
* 是否有油漆
*/
@Column(name="you")
@Type(type = "org.hibernate.type.BooleanType")
private Boolean you;
// 添加 OneToMany 映射
@OneToMany(mappedBy = "mupi1") // 指向 Bancai 中的 mupi1 字段
private List<Bancai> bancaisForMupi1;
@OneToMany(mappedBy = "mupi2") // 指向 Bancai 中的 mupi2 字段
private List<Bancai> bancaisForMupi2;
public List<Bancai> getBancaisForMupi1() {
return bancaisForMupi1;
}
public void setBancaisForMupi1(List<Bancai> bancaisForMupi1) {
this.bancaisForMupi1 = bancaisForMupi1;
}
public List<Bancai> getBancaisForMupi2() {
return bancaisForMupi2;
}
public void setBancaisForMupi2(List<Bancai> bancaisForMupi2) {
this.bancaisForMupi2 = bancaisForMupi2;
}
public Mupi() {
super();
}
public Boolean getYou() {
return you;
}
public void setYou(Boolean you) {
this.you = you;
}
}
------------------------ SimpleEntity.java ------------------------
package com.kucun.data.entity;
import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class SimpleEntity implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@Column(nullable = false, unique = true)
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// Getters and Setters...
}
------------------------ User.java ------------------------
package com.kucun.data.entity;
import java.util.Objects;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 用户
* @author Administrator
*
*/
@Entity
@Table(name="user")
@JsonSerialize(using = FullEntitySerializer.class)
public class User implements EntityBasis{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
/**
* 名字
*/
@Column(nullable=false)
private String name;
/**
* 账号
*/
@Column(nullable=false)
private String andy;
/**
* 密码
*/
@Column(nullable=false)
private String pass;
/**
* 权限
*/
@Column(nullable=false)
private int role;
public User() {
super();
}
public User(int id, String name, String andy, String pass) {
super();
this.id = id;
this.name = name;
this.andy = andy;
this.pass = pass;
}
public Integer getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAndy() {
return andy;
}
public void setAndy(String andy) {
this.andy = andy;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
public int getRole() {
System.out.println(role);
return role;
}
public void setRole(int role) {
this.role = role;
}
@Override
public String toString() {
return "{id:" + id + ", name:" + name + ", andy:" + andy + ", pass:" + pass + ", role:" + role + "}";
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id) &&
Objects.equals(name, user.name) &&
Objects.equals(andy, user.andy)&&
Objects.equals(role, user.role); //添加所有属性比较
}
@Override
public int hashCode() {
return Objects.hash(id, name, andy,pass,role);
}
@Override
public void setId(Integer id) {
// TODO Auto-generated method stub
}
}
------------------------ Zujian.java ------------------------
package com.kucun.data.entity;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
@Entity
@JsonSerialize(using = FullEntitySerializer.class)
public class Zujian extends SimpleEntity implements EntityBasis{
// 反向关联到产品组件
@OneToMany(
mappedBy = "zujian",
cascade = CascadeType.ALL,
fetch = FetchType.LAZY
)
private List<Chanpin_zujian> chanping_zujian;
public List<Chanpin_zujian> getChanping_zujian() {
return chanping_zujian;
}
public void setChanping_zujian(List<Chanpin_zujian> chanping_zujian) {
this.chanping_zujian = chanping_zujian;
}
}
------------------------ Bancai.java ------------------------
package com.kucun.data.entity;
import java.lang.annotation.Annotation;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import com.kucun.data.entity.DTO.*;
import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
/**
* 板材
* @author Administrator
*
*/
@Entity
@Table(name="bancai")
@JsonSerialize(using = FullEntitySerializer.class)
public class Bancai implements EntityBasis {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
@ManyToOne( fetch = FetchType.LAZY)
@JoinColumn(name = "caizhi_id") //
private Caizhi caizhi;
@ManyToOne( fetch = FetchType.LAZY)
@JoinColumn(name = "mupi1_id")
private Mupi mupi1;
@ManyToOne( fetch = FetchType.LAZY)
@JoinColumn(name = "mupi2_id")
private Mupi mupi2;
private Double houdu;
@OneToOne(
cascade = CascadeType.ALL,
orphanRemoval = true, // 添加此配置
fetch = FetchType.LAZY
)
@JoinColumn(name = "kucun_id", referencedColumnName = "id")
private Kucun kucun;
public Kucun getKucun() {
return kucun;
}
public void setKucun(Kucun kucun) {
this.kucun = kucun;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Caizhi getCaizhi() {
return caizhi;
}
public void setCaizhi(Caizhi caizhi) {
this.caizhi = caizhi;
}
public Mupi getMupi1() {
return mupi1;
}
public void setMupi1(Mupi mupi1) {
this.mupi1 = mupi1;
}
public Mupi getMupi2() {
return mupi2;
}
public void setMupi2(Mupi mupi2) {
this.mupi2 = mupi2;
}
public Double getHoudu() {
return houdu;
}
public void setHoudu(Double houdu) {
this.houdu = houdu;
}
public Bancai(int id, Caizhi caizhi, Mupi mupi1, Mupi mupi2, Double houdu) {
super();
this.id = id;
this.caizhi = caizhi;
this.mupi1 = mupi1;
this.mupi2 = mupi2;
this.houdu = houdu;
}
public Bancai() {
super();
}
}
------------------------ Caizhi.java ------------------------
package com.kucun.data.entity;
import java.util.List;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.kucun.data.entity.DTO.FullEntitySerializer;
/**
* 板材材质
* @author Administrator
*
*/
@Entity
@Table(name="caizhi", uniqueConstraints = {
@UniqueConstraint(columnNames = "name")
})
@JsonSerialize(using = FullEntitySerializer.class)
public class Caizhi extends SimpleEntity implements EntityBasis{
@OneToMany(mappedBy="caizhi")
private List<Bancai> bancai;
public List<Bancai> getBancai() {
return bancai;
}
public void setBancai(List<Bancai> bancai) {
this.bancai = bancai;
}
}
erDiagram
Chanpin ||–o{ Chanpin_zujian : “1:N”
Chanpin ||–o{ Dingdan_chanpin : “1:N”
Dingdan ||–o{ Dingdan_chanpin : “1:N”
Dingdan ||–o{ Dingdan_chanpin_zujian : “1:N”
Chanpin_zujian ||–o| Zujian : “N:1”
Chanpin_zujian ||–o| Bancai : “N:1”
Dingdan_chanpin_zujian ||–o| Chanpin_zujian : “N:1”
Dingdan_chanpin_zujian ||–o| Bancai : “N:1”
Bancai ||–o| Caizhi : “N:1”
Bancai ||–o| Mupi : “正面木皮 (N:1)”
Bancai ||–o| Mupi : “反面木皮 (N:1)”
Bancai ||–|| Kucun : “1:1”
Mupi ||–o{ Bancai : “正面关联 (1:N)”
Mupi ||–o{ Bancai : “反面关联 (1:N)”
Caizhi ||–o{ Bancai : “1:N”
Jinhuo }|–|| Dingdan : “N:1”
Jinhuo }|–|| Chanpin : “N:1”
Jinhuo }|–|| Zujian : “N:1”
Jinhuo }|–|| Bancai : “N:1”
Jinhuo }|–|| User : "N:1"优化后的关联解析函数(解决空值问题)
@param {Object} data - 后端原始数据
@returns {Object} 处理后的完整关联数据 */ function __resolveDataReferences(data) { // 创建ID映射表(带空值保护) const idMaps = {}; Object.keys(data).forEach(key => { if (Array.isArray(data[key])) { idMaps[key] = new Map(); data[key].forEach(item => item.id && idMaps[key].set(item.id, item)); } });
// 通用关联解析方法(带安全检测)
const resolveRef = (sourceArray, sourceKey, targetKey, refProperty) => {
if (!Array.isArray(sourceArray)) return;
sourceArray.forEach(item => {
const refObj = item[refProperty];
if (refObj && refObj.id && idMaps[targetKey]) {
const target = idMaps[targetKey].get(refObj.id);
if (target) {
// 建立正向引用
item[refProperty] = target;
// 建立反向引用(自动创建关联数组)
const reverseProp = sourceKey.endsWith(‘s’) ?
sourceKey.slice(0, -1) + ‘_list’ :
sourceKey + ‘_list’;
if (!target[reverseProp]) target[reverseProp] = [];
if (!target[reverseProp].includes(item)) {
target[reverseProp].push(item);
}
}
}
});
};
// 处理特定关联(使用新安全方法)
// 订单 ↔ 订单产品
if (data.dingdans && data.dingdan_chanpins) {
resolveRef(data.dingdan_chanpins, ‘dingdans’, ‘dingdans’, ‘dingdan’);
}
// 订单 ↔ 订单组件
if (data.dingdans && data.dingdan_chanpin_zujians) {
resolveRef(data.dingdan_chanpin_zujians, ‘dingdans’, ‘dingdans’, ‘dingdan’);
}
// 产品 ↔ 产品组件
if (data.chanpins && data.chanpin_zujians) {
resolveRef(data.chanpin_zujians, ‘chanpins’, ‘chanpins’, ‘chanpin’);
}
// 组件 ↔ 产品组件
if (data.zujians && data.chanpin_zujians) {
resolveRef(data.chanpin_zujians, ‘zujians’, ‘zujians’, ‘zujian’);
}
// 材质 ↔ 板材
if (data.caizhis && data.bancais) {
resolveRef(data.bancais, ‘caizhis’, ‘caizhis’, ‘caizhi’);
}
// 板材 ↔ 库存(一对一)
if (data.bancais && data.kucuns) {
resolveRef(data.bancais, ‘kucuns’, ‘kucuns’, ‘kucun’);
resolveRef(data.kucuns, ‘bancais’, ‘bancais’, ‘bancai’); // 反向引用
}
// 板材 ↔ 木皮(mupi1/mupi2)
if (data.bancais && data.mupis) {
resolveRef(data.bancais, ‘mupis’, ‘mupis’, ‘mupi1’);
resolveRef(data.bancais, ‘mupis’, ‘mupis’, ‘mupi2’);
}
// 订单产品 ↔ 产品
if (data.dingdan_chanpins && data.chanpins) {
resolveRef(data.dingdan_chanpins, ‘chanpins’, ‘chanpins’, ‘chanpin’);
}
// 订单组件 ↔ 产品组件
if (data.dingdan_chanpin_zujians && data.chanpin_zujians) {
resolveRef(data.dingdan_chanpin_zujians, ‘chanpin_zujians’, ‘chanpin_zujians’, ‘chanpin_zujian’);
}
// 订单组件 ↔ 板材
if (data.dingdan_chanpin_zujians && data.bancais) {
resolveRef(data.dingdan_chanpin_zujians, ‘bancais’, ‘bancais’, ‘bancai’);
}
// 进货 ↔ 相关实体
if (data.jinhuos) {
[‘dingdan’, ‘chanpin’, ‘zujian’, ‘bancai’, ‘user’].forEach(entity => {
const plural = entity + ‘s’;
if (data[plural]) {
resolveRef(data.jinhuos, plural, plural, entity);
}
});
}
return data;
}
function resolveDataReferences(data) {
// 获取 data 对象的所有顶层键
const keys = Object.keys(data);
// 遍历每个顶层键(如 users, posts 等)
for (const key of keys) {
const entities = data[key];
// 遍历该顶层键下的每个实体(如每个 user 或 post)
for (const entity of entities) {
// 遍历实体的每个属性
for (const attribute in entity) {
if (entity.hasOwnProperty(attribute)) {
var trpe=attribute.replace(/\d/g, '');
// 确保属性属于当前实体
if (Array.isArray(entity[attribute])) {
if(data[trpe]==null){
trpe+="s"
}
// 如果属性是一个数组,则将数组中的每个 ID 替换为对应的实际对象
entity[attribute] = entity[attribute].map(item =>
data[trpe ]?.find(updateItem => updateItem.id === item.id) || item
);
} else if (typeof entity[attribute] === "object" && entity[attribute] !== null) {
// 如果属性是一个对象,则将其替换为对应的实际对象
entity[attribute] = data[trpe + "s"]?.find(updateItem => updateItem.id === entity[attribute].id);
}
}
}
}
}
console.log(data)
return data;
}
/**
数据管理器类,负责与后端API通信并管理数据
*/
class DataManager {
constructor(baseUrl) {
this.baseUrl = baseUrl;
this.data = {
bancais: [],
dingdans: [],
mupis: [],
chanpins: [],
kucuns: [],
dingdan_chanpin_zujians: [],
chanpin_zujians: [],
zujians: [],
caizhis: [],
dingdan_chanpins: [],
users: []
};
this.isSyncing = false;
this.lastSync = null;
// 回调注册表
this.callbacks = {
// 全局回调
all: [],
// 按实体类型分类的回调
bancais: [],
dingdan: [],
mupi: [],
chanpin: [],
kucun: [],
dingdan_chanpin_zujian: [],
chanpin_zujian: [],
zujian: [],
caizhi: [],
dingdan_chanpin: [],
user: [],
// …其他实体
};
this.syncQueue = Promise.resolve();
}
/**
获取所有数据
@returns {Promise<boolean>} 是否成功
*/
async fetchAll() {
console.log(this)
try {
const response = await fetch(${this.baseUrl}/app/all);
if (!response.ok) throw new Error(‘Network response was not ok’);
const result = await response.json();
if (result.status !== 200) throw new Error(result.text || ‘API error’);
const resolvedData = resolveDataReferences(result.data);
// 更新本地数据
Object.keys(this.data).forEach(key => {
if (resolvedData[key]) {
this.data[key] = resolvedData[key];
}
});
this.lastSync = new Date();
// 关键改进:数据更新后触发刷新回调
this.triggerCallbacks(‘refresh’, ‘all’, this.data);
return true;
} catch (error) {
console.error(‘Fetch error:’, error);
// 触发错误回调
this.triggerCallbacks(‘fetch_error’, ‘all’, { error });
return false;
}
}
/**
注册回调函数
@param {string} entity - 实体类型(如’bancai’)或’all’表示全局回调
@param {Function} callback - 回调函数,参数为(operation, data) / registerCallback(entity, callback) { if (!this.callbacks[entity]) { this.callbacks[entity] = []; } this.callbacks[entity].push(callback); }
/*
移除回调函数
@param {string} entity - 实体类型单数性质
@param {Function} callback - 要移除的回调函数 */ unregisterCallback(entity, callback) { if (!this.callbacks[entity]) return;
const index = this.callbacks[entity].indexOf(callback);
if (index !== -1) {
this.callbacks[entity].splice(index, 1);
}
}
/**
触发回调
@param {string} operation - 操作类型(‘add’, ‘update’, ‘delete’)
@param {string} entity - 实体类型单数性质
@param {Object} data - 相关数据 */ triggerCallbacks(operation, entity, data) { // 触发全局回调 this.callbacks.all.forEach(cb => cb(operation, entity, data));
// 触发特定实体回调
if (this.callbacks[entity]) {
this.callbacks[entity].forEach(cb => cb(operation, data));
}
}
/**
执行CRUD操作并触发回调
*/
async crudOperation(operation, entity, data) {
try {
const response = await fetch(
�
ℎ
�
�
.
�
�
�
�
�
�
�
/
�
�
�
/
this.baseUrl/app/{operation}/${entity}, {
method: ‘POST’,
headers: {‘Content-Type’: ‘application/json’},
body: JSON.stringify(data)
});
if (!response.ok) throw new Error(‘Network response was not ok’);
const result = await response.json();
if (result.status !== 200) throw new Error(result.text || ‘API error’);
// 自动同步数据
this.syncData();
// 触发操作成功的回调
this.triggerCallbacks(operation, entity, data);
return result;
} catch (error) {
console.error(‘CRUD error:’, error);
// 触发操作失败的回调
this.triggerCallbacks(${operation}_error, entity, {
data,
error: error.message
});
throw error;
}
}
/**
执行CRUD操作
@param {string} operation - ‘add’, ‘delete’, ‘update’
@param {string} entity - 实体名称单数性质(小写)
@param {Object} data - 要发送的数据 后端要求数据格式为{属性: “值”, 关联对象: {id:0}, 关联对象集: [{id:0}]}
@returns {Promise<Object>} 响应结果
*/
async crudOperation(operation, entity, data) {
try {
const response = await fetch(
�
ℎ
�
�
.
�
�
�
�
�
�
�
/
�
�
�
/
this.baseUrl/app/{operation}/${entity}, {
method: ‘POST’,
headers: {‘Content-Type’: ‘application/json’},
body: JSON.stringify(data)
});
if (!response.ok) throw new Error(‘Network response was not ok’);
const result = await response.json();
if (result.status !== 200) throw new Error(result.text || ‘API error’);
// 自动同步数据
this.syncQueue = this.syncQueue.then(async () => {
await this.syncData();
// 同步完成后触发操作回调
this.triggerCallbacks(operation, entity, data);
});
return result;
} catch (error) {
console.error(‘CRUD error:’, error);
// 触发操作失败的回调
this.triggerCallbacks(${operation}_error, entity, {
data,
error: error.message
});
throw error;
}
}
/**
自动同步数据(防止频繁请求)
*/
async syncData() {
if (this.isSyncing) {
this.pendingSync = true;
return;
}
this.isSyncing = true;
try {
await this.fetchAll();
} catch (error) {
console.error(‘Sync failed:’, error);
} finally {
this.isSyncing = false;
// 处理等待中的同步请求
if (this.pendingSync) {
this.pendingSync = false;
setTimeout(() => this.syncData(), 1000);
}
}
}
/**
添加实体
@param {string} entity - 实体名称单数性质
@param {Object} data - 实体数据 / async addEntity(entity, data) { return this.crudOperation(‘add’, entity, data); }
/*
更新实体
@param {string} entity - 实体名称单数性质
@param {Object} data - 实体数据(必须包含id) / async updateEntity(entity, data) { return this.crudOperation(‘update’, entity, data); }
/*
删除实体
@param {string} entity - 实体名称单数性质
@param {number} id - 实体ID / async deleteEntity(entity, id) { return this.crudOperation(‘delete’, entity, {id}); }
/*
新增方法:手动触发数据刷新 */ async refreshData() { return this.syncQueue = this.syncQueue.then(() => this.syncData()); }
}
export { DataManager };
// 创建单例实例
//const dataManager = new DataManager(‘http://127.0.0.1:8080/KuCun2’);
//// 初始化时获取所有数据
//dataManager.fetchAll().then(() => {
// console.log(‘Initial data loaded’);
//});
// 导出数据对象,外部可以直接访问 data.bancais, data.dingdans 等
//export const data = dataManager.data;
//// 导出操作方法
//export const addEntity = dataManager.addEntity.bind(dataManager);
//export const updateEntity = dataManager.updateEntity.bind(dataManager);
//export const deleteEntity = dataManager.deleteEntity.bind(dataManager);
//export const fetchAll = dataManager.fetchAll.bind(dataManager); <!DOCTYPE html>
<html lang=“zh-CN”>
<head>
<meta charset=“UTF-8”>
<meta name=“viewport” content=“width=device-width, initial-scale=1.0”>
<title>板材库存查询系统</title>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link href=“https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css” rel=“stylesheet”>
<!-- 引入 Popper.js 和 Bootstrap JS -->
<script src=“https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.6/dist/umd/popper.min.js”></script>
<script src=“https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.min.js”></script>
<script src="../js/main.js"></script>
<style>
.card-header {
background: linear-gradient(to right, #1e3c72, #2a5298);
color: white;
}
.search-section {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
border-radius: 10px;
}
.result-section {
max-height: 70vh;
overflow: auto;
border-left: 3px solid #1e3c72;
}
.table-hover tbody tr:hover {
background-color: rgba(42, 82, 152, 0.05);
}
.material-kucun {
font-weight: 700;
color: #1e3c72;
}
.material-kucun-low {
color: #dc3545 !important;
}
.no-results {
min-height: 200px;
display: flex;
align-items: center;
justify-content: center;
}
.stats-card {
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
body {
background-color: #f8f9fa;
padding-bottom: 2rem;
}
.search-control {
position: relative;
}
.search-icon {
position: absolute;
left: 12px;
top: 12px;
color: #6c757d;
}
.form-control.with-icon {
padding-left: 35px;
}
.highlight {
background-color: rgba(255, 255, 0, 0.3) !important;
}
.info-badge {
font-size: 0.8rem;
font-weight: normal;
}
</style>
</head>
<body>
<div class=“container py-4”>
<!-- 标题部分 -->
<div class=“text-center mb-4”>
<h1 class=“text-primary”><i class=“bi bi-boxes”></i> 板材库存管理系统</h1>
<p class=“text-muted”>查询订单、产品、板材及库存信息</p>
</div>
<!-- 统计卡片 -->
<div class="row mb-4">
<div class="col-md-3">
<div class="card stats-card border-primary">
<div class="card-body">
<h5 class="card-title">订单总数</h5>
<p class="card-text fs-3 text-primary" id="orderCount">0</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card stats-card border-info">
<div class="card-body">
<h5 class="card-title">产品种类</h5>
<p class="card-text fs-3 text-info" id="productCount">0</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card stats-card border-success">
<div class="card-body">
<h5 class="card-title">板材库存</h5>
<p class="card-text fs-3 text-success" id="materialCount">0</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card stats-card border-warning">
<div class="card-body">
<h5 class="card-title">库存总量</h5>
<p class="card-text fs-3 text-warning" id="totalStock">0</p>
</div>
</div>
</div>
</div>
<!-- 搜索区域 -->
<div class="card search-section mb-4">
<div class="card-header">
<h5 class="mb-0"><i class="bi bi-search me-2"></i>高级搜索</h5>
</div>
<div class="card-body">
<div class="row g-3">
<!-- 订单搜索 -->
<div class="col-md-6">
<div class="search-control">
<i class="bi bi-clipboard-search search-icon"></i>
<input type="text" class="form-control with-icon" id="orderSearch" placeholder="搜索订单号..." aria-label="订单号搜索">
</div>
</div>
<!-- 产品搜索 -->
<div class="col-md-6">
<div class="search-control">
<i class="bi bi-grid search-icon"></i>
<input type="text" class="form-control with-icon" id="productSearch" placeholder="搜索产品编号..." aria-label="产品编号搜索">
</div>
</div>
<!-- 板材搜索 -->
<div class="col-md-4">
<div class="search-control">
<i class="bi bi-box search-icon"></i>
<input type="text" class="form-control with-icon" id="materialSearch" placeholder="搜索板材ID或材质..." aria-label="板材搜索">
</div>
</div>
<!-- 木皮搜索 -->
<div class="col-md-4">
<div class="search-control">
<i class="bi bi-tree search-icon"></i>
<input type="text" class="form-control with-icon" id="woodSearch" placeholder="搜索木皮名称..." aria-label="木皮搜索">
</div>
</div>
<!-- 厚度范围 -->
<div class="col-md-4">
<div class="input-group">
<span class="input-group-text"><i class="bi bi-arrows-vertical"></i></span>
<input type="number" class="form-control" id="minThickness" placeholder="厚度(mm)" min="0" step="0.1">
<button class="btn btn-primary" type="button" id="thicknessBtn">
<i class="bi bi-arrow-right"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- 结果区域 -->
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0"><i class="bi bi-table me-2"></i>查询结果</h5>
<div class="text-secondary">
<span id="resultCount">0</span> 条记录
<span class="ms-2"><i class="bi bi-info-circle"></i> <small>实时数据更新时间: <span id="lastUpdate">--:--:--</span></small></span>
</div>
</div>
<div class="card-body result-section">
<div class="table-responsive">
<table class="table table-hover" id="resultTable">
<thead class="table-light sticky-top">
<tr>
<th>订单号</th>
<th>产品信息</th>
<th>产品数量</th>
<th>组件</th>
<th>板材</th>
<th>板材/组件</th>
<th>板材订购数量</th>
<th>操作</th>
</tr>
</thead>
<tbody id="resultBody">
<!-- 数据加载中 -->
<tr id="loadingRow">
<td colspan="9" class="text-center py-5">
<div class="d-flex align-items-center justify-content-center">
<div class="spinner-border text-primary" role="status">
<span class="visually-hidden">加载中...</span>
</div>
<div class="ms-3">正在加载数据,请稍候...</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- 空结果提示 -->
<div id="noResults" class="no-results text-center py-5" style="display: none;">
<div>
<i class="bi bi-inboxes text-muted" style="font-size: 3rem;"></i>
<h4 class="mt-3 text-muted">没有找到匹配的记录</h4>
<p class="text-muted">请尝试调整您的搜索条件</p>
</div>
</div>
</div>
</div>
</div>
<script type=“text/javascript”>
</script>
<script src=“…/js/dingdan.js”></script>
订单下有多个产品不同数量(dingdan_chanpin类连接储存) 一个产品下有多个组件(chanpin_zujian连接) 一个产品和组件的组合有一种板材并产量一样(chanpin_zujian连接储存不是dingdan_chanpin_zujian),一个订单订购的板材可能多一点也可能少一点(dingdan_chanpin_zujian中储存)修复页面逻辑问题,创建订单下拉框显示创建的,添加产品要输入数量创建一个dingdan_chanpin并显示添加的产品,添加组件中要添加板材和 输入一张板出多少组件创建一个chnapin_zujian, 最下面一个订购数量输入,提交后判断有无一样dingdan_chanpin_zujian,无就创建,并创建jinhuo