模块管理常规功能自定义系统的设计与实现(25--多个模块之间的关联[1])

多个模块之间的关联(1)

现在开始加入第三个模块“客户单位”,顺便先把“客户等级”和“行业”也加进去。加入进去了以后将会完成下图的五个模块的操作。在加入的模块中,“所属行业”的编码是分级的,就象财务里面的科目一样,分为一级,二级,三级等。二级代码必须要有一级的父代码才可以保存。分级代码在导航的时候是做成树状的,下面会具体展示一下。

一、客户等级的加入

CREATE TABLE [dbo].[Rate](
	[tf_rateId] [nvarchar](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK_Rate] PRIMARY KEY CLUSTERED
(
	[tf_rateId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
package com.jfok.server.hibernate.sales;

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import com.jfok.server.common.annotation.FieldDefine;
import com.jfok.server.common.annotation.TableDefine;

@Entity
@SuppressWarnings("serial")
@TableDefine(group = "编码设置", id = 7014, title = "客户等级")
public class Rate implements Serializable {

	@Id
	@FieldDefine(title = "编码", number = 10, fieldGroup = "基本信息")
	@Column(nullable = false, length = 2)
	private String tf_rateId;

	@FieldDefine(title = "等级名称", number = 20, nameField = true, fieldGroup = "基本信息")
	@Column(nullable = false, length = 50, unique = true)
	private String tf_name;

	public Rate() {

	}
//getter and setter
}

加入模块后的界面如下:

二、行业的加入。

CREATE TABLE [dbo].[Trade](
	[tf_tradeId] [nvarchar](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
 CONSTRAINT [PK_Trade] PRIMARY KEY CLUSTERED
(
	[tf_tradeId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
@Entity
@SuppressWarnings("serial")
@TableDefine(group = "编码设置", id = 7016, title = "行业")
public class Trade implements Serializable {

	@Id
	//此处行业编码是分级的,类似于财务里面的科目,每级长为2,共分为3级。
	@FieldDefine(title = "行业编码", number = 10, fieldGroup = "基本信息")
	@Column(nullable = false, length = 6)
	private String tf_tradeId;

	@FieldDefine(title = "行业名称", number = 20, nameField = true, fieldGroup = "基本信息")
	@Column(nullable = false, length = 50, unique = true)
	private String tf_name;

	public Trade() {

	}
//
}

行业的模块数据如下:

三、加入客户单位模块。客户单位模块共有三个父模块,可以分别对客户进行导航。客户单位的主键不同于上面的,是自增量型的。

CREATE TABLE [dbo].[Customer](
	[tf_customerId] [int] NOT NULL,
	[tf_cityId] [nvarchar](4) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_rateId] [nvarchar](2) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_tradeId] [nvarchar](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_name] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NOT NULL,
	[tf_address] [nvarchar](50) COLLATE Chinese_PRC_CI_AS NULL,
	[tf_linkman] [nvarchar](10) COLLATE Chinese_PRC_CI_AS NULL,
	[tf_linkmanTel] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NULL,
	[tf_taxId] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NULL,
	[tf_remark] [nvarchar](max) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_Customer] PRIMARY KEY CLUSTERED
(
	[tf_customerId] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
ALTER TABLE [dbo].[Customer]  WITH CHECK ADD  CONSTRAINT [FK_Customer_City] FOREIGN KEY([tf_cityId])
REFERENCES [dbo].[City] ([tf_cityId])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[Customer]  WITH CHECK ADD  CONSTRAINT [FK_Customer_Rate] FOREIGN KEY([tf_rateId])
REFERENCES [dbo].[Rate] ([tf_rateId])
ON UPDATE CASCADE
GO
ALTER TABLE [dbo].[Customer]  WITH CHECK ADD  CONSTRAINT [FK_Customer_Trade] FOREIGN KEY([tf_tradeId])
REFERENCES [dbo].[Trade] ([tf_tradeId])
ON UPDATE CASCADE
@Entity
@SuppressWarnings("serial")
@JsonSerialize(include = JsonSerialize.Inclusion.NON_EMPTY)
@org.hibernate.annotations.Entity(dynamicUpdate = true)
@TableDefine(group = "销售系统", id = 6010, title = "客户单位")
public class Customer implements Serializable {

	@Id
	// 使用的hibernate 的自动增量,没有用数据库的自动增量型
	@GeneratedValue(generator = "increment")
	@GenericGenerator(name = "increment", strategy = "increment")
	// 这是客户单位的序号主键,隐藏不要显示
	@FieldDefine(title = "序号", number = 10, fieldGroup = "基本信息", hidden = true)
	@Column(nullable = false)
	private Integer tf_customerId;

	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_cityId", nullable = false)
	@FieldDefine(title = "市", number = 20, fieldGroup = "基本信息")
	private City tf_City;

	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_tradeId", nullable = false)
	@FieldDefine(title = "行业", number = 30, fieldGroup = "基本信息")
	private Trade tf_Trade;

	@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER)
	@JoinColumn(name = "tf_rateId", nullable = false)
	@FieldDefine(title = "等级", number = 40, fieldGroup = "基本信息")
	private Rate tf_Rate;

	@FieldDefine(title = "客户名称", number = 50, nameField = true, fieldGroup = "基本信息", remark = "请输入该单位公章上的全称")
	@Column(nullable = false, length = 50)
	private String tf_name;

	@FieldDefine(title = "单位地址", number = 60, fieldGroup = "附加信息")
	@Column(length = 50)
	private String tf_address;

	@FieldDefine(title = "联系人", number = 70, fieldGroup = "附加信息")
	@Column(length = 10)
	private String tf_linkman;

	@FieldDefine(title = "联系电话", number = 80, fieldGroup = "附加信息")
	@Column(length = 20)
	private String tf_linkmanTel;

	@FieldDefine(title = "税号", number = 90, fieldGroup = "附加信息")
	@Column(length = 20)
	private String tf_taxId;

	@FieldDefine(title = "备注", number = 190, fieldGroup = "附加信息")
	@Column(length = 20)
	private String tf_remark;

	public Customer() {

	}

上面的java代码中可以看到三个父模块的manyToOne的标记配置。界面截图如下:

我新增一些客户,下节继续

模块管理常规功能自定义系统的设计与实现(25--多个模块之间的关联[1])

时间: 2024-10-06 03:24:09

模块管理常规功能自定义系统的设计与实现(25--多个模块之间的关联[1])的相关文章

模块管理常规功能自定义系统的设计与实现(22--第二个模块的加入)

模块"市"的设计与加入 现在重复加入"省"模块的过程,来加入市的模块. 1.建立数据表City CREATE TABLE [dbo].[City]( [tf_cityId] [nvarchar](4) COLLATE Chinese_PRC_CI_AS NOT NULL, [tf_provinceId] [nvarchar](2) COLLATE Chinese_PRC_CI_AS NOT NULL, [tf_name] [nvarchar](50) COLLATE

模块管理常规功能自定义系统的设计与实现(36--终级阶段 综合查询[3])

综合查询(3)--查询条件的设置2 不仅仅对于模块才有这样方便的条件选择方式,对模块的字段也可以设置.例如对于"省份"中有个字段是"所属区域",这个字段不是一个manyToOne字段,而是一个字符串字段,里面就是存着"东北地区"."华北地区"等等这样的具体的字符串值.对于这样的字段也很容易将其放在toolbar上供选择.在模块字段中找到"所属区域"这个字段,修改字段的属性,让这个字段可以加到综合查询的too

模块管理常规功能自定义系统的设计与实现(33--权限设计[3])

权限设计(3) 三.字段的只读权限.对于可以修改记录的操作员,可以进一步限制哪些字段对于他是不可修改的.这个功能很少用到,是用户提出来的,我就顺便加了进去.实现这个功能也很简单建立只读字段角色,然后加入模块的字段,最后再将角色加到操作员上即可.前台在解释生成edit form 的时候,将这个字段的只读属性置为true即可.后台Hibernate在新增或保存的时候,可以把只读字段过滤掉,不能保存或不能修改即可. 四.字段的可视权限.有时候某些字段你不希望被某些群组的操作员看到,那么就设置一个隐藏字

模块管理常规功能自定义系统的设计与实现(28--多个模块之间的关联[4])

多个模块之间的关联(4) 前面搭建了客户以及客户父模块的一个分支,另一个分支是产品线,还有一个是业务员,然后这三条线归并到订单之上. 前面我贴了我要搭建系统的一张图,现在贴一下数据库的表和其之间的关系情况. 上图中表和我设计的简易销售管理系统是完全一致的.再看一下的模块图,稍微记下下其中的关系,对于看懂下面的内容很有必要. 对于业务员,产品,订单三条分支我建立的过程就不介绍了.现在来看看架构好的菜单: 再看看加好的各个模块的页面: 1.部门和业务员: 2.商品类别 3.商品 4?订单 订单明细

模块管理常规功能自定义系统的设计与实现(52--功能更新[2] 对百分比字段的操作)

功能更新(2)  对百分比字段的操作 百分比数据,或者是比率数据是一个比较难处理的字段,难点并不在于单条记录之中,而是在于汇总和分类汇总的时候. 先来看看我系统中的一个模块中的一个比率字段: 上图中的  已支付比例,这个字段是  已支付金额 / 结算金额,这个字段在此合同模块中可以作为一个计算字段来保存在数据库中,甚至可以不保存在数据库中,直接在bean里作为一个计算的属性. 现在问题就来了,如果要计算所有合同的已支付比例,那么就不是简单加起来的问题了,要把分子和分母分别加起来再除才会得到总计的

模块管理常规功能自定义系统的设计与实现(29--多个模块之间的关联[5])

多个模块之间的关联(5) 系统全部架构好了,下面来看看一个很远的关系,"省份","订单"之间的关联.在省份模块里显示该省的订单的个数以及金额和收款情况.跟前面的设计一样,给省份增加"附加字段". 然后把选入的字段加入到 grid 当中. 再来看看子模块市下面的菜单: 下面显示一下选择了订单菜单项的界面. 其他导航 以上为模块间关系的一个例子.上面有个缺点就是,我要看某个省份2013年度的订单汇总,在省份模块里就没有办法做到,这个问题放到以后去解决

模块管理常规功能自定义系统的设计与实现(23--二个模块之间的关联[1])

"省"."市"二个模块之间的关联的操作(1) 一. "市"模块定义好了,我们先来新增1个市,看看和"省"的关联操作. 上面显示了"市"的模块界面,在导航栏中为省份的导航,我们看到只有"江苏省"一个,其他的在哪里呢. 一个模块的父模块的导航有一个选项,叫"显示无记录的项目",此选项默认不选中,也就是说省里面还没有市的话,那个省将不放在导航列表中,看下图. 二.记录拖放操

模块管理常规功能自定义系统的设计与实现(37--终级阶段 综合查询[4])

综合查询(4)--查询条件的设置3 这节来看看日期字段如何设置查询条件.我对日期字段做了一个分类,使其可以按年,年季,年月,年月日的几种方式来设置条件.另外每一个模块可以设置一个日期字段,当该模块作为查询的基准模块时,在条件设置toolbar 上第一个菜单即是日期选择菜单,选择的值将会作为该日期字段的条件.例如对于"订单"模块,为其设置了日期字段为"tf_date". 在综合查询的模块中显示为以下: 上图是选中了基准模块为"订单"时,查询期间选择

模块管理常规功能自定义系统的设计与实现(24--二个模块之间的关联[2])

父子模块之间关联操作(2) 上一节介绍了子模块中对父模块的一些相关操作.这一节来看看父模块中对子模块可以进行什么样的操作. 一.进入子模块的时候,限定父模块值.选择一个"省"记录,查看省下面的所有市的记录. 在选择了"江苏省"记录之后,按toolbar上面的"市",会进入市模块的界面.(在前一节的基础上,我又给河北省和浙江省增加了市,在下面的界面中将会看不到) 二.加入子模块的记录和聚合字段.上节中介绍了可以将父模块中的字段加入到子模块的grid

模块管理常规功能自定义系统的设计与实现(21--第二阶段设计目标)

第二阶段设计目标 前面的章节讲了建立单个模块的各种功能,从现在开始要加入若干个具有关联的模块,使其协同工作.我设计了一个简易的销售管理系统,系统的结构如下图所示,从本节开始将逐步的搭建此系统. 在上图中,各模块之间都能通过一定的路径产生联系,而具有关联的二个模块具有直接的关系,例如省是市的父模块,市是省的子模块:客户单位是市的子模块也是省的子模块.这种上下级关系将会是处理的重点.各模块间的关系要明确,不能出现关系不明确或者循环引用的模块,那样权限的设置将会有问题. 例如有如下模块结构: 在上图中