# 子表格数据重复校验
# 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 (value) {
//通过接口查询物料实体获取数据
let url =
"/api/lowcode/models/actions/query-with-page?entityName=formeg.entity.OrderMaterial&pageIndex=0&pageSize=10&cascadeDeep=0"
//定义查询对象,查询条件为:code和materialType
let condition = {
"orderPropertyNames": "",
"expandConfigs": [{
"propertyNames": "materialType",
"refEntityName": "Dict",
"dictTypeCode": "material_type"
}],
"and": {
"items": [{
"propertyName": "name",
"op": "=",
"propertyValue": this.formData.name,
}, {
"propertyName": "materialType",
"op": "=",
"propertyValue": value
}]
}
}
let isExist = false;
//调用查询接口查询结果后赋值给res对象
const res = await this.Ajax.post(url, {
condition
}, false)
//如果数据存在返回true,不存在则返回false
if (res.data.length > 0) {
isExist = true
}
return isExist
}
# 4.4 添加值变化时事件
在物料表单-物料名称-高级-添加值变化时事件,检查该值是否已存在,若已存在,进行提示;若不存在,生成uuid值。 在此以物料类型materialType字段的值为例,通过参数value传入,调用方法checkName,根据结果判断数据是否已存在,如果已存在,提示“数据存在重复!”,如果不存在,通过时间生成字符串给物料编码code赋值:

示例代码如下:
if (value) {
let isExist = await this.checkName(value)
if (isExist) {
this.$error('数据存在重复!');
}
else {
const now = new Date();
const formattedDate =
`${now.getFullYear()}${now.getMonth() + 1}${now.getDate()}${now.getHours()}${now.getMinutes()}${now.getSeconds()}`;
//将生成的字符串formattedDate赋值给物料编码code
this.formData.code = formattedDate;
}
}