# 子表格数据重复校验
# 1.场景介绍
供应商中有物料子表格,在新增物料数据时,通过物料名称和物料类型进行检查该行数据是否已存在,如果存在,则进行提示“数据存在重复!”,如果不存在,则为其自动生成物料编码code。
# 2.效果展示
效果展示如下:

# 3.实现思路
1.在物料表单中添加方法checkName,通过物料名称和物料类型查询当前数据是否已存在
2.给物料类型添加值变化时事件,若当前物料数据存在,提示“数据存在重复!”;若不存在,则自动生成物料编码的uuid值
# 4.操作步骤
# 4.1 创建数据实体
执行数据库脚本,以MySQL为例,示例脚本如下:
drop table if exists order_material;
drop table if exists order_spec;
drop table if exists order_supplier;
create table order_material (
id varchar(32) not null comment '主键',
supplier_id varchar(32) comment '关联供应商主键',
name varchar(255) comment '物料名称',
material_type varchar(32) comment '类型',
material_image varchar(255) comment '物料图片',
remark varchar(255) comment '备注',
code varchar(255) comment '物料编码',
primary key (id)
) comment='orderMaterial';
create table order_spec (
id varchar(32) not null comment '主键',
material_id varchar(32) not null comment '关联物料主键',
name varchar(255) comment '规格名称',
price numeric(10,2) not null comment '价格',
primary key (id)
) comment='orderSpec';
create table order_supplier (
id varchar(32) not null comment '主键',
supplier_name varchar(255) comment '供应商名称',
supplier_code varchar(255) comment '供应商编码',
supplier_address varchar(255) comment '供应商地址',
supplier_contact varchar(255) comment '联系人',
contact_tel varchar(255) comment '联系电话',
enable varchar(32) not null comment '供应商状态',
primary key (id)
) comment='orderSupplier';
在构件包内,新建供应商数据实体

# 4.2 生成并调整表单和视图
右键点击实体,生成表单和视图

# 4.3 添加checkName方法
在物料表单-表单设置-高级设置-添加checkName方法,检查是否存在符合特定条件的物料数据。 在此以通过物料编码code和物料类型materialType为例进行查询数据:

生成的代码如下:
if (!this.Util.isNullOrEmpty(value)) {
const query_ordermaterial = await this.Api.queryByEntity('formeg.entity.OrderMaterial', {
"orderPropertyNames": "",
"expandConfigs": [{
"propertyNames": "materialType",
"refEntityName": "Dict",
"dictTypeCode": "material_type"
}],
"and": {
"items": [{
"propertyName": "name",
"op": "=",
"propertyValue": this.formData.name,
}, {
"propertyName": "materialType",
"op": "=",
"propertyValue": value
}]
}
}, 0, -1, 0)
if (query_ordermaterial.total != '0') {
return true
}
else {
return false
}
}
# 4.4 添加方法generalMaterialCode
在物料表单-表单设置-高级设置-添加generalMaterialCode方法,将当前的日期和时间格式化为一个连续的字符串,并返回这个字符串,用于生成物料编码code:

示例代码如下:
const now = new Date();
const formattedDate =
`${now.getFullYear()}${now.getMonth() + 1}${now.getDate()}${now.getHours()}${now.getMinutes()}${now.getSeconds()}`;
return formattedDate;
# 4.5 添加值变化时事件
在物料表单-物料名称-高级-添加值变化时事件,检查该值是否已存在,若已存在,进行提示;若不存在,生成uuid值。 在此以物料类型materialType字段的值为例,通过参数value传入,调用方法checkName,根据结果判断数据是否已存在,如果已存在,提示“数据存在重复!”,如果不存在,调用generalMaterialCode方法给物料编码code赋值:

生成的代码如下:
if (!this.Util.isNullOrEmpty(value)) {
if (await this.checkName(value)) {
this.$fail('数据存在重复')
}
else {
this.formData.code = await this.generalMaterialCode()
}
}