Skip to content
On this page

绑定函数 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();
}