Appearance
绑定函数 callback
purchase_ebidding_TC2021022702_1
示例 DEMO:采购协同 > 寻源协同 > 竞价管理 业务模板 配置
TIP
绑定函数,用于实现各模块具体业务流程的需求,V6 产品中已重新梳理、统一规范、且简化了调用方式;
callback 参数格式说明
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {String | string[]} label 树型下拉组件label
* @param {any} extra 组件暴露的额外参数,如树型下拉当前所选行信息
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
// ...
}
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
// ...
}
弹窗选择/远程下拉搜索 表头字段配置
负责人purchasePrincipal
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const { subAccount = "", realname = "" } = data[0] || {};
pageData.purchasePrincipal = subAccount + "_" + realname;
}
}
js
{
modalColumns: [
{
field: "elsAccount",
title: "ELS账号",
fieldLabelI18nKey: "",
with: 150,
},
{
field: "subAccount",
title: "子账号",
fieldLabelI18nKey: "i18n_field_subAccount",
with: 150,
},
{
field: "realname",
title: "用户名",
fieldLabelI18nKey: "i18n_field_realname",
with: 150,
},
{
field: "orgCode_dictText",
title: "部门名称",
fieldLabelI18nKey: "",
with: 150,
},
],
modalUrl: "/account/elsSubAccount/list",
selectModal: 'single',
params: { status: '1' },
mobileModalParams: { status: '1' },
handleAfter({ pageData, row }) {
pageData.purchasePrincipal = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.purchasePrincipal = '';
},
}
tex
groupCode: 'expandForm',
sortOrder: '76',
fieldType: 'remoteSelect',
fieldLabel: '采购负责人',
fieldLabelI18nKey: 'i18n_field_TCBFL_803dd1fd',
fieldName: 'purchasePrincipal',
dictCode: '',
defaultValue: '',
供应商ELS账号toElsAccount
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const {
toElsAccount = "",
supplierName = "",
supplierCode = "",
} = data[0] || {};
pageData.toElsAccount = toElsAccount;
pageData.supplierName = supplierName;
pageData.supplierCode = supplierCode;
}
}
js
{
modalColumns: [
{
field: "toElsAccount",
title: "供应商ELS账号",
fieldLabelI18nKey: "i18n_title_supplierELSAccount",
with: 150
},
{
field: "supplierName",
title: "供应商名称",
fieldLabelI18nKey: "i18n_field_supplierName",
with: 150
},
{
field: "supplierCode",
title: "供应商ERP编码",
fieldLabelI18nKey: "i18n_field_supplierCode",
with: 150
}
],
selectModal: 'single',
modalUrl: "/supplier/supplierMaster/list",
params: {},
mobileModalParams: {},
handleAfter({ pageData, row }) {
pageData.toElsAccount = '';
pageData.supplierName = '';
pageData.supplierCode = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.toElsAccount = '';
_form.supplierName = '';
_form.supplierCode = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '对方ELS账号',
fieldLabelI18nKey: 'i18n_field_toElsAccount',
fieldName: 'toElsAccount',
dictCode: '',
defaultValue: '',
物料编码materialNumber
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const {
materialNumber = "",
materialName = "",
materialDesc = "",
} = data[0] || {};
pageData.materialNumber = materialNumber;
pageData.materialName = materialName;
pageData.materialDesc = materialDesc;
}
}
js
{
modalColumns: [
{
field: "materialNumber",
title: "物料编码",
fieldLabelI18nKey: "i18n_title_materialNumber",
with: 150,
},
{
field: "materialName",
title: "物料名称",
fieldLabelI18nKey: "i18n_field_materialName",
with: 150,
},
{
field: "materialDesc",
title: "物料描述",
fieldLabelI18nKey: "i18n_field_materialDesc",
with: 150,
},
{
field: 'materialSpec',
title: '物料规格',
fieldLabelI18nKey: 'i18n_field_materialSpec',
with: 150,
}
],
modalUrl: "/material/purchaseMaterialHead/list",
selectModal: 'single',
params: {},
mobileModalParams: {},
handleAfter({ pageData, row }) {
pageData.materialNumber = '';
pageData.materialName = '';
pageData.materialDesc = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.materialNumber = '';
_form.materialName = '';
_form.materialDesc = '';
},
}
tex
groupCode: 'baseForm',
sortOrder: '8',
fieldType: 'remoteSelect',
fieldLabel: '物料编码',
fieldLabelI18nKey: 'i18n_field_materialNumber',
fieldName: 'materialNumber',
物料组编码materialGroup
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const { value = "", title = "" } = data[0] || {};
pageData.materialGroup = value;
pageData.materialGroupName = title;
}
}
js
{
modalColumns: [
{
field: "materialGroup",
title: "物料组编码",
fieldLabelI18nKey: "i18n_title_materialGroup",
with: 150,
},
{
field: "materialGroupName",
title: "物料组名称",
fieldLabelI18nKey: "i18n_field_materialGroupName",
with: 150,
},
],
modalUrl: "/material/purchaseMaterialHead/list",
selectModal: 'single',
params: {},
mobileModalParams: {},
handleAfter({ pageData, row }) {
pageData.materialGroup = '';
pageData.materialGroupName = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.materialGroup = '';
_form.materialGroupName = '';
},
}
tex
groupCode: 'baseForm',
sortOrder: '14',
fieldType: 'select',
fieldLabel: '准入策略',
fieldLabelI18nKey: 'i18n_field_rNiN_266d016e',
fieldName: 'policyDesc',
dictCode: 'MaterialGroup',
绩效模板编号performanceTemplateNumber
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const {
performanceTemplateNumber = "",
id = "",
isWeightStrategy = "",
performanceTemplateName = "",
resultRequiredAudit = "",
resultRequiredSend = "",
orgType = "",
orgCode = "",
orgName = "",
supplierClassify = "",
assessmentCycle = "1",
} = data[0] || {};
pageData.performanceTemplateNumber = performanceTemplateNumber;
pageData.performanceTemplateId = id;
pageData.isWeightStrategy = isWeightStrategy;
pageData.performanceTemplateName = performanceTemplateName;
pageData.assessmentCycle = assessmentCycle;
pageData.requiredAudit = resultRequiredAudit || "0";
pageData.requiredSend = resultRequiredSend || "0";
pageData.orgType = orgType;
pageData.orgCode = orgCode;
pageData.orgName = orgName;
pageData.supplierClassify = supplierClassify;
pageData.templateIdRefreshStatus = "1";
// 考核时间范围 数据字典
// pageData.assessmentTimeRange = '';
let codeMap = {
1: "assessmentTimeRangeMonth",
2: "assessmentTimeRangeQuarter",
3: "assessmentTimeRangeYear",
};
let idx = parseInt(assessmentCycle);
let dictCode = codeMap[idx] || "assessmentTimeRangeMonth";
customFormatItem("baseForm", "assessmentTimeRange", function fn(item) {
item.dictCode = dictCode;
item.fieldType = "select";
});
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}
}
js
{
modalColumns: [{
field: 'performanceTemplateNumber',
title: '绩效模板编号',
fieldLabelI18nKey: 'i18n_field_performanceTemplateNumber',
with: 150,
},
{
field: 'performanceTemplateName',
title: '绩效模板名称',
fieldLabelI18nKey: 'i18n_field_performanceTemplateName',
with: 150,
},
{
field: 'isWeightStrategy_dictText',
title: '权重策略',
fieldLabelI18nKey: 'i18n_field_bsiN_31236539',
with: 150,
},
{
field: 'orgType_dictText',
title: '组织类型',
fieldLabelI18nKey: 'i18n_field_orgTypeName',
with: 150,
},
{
field: 'orgCode',
title: '组织编码',
fieldLabelI18nKey: 'i18n_field_orgCode',
with: 150,
},
{
field: 'orgName',
title: '组织名称',
fieldLabelI18nKey: 'i18n_field_orgName',
with: 150,
},
{
field: 'assessmentCycle_dictText',
title: '考核周期',
fieldLabelI18nKey: 'i18n_field_assessmentCycle',
with: 150,
},{
field: 'supplierClassify_dictText',
title: '供应商分类',
fieldLabelI18nKey: 'i18n_field_supplierClassify',
with: 150,
},
],
selectModal: 'single',
modalUrl: '/performance/purchasePerformanceTemplateHead/list',
params: {},
mobileModalParams: {},
handleAfter({ pageData, row }) {
pageData.performanceTemplateNumber = '';
pageData.performanceTemplateId = '';
pageData.isWeightStrategy = '';
pageData.performanceTemplateName = '';
pageData.assessmentCycle = '';
pageData.requiredAudit = '';
pageData.requiredSend = '';
pageData.orgType = '';
pageData.orgCode = '';
pageData.orgName = '';
pageData.supplierClassify = '';
pageData.templateIdRefreshStatus = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.performanceTemplateNumber = '';
_form.performanceTemplateId = '';
_form.isWeightStrategy = '';
_form.performanceTemplateName = '';
_form.assessmentCycle = '';
_form.requiredAudit = '';
_form.requiredSend = '';
_form.orgType = '';
_form.orgCode = '';
_form.orgName = '';
_form.supplierClassify = '';
_form.templateIdRefreshStatus = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '绩效模板编号',
fieldLabelI18nKey: 'i18n_field_performanceTemplateNumber',
fieldName: 'performanceTemplateNumber',
dictCode: '',
defaultValue: '',
物料分类编码cateCode
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const cateCode = data.map((n) => n.cateCode).join(",");
const cateName = data.map((n) => n.cateCode + "_" + n.cateName).join(",");
pageData.cateCode = cateCode;
pageData.cateName = cateName;
}
}
js
{
modalColumns: [
{
field: "cateCode",
title: "物料分类编码",
fieldLabelI18nKey: "i18n_field_materialClassificationCode",
with: 150
},
{
field: "cateName",
title: "物料分类名称",
fieldLabelI18nKey: "i18n_field_cateName",
with: 150
},
],
modalUrl: "/material/purchaseMaterialCode/list",
params:{ cateStatus: '1' },
mobileModalParams: { cateStatus: '1' },,
handleAfter({ pageData, row }) {
pageData.cateCode = '';
pageData.cateName = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.cateCode = '';
_form.cateName = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '物料分类编码',
fieldLabelI18nKey: 'i18n_field_cateCode',
fieldName: 'cateCode',
dictCode: '',
defaultValue: '',
核价单业务模版编号managementTemplateNumber
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const {
templateName = "",
templateVersion = "",
elsAccount = "",
templateNumber = "",
} = data[0] || {};
pageData.managementTemplateName = templateName;
pageData.managementTemplateVersion = templateVersion;
pageData.managementTemplateAccount = elsAccount;
pageData.managementTemplateNumber = templateNumber;
}
}
js
{
modalColumns: [
{
field: 'elsAccount',
title: '模版账号',
width: 180,
},
{
field: 'templateName',
title: '模版名称',
width: 180,
},
{
field: 'templateNumber',
title: '模版编号',
width: 180,
},
{
field: 'templateVersion',
title: '模版版本',
width: 180,
}
],
selectModel: "single",
modalUrl: '/template/templateHead/noToken/listByBusiness',
modalParams: { businessType: "purchasePriceEvaluationManageHead" },
mobileModalParams: { businessType: "purchasePriceEvaluationManageHead" },
handleAfter({ pageData, row }) {
pageData.managementTemplateName = '';
pageData.managementTemplateVersion = '';
pageData.managementTemplateAccount = '';
pageData.managementTemplateNumber = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.managementTemplateName = '';
_form.managementTemplateVersion = '';
_form.managementTemplateAccount = '';
_form.managementTemplateNumber = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '核价单业务模版编号',
fieldLabelI18nKey: 'i18n_field_nutESCrAy_4c644765',
fieldName: 'managementTemplateNumber',
dictCode: '',
required: '1',
申请部门applyDept
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const { orgCode = "", orgName = "" } = data[0] || {};
pageData.applyDept = orgCode + "_" + orgName;
}
}
js
{
modalColumns: [{
field: 'orgCode',
title: '组织编码',
fieldLabelI18nKey: 'i18n_field_orgCode',
with: 150,
},
{
field: 'orgName',
title: '组织名称',
fieldLabelI18nKey: 'i18n_field_orgName',
with: 150,
}
],
modalUrl: '/org/purchaseOrganizationInfo/getOrgBySubAccount',
params ({ pageData, row, userInfo }) {
return { subAccount: pageData.subAccount || '' }
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {
return { subAccount: _cacheAllData.subAccount || '', }
},
handleAfter({ pageData, row }) {
pageData.applyDept = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
pageData.applyDept = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '申请部门',
fieldLabelI18nKey: 'i18n_field_applyDept',
fieldName: 'applyDept',
defaultValue: '',
收货地址deliveryAddress
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const { address = "", consignee = "", purchasePhone = "" } = data[0] || {};
pageData.deliveryAddress = address;
pageData.receiveContact = consignee;
pageData.receivePhone = purchasePhone;
}
}
js
{
modalColumns: [
{
field: 'organizationType_dictText',
title: '组织类型',
fieldLabelI18nKey: 'i18n_field_orgTypeName',
width: 150
},
{
field: 'organizationName',
title: '组织名称',
fieldLabelI18nKey: 'i18n_field_orgName',
width: 150
},
{
field: 'address',
title: '收货地址',
fieldLabelI18nKey: 'i18n_title_address',
width: 350
},
{
field: 'consignee',
title: '收货人',
fieldLabelI18nKey: 'i18n_field_consignee',
width: 200
},
{
field: 'purchasePhone',
title: '收货人电话',
fieldLabelI18nKey: 'i18n_field_receivedPhone',
width: 200
},
{
field: 'consigneeEmail',
title: '收货人邮箱',
fieldLabelI18nKey: 'i18n_field_consigneeEmail',
width: 200
},
{
field: 'phone',
title: '收货人座机',
fieldLabelI18nKey: 'i18n_title_consigneePlan',
width: 200
}
],
modalUrl: '/delivery/deliveryOrderAddress/list',
params ({ pageData, row, userInfo }) {
return {
elsAccount: pageData.busAccount || '',
organizationType: 'factory',
organizationNo: pageData.factory,
}
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {
return {
elsAccount: _cacheAllData.busAccount || '',
organizationType: 'factory',
organizationNo: _cacheAllData.factory,
}
},
handleAfter({ pageData, row }) {
pageData.deliveryAddress = '';
pageData.receiveContact = '';
pageData.receivePhone = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.deliveryAddress = '';
_form.receiveContact = '';
_form.receivePhone = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '收货地址',
fieldLabelI18nKey: 'i18n_field_deliveryAddress',
fieldName: 'deliveryAddress',
采购订单orderNumber
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
const {
id = "",
headId = "",
orderNumber = "",
itemNumber = "",
} = data[0] || {};
pageData.orderItemId = id;
pageData.orderHeadId = headId;
pageData.orderNumber = orderNumber;
pageData.orderItemNumber = itemNumber;
}
}
js
{
modalColumns: [
{
field: 'orderNumber',
title: '采购订单号',
with: 150,
},
{
field: 'itemNumber',
title: '采购订单行号',
with: 150,
},
{
field: 'materialNumber',
title: '物料编码',
with: 150,
},
{
field: 'materialDesc',
title: '物料描述',
with: 150,
},
{
field: 'cateCode',
title: '物料分类编码',
with: 150,
},
{
field: 'cateName',
title: '物料分类名称',
with: 150,
},
{
field: 'factory',
title: '工厂',
with: 150,
},
{
field: 'itemStatus_dictText',
title: '行状态',
with: 100
}
],
modalUrl: '/order/purchaseOrderItem/list',
params ({ pageData, row, userInfo }) {
return { materialNumber: pageData.materialNumber || '' }
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {
return {
elsAccount: _cacheAllData.busAccount || '',
organizationType: 'factory',
organizationNo: _cacheAllData.factory,
}
},
handleBefore ({ pageData, userInfo }) {
if (!pageData.materialNumber) {
return Promise.reject('请先选择物料编码')
} else {
return Promise.resolve('success')
}
},
mobileHandleBefore(Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
return new Promise((resolve, reject) => {
!_cacheAllData.materialNumber ? reject("请先选择物料编码") : resolve("success");
})
},
handleAfter({ pageData, row }) {
pageData.orderItemNumber = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_form.orderItemNumber = '';
},
}
tex
fieldType: 'selectModal',
fieldLabel: '采购订单',
fieldLabelI18nKey: 'i18n_field_nRIt_446776b9',
fieldName: 'orderNumber',
dictCode: '',
defaultValue: '',
弹窗选择/远程下拉搜索 表行字段配置
税码taxCode+动态计算(4位小数)
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
}
) {
if (data && data.length) {
let { taxCode = "", taxRate = "0" } = data[0] || {};
row.taxCode = taxCode;
row.taxRate = taxRate;
}
const DIGIT = 4;
// 税率 taxRate;
const taxRate = row.taxRate || "0";
// 报价项 quoteType;
// 数据字典 srmQuoteType (0: 含税价, 1: 不含税价);
const quoteType = pageData.quoteType || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
const requireQuantity = row.requireQuantity || "";
// 根据含税价 price, 实时计算未税单价
if (quoteType === "0") {
const price = row.price || "";
if (price && taxRate) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (requireQuantity) {
let taxAmount = Decimal.mul(price, requireQuantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
} else {
// 根据未税单价价 netPrice, 实时计算含税价
const netPrice = row.netPrice || "";
if (netPrice && taxRate) {
let price = Decimal.mul(netPrice, formula);
// 4位小数
row.price = new Decimal(price).toFixed(DIGIT);
if (requireQuantity) {
let netAmount = Decimal.mul(netPrice, requireQuantity);
let taxAmount = Decimal.mul(netAmount, formula);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
}
}
}
}
js
{
modalColumns: [
{
field: 'taxCode',
title: '税码',
fieldLabelI18nKey: 'i18n_field_taxCode',
with: 150,
},
{
field: 'taxRate',
title: '税率(%)',
fieldLabelI18nKey: 'i18n_field_fIWWW_f03b2eb3',
with: 150,
},
{
field: 'taxName',
title: '税码名称',
fieldLabelI18nKey: 'i18n_field_taxName',
with: 150,
},
{
field: 'remark',
title: '备注',
fieldLabelI18nKey: 'i18n_field_remark',
with: 150,
}
],
modalUrl: "/base/tax/queryTaxForTemplate",
params ({ pageData, row, userInfo }) {
return { purchaseAccount: row.elsAccount || '' }
},
mobileModalParams(Vue, { _pageData, _cacheAllData, _form, _row }) {
return { purchaseAccount: _row.busAccount || '' }
},
selectModel: "single",
handleAfter({ pageData, row }) {
row.taxCode = '';
row.taxCode_dictText = '';
row.taxRate = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_row.orderItemNumber = '';
},
}
tex
groupCode: "purchaseEnquiryItemList",
title: "税码",
fieldLabelI18nKey: "i18n_field_taxCode",
fieldType: "remoteSelect",
field: "taxCode",
align: "",
子账号subAccount
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
// 填充操作时 _isFill 判断标识值为 true
// 且 data 参数为当前所选行缓存数据
// 如果赋值操作中字段属性不同, 需要加条件判断区分取值
// 如果各属性名称相同, 则不用修改
if (_isFill) {
const {
subAccount = "",
name = "",
telphone = "",
email = "",
} = data[0] || {};
row.subAccount = subAccount;
row.name = name;
row.telphone = telphone;
row.email = email;
} else {
const {
subAccount = "",
realname = "",
phone = "",
email = "",
} = data[0] || {};
row.subAccount = subAccount;
row.name = realname;
row.telphone = phone;
row.email = email;
}
}
}
js
{
modalColumns: [
{
field: 'subAccount',
title: '子账号',
fieldLabelI18nKey: 'i18n_field_subAccount',
with: 150,
},
{
field: 'realname',
title: '姓名',
fieldLabelI18nKey: 'i18n_field_realname',
with: 150,
},
{
field: 'phone',
title: '电话号码',
fieldLabelI18nKey: 'i18n_title_telphone',
with: 150,
},
{
field: 'email',
title: '邮箱',
fieldLabelI18nKey: 'i18n_field_email',
with: 150,
}
],
modalUrl: '/account/elsSubAccount/getByElsAccount',
selectModal: 'single',
params ({ pageData, row, userInfo }) {
return {
participants: 'sale',
toElsAccount: pageData.toElsAccount
}
},
mobileModalParams(Vue, { _pageData, _cacheAllData }) {
return {
participants: 'sale',
toElsAccount: _cacheAllData.toElsAccount,
}
},
handleBefore ({ pageData, userInfo }) {
if (!pageData.toElsAccount) {
return Promise.reject('公共信息只能供方在企业基本信息中维护')
} else {
return Promise.resolve()
}
},
mobileHandleBefore(Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
return new Promise((resolve, reject) => {
!_cacheAllData.toElsAccount ? reject("请先选择物料编码") : resolve("success");
})
},
handleAfter({ pageData, row }) {
row.subAccount = '';
row.name = '';
row.telphone = '';
row.email = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_row.subAccount = '';
_row.name = '';
_row.telphone = '';
_row.email = '';
},
}
tex
groupCode: 'supplierContactsInfoList',
title: '子账号',
fieldLabelI18nKey: 'i18n_field_Jey_16832e1',
fieldType: 'remoteSelect',
field: 'subAccount',
align: '',
headerAlign: 'center',
dataFormat: '',
defaultValue: '',
width: 150,
dictCode: '',
对方ELS账号toElsAccount
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
// 填充操作时 _isFill 判断标识值为 true
// 且 data 参数为当前所选行缓存数据
// 如果赋值操作中字段属性不同, 需要加条件判断区分取值
// 如果各属性名称相同, 则不用修改
const {
toElsAccount = "",
supplierName = "",
supplierCode = "",
} = data[0] || {};
row.toElsAccount = toElsAccount;
row.supplierName = supplierName;
row.supplierCode = supplierCode;
}
}
js
{
modalColumns: [
{
field: "toElsAccount",
title: "供应商ELS账号",
fieldLabelI18nKey: "i18n_title_supplierELSAccount",
with: 150
},
{
field: "supplierName",
title: "供应商名称",
fieldLabelI18nKey: "i18n_field_supplierName",
with: 150
},
{
field: "supplierCode",
title: "供应商ERP编码",
fieldLabelI18nKey: "i18n_field_supplierCode",
with: 150
}
],
modalUrl: "/supplier/supplierMaster/list",
selectModal: 'single',
params: {},
mobileModalParams: {},
handleAfter({ pageData, row }) {
row.toElsAccount = '';
row.supplierName = '';
row.supplierCode = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_row.toElsAccount = '';
_row.supplierName = '';
_row.supplierCode = '';
},
}
tex
groupCode: 'purchaseQuotaProtocolItemList',
title: '对方ELS账号',
fieldLabelI18nKey: 'i18n_field_toElsAccount',
fieldType: 'remoteSelect',
field: 'toElsAccount',
评分人scorer
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
userInfo,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
Decimal,
}
) {
if (data && data.length) {
// 填充操作时 _isFill 判断标识值为 true
// 且 data 参数为当前所选行缓存数据
// 如果赋值操作中字段属性不同, 需要加条件判断区分取值
// 如果各属性名称相同, 则不用修改
if (_isFill) {
const { scorer = "" } = data[0] || {};
row.scorer = scorer;
} else {
const { subAccount = "", realname = "" } = data[0] || {};
row.scorer = subAccount + "_" + realname;
}
}
}
js
field: "subAccount",
title: "账号",
fieldLabelI18nKey: "i18n_field_subAccount",
with: 150,
},
{
field: "realname",
title: "名称",
fieldLabelI18nKey: "i18n_field_realname",
with: 150,
},
],
modalUrl: "/account/elsSubAccount/page",
selectModal: 'single',
params: { status: 1 },
mobileModalParams: { status: 1 },
handleAfter({ pageData, row }) {
row.scorer = '';
},
mobileHandleAfter (Vue, { _pageData, _form, _row, _cacheAllData, _value }) {
_row.scorer = '';
},
}
tex
groupCode: 'purchaseStandardItemList',
title: '评分人',
fieldLabelI18nKey: 'i18n_field_scorer',
fieldType: 'remoteSelect',
field: 'scorer',
align: '',
headerAlign: 'center',
dataFormat: '',
内置方法说明
vue
<script lang="ts">
/**
* @description: 遍历模板分组配置,自定义格式化查询到的字段
* @param {string} groupCode 分组编码
* @param {string} fieldName 字段编码
* @param {Function} fn 自定义设置字段配置
* @param {Array} exclude 需要排除的字段, 如状态值等
* @return {*}
*/
const customFormatItem: CustomFormatItem = (
groupCode,
fieldName,
fn,
exclude = []
) => {
if (!groupCode || !fieldName) {
return;
}
layoutConfig.value.groups.forEach((group) => {
if (group.groupCode === groupCode) {
if (group.groupType === "head") {
// 表头配置
group.formFields.forEach((n) => {
// '***'表示设置整个分组的所有字段
if (
(fieldName === "***" && !exclude.includes(n.fieldName)) ||
n.fieldName === fieldName
) {
fn && fn(n);
}
});
} else {
// 表行配置
group.columns.forEach((n) => {
// '***'表示设置整个分组的所有字段
if (
(fieldName === "***" && !exclude.includes(n.field)) ||
n.field === fieldName
) {
fn && fn(n);
}
});
}
}
});
};
/**
* @description: 自定义设置字段必填
* @param {string} groupCode 分组编码
* @param {string} fieldName 字段编码
* @param {boolean} flag 布尔值
* @param {Array} exclude 需要排除的字段, 如状态值等
* @return {*}
*/
const setItemRequired: SetItemRequired = (
groupCode,
fieldName,
flag,
exclude
) => {
customFormatItem(
groupCode,
fieldName,
function fn(item) {
item.required = flag ? "1" : "0";
},
exclude
);
};
/**
* @description: 自定义设置字段置灰
* @param {string} groupCode 分组编码
* @param {string} fieldName 字段编码
* @param {boolean} flag 布尔值
* @return {*}
*/
const setItemDisabled: SetItemDisabled = (
groupCode,
fieldName,
flag,
exclude
) => {
customFormatItem(
groupCode,
fieldName,
function fn(item) {
item.disabled = !!flag;
},
exclude
);
};
/**
* @description: 自定义设置字段必填 + 置灰
* @param {string} groupCode 分组编码
* @param {string} fieldName 字段编码
* @param {boolean} flag 布尔值
* @param {Array} exclude 需要排除的字段, 如状态值等
* @return {*}
*/
const setItemRequiredOrDisabled: SetItemRequiredOrDisabled = (
groupCode,
fieldName,
flag,
exclude
) => {
customFormatItem(
groupCode,
fieldName,
function fn(item) {
if (flag) {
item.required = "1";
item.disabled = false;
} else {
item.required = "0";
item.disabled = true;
}
},
exclude
);
};
</script>
字段置灰设置
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
// 竞价范围 ebiddingScope;
// 数据字典 srmEbiddingScope (0: 邀请竞价,1: 公开竞价)
/**
* @description: 业务规则
* 邀请竞价时,供应商资格要求、报名截止时间不可编辑, 否则取反
* @return {*}
*/
setItemDisabled("baseForm", "supllierQualification", value === "0");
setItemDisabled("baseForm", "publicScope", value === "0");
}
tex
fieldType: 'select',
fieldLabel: '竞价范围',
fieldName: 'ebiddingScope',
dictCode: 'srmEbiddingScope',
required: '1',
字段必填设置
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
/**
* @description: 业务规则
* 供应商税率为'是', '需要应标'必填, 否则置灰
* @return {*}
*/
setItemRequired("baseForm", "needEcho", value === "1");
}
tex
fieldType: 'switch',
fieldLabel: '供应商税率',
fieldName: 'supplierTaxRate',
defaultValue: '1',
字段必填 + 置灰设置
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
// 竞价方式 ebiddingMethod;
// 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
// 报价方式 ebiddingWay;
// 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
// 数据字典 srmEbiddingWayFilter (0: 打包, 1: 逐条);
const ebiddingMethod = pageData.ebiddingMethod || "";
// 竞价方式: 英式
const ebiddingMethodZero = ebiddingMethod === "0";
const ebiddingWay = pageData.ebiddingWay || "";
// 报价方式: 逐条
const ebiddingWayOne = ebiddingWay === "1";
/**
* @description: 业务规则
* 英式竞价 + 报价方式为'逐条'时,'时间间隔(分钟)'必填,否则置灰
* @return {*}
*/
setItemRequiredOrDisabled(
"baseForm",
"intervalMinute",
ebiddingMethodZero && ebiddingWayOne
);
}
tex
fieldType: 'select',
fieldLabel: '竞价方式',
fieldName: 'ebiddingMethod',
dictCode: 'srmEbiddingMethod',
required:'1',
动态设置字段数据字典 dictCode
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
/**
* @description: 业务规则
* 竞价方式为'英式'时, 报价方式无限制;
* 阶段类型为'邀请竞价'时,表行'附件需求清单', 阶段类型数据字典为'srmEbidding4StageType'
* 否则设置为 srmEbiddingStageType
* 数据字典 srmEbidding4StageType (4: 应标阶段);
* 数据字典 srmEbiddingStageType (1: 报名阶段, 4: 应标阶段);
*/
customFormatItem(
"purchaseAttachmentDemandList",
"stageType",
function fn(item) {
item.dictCode =
value === "1" ? "srmEbiddingStageType" : "srmEbidding4StageType";
}
);
}
tex
fieldType: 'select',
fieldLabel: '竞价范围',
fieldLabelI18nKey: 'i18n_field_ebiddingScope',
fieldName: 'ebiddingScope',
dictCode: 'srmEbiddingScope',
defaultValue: '',
字段自定义设置 + 数据赋值
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
// 竞价方式 ebiddingMethod;
// 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
// 报价方式 ebiddingWay;
// 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
// 数据字典 srmEbiddingWayFilter (0: 打包, 1: 逐条);
const ebiddingMethod = pageData.ebiddingMethod || "";
const ebiddingWay = pageData.ebiddingWay || "";
/**
* @description: 业务规则
* 竞价方式为'英式'时, 报价方式无限制;
* 竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中批量, 且修改数据字典;
*/
function customRule() {
const flag =
ebiddingMethod &&
ebiddingMethod !== "0" &&
ebiddingWay &&
ebiddingWay === "2";
if (flag) {
pageData.ebiddingWay = "";
console.warn(
"竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中'批量'"
);
}
customFormatItem("baseForm", "ebiddingWay", function fn(item) {
item.dictCode = flag ? "srmEbiddingWayFilter" : "srmEbiddingWay";
});
}
customRule();
}
tex
fieldType: 'select',
fieldLabel: '竞价方式',
fieldName: 'ebiddingMethod',
dictCode: 'srmEbiddingMethod',
required:'1',
只作用于供应方端的绑定函数
TIP
通过 handleAfterRemoteConfig 自定义配置供应方端绑定函数来处理
vue
<script setup lang="ts">
const handleAfterRemoteConfig = (config) => {
const formFields = config.formFields || [];
formFields.forEach((n) => {
if (n.fieldName === "supplierTaxRate") {
n.callback = function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
/**
* @description: 业务规则
* 供应商税率为'是', 供应方竞价行信息中税码、税率允许修改
* @return {*}
*/
const flag = value !== "1";
setItemDisabled("baseForm", "taxCode", flag);
setItemDisabled("purchaseEbiddingItemList", "taxCode", flag);
};
}
});
return config; // 返回处理后的配置数据, 可以是 promise 对象
};
// 配置
const options = reactive<Partial<GlobalPageLayoutTypes.EditPageLayoutProps>>({
handleAfterRemoteConfig,
});
</script>
表单字段赋值联动,动态切换列显示或隐藏
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
}
) {
/**
* @description: 业务规则
* 动态切换列显示或隐藏
*/
function customRule() {
const flag = pageData.xxx === "1";
if (flag) {
console.warn("提示xxx xxx xxx");
}
customFormatItem("分组groupCode", "字段fieldName", function fn(item) {
// 缓存字段类型
if (!item._fieldType) {
item._fieldType = "";
}
if (flag) {
item._fieldType = item.fieldType;
item.fieldType = "hiddenField";
} else {
if (item._fieldType) {
item.fieldType = item._fieldType;
item._fieldType = "";
}
}
});
}
customRule();
}
计算未税单价及保留 4 位小数(精度计算需求)
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
}
) {
const { taxCode = "", taxRate = "" } = data[0] || {};
pageData.taxCode = taxCode;
pageData.taxRate = taxRate;
// 税率 taxRate;
let taxRate = pageData.taxRate || "";
// 含税单价 price;
let price = pageData.price || "";
// 小数位数
const DIGIT = 4;
// 计算未税单价 netPrice
if (taxRate && price) {
if (Decimal) {
let formula = Decimal.add(1, Decimal.div(taxRate, 100));
let netPrice = Decimal.div(price, formula);
// 4位小数
pageData.netPrice = new Decimal(netPrice).toFixed(DIGIT);
}
}
}
tex
fieldType: 'selectModal',
fieldLabel: '税码',
fieldLabelI18nKey: 'i18n_title_enterTaxCode',
fieldName: 'taxCode',
dictCode: '',
defaultValue: '',
表行动态计算含税单价或未税单价及保留 4 位小数(精度计算需求)
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
}
) {
// 小数位数
const DIGIT = 4;
// 税率 taxRate;
const taxRate = row.taxRate || "0";
// 报价项 quoteType
// 数据字典 srmQuoteType (0: 含税价, 1: 不含税价)
const quoteType = pageData.quoteType || "0";
let formula = Decimal.add(1, Decimal.div(taxRate, 100));
const requireQuantity = row.requireQuantity || "";
if (Decimal) {
// 计算当前行未税单价 netPrice
if (quoteType === "0") {
// 含税单价 price;
const price = row.price || "";
if (taxRate && price) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (requireQuantity) {
let taxAmount = Decimal.mul(price, requireQuantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
} else {
// 计算当前行含税单价 price
// 未税单价 netPrice;
const netPrice = row.netPrice || "";
if (netPrice && taxRate) {
let price = Decimal.mul(netPrice, formula);
// 4位小数
row.price = new Decimal(price).toFixed(DIGIT);
if (requireQuantity) {
let netAmount = Decimal.mul(netPrice, requireQuantity);
let taxAmount = Decimal.mul(netAmount, formula);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
}
}
}
}
}
tex
groupCode: 'purchaseEbiddingItemList',
title: '含税价',
fieldLabelI18nKey: 'i18n_field_price',
fieldType: 'number',
field: 'price',
align: 'left',
headerAlign: 'center',
dataFormat: '',
defaultValue: '',
表行精度计算,根据报价项 quoteType 计算单价及总价
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
}
) {
if (data && data.length) {
let { taxCode = "", taxRate = "0" } = data[0] || {};
row.taxCode = taxCode;
row.taxRate = taxRate;
}
const DIGIT = 4;
// 税率 taxRate;
const taxRate = row.taxRate || "0";
// 报价项 quoteType;
// 数据字典 srmQuoteType (0: 含税价, 1: 不含税价);
const quoteType = pageData.quoteType || "0";
const formula = Decimal.add(1, Decimal.div(taxRate, 100));
const requireQuantity = row.requireQuantity || "";
// 根据含税价 price, 实时计算未税单价
if (quoteType === "0") {
const price = row.price || "";
if (price && taxRate) {
let netPrice = Decimal.div(price, formula);
// 4位小数
row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
if (requireQuantity) {
let taxAmount = Decimal.mul(price, requireQuantity);
let netAmount = Decimal.div(taxAmount, formula);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
}
}
} else {
// 根据未税单价价 netPrice, 实时计算含税价
const netPrice = row.netPrice || "";
if (netPrice && taxRate) {
let price = Decimal.mul(netPrice, formula);
// 4位小数
row.price = new Decimal(price).toFixed(DIGIT);
if (requireQuantity) {
let netAmount = Decimal.mul(netPrice, requireQuantity);
let taxAmount = Decimal.mul(netAmount, formula);
row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
}
}
}
}
js
{
modalColumns: [{
field: 'taxCode',
title: '税码',
fieldLabelI18nKey: 'i18n_field_taxCode',
with: 150,
}, {
field: 'taxRate',
title: '税率(%)',
fieldLabelI18nKey: 'i18n_field_fIWWW_f03b2eb3',
with: 150,
}, {
field: 'taxName',
title: '税码名称',
fieldLabelI18nKey: 'i18n_field_taxName',
with: 150,
}, {
field: 'remark',
title: '备注',
fieldLabelI18nKey: 'i18n_field_remark',
with: 150,
}],
modalUrl: '/base/tax/queryTaxForTemplate',
params: {},
selectModel: "single",
handleAfter({ pageData, row }) {
row.taxCode = '';
row.taxRate = '';
}
}
tex
groupCode: 'purchaseBiddingItemList',
title: srmI18n('i18n_title_enterTaxCode', '税码'),
field: 'taxCode',
fieldType: 'selectModal',
width: 150,
优雅处理复杂需求
WARNING
一些复杂的需求,如某个字段的值修改后,需要发请求,获取接口数据,重新赋值表行信息等;这类的需求,配合绑定函数,统一在模板页面中处理;
🙌 🌰 采购协同 > 质量协同 > 8D 改进
示例 DEMO:采购协同 > 质量协同 > 8D 改进 业务模板配置
purchase_eightDisciplines_TC2022052404_1
txt
需求:编辑模板在重新选择 对方 ELS 账号 下拉选项值后,需要组装参数发请求获取用户信息并重新赋值给“D1:小组成立”表行列数据
分解操作
1. 绑定函数内调用 topEmit 派发事件
2. 编辑模板监听绑定函数事件
3. 在本地处理复杂需求逻辑代码
tex
groupCode: "baseForm",
sortOrder: "13",
fieldType: "remoteSelect",
fieldLabel: "对方ELS账号",
fieldLabelI18nKey: "i18n_field_toElsAccount",
fieldName: "toElsAccount",
dictCode: "",
defaultValue: "",
js
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} userInfo 当前登录人信息
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {() => void}
* topEmit 用于处理复杂绑定函数需求
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
topEmit,
}
) {
const {
toElsAccount = "",
supplierCode = "",
supplierName = "",
} = data[0] || {};
pageData.toElsAccount = toElsAccount;
pageData.supplierCode = supplierCode;
pageData.supplierName = supplierName;
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}
vue
<template>
<div class="edit-page">
<a-spin :spinning="loading">
<!-- 注意: 表头,如 toElsAccount 字段绑定函数调用 topEmit 方法后,监听的事件名为 **`${fieldName}_callback`**, 表行,如 planPerson 字段绑定函数调用 topEmit 方法后,监听的事件名为 **`${field}_vxe_callback`** -->
<q-edit-page-layout
ref="layoutRef"
v-bind="options"
@toElsAccount_callback="handleToElsAccountCallback"
@planPerson_vxe_callback="handlePlanPersonVxeCallback"
@reject="handleReject"
></q-edit-page-layout>
</a-spin>
</div>
</template>
<script setup lang="ts">
// 本地处理复杂需求逻辑
// 缓存 对方ELS账号
const cacheToElsAccount = ref<string>("");
// 对方ELS账号 复杂绑定函数
const handleToElsAccountCallback: (
config: GlobalPageLayoutTypes.BindFunctionEvent
) => void = ({ data }) => {
if (!data) {
return;
}
const { toElsAccount = "" } = data[0] || {};
// 如果缓存没有修改
if (!toElsAccount || cacheToElsAccount.value === toElsAccount) {
return;
}
cacheToElsAccount.value = toElsAccount as string;
const url = "/account/elsSubAccount/querySubAccount";
const params = {
elsAccount: cacheToElsAccount.value,
subAccount: "1001",
};
loading.value = true;
Request.get({ url, params })
.then((res) => {
if (res.success) {
Message.success("D1: 小组成立供执行方等账号信息已更新");
}
const result = res.result as GlobalPageLayoutTypes.RecordString;
// D1:小组成立 表行数据
const tableData = pageData.value[
"eightDisciplinesTeamList"
] as GlobalPageLayoutTypes.RecordString[];
tableData.forEach((n) => {
if (n.reportFlowStep !== "D8") {
n.toElsAccount = cacheToElsAccount.value;
n.subAccount = "1001";
n.phone = result.phone;
n.mail = result.email;
n.name = result.realname;
n.teamRole = "member";
}
});
})
.finally(() => {
loading.value = false;
});
};
</script>
处理复杂动态实时计算需求
🙌 🌰 采购协同 > 寻源协同 > 核价标准
vue
<template>
<div class="edit-page">
<q-edit-page-layout
ref="layoutRef"
v-bind="options"
@taxCode_callback="handleTaxCodeCallback"
@rateBase_vxe_callback="handleRateBaseVxeCallback"
@quantity_vxe_callback="handleQuantityVxeCallback"
></q-edit-page-layout>
</div>
</template>
<script setup lang="ts">
// 税码 处理复杂绑定函数
const handleTaxCodeCallback: () => void = () => {
const materialCostPrice = (pageData.value.materialCostPrice as string) || "0";
const processPrice = (pageData.value.processPrice as string) || "0";
const otherPrice = (pageData.value.otherPrice as string) || "0";
const taxRate = (pageData.value.taxRate as string) || "";
if (!taxRate) {
return;
}
// 计算未税价 netPrice
// 未税材料成本+未税加工成本+未税其他费用
// 同时计算含税单价 未税单价*(1+税率)
let netPrice = Decimal.add(
materialCostPrice,
Decimal.add(processPrice, otherPrice)
);
let formula = Decimal.add(1, Decimal.div(taxRate, 100));
let price = Decimal.mul(netPrice, formula);
pageData.value.netPrice = new Decimal(netPrice).toFixed(DIGIT);
pageData.value.price = new Decimal(price).toFixed(DIGIT);
};
// 费用基数 其他费用表行 处理复杂绑定函数
const handleRateBaseVxeCallback: (
config: GlobalPageLayoutTypes.VxeBindFunctionEvent
) => void = (config) => {
console.log("config :>> ", config);
const { groupCode, value, idx } = config;
if (!value || !Decimal) {
return;
}
const tableData = pageData.value[
groupCode
] as GlobalPageLayoutTypes.RecordString[];
const row = tableData[idx];
// 其他费用
// purchaseManagementClassifyItemList
// coefficientValue 系数值(%)
// 计算表行 未税费用金额 totalNetAmount
if (row.coefficientValue) {
const totalNetAmount = Decimal.mul(
value,
Decimal.div(row.coefficientValue as string, 100)
);
row.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}
// 加工成本计算规则
// 动态计算 表头 未税其他费用 otherPrice
// 根据其他费用,=sum(明细未税费用金额之和)
if (groupCode === "purchaseManagementClassifyItemList") {
let otherPrice = tableData.reduce((acc, row) => {
return Decimal.add(acc, row.totalNetAmount as string);
}, new Decimal(0));
pageData.value.otherPrice = new Decimal(otherPrice).toFixed(DIGIT);
}
const materialCostPrice = (pageData.value.materialCostPrice as string) || "0";
const processPrice = (pageData.value.processPrice as string) || "0";
const otherPrice = (pageData.value.otherPrice as string) || "0";
const taxRate = (pageData.value.taxRate as string) || "";
if (!taxRate) {
return;
}
// 计算未税价 netPrice
// 未税材料成本+未税加工成本+未税其他费用
// 同时计算含税单价 未税单价*(1+税率)
let netPrice = Decimal.add(
materialCostPrice,
Decimal.add(processPrice, otherPrice)
);
let formula = Decimal.add(1, Decimal.div(taxRate, 100));
let price = Decimal.mul(netPrice, formula);
pageData.value.netPrice = new Decimal(netPrice).toFixed(DIGIT);
pageData.value.price = new Decimal(price).toFixed(DIGIT);
};
// 用量 quantity(加工成本表行)处理复杂绑定函数
// 用量 quantity(材料成本表行)处理复杂绑定函数
const handleQuantityVxeCallback: (
config: GlobalPageLayoutTypes.VxeBindFunctionEvent
) => void = (config) => {
console.log("config :>> ", config);
const { groupCode, value } = config;
if (!value || !Decimal) {
return;
}
const tableData = pageData.value[
groupCode
] as GlobalPageLayoutTypes.RecordString[];
// const row = tableData[idx]
// 材料成本分组
// purchasePriceEvaluationItemList
// 加工成本
// purchaseProcessingProcedurePriceItemList
// 费用基数 rateBase;
// 加工成本计算规则
// 动态计算 表头 未税加工成本 processPrice
// 根据加工成本明细合计生成,=sum(明细未税单价/价格基数*用量)
if (groupCode === "purchaseProcessingProcedurePriceItemList") {
let processPrice = tableData.reduce((acc, row) => {
// 价格基数 netPrice
let netPrice = (row.netPrice as string) || "";
let priceBase = (row.priceBase as string) || "";
let quantity = (row.quantity as string) || "";
if (netPrice && priceBase && quantity) {
const countPrice = Decimal.mul(
quantity,
Decimal.div(netPrice, priceBase)
);
acc = Decimal.add(acc, countPrice);
}
return acc;
}, new Decimal(0));
pageData.value.processPrice = new Decimal(processPrice).toFixed(DIGIT);
}
// 材料成本分组计算规则
// 动态计算 表头 未税材料成本 materialCostPrice
// 根据材料成本明细合计生成,=sum(明细未税单价/价格基数*用量)
if (groupCode === "purchasePriceEvaluationItemList") {
let materialCostPrice = tableData.reduce((acc, row) => {
// 价格基数 netPrice
let netPrice = (row.netPrice as string) || "";
let priceBase = (row.priceBase as string) || "";
let quantity = (row.quantity as string) || "";
if (netPrice && priceBase && quantity) {
const countPrice = Decimal.mul(
quantity,
Decimal.div(netPrice, priceBase)
);
acc = Decimal.add(acc, countPrice);
}
return acc;
}, new Decimal(0));
pageData.value.materialCostPrice = new Decimal(materialCostPrice).toFixed(
DIGIT
);
}
const materialCostPrice = (pageData.value.materialCostPrice as string) || "0";
const processPrice = (pageData.value.processPrice as string) || "0";
const otherPrice = (pageData.value.otherPrice as string) || "0";
const taxRate = (pageData.value.taxRate as string) || "";
if (!taxRate) {
return;
}
// 计算未税价 netPrice
// 未税材料成本+未税加工成本+未税其他费用
// 同时计算含税单价 未税单价*(1+税率)
let netPrice = Decimal.add(
materialCostPrice,
Decimal.add(processPrice, otherPrice)
);
let formula = Decimal.add(1, Decimal.div(taxRate, 100));
let price = Decimal.mul(netPrice, formula);
pageData.value.netPrice = new Decimal(netPrice).toFixed(DIGIT);
pageData.value.price = new Decimal(price).toFixed(DIGIT);
};
</script>
js
// groupCode: 'baseForm',
// sortOrder: '17',
// fieldType: 'remoteSelect',
// fieldLabel: '税码',
// fieldLabelI18nKey: 'i18n_title_enterTaxCode',
// fieldName: 'taxCode',
// dictCode: '',
// defaultValue: '',
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
data,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
}
) {
const { taxCode = "", taxRate = "" } = data[0] || {};
pageData.taxCode = taxCode;
pageData.taxRate = taxRate;
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}
js
// groupCode: 'purchaseManagementClassifyItemList',
// title: '费用基数',
// fieldLabelI18nKey: 'i18n_field_ujtW_41f51405',
// field: 'rateBase',
// align: 'center',
// headerAlign: 'center',
// dataFormat: '',
// defaultValue: '',
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
topEmit,
}
) {
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}
js
// groupCode: 'purchaseProcessingProcedurePriceItemList',
// title: '用量',
// fieldLabelI18nKey: 'i18n_field_jR_ec1a7',
// field: 'quantity',
// align: 'center',
// headerAlign: 'center',
// dataFormat: '',
// defaultValue: '',
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
topEmit,
}
) {
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}
js
// groupCode: 'purchasePriceEvaluationItemList',
// title: '用量',
// fieldLabelI18nKey: 'i18n_field_jR_ec1a7',
// fieldType: 'number',
// field: 'quantity',
// align: '',
// headerAlign: 'center',
// dataFormat: '',
// defaultValue: '0',
/**
* @param {Object} ctx 组件实例
* @param {String} value 当前所选值
* @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
* @param {boolean} _isFill 填充、粘贴操作判断标识
* @param {Object} pageData 页面所有数据
* @param {Object} layoutConfig 模板配置
* @param {Object} row 表行数据 (如有)
* @param {number} idx 表行索引值 (如有)
* @param {(groupCode: string, fieldName: string, fn: (item: FormFieldsItem | ColumnItem) => void) => void}
* customFormatItem 遍历模板分组配置,自定义格式化查询到的字段
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequired 自定义设置字段必填
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemDisabled 自定义设置字段置灰
* @param {(groupCode: string, fieldName: string, flag: boolean) => void}
* setItemRequiredOrDisabled 自定义设置字段必填/置灰
* @param {Constructor} Decimal构造函数, 适用于js小数位数精度计算
* https://github.com/MikeMcl/decimal.js
*/
function callback(
ctx,
{
value,
_isFill,
data,
row,
idx,
pageData,
layoutConfig,
customFormatItem,
setItemRequired,
setItemDisabled,
setItemRequiredOrDisabled,
Decimal,
topEmit,
}
) {
// 本地页面处理复杂绑定函数需求
topEmit && topEmit();
}