你好,我想做一个商品入库功能,目前在表单开发中建了三张表,form_in, form_in_item, production, 三张表,参考了文档高级用法中https://doc.jeelowcode.com/doc/1800-33-0 实现了 主附表以及和产品表的交互联动(见图一)
现在遇到的问题和思考:
1) 系统中可能有多个相似功能,比如商品入库,出库,领用,归还,维修,变更等等,这些功能基本相似,都是要选择产品,那选择产品这里是否可以封装成一个公共组件?因为我发现我在from_in表的JS增强中写了选择产品的弹框代码,如果我现在要做出库,也是要选择产品,这时又要复制一遍弹框的代码到form_out增强代码中,这样似乎有点冗余了(见图二),有没有好的办法处理呢
2)以下是form_in表中的完整增强代码 ,可以简单帮我看一下,并提出优化吗,非常感谢


// form_in
//初始化控件 打开产品选择弹框
useFun.controlInit('TableView', 'tableView_32983', {
tableId: '1925362580893753345', //表单开发id
fixedSearch: {}, //固定表格搜索值(不会被覆盖)
enhanceData: {
type: 'enhance_select', // 选择时,隐藏新增编辑等按钮
selectIds: []
}, //传递给表格js增强内部调用配置
showType: 'dialog', //弹窗类型 dialog | drawer
popOption: { //弹窗配置
title: '选择商品', //标题
width: '90%', //弹窗宽度
fullscreen: false, //是否全屏
footerBtn: [ //底部按钮配置
{
params: {
type: 'primary'
}, //el-button 其他参数
name: '确认选择', //按钮名称
display: true, //是否显示
loading: true, //点击时是否有loading
icon: '', //图标
clickFun: (loading) => {
//点击事件
// console.log('点击确定', tableView_32983.value,)
// 当前弹窗表格
const currTable = componentRef.value.tableView_32983.controlRef
// 附表实例
const subTable = subTableRef.value.form_in_item
if (!currTable.tableSelect?.length) {
message.info('请勾选数据!')
if (loading) loading() //关闭loading
return;
}
// 拿到所有选中的附表data
// console.error(tableForm.value.form_in_item)
const selectIds = tableForm.value.form_in_item.map(k => k.sku_id)
// 把勾选的数据赋值到附表
setTimeout(() => {
currTable.tableSelect.map(item => {
// 没勾选过的
if (!selectIds.includes(item.id)) {
subTable.rowAdd({
sku_id: item.id,
epc: item.epc,
name: item.name,
num: 0,
$btn__signRowBtn: false, // 自定义按钮隐藏
})
}
})
}, 100)
if (loading) loading() //关闭loading
tableView_32983.value.show = false // 关闭弹框
}
}
],
headerBtn: [], //顶部按钮配置(配置同上)
dialogParams: {}, //弹窗其他配置
handleClose: (done) => { //关闭弹窗前的回调
done()
}
}
})
//控件调用
const { tableView_32983 } = Vue.toRefs(rendControlData.value)
const controlData = tableView_32983.value.params //TableView的配置
// 数组对象求和
const sumField = (arr, field) => {
return arr?.reduce((total, item) => {
const value = Number(item[field]);
return total + (isNaN(value) ? 0 : value);
}, 0) || 0;
}
// 设置主表表格顶部按钮是否可点击
const setTableBtnDisabled = (bool = true) => {
// 审核按钮
buttonObj.value.header.checkBtn = {
...buttonObj.value.header.checkBtn,
params: {
disabled: bool
}
}
}
// 监听主表表格勾选
watch(() => tableSelect.value.length, (length) => {
setTableBtnDisabled(length == 0)
}, { immediate: true })
// 设置附表表格顶部按钮是否可点击
const setSubTableBtnDisabled = (bool = true) => {
for (const key in subTableObj.value) {
const headerBtn = subTableObj.value[key].buttonObj.header
// console.error('headerBtn',headerBtn)
// 审核按钮
headerBtn.signBtn.params.disabled = bool
}
}
// 监听附表表格勾选
watch(() => subTableRef.value?.form_in_item?.selectionSubChange(), (subTableSelect) => {
// console.error('subTableRef.value.form_in_item.selectionSubChange', subTableRef.value)
setSubTableBtnDisabled(subTableSelect?.length == 0)
}, { immediate: true })
// 监听附表数据,自动计算商品总数和金额
watch(() => tableForm.value.form_in_item, (subTable) => {
tableForm.value.num = sumField(subTable, 'num')
tableForm.value.amount = sumField(subTable, 'amount')
}, { immediate: true })
return {
// 附表 自定义按钮 单个签收
signRowBtn(row) {
row.status = 1
useFun.requestApi('put', '/jeelowcode/dbform-data/edit/1925363117659807746', {
data: {
...row,
form_type: 'form_in'
}
}).then(res => {
row.$btn__signRowBtn = false
message.success('操作成功')
useFun.refreshChange() // 刷新当前页表格数据
})
},
// 附表 自定义按钮 批量签收
signBtn() {
if (!tableForm.value.form_in_item?.length) {
message.info('请勾选数据!')
return;
}
const data = tableForm.value.form_in_item.map(item => {
item.status = 1
item.form_type = 'form_in'
return item
})
useFun.requestApi('put', '/jeelowcode/dbform-data/edit/batch/1925363117659807746', {
data: data
}).then(res => {
message.success('操作成功')
useFun.refreshChange() // 刷新当前页表格数据
subTableRef.value.form_in_item.crudRef.refreshTable()
})
},
// 主表 自定义按钮 批量审核
checkBtn() {
if (!tableSelect.value?.length) {
message.info('请勾选数据!')
return;
}
const data = tableSelect.value.map(item => {
item.status = 1
return item
})
useFun.requestApi('put', '/jeelowcode/dbform-data/edit/batch/1925363085304946690', {
data: data
}).then(res => {
message.success('操作成功')
useFun.refreshChange() // 刷新当前页表格数据
tableSelect.value = [] // 重置勾选
initSelectChange()
})
},
//勾选表格数据时触发
// selectionChange(selectData) {
// //selectData 表格勾选数据
// // console.error(selectData,buttonObj.value.header.checkBtn.display)
// if(selectData?.length){
// buttonObj.value.header.checkBtn.display = true
// }else{
// buttonObj.value.header.checkBtn.display = false
// }
// },
// 自定义按钮 选择产品
selectAssetsBtn() {
// 把已勾选的产品,勾选上
controlData.enhanceData.selectIds = tableForm.value.form_in_item.map(k => k.sku_id)
//显示TableView
tableView_32983.value.show = true
// componentRef.value.tableView_32983 TableView的Ref控件引用
},
beforeFormData(formData, type) { //表单打开前执行
return new Promise(resolve => {
const tableHideFields = ['order_user_id', 'confirm_user_id', 'status'] // 主表表单要隐藏的字段
const tableDisabledFields = ['order_user_id', 'confirm_user_id', 'status','num','amount'] // 主表表单要禁止编辑的字段
console.log('formData------------------', formData)
// 设置主表部分字段不可见
if (formData?.id) {
// 编辑
tableHideFields.forEach(item => {
useFun.setPropConfig(item, { display: true })
})
} else {
// 新增
tableHideFields.forEach(item => {
useFun.setPropConfig(item, { display: false })
})
}
// 设置主表部分字段不可编辑
for (const key in tableOption.value.column) {
if(!tableDisabledFields.includes(key)){
tableOption.value.column[key].disabled = false
}
}
setTimeout(() => {
// 隐藏附表头、操作列按钮
for (const key in subTableObj.value) {
const subTableButton = subTableObj.value[key].buttonObj
// console.error('subTableButton------------------>', subTableButton)
subTableButton.header.addBtn.display = false // 隐藏新增按钮
if (formData.status == 0 || !formData.status) {
subTableButton.header.selectAssetsBtn.display = true // 显示选择产品按钮
subTableButton.header.batchDelBtn.display = true // 显示批量删除按钮
subTableButton.header.signBtn.display = false // 隐藏批量签收按钮
subTableButton.menu.signRowBtn.display = false // 隐藏签收按钮
subTableButton.menu.delBtn.display = true // 显示行删除按钮
} else if (formData.status == 1) {
// 主表字段都禁用
for (const key in tableOption.value.column) {
tableOption.value.column[key].disabled = true
}
// 附表字段都禁用
for (const key in subTableRef.value.form_in_item.tableOption.column) {
subTableRef.value.form_in_item.tableOption.column[key].cell = false
}
subTableButton.header.selectAssetsBtn.display = false // 隐藏选择产品按钮
subTableButton.header.batchDelBtn.display = false // 隐藏批量删除按钮
subTableButton.header.signBtn.display = true // 显示批量签收按钮
subTableButton.menu.signRowBtn.display = true // 显示行签收按钮
subTableButton.menu.delBtn.display = false // 隐藏行删除按钮
}
}
// 隐藏附表行签收按钮
tableForm.value.form_in_item = tableForm.value.form_in_item.map(item => {
if (item.status == 1) {
item.$btn__signRowBtn = false
}
return item;
})
console.warn('tableForm.value.form_in_item', tableForm.value.form_in_item)
// 设置附表部分字段不可编辑和 不可见
const subTableDisabledFields = ['order_id', 'epc', 'sku_id', 'assets_id', 'remark', 'status'] // 要禁止编辑的字段
const subTableHideFields = ['order_id', 'epc'] // 要隐藏的字段
subTableDisabledFields.forEach(item => {
useFun.setSubPropConfig(item, { cell: false }, 'form_in_item')
})
subTableHideFields.forEach(item => {
useFun.setSubPropConfig(item, { hide: true }, 'form_in_item')
})
// 设置附表选择禁用
const subRef = subTableRef.value.form_in_item
subRef.tableOption.selectable = (row, index) => { //控制行是否可勾选
if (row.status == 1) { // 状态为1禁用选择 false
return false
} else {
return true
}
}
subRef.crudRef.refreshTable()
// 修改附表商品和价格,修改主表
useFun.setSubPropConfig('num', {
change: ({ value }) => {
tableForm.value.num = sumField(tableForm.value.form_in_item, 'num')
}
})
useFun.setSubPropConfig('amount', {
change: ({ value }) => {
tableForm.value.amount = sumField(tableForm.value.form_in_item, 'amount')
}
})
}, 500)
resolve(formData)
})
},
initOption() { //表格显示前执行
// 隐藏审核按钮
//buttonObj.value.header.checkBtn.display = false
},
}
项目:JeeLowCode








可以尝试一下通过打开自定义组件来实现
思路
1.自行编写一个产品选择的控件
2.内部把所有数据处理获取的逻辑都写到组件里面,再把方法暴露出去
3. 表单开发 点击 选择产品的时候 弹出这个组件
4.确认选择这里的按钮都可以直接调用到 组件内部的方法 去获取数据处理数据之类的
5.表单开发增强只调用方法 和 网附表添加或删除数据