一、通过表单引入js,实现根据主表数据信息,实现子表数据自动批量添加;
场景:适用批量维护楼盘等,批量数据维护快速批量生成的方式,实现数据快速添加。
二、实现详情方式:
1. 以房屋维护表为例,根据规则字段字段生成对应的子表数据;
2. 2.首先需建五个表。分别为座栋表、单元表、楼层表、房屋表、和一张建它们关联起来的房屋批量生成表。
座栋表:
单元表:
楼层表:
房屋表:
批量生成表,用于将这四张表以外部表的形式关联起来:
添加外部表操作信息可参考链接:
http://www.hotent.org:8880/chanzhi/index.php/book/design-center/31.html
3、新建表单。
将这五个建模的表,新建五个表单,根据表单的样式喜好可以自定义;
这里以批量添加表为例;
子表是根据主表字段自动生成的,所以需要将子表拖到表单内,将子表字段拉出来。
子表分别对应四个外部表。座栋表、单元表、楼层表、房屋表,将对应的字段拉到表单内。
表单设计可参考链接:http://www.hotent.org:8880/chanzhi/index.php/book/EIPSAAS7.2/34.html
4、编写对应的规则脚本;
这里规则:
座栋数、单元数、楼层数、房间数皆为整数
交互逻辑:
根据填写的内容自动生成座栋、单元、楼层和房间,如填写的座栋数为2、单元数为2、楼层数为2、房间数为2,起始编号为1,则需要新建两个座栋,座栋名为1和2,每栋两个单元1单元、2单元,每单元两层,每层两个房间。
在表单左上角点击引入脚本,然后编写对应js脚本代码:
Js脚本如下:
const vm = document.getElementsByName("online-form")[0].__vue__;
let { pqplscfw } = vm.data;
//需要触发监听的字段
let fields = ["zds", "qsbh", "lcs", "fjs", "dys", "zddw", "lcdw", "fjdw"];
vm.$nextTick(() => {
fields.forEach((field) => {
vm.$el
.querySelector(`[model-name='data.pqplscfw.${field}']`)
.__vue__.$children[0].$on("blur", () => {
validateFields();
});
});
});
function validateFields() {
//如果能校验通过
vm.$root.$validator.validateAll("custom-form").then((result) => {
if (result) {
if (Number(pqplscfw.zds) < Number(pqplscfw.qsbh)) {
vm.$message.warning("座栋数不能小于起始编号");
pqplscfw.zds = "";
pqplscfw.qsbh = "";
return;
}
doNext();
}
});
}
function doNext() {
let subFields = ["sub_fwplb", "sub_dyplb", "sub_zdplb", "sub_lcplb"]; //子表名
subFields.forEach((item) => {
//清空子表数据
pqplscfw[item].splice(0);
});
let { zds, qsbh, lcs, fjs, dys, zddw, lcdw, fjdw } = pqplscfw;
zds = Number(zds);
qsbh = Number(qsbh);
lcs = Number(lcs);
fjs = Number(fjs);
dys = Number(dys);
for (let build = qsbh; build <= zds; build++) {
let buildingName = `座栋-${build}`;
//添加坐栋表
handleAddSubTableWithValues("sub_zdplb", {
F_zddw: zddw,
F_zdmc: buildingName,
});
//处理单元
for (let unit = 1; unit <= dys; unit++) {
let unitName = `单元-${unit}`;
//添加单元表
handleAddSubTableWithValues("sub_dyplb", {
F_zdmc: buildingName,
F_dymc: unitName,
});
//处理楼层
for (let floor = 1; floor <= lcs; floor++) {
let floorName = `楼层-${floor}`;
//添加楼层表
handleAddSubTableWithValues("sub_lcplb", {
F_lcdw: lcdw,
F_zdmc: buildingName,
F_dymc: unitName,
F_wllc: floorName,
});
//处理房间
for (let room = 1; room <= fjs; room++) {
let roomName = `房间-${room}`;
//添加房间表
handleAddSubTableWithValues("sub_fwplb", {
F_zdmc: buildingName,
F_dymc: unitName,
F_lcmc: floorName,
F_fzbh: roomName,
F_fjdw: fjdw,
});
}
}
}
}
}
function handleAddSubTableWithValues(subTabField, map) {
let subInitData = pqplscfw["initData"][subTabField.replace("sub_", "")] || {};
let str = JSON.stringify(subInitData).replace(/null/g, '""');
let subData = JSON.parse(str);
subData["sub_guid"] = uid();
for (let key in map) {
subData[key] = map[key];
}
pqplscfw[subTabField].push(subData);
}
function uid() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
var r = (Math.random() * 16) | 0,
v = c == "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
效果图:
可下载导入表单: