Skip to content
On this page

采购范式合同管理(框架)

业务模板

合同层级 contractLevels

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "合同层级",
  "fieldName": "contractLevels",
  "dictCode": "srmContractLevels",
  "defaultValue": "master",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  const flag = value === "master";
  setItemDisabled("baseForm", "masterContractNumber", flag);
  setItemDisabled("baseForm", "masterContractName", flag);

  if (flag) {
    pageData.masterContractNumber = "";
    pageData.masterContractName = "";
    pageData.masterContractId = "";
  }
}

主合同号 masterContractNumber

json
{
  "groupCode": "baseForm",
  "fieldType": "selectModal",
  "fieldLabel": "主合同号",
  "fieldName": "masterContractNumber",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { id = "", contractNumber = "", contractName = "" } = data[0] || {};
    pageData.masterContractId = id;
    pageData.masterContractNumber = contractNumber;
    pageData.masterContractName = contractName;
    // 本地页面处理复杂绑定函数需求
    topEmit && topEmit();
  }
}
js
{
  modalColumns: [
    {
      field: "contractNumber",
      title: "合同单号",
      fieldLabelI18nKey: "i18n_field_masterContractNumber ",
      with: 150,
    },
    {
      field: "contractName",
      title: "合同名称",
      fieldLabelI18nKey: "i18n_field_masterContractName",
      with: 150,
    },
    {
      field: "contractDesc",
      title: "合同描述",
      fieldLabelI18nKey: "i18n_field_contractDesc",
      with: 150,
    },
    {
      field: "contractType_dictText",
      title: "合同类型",
      fieldLabelI18nKey: "i18n_field_contractType",
      with: 150,
    },
  ],
  modalUrl: "/contract/purchaseContractHead/list",
  selectModel: "single",
  params({ pageData }) {
    return {
      superQueryParams:
        "%5B%7B%22logicSymbol%22:%22in%22,%22fieldCode%22:%22contractStatus%22,%22fieldType%22:%22input%22,%22dictCode%22:%22%22,%22fieldValue%22:%223,6%22,%22joiner%22:%22AND%22%7D,%7B%22logicSymbol%22:%22eq%22,%22fieldCode%22:%22contractLevels%22,%22fieldType%22:%22input%22,%22dictCode%22:null,%22fieldValue%22:%22master%22,%22joiner%22:%22AND%22%7D%5D",
      superQueryMatchType: "AND",
    };
  },
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {
    return {
      superQueryParams:
        "%5B%7B%22logicSymbol%22:%22in%22,%22fieldCode%22:%22contractStatus%22,%22fieldType%22:%22input%22,%22dictCode%22:%22%22,%22fieldValue%22:%223,6%22,%22joiner%22:%22AND%22%7D,%7B%22logicSymbol%22:%22eq%22,%22fieldCode%22:%22contractLevels%22,%22fieldType%22:%22input%22,%22dictCode%22:null,%22fieldValue%22:%22master%22,%22joiner%22:%22AND%22%7D%5D",
      superQueryMatchType: "AND",
    };
  },
  handleAfter: ({ pageData }) => {
    pageData.masterContractId = "";
    pageData.masterContractNumber = "";
    pageData.masterContractName = "";
  },
}

补录标识 supplement

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "补录标识",
  "fieldName": "supplement",
  "dictCode": "yn",
  "defaultValue": "0",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  const flag = value === "1";
  setItemDisabled("baseForm", "sign", flag);
  pageData.sign = value === "1" ? "0" : pageData.sign;
  // 是否属于先执行后签合同 控制 先执行后签合同申请流程号 是否必填
  // setItemRequired("baseForm", "processNumber", flag);
}

合同模板编码 contractTemplateNumber

json
{
  "groupCode": "baseForm",
  "fieldType": "selectModal",
  "fieldLabel": "合同模板编码",
  "fieldName": "contractTemplateNumber",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const {
      contractTemplateNumber = "",
      contractTemplateName = "",
      contractTemplateVersion = "",
      company = "",
      purchaseGroup = "",
      purchaseOrg = "",
    } = data[0] || {};
    pageData.contractTemplateNumber = contractTemplateNumber;
    pageData.contractTemplateName = contractTemplateName;
    pageData.contractTemplateVersion = contractTemplateVersion;
    pageData.company = company;
    pageData.purchaseGroup = purchaseGroup;
    pageData.purchaseOrg = purchaseOrg;
    // 本地页面处理复杂绑定函数需求
    topEmit && topEmit();
  }
}
js
{
  selectModal: "single",
  modalColumns: [
    {
      field: "contractTemplateNumber",
      fieldLabelI18nKey: "i18n_field_contractTemplateNumber",
      title: "合同模板编码",
      with: 150,
    },
    {
      field: "contractTemplateName",
      fieldLabelI18nKey: "i18n_field_contractTemplateName",
      title: "合同模板名称",
      with: 150,
    },
    {
      field: "contractTemplateVersion",
      fieldLabelI18nKey: "i18n_field_contractTemplateVersion",
      title: "合同模板版本",
      with: 150,
    },
    {
      field: "templateDesc",
      fieldLabelI18nKey: "i18n_field_templateDesc",
      title: "模板描述",
      with: 150,
    },
    {
      field: "templateType_dictText",
      fieldLabelI18nKey: "i18n_field_templateType",
      title: "模板类型",
      with: 150,
    },
    {
      field: "templateStatus_dictText",
      fieldLabelI18nKey: "i18n_field_templateStatus",
      title: "模板状态",
      with: 150,
    },
  ],
  modalUrl: "/contract/purchaseContractTemplateHead/list",
  params: () => {
    return {
      auditStatus: "2",
      templateStatus: "1",
      order: "desc",
      column: "id",
    };
  },
  handleAfter: ({ pageData }) => {
    pageData.contractTemplateNumber = "";
    pageData.contractTemplateName = "";
    pageData.contractTemplateVersion = "";
    pageData.company = "";
    pageData.purchaseGroup = "";
    pageData.purchaseOrg = "";
    pageData.purchaseContractContentItemList = [];
  },
}

是否显示合同里程碑 showCustom1

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "是否显示合同里程碑",
  "fieldName": "showCustom1",
  "defaultValue": "1",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (layoutConfig && layoutConfig.groups && layoutConfig.groups.length) {
    for (let grp of layoutConfig.groups) {
      if (grp.groupCode == "contractItemCustom1List") {
        console.log("grp", grp);
        grp.show = value == "1" ? true : false;
      }
    }
  }
}

签订地址 contractSignAddress

json
{
  "groupCode": "busRule",
  "fieldType": "input",
  "fieldLabel": "签订地址",
  "fieldName": "contractSignAddress",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  pageData.address = value;
}

签订日期 contractSignDate

json
{
  "groupCode": "busRule",
  "fieldType": "date",
  "fieldLabel": "签订日期",
  "fieldName": "contractSignDate",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  pageData.effectiveDate = value;
}

对方 ELS 账号 toElsAccount

json
{
  "groupCode": "personFrom",
  "fieldType": "remoteSelect",
  "fieldLabel": "对方ELS账号",
  "fieldName": "toElsAccount",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const {
      toElsAccount = "",
      supplierCode = "",
      supplierName = "",
    } = data[0] || {};
    pageData.toElsAccount = toElsAccount;
    pageData.supplierCode = supplierCode;
    pageData.supplierName = supplierName;
    pageData.invoicedElsAccount = toElsAccount;
    pageData.invoicedErpCode = supplierCode;
    pageData.invoicedName = supplierName;
    //履约方编码
    pageData.performingPartyElsAccount = toElsAccount;
    pageData.performingPartyCode = supplierCode;
    //履约方名称
    pageData.performingPartyName = supplierName;
    pageData.payeeElsAccount = toElsAccount;
    pageData.payeeErpCode = supplierCode;
    pageData.payeeName = supplierName;
    //销售负责人 供应商联系人新增中职能含订单的联系人
  }
  // 本地页面处理复杂绑定函数需求
  topEmit && topEmit();
}
js
{
  modalColumns: [
    {
      field: "toElsAccount",
      title: "供应商账号",
      fieldLabelI18nKey: "i18n_title_supplierAccount",
      width: 150,
    },
    {
      field: "supplierName",
      title: "供应商名称",
      fieldLabelI18nKey: "i18n_field_supplierName",
      width: 150,
    },
    {
      field: "supplierCode",
      title: "供应商编码",
      fieldLabelI18nKey: "i18n_field_toCompanyCode",
      width: 150,
    },
    {
      field: "bankBranchName",
      title: "开户行全称",
      fieldLabelI18nKey: "",
      width: 150,
    },
    {
      field: "bankAccount",
      title: "银行账号",
      fieldLabelI18nKey: "",
      width: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  selectModal: "single",
  params({ pageData }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: pageData?.purchaseOrg || "",
    };
  },
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: _cacheAllData.purchaseOrg,
    };
  },
  handleAfter({ pageData }) {
    pageData.toElsAccount = "";
    pageData.supplierCode = "";
    pageData.supplierName = "";
    pageData.performingPartyElsAccount = "";
    pageData.invoicedElsAccount = "";
    pageData.payeeElsAccount = "";
    pageData.invoicedErpCode = "";
    pageData.invoicedName = "";
    pageData.payeeErpCode = "";
    pageData.payeeName = "";
    pageData.performingPartyCode = "";
    pageData.performingPartyName = "";
    pageData.bankBranchName = "";
    pageData.bankAccount = "";
    pageData.paymentCondition = "";
    pageData.paymentType = "";
    pageData.purchasePrincipal = "";
  },
}

销售负责人 salePrincipal

json
{
  "groupCode": "personFrom",
  "fieldType": "selectModal",
  "fieldLabel": "销售负责人",
  "fieldName": "salePrincipal",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { realname = "", email = "", phone = "" } = data[0] || {};
    pageData.salePrincipal = realname;
    pageData.supplierMail = email;
    pageData.supplierPhone = phone;
  }
}
js
{
  modalColumns: [
    {
      field: "post",
      title: "职位",
      fieldLabelI18nKey: "i18n_title_position",
      with: 150,
    },
    {
      field: "realname",
      title: "名字",
      fieldLabelI18nKey: "i18n_field_RJ_a88ea",
      with: 150,
    },
    {
      field: "phone",
      title: "电话",
      fieldLabelI18nKey: "i18n_field_telephone",
      with: 150,
    },
    {
      field: "email",
      title: "邮箱",
      fieldLabelI18nKey: "i18n_field_email",
      with: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/getContract",
  selectModel: "single",
  params({ pageData }) {
    return {
      elsAccount: pageData.toElsAccount || "",
      toElsAccount: pageData.elsAccount || "",
    };
  },
  mobileModalParams(Vue) {
    return {
      elsAccount: Vue.vuex_userInfo.elsAccount,
      toElsAccount: Vue.vuex_userInfo.elsAccount,
    };
  },
  handleAfter: ({ pageData }) => {
    pageData.salePrincipal = "";
    pageData.supplierMail = "";
    pageData.supplierPhone = "";
  },
}

供应商地址 supplierAddress

json
{
  "groupCode": "personFrom",
  "fieldType": "selectModal",
  "fieldLabel": "供应商地址",
  "fieldName": "supplierAddress",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { address } = data[0] || {};
    pageData.supplierAddress = address;
  }
}
js
{
  modalColumns: [
    {
      field: "country",
      title: "国家",
      with: 150,
    },
    {
      field: "province",
      title: "省份",
      with: 150,
    },
    {
      field: "city",
      title: "城市",
      with: 150,
    },
    {
      field: "address",
      title: "详细地址",
      with: 250,
    },
  ],
  modalUrl: "/supplier/supplierMaster/getAddressInfo",
  selectModal: "single",
  params: function ({ pageData }) {
    return {
      elsAccount: pageData.elsAccount || "",
      toElsAccount: pageData.toElsAccount || "",
    };
  },
  handleAfter: ({ pageData }) => {
    pageData.supplierAddress = "";
  },
}

采购负责人 purchasePrincipal

json
{
  "groupCode": "personFrom",
  "fieldType": "remoteSelect",
  "fieldLabel": "采购负责人",
  "fieldName": "purchasePrincipal",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { realname = "", email = "", phone = "" } = data[0] || {};
    pageData.purchasePrincipal = realname;
    pageData.mail = email;
    pageData.phone = phone;
  }
}
js
{
  modalColumns: [
    {
      field: "subAccount",
      title: "子账号",
      fieldLabelI18nKey: "i18n_field_subAccount",
      with: 150,
    },
    {
      field: "realname",
      title: "名字",
      fieldLabelI18nKey: "i18n_field_RJ_a88ea",
      with: 150,
    },
  ],
  modalUrl: "/account/elsSubAccount/page",
  selectModal: "single",
  params({ pageData }) {
    return {
      elsAccount: pageData.elsAccount || "",
      toElsAccount: pageData.elsAccount || "",
    };
  },
  mobileModalParams(Vue) {
    return {
      elsAccount: Vue.vuex_userInfo.elsAccount,
      toElsAccount: Vue.vuex_userInfo.elsAccount,
    };
  },
  handleAfter: ({ pageData }) => {
    pageData.purchasePrincipal = "";
    pageData.mail = "";
    pageData.phone = "";
  },
}

履约方 ELS 账号 performingPartyElsAccount

json
{
  "groupCode": "personFrom",
  "fieldType": "remoteSelect",
  "fieldLabel": "履约方ELS账号",
  "fieldName": "performingPartyElsAccount",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const {
      toElsAccount = "",
      supplierCode = "",
      supplierName = "",
      personPhone = "",
      personEmail = "",
    } = data[0] || {};
    pageData.performingPartyElsAccount = toElsAccount;
    pageData.performingPartyCode = supplierCode;
    pageData.performingPartyName = supplierName;
    pageData.performingPartyPhone = personPhone;
    pageData.performingPartyMail = personEmail;
  }
}
js
{
  modalColumns: [
    {
      field: "toElsAccount",
      title: "履约方账号",
      fieldLabelI18nKey: "i18n_field_IZCey_51232089",
      with: 150,
    },
    {
      field: "supplierName",
      title: "履约方名称",
      fieldLabelI18nKey: "i18n_field_IZCRL_511c5c7b",
      with: 150,
    },
    {
      field: "supplierCode",
      title: "履约方编码",
      fieldLabelI18nKey: "i18n_field_IZCAo_512190a3",
      with: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  selectModel: "single",
  params: ({ pageData, userInfo }) => {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: pageData?.purchaseOrg || "",
    };
  },
  handleAfter: ({ pageData, userInfo }) => {
    pageData.performingPartyElsAccount = "";
    pageData.performingPartyCode = "";
    pageData.performingPartyName = "";
    pageData.performingPartyPhone = "";
    pageData.performingPartyMail = "";
  },
}

开票方 ELS 账号 invoicedElsAccount

json
{
  "groupCode": "personFrom",
  "fieldType": "remoteSelect",
  "fieldLabel": "开票方ELS账号",
  "fieldName": "invoicedElsAccount",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const {
      toElsAccount = "",
      supplierCode = "",
      supplierName = "",
      personPhone = "",
    } = data[0] || {};
    pageData.invoicedElsAccount = toElsAccount;
    pageData.invoicedErpCode = supplierCode;
    pageData.invoicedName = supplierName;
    pageData.invoicedPhone = personPhone;
  }
}
js
{
  modalColumns: [
    {
      field: "toElsAccount",
      title: "开票方账号",
      fieldLabelI18nKey: "i18n_alert_vPCey_737853a2",
      with: 150,
    },
    {
      field: "supplierName",
      title: "开票方名称",
      fieldLabelI18nKey: "i18n_alert_vPCRL_73718f94",
      with: 150,
    },
    {
      field: "supplierCode",
      title: "开票方编码",
      fieldLabelI18nKey: "i18n_alert_vPCAo_7376c3bc",
      with: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  selectModal: "single",
  params({ pageData, userInfo }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: pageData?.purchaseOrg || "",
    };
  },
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: _cacheAllData.purchaseOrg,
    };
  },
  handleAfter({ pageData, userInfo }) {
    pageData.invoicedElsAccount = "";
    pageData.invoicedErpCode = "";
    pageData.invoicedName = "";
    pageData.invoicedPhone = "";
  },
}

收款方 ELS 账号 payeeElsAccount

json
{
  "groupCode": "personFrom",
  "fieldType": "remoteSelect",
  "fieldLabel": "收款方ELS账号",
  "fieldName": "payeeElsAccount",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const {
      toElsAccount = "",
      supplierCode = "",
      supplierName = "",
      personPhone = "",
    } = data[0] || {};
    pageData.payeeElsAccount = toElsAccount;
    pageData.payeeErpCode = supplierCode;
    pageData.payeeName = supplierName;
    pageData.payeePhone = personPhone;
  }
}
js
{
  modalColumns: [
    {
      field: "toElsAccount",
      title: "收款方账号",
      fieldLabelI18nKey: "i18n_field_receiverBankAccount",
      with: 150,
    },
    {
      field: "supplierName",
      title: "收款方名称",
      fieldLabelI18nKey: "i18n_alert_lVCRL_c4874134",
      with: 150,
    },
    {
      field: "supplierCode",
      title: "收款方编码",
      fieldLabelI18nKey: "i18n_alert_lVCAo_c48c755c",
      with: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  selectModal: "single",
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: _cacheAllData.purchaseOrg,
    };
  },
  params({ pageData, userInfo }) {
    return {
      frozenFunctionValue: "3",
      purchaseOrg: pageData.purchaseOrg || "",
    };
  },
  handleAfter({ pageData, userInfo }) {
    pageData.payeeElsAccount = "";
    pageData.payeeErpCode = "";
    pageData.payeeName = "";
    pageData.payeePhone = "";
  },
}

物料分类 cateCode 🎉

json
{
  "groupCode": "purchaseContractItemList",
  "fieldType": "selectModal",
  "title": "物料分类",
  "field": "cateCode",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { cateCode = "", title = "", value = "" } = data[0] || {};
    row.cateCode = cateCode;
    row.cateName = title;
    row.cateLevelCode = value;
  }
}
js
{
  modalColumns: [
    {
      field: "cateCode",
      title: "编码",
      fieldLabelI18nKey: "i18n_field_cateCode",
      treeNode: true,
    },
    {
      field: "title",
      title: "分类名称",
      fieldLabelI18nKey: "i18n_title_classificationName",
      width: 180,
    },
    {
      field: "value",
      title: "分类编码",
      fieldLabelI18nKey: "i18n_title_classificationCode",
      width: 180,
    },
  ],
  selectModal: "single",
  modalUrl: "/material/purchaseMaterialCode/pageMaterialCodeTree",
  params: {
    cateStatus: "1",
  },
  isTree: true,
  treeConfig: {},
  handleAfter({ row }) {
    row.cateCode = "";
    row.cateName = "";
    row.cateLevelCode = "";
  },
}

订单数量 quantity 🎉

json
{
  "groupCode": "purchaseContractItemList",
  "fieldType": "float",
  "title": "订单数量",
  "field": "quantity",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  // 税率 taxRate;
  let taxRate = row.taxRate || "0";
  // 含税单价 price;
  let price = row.price || "";
  // 订单数量 quantity
  let quantity = row.quantity || "";

  const DIGIT = 4;

  if (!Decimal) {
    return;
  }

  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  if (price && taxRate) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      let taxAmount = Decimal.mul(price, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }

    // 动态计算
    // 含税总金额 totalTaxAmount
    // 未税总金额 totalNetAmount
    const purchaseContractItemList = pageData.purchaseContractItemList || [];
    if (purchaseContractItemList.length) {
      let totalTaxAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.taxAmount);
      }, new Decimal(0));

      let totalNetAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.netAmount);
      }, new Decimal(0));

      pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
      pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
    }
  }
}

含税单价 price 🎉

json
{
  "groupCode": "purchaseContractItemList",
  "fieldType": "float",
  "title": "含税单价",
  "field": "price",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  // 税率 taxRate;
  let taxRate = row.taxRate || "0";
  // 含税单价 price;
  let price = row.price || "";
  // 订单数量 quantity
  let quantity = row.quantity || "";

  const DIGIT = 4;

  if (!Decimal) {
    return;
  }

  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  if (price && taxRate) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      let taxAmount = Decimal.mul(price, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }

    // 动态计算
    // 含税总金额 totalTaxAmount
    // 未税总金额 totalNetAmount
    const purchaseContractItemList = pageData.purchaseContractItemList || [];
    if (purchaseContractItemList.length) {
      let totalTaxAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.taxAmount);
      }, new Decimal(0));

      let totalNetAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.netAmount);
      }, new Decimal(0));
      pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
      pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
    }
  }
}

税码 taxCode 🎉

json
{
  "groupCode": "purchaseContractItemList",
  "fieldType": "remoteSelect",
  "title": "税码",
  "field": "taxCode",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  if (data && data.length) {
    const { taxCode = "", taxRate = "" } = data[0] || {};
    row.taxCode = taxCode;
    row.taxRate = taxRate;
  }

  // 税率 taxRate;
  let taxRate = row.taxRate || "0";
  // 含税单价 price;
  let price = row.price || "";
  // 订单数量 quantity
  let quantity = row.quantity || "";

  const DIGIT = 4;

  if (!Decimal) {
    return;
  }

  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  if (price && taxRate) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      let taxAmount = Decimal.mul(price, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }

    // 动态计算
    // 含税总金额 totalTaxAmount
    // 未税总金额 totalNetAmount
    const purchaseContractItemList = pageData.purchaseContractItemList || [];
    if (purchaseContractItemList.length) {
      let totalTaxAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.taxAmount);
      }, new Decimal(0));

      let totalNetAmount = purchaseContractItemList.reduce((acc, item) => {
        return Decimal.add(acc, item.netAmount);
      }, new Decimal(0));
      pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
      pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
    }
  }
}
js
{
  modalColumns: [
    {
      field: "taxCode",
      title: "税码",
      fieldLabelI18nKey: "i18n_title_enterTaxCode",
      with: 150,
    },
    {
      field: "taxRate",
      title: "税率(%)",
      fieldLabelI18nKey: "i18n_field_fIW_1d82c07",
      with: 150,
    },
    {
      field: "taxName",
      title: "税码名称",
      fieldLabelI18nKey: "i18n_field_taxName",
      with: 150,
    },
    {
      field: "remark",
      title: "备注",
      fieldLabelI18nKey: "i18n_field_remark",
      with: 150,
    },
  ],
  modalUrl: "/base/tax/queryTaxForTemplate",
  modalParams: {},
  handleAfter: ({ pageData, row }) => {
    row.taxCode = "";
    row.taxRate = "";
  },
}

履约比例% performanceRatio 🎉

json
{
  "groupCode": "purchaseContractPromiseList",
  "fieldType": "input",
  "title": "履约比例%",
  "field": "performanceRatio",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  let totalTaxAmount = pageData.totalTaxAmount;
  let targetQuantity = pageData.targetQuantity;
  try {
    if (pageData.contractType === "1") {
      if (
        totalTaxAmount &&
        totalTaxAmount !== "0" &&
        row.performanceRatio &&
        row.performanceRatio !== "0"
      ) {
        row.performanceRatio = row.performanceRatio.toFixed(6);
        let temp = Decimal.mul(row.performanceRatio, totalTaxAmount);
        row.amount = Decimal.mul(temp, "0.01");
        row.amount = row.amount.toFixed(6);
      }
    } else if (pageData.contractType === "2") {
      if (
        targetQuantity &&
        targetQuantity !== "0" &&
        row.performanceRatio &&
        row.performanceRatio !== "0"
      ) {
        row.performanceRatio = row.performanceRatio.toFixed(6);
        let temp = Decimal.mul(row.performanceRatio, targetQuantity);
        row.amount = Decimal.mul(temp, "0.01");
        row.amount = row.amount.toFixed(6);
      }
    }
  } catch (f) {
    console.log(f);
  }

  if (row.performanceRatio === "") {
    row.amount = "";
  }
  row.precedence = "2";
}

履约目标值 amount 🎉

json
{
  "groupCode": "purchaseContractPromiseList",
  "fieldType": "input",
  "title": "履约目标值",
  "field": "amount",
  "required": "0"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  let totalTaxAmount = pageData.totalTaxAmount;
  let targetQuantity = pageData.targetQuantity;
  try {
    if (pageData.contractType === "1") {
      if (
        totalTaxAmount &&
        totalTaxAmount !== "0" &&
        row.amount &&
        row.amount !== "0"
      ) {
        row.performanceRatio = Decimal.div(
          Decimal.mul(row.amount, "100"),
          totalTaxAmount,
        ).toFixed(6);
        row.amount = row.amount.toFixed(6);
      }
    } else if (pageData.contractType === "2") {
      if (
        targetQuantity &&
        targetQuantity !== "0" &&
        row.amount &&
        row.amount !== "0"
      ) {
        row.performanceRatio = Decimal.div(
          Decimal.mul(row.amount, "100"),
          targetQuantity,
        ).toFixed(6);
        row.amount = row.amount.toFixed(6);
      }
    }
  } catch (f) {
    console.log(f);
  }

  if (row.amount === "") {
    row.performanceRatio = "";
  }
  row.precedence = "1";
}

履约目标值 amount 🎉

json
{
  "groupCode": "contractItemCustom1List",
  "fieldType": "float",
  "title": "履约目标值",
  "field": "amount",
  "dataFormat": "#.000000",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  let totalTaxAmount = 0;
  let targetQuantity = 0;
  layoutConfig.groups.forEach((group) => {
    if (group.groupCode == "busRule") {
      totalTaxAmount = pageData.totalTaxAmount;
    }
    if (group.groupCode == "baseForm") {
      targetQuantity = pageData.targetQuantity;
    }
  });
  if (pageData.contractType === "1") {
    if (
      totalTaxAmount &&
      totalTaxAmount !== "0" &&
      row.amount &&
      row.amount !== "0"
    ) {
      row.performanceRatio = Decimal.div(
        Decimal.mul(row.amount, "100"),
        totalTaxAmount,
      ).toFixed(6);
      row.amount = new Decimal(row.amount).toFixed(6);
    }
  } else if (pageData.contractType === "2") {
    if (
      targetQuantity &&
      targetQuantity !== "0" &&
      row.amount &&
      row.amount !== "0"
    ) {
      row.performanceRatio = Decimal.div(
        Decimal.mul(row.amount, "100"),
        targetQuantity,
      ).toFixed(6);
      row.amount = new Decimal(row.amount).toFixed(6);
    }
  }
  if (row.amount == "") {
    row.performanceRatio = "";
  }
  if (row.amount == null) {
    row.performanceRatio = null;
  }
  row.precedence = "1";
}

履行比例 performanceRatio 🎉

json
{
  "groupCode": "contractItemCustom1List",
  "fieldType": "float",
  "title": "履行比例",
  "field": "performanceRatio",
  "dataFormat": "#.000000",
  "required": "1"
}
js
/**
 * @param {Object} ctx 组件实例
 * @param {String} value 当前所选值
 * @param {Array} data selectModal, remoteSelect 已选行数据 (如有)
 * @param {boolean} _isFill 填充、粘贴操作判断标识
 * @param {Object} row 表行数据 (如有)
 * @param {number} idx 表行索引值 (如有)
 * @param {Object} pageData 页面所有数据
 * @param {Object} layoutConfig 模板配置
 * @param {Object} userInfo 当前登录人信息
 * @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,
    _isFill,
    row,
    idx,
    pageData,
    layoutConfig,
    userInfo,
    customFormatItem,
    setItemRequired,
    setItemDisabled,
    setItemRequiredOrDisabled,
    topEmit,
    Decimal,
  },
) {
  let totalTaxAmount = 0;
  let targetQuantity = 0;

  layoutConfig.groups.forEach((group) => {
    if (group.groupCode == "busRule") {
      totalTaxAmount = pageData.totalTaxAmount;
    }
    if (group.groupCode == "baseForm") {
      targetQuantity = pageData.targetQuantity;
    }
  });
  if (pageData.contractType === "1") {
    if (
      totalTaxAmount &&
      totalTaxAmount !== "0" &&
      row.performanceRatio &&
      row.performanceRatio !== "0"
    ) {
      row.performanceRatio = new Decimal(row.performanceRatio).toFixed(6);
      let temp = Decimal.mul(row.performanceRatio, totalTaxAmount);
      row.amount = Decimal.mul(temp, "0.01");
      row.amount = new Decimal(row.amount).toFixed(6);
    }
  } else if (pageData.contractType === "2") {
    if (
      targetQuantity &&
      targetQuantity !== "0" &&
      row.performanceRatio &&
      row.performanceRatio !== "0"
    ) {
      row.performanceRatio = new Decimal(row.performanceRatio).toFixed(6);
      let temp = Decimal.mul(row.performanceRatio, targetQuantity);
      row.amount = Decimal.mul(temp, "0.01");
      row.amount = new Decimal(row.amount).toFixed(6);
    }
  }
  if (row.performanceRatio === "") {
    row.amount = "";
  }
  row.precedence = "2";
}