Skip to content
On this page

竞价管理

业务模板

采购负责人 purchasePrincipal

json
{
  "groupCode": "baseForm",
  "fieldType": "remoteSelect",
  "fieldLabel": "采购负责人",
  "fieldName": "purchasePrincipal",
  "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) {
    return;
  }
  const { subAccount = "", realname = "" } = data[0] || {};
  pageData.purchasePrincipal = `${subAccount}_${realname}`;
}
js
{
  modalColumns: [
    {
      field: "subAccount",
      title: "子账号",
      fieldLabelI18nKey: "i18n_field_subAccount",
      with: 150,
    },
    {
      field: "realname",
      title: "姓名",
      fieldLabelI18nKey: "i18n_field_realname",
      with: 150,
    },
  ],
  modalUrl: "/account/elsSubAccount/page",
  modalParams: {
    status: "1",
  },
}

竞价范围 ebiddingScope

json
{
  "groupCode": "baseForm",
  "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} 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,
  },
) {
  // 竞价范围 ebiddingScope;
  // 数据字典 srmEbiddingScope (0: 邀请竞价,1: 公开竞价)

  /**
   * @description: 业务规则
   * 邀请竞价时,供应商资格要求、报名截止时间不可编辑, 否则取反
   * @return {*}
   */
  setItemDisabled("baseForm", "supllierQualification", value === "0");
  setItemDisabled("baseForm", "publicScope", value === "0");

  /**
   * @description: 业务规则
   * 竞价范围为'公开竞价','报名截止时间'必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled("baseForm", "applyEndTime", value === "1");

  /**
   * @description: 业务规则
   * 竞价方式为'英式'时, 报价方式无限制;
   * 阶段类型为'邀请竞价'时,表行'附件需求清单', 阶段类型数据字典为'srmEbidding4StageType'
   * 否则设置为 srmEbiddingStageType
   * 数据字典 srmEbidding4StageType (4: 应标阶段);
   * 数据字典 srmEbiddingStageType (1: 报名阶段, 4: 应标阶段);
   */
  customFormatItem(
    "purchaseAttachmentDemandList",
    "stageType",
    function fn(item) {
      item.options = [];
      item.dictCode =
        value === "1" ? "srmEbiddingStageType" : "srmEbidding4StageType";
    },
  );
}

需要应标 needEcho

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "需要应标",
  "fieldName": "needEcho",
  "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,
  },
) {
  if (value === "0") {
    pageData.echoEndTime = "";
    console.warn("需要应标为‘否’,请空‘应标截止时间’");
  }

  /**
   * @description: 业务规则
   * 需要应标为'是', '应标截止时间'必填, 否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled("baseForm", "echoEndTime", value === "1");
}

竞价方式 ebiddingMethod

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "竞价方式",
  "fieldName": "ebiddingMethod",
  "dictCode": "srmEbiddingMethod",
  "required": "1",
  "helpText": "荷式:报价向竞标者的目标价靠拢;英式:报价向招标方的目标价靠拢;日式:与英式的区别是招标方出价,竞标者确认是否接受"
}
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,
  },
) {
  // 竞价方式 ebiddingMethod;
  // 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
  // 报价方式 ebiddingWay;
  // 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
  // 数据字典 srmEbiddingWayFilter (0: 打包, 1: 逐条);
  const ebiddingMethod = pageData.ebiddingMethod || "";
  // 竞价方式: 英式
  const ebiddingMethodZero = ebiddingMethod === "0";
  // 竞价方式: 荷式
  const ebiddingMethodTwo = ebiddingMethod === "2";

  const ebiddingWay = pageData.ebiddingWay || "";
  // 报价方式: 逐条
  const ebiddingWayOne = ebiddingWay === "1";

  // 延期规则 delayRule;
  // 数据字典 srmEbiddingDelayRule (0: 不允许延期, 1: 不限制延期次数, 2: 有限制次数延期);
  const delayRule = pageData.delayRule || "";
  // 延期规则: 不限制延期次数
  const delayRuleOne = delayRule === "1";
  // 延期规则: 有限制次数延期
  const delayRuleTwo = delayRule === "2";

  /**
   * @description: 业务规则
   * 竞价方式为'英式'时, 报价方式无限制;
   * 竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中批量, 且修改数据字典;
   */
  function customRule() {
    const flag =
      ebiddingMethod &&
      ebiddingMethod !== "0" &&
      ebiddingWay &&
      (ebiddingWay === "2" || ebiddingWay === "3");
    if (flag) {
      pageData.ebiddingWay = "";
      console.warn(
        "竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中'批量' 或 '一次性'",
      );
    }

    customFormatItem("baseForm", "ebiddingWay", function fn(item) {
      item.options = [];
      item.dictCode =
        ebiddingMethod && ebiddingMethod !== "0"
          ? "srmEbiddingWayFilter"
          : "srmEbiddingWay";
    });
  }
  customRule();

  /**
   * @description: 业务规则
   * 英式或荷式竞价 + 报价方式为'逐条'时,'时间间隔(分钟)'必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "intervalMinute",
    (ebiddingMethodZero || ebiddingMethodTwo) && ebiddingWayOne,
  );

  /**
   * @description: 业务规则
   * 英式竞价时,延期规则必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled("baseForm", "delayRule", ebiddingMethodZero);

  /**
   * @description: 业务规则
   * 英式或荷式竞价时,持续时间(分钟) 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "keepMinute",
    ebiddingMethodZero || ebiddingMethodTwo,
  );

  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“不限制延期次数”或“有限制次数延期”时,结束前多少分钟 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "beforeEndMinute",
    ebiddingMethodZero && (delayRuleOne || delayRuleTwo),
  );

  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“不限制延期次数”或“有限制次数延期”时,延期多少分钟 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "delayMinute",
    ebiddingMethodZero && (delayRuleOne || delayRuleTwo),
  );

  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“有限制次数延期”时,可以延期次数 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "delayCount",
    ebiddingMethodZero && delayRuleTwo,
  );

  /**
   * @description: 业务规则
   * 竞价方式为'荷式'时 + 逐条报价 + 拆分方式为"数值"时
   * 是否允许修改投标数量 可以修改, 否则置灰,且重置值为“0”
   */
  function allowModifyCustomRule() {
    const flag =
      ebiddingMethodTwo && ebiddingWayOne && pageData.quotaWay === "1";

    if (!flag) {
      pageData.allowModifyQuantity = "0";
      console.warn(
        "竞价方式为'荷式'时 + 逐条报价 + 拆分方式为数值时才允许修改",
      );
    }

    setItemDisabled("baseForm", "allowModifyQuantity", !flag);
  }
  allowModifyCustomRule();
}

报价方式 ebiddingWay

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "报价方式",
  "fieldName": "ebiddingWay",
  "dictCode": "srmEbiddingWay",
  "required": "1",
  "helpText": "逐条指对竞价单行逐行报价,按行项比价和定价;打包指对整张竞价单报总价,按整单总价比对和定价;批量指一次性对所有竞价单行报价,按整单总金额比价和定价;一次性指同时对所有物料行报价,按行项比价和定价"
}
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,
  },
) {
  // 竞价方式 ebiddingMethod;
  // 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
  const ebiddingMethod = pageData.ebiddingMethod || "";
  // 竞价方式: 英式
  const ebiddingMethodZero = ebiddingMethod === "0";
  // 竞价方式: 荷式
  const ebiddingMethodTwo = ebiddingMethod === "2";

  // 报价方式 ebiddingWay;
  // 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
  // 数据字典 srmEbiddingWayFilter (0: 打包, 1: 逐条);
  const ebiddingWay = pageData.ebiddingWay || "";
  // 报价方式: 打包
  const ebiddingWayZero = ebiddingWay === "0";
  // 报价方式: 逐条
  const ebiddingWayOne = ebiddingWay === "1";
  // 报价方式: 批量
  const ebiddingWayTwo = ebiddingWay === "2";

  // 价格表生成方式 priceCreateWay
  // 数据字典 srmPriceCreateWay (1: 自动生成, 2: 手工生成, 3: 不生成)
  const priceCreateWay = pageData.priceCreateWay || "";

  // 设置起拍价 setStartPrice
  // 数据字典 yn (0: 否, 1: 是)
  const setStartPrice = pageData.setStartPrice || "";
  const setStartPriceOne = setStartPrice === "1";

  // 采购自动报价 purchaseAutoQuote
  // 数据字典 yn (0: 否, 1: 是)
  const purchaseAutoQuote = pageData.purchaseAutoQuote || "";
  const purchaseAutoQuoteOne = purchaseAutoQuote === "1";

  /**
   * @description: 业务规则
   * 竞价方式为'英式'时, 报价方式无限制;
   * 竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中批量, 且修改数据字典;
   */
  function customRule() {
    const flag =
      ebiddingMethod &&
      ebiddingMethod !== "0" &&
      ebiddingWay &&
      (ebiddingWay === "2" || ebiddingWay === "3");
    if (flag) {
      pageData.ebiddingWay = "";
      console.warn(
        "竞价方式为'日式/荷式'时, 只能选择'逐条'或者'打包', 不能选中'批量' 或 '一次性'",
      );
    }

    customFormatItem("baseForm", "ebiddingWay", function fn(item) {
      item.options = [];
      item.dictCode =
        ebiddingMethod && ebiddingMethod !== "0"
          ? "srmEbiddingWayFilter"
          : "srmEbiddingWay";
    });
  }
  customRule();

  /**
   * @description: 业务规则
   * 报价方式为'打包'时, 价格表生成方式不允许为'自动生成'
   */
  function priceCreateWayCustomRule() {
    const flag = ebiddingWay && ebiddingWay === "0";
    if (flag && priceCreateWay && priceCreateWay === "1") {
      pageData.priceCreateWay = "";
      console.warn("报价方式为'打包'时, 价格表生成方式不允许为'自动生成'");
    }

    customFormatItem("baseForm", "priceCreateWay", function fn(item) {
      item.options = [];
      item.dictCode = flag ? "srmPriceCreateWayFilter" : "srmPriceCreateWay";
    });
  }
  priceCreateWayCustomRule();

  /**
   * @description: 业务规则
   * 设置起拍价 + 报价方式'打包'或'批量'时, '打包起拍价金额'必填
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "startTotalAmount",
    setStartPriceOne && (ebiddingWayZero || ebiddingWayTwo),
  );

  /**
   * @description: 业务规则
   * 英式或荷式竞价 + 报价方式为'逐条'时,'时间间隔(分钟)'必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "intervalMinute",
    (ebiddingMethodZero || ebiddingMethodTwo) && ebiddingWayOne,
  );

  /**
   * @description: 业务规则
   * 报价方式为'逐条' + 设置起拍价 + 采购自动报价,竞价行信息表行'起拍单价'必填
   * @return {*}
   */
  setItemRequired(
    "purchaseEbiddingItemList",
    "startPrice",
    ebiddingWayOne && setStartPriceOne && purchaseAutoQuoteOne,
  );

  /**
   * @description: 业务规则
   * 竞价方式为'荷式'时 + 逐条报价 + 拆分方式为"数值"时
   * 是否允许修改投标数量 可以修改, 否则置灰,且重置值为“0”
   */
  function allowModifyCustomRule() {
    const flag =
      ebiddingMethodTwo && ebiddingWayOne && pageData.quotaWay === "1";

    if (!flag) {
      pageData.allowModifyQuantity = "0";
      console.warn(
        "竞价方式为'荷式'时 + 逐条报价 + 拆分方式为数值时才允许修改",
      );
    }

    setItemDisabled("baseForm", "allowModifyQuantity", !flag);
  }
  allowModifyCustomRule();
}

供应商税率 supplierTaxRate

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "供应商税率",
  "fieldName": "supplierTaxRate",
  "defaultValue": "1",
  "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,
  },
) {
  /**
   * @description: 业务规则
   * 供应商税率为'是', '需要应标'必填, 否则置灰
   * @return {*}
   */
  setItemRequired("baseForm", "needEcho", value === "1");
}

税码 taxCode

json
{
  "groupCode": "baseForm",
  "fieldType": "remoteSelect",
  "fieldLabel": "税码",
  "fieldName": "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) {
    return;
  }
  const { taxCode = "", taxRate = "" } = data[0] || {};
  pageData.taxCode = taxCode;
  pageData.taxRate = taxRate;
  // 竞价行信息 税率 + 税码赋值
  if (
    pageData.purchaseEbiddingItemList &&
    pageData.purchaseEbiddingItemList.length
  ) {
    pageData.purchaseEbiddingItemList.forEach((n) => {
      n.taxCode = taxCode;
      n.taxRate = taxRate;
    });
  }
}
js
{
  modalColumns: [
    {
      field: "taxCode",
      title: "税码",
      fieldLabelI18nKey: "i18n_field_taxCode",
      with: 150,
    },
    {
      field: "taxRate",
      title: "税率(%)",
      fieldLabelI18nKey: "i18n_field_taxRate",
      with: 150,
    },
    {
      field: "taxName",
      title: "税码名称",
      fieldLabelI18nKey: "i18n_field_taxName",
      with: 150,
    },
    {
      field: "remark",
      title: "备注",
      fieldLabelI18nKey: "i18n_field_remark",
      with: 150,
    },
  ],
  modalUrl: "/base/tax/queryTaxForTemplate",
  afterClearCallBack: function (form, pageData) {
    form.taxRate = "";
    form.taxCode_dictText = "";
    form.taxRate = "";
  },
  handleAfter: ({ pageData }) => {
    pageData.taxCode = "";
    pageData.taxCode_dictText = "";
    pageData.taxRate = "";
  },
}

延期规则 delayRule

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "延期规则",
  "fieldName": "delayRule",
  "dictCode": "srmEbiddingDelayRule",
  "defaultValue": "1",
  "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,
  },
) {
  // 竞价方式 ebiddingMethod;
  // 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
  const ebiddingMethod = pageData.ebiddingMethod || "";
  // 竞价方式: 英式
  const ebiddingMethodZero = ebiddingMethod === "0";

  // 延期规则 delayRule;
  // 数据字典 srmEbiddingDelayRule (0: 不允许延期, 1: 不限制延期次数, 2: 有限制次数延期);
  const delayRule = pageData.delayRule || "";
  // 延期规则: 不限制延期次数
  const delayRuleOne = delayRule === "1";
  // 延期规则: 有限制次数延期
  const delayRuleTwo = delayRule === "2";
  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“不限制延期次数”或“有限制次数延期”时,结束前多少分钟 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "beforeEndMinute",
    ebiddingMethodZero && (delayRuleOne || delayRuleTwo),
  );

  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“不限制延期次数”或“有限制次数延期”时,延期多少分钟 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "delayMinute",
    ebiddingMethodZero && (delayRuleOne || delayRuleTwo),
  );

  /**
   * @description: 业务规则
   * 英式竞价 + 延期规则为“有限制次数延期”时,可以延期次数 必填,否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "delayCount",
    ebiddingMethodZero && delayRuleTwo,
  );
}

价格生效日期 effectiveDate

json
{
  "groupCode": "baseForm",
  "fieldType": "date",
  "fieldLabel": "价格生效日期",
  "fieldName": "effectiveDate",
  "dataFormat": "YYYY-MM-DD",
  "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,
  },
) {
  /**
   * @description: 业务规则
   * 如果表行:竞价行信息 生效日期 字段未赋,则使用表头已选的 价格生效日期
   */

  if (
    pageData.purchaseEbiddingItemList &&
    pageData.purchaseEbiddingItemList.length
  ) {
    pageData.purchaseEbiddingItemList.forEach((n) => {
      n.effectiveDate = value;
    });
  }
}

价格失效日期 expiryDate

json
{
  "groupCode": "baseForm",
  "fieldType": "date",
  "fieldLabel": "价格失效日期",
  "fieldName": "expiryDate",
  "dataFormat": "YYYY-MM-DD",
  "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,
  },
) {
  /**
   * @description: 业务规则
   * 如果表行:竞价行信息 失效日期 字段未赋,则使用表头已选的 价格失效日期
   */

  if (
    pageData.purchaseEbiddingItemList &&
    pageData.purchaseEbiddingItemList.length
  ) {
    pageData.purchaseEbiddingItemList.forEach((n) => {
      n.expiryDate = value;
    });
  }
}

物料编号必填 mustMaterialNumber

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "物料编号必填",
  "fieldName": "mustMaterialNumber",
  "dictCode": "yn",
  "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 (value === "0") {
    pageData.echoEndTime = "";
    console.warn("需要应标为‘否’,请空‘应标截止时间’");
  }

  /**
   * @description: 业务规则
   * 物料编号必填为'是', 竞价行信息 '物料编号'必填, 否则置灰
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "purchaseEbiddingItemList",
    "materialNumber",
    value === "1",
  );
}

设置起拍价 setStartPrice

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "设置起拍价",
  "fieldName": "setStartPrice",
  "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,
  },
) {
  // 报价方式 ebiddingWay;
  // 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
  const ebiddingWay = pageData.ebiddingWay || "";
  // 报价方式: 打包
  const ebiddingWayZero = ebiddingWay === "0";
  // 报价方式: 逐条
  const ebiddingWayOne = ebiddingWay === "1";
  // 报价方式: 批量
  const ebiddingWayTwo = ebiddingWay === "2";

  // 设置起拍价 setStartPrice
  // 数据字典 yn (0: 否, 1: 是)
  const setStartPrice = pageData.setStartPrice || "";
  const setStartPriceOne = setStartPrice === "1";

  // 采购自动报价 purchaseAutoQuote
  // 数据字典 yn (0: 否, 1: 是)
  const purchaseAutoQuote = pageData.purchaseAutoQuote || "";
  const purchaseAutoQuoteOne = purchaseAutoQuote === "1";

  /**
   * @description: 业务规则
   * 设置起拍价 + 报价方式'打包'或'批量'时, '打包起拍价金额'必填
   * @return {*}
   */
  setItemRequiredOrDisabled(
    "baseForm",
    "startTotalAmount",
    setStartPriceOne && (ebiddingWayZero || ebiddingWayTwo),
  );

  /**
   * @description: 业务规则
   * 报价方式为'逐条' + 设置起拍价 + 采购自动报价,竞价行信息表行'起拍单价'必填
   * @return {*}
   */
  setItemRequired(
    "purchaseEbiddingItemList",
    "startPrice",
    ebiddingWayOne && setStartPriceOne && purchaseAutoQuoteOne,
  );
}

拆分方式 quotaWay

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "拆分方式",
  "fieldName": "quotaWay",
  "dictCode": "srmQuotaWay",
  "defaultValue": "0",
  "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,
  },
) {
  // 竞价方式 ebiddingMethod;
  // 数据字典 srmEbiddingMethod (0: 英式, 1: 日式, 2: 荷式);
  // 报价方式 ebiddingWay;
  // 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
  // 数据字典 srmEbiddingWayFilter (0: 打包, 1: 逐条);
  const ebiddingMethod = pageData.ebiddingMethod || "";
  // 竞价方式: 荷式
  const ebiddingMethodTwo = ebiddingMethod === "2";

  const ebiddingWay = pageData.ebiddingWay || "";
  // 报价方式: 逐条
  const ebiddingWayOne = ebiddingWay === "1";
  /**
   * @description: 业务规则
   * 竞价方式为'荷式'时 + 逐条报价 + 拆分方式为"数值"时
   * 是否允许修改投标数量 可以修改, 否则置灰,且重置值为“0”
   */
  function allowModifyCustomRule() {
    const flag =
      ebiddingMethodTwo && ebiddingWayOne && pageData.quotaWay === "1";

    if (!flag) {
      pageData.allowModifyQuantity = "0";
      console.warn(
        "竞价方式为'荷式'时 + 逐条报价 + 拆分方式为数值时才允许修改",
      );
    }

    setItemDisabled("baseForm", "allowModifyQuantity", !flag);
  }
  allowModifyCustomRule();
}

采购自动报价 purchaseAutoQuote

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "采购自动报价",
  "fieldName": "purchaseAutoQuote",
  "dictCode": "yn",
  "required": "0",
  "helpText": "根据起拍价和调整幅度自动出价,采购方无需人工操作。仅限于日式及荷式竞价。"
}
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,
  },
) {
  // 报价方式 ebiddingWay;
  // 数据字典 srmEbiddingWay (0: 打包, 1: 逐条, 2: 批量, 3: 一次性);
  const ebiddingWay = pageData.ebiddingWay || "";
  // 报价方式: 逐条
  const ebiddingWayOne = ebiddingWay === "1";

  // 设置起拍价 setStartPrice
  // 数据字典 yn (0: 否, 1: 是)
  const setStartPrice = pageData.setStartPrice || "";
  const setStartPriceOne = setStartPrice === "1";

  // 采购自动报价 purchaseAutoQuote
  // 数据字典 yn (0: 否, 1: 是)
  const purchaseAutoQuote = pageData.purchaseAutoQuote || "";
  const purchaseAutoQuoteOne = purchaseAutoQuote === "1";

  /**
   * @description: 业务规则
   * 报价方式为'逐条' + 设置起拍价 + 采购自动报价,竞价行信息表行'起拍单价'必填,否则置灰
   * @return {*}
   */
  setItemRequired(
    "purchaseEbiddingItemList",
    "startPrice",
    ebiddingWayOne && setStartPriceOne && purchaseAutoQuoteOne,
  );
}

含税价 price 🎉

json
{
  "groupCode": "purchaseEbiddingItemList",
  "fieldType": "number",
  "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 || "";
  // 未税单价 netPrice;
  let netPrice = row.netPrice || "";
  // 报价项 quoteType_dictText
  // 数据字典 srmQuoteType (0: 含税价, 1: 不含税价)
  const quoteType = pageData.quoteType || "";

  if (Decimal) {
    let formula = Decimal.add(1, Decimal.div(taxRate, 100));
    // 计算当前行未税单价 netPrice
    if (quoteType === "0") {
      if (taxRate && price) {
        if (Decimal) {
          let netPrice = Decimal.div(price, formula);
          // 4位小数
          row.netPrice = new Decimal(netPrice).toFixed(4);
        }
      }
    }
    // 计算当前行含税单价 price
    if (quoteType === "1") {
      if (taxRate && netPrice) {
        if (Decimal) {
          let price = Decimal.mul(netPrice, formula);
          // 4位小数
          row.price = new Decimal(price).toFixed(4);
        }
      }
    }
  }
}

未税价 netPrice 🎉

json
{
  "groupCode": "purchaseEbiddingItemList",
  "fieldType": "number",
  "title": "未税价",
  "field": "netPrice",
  "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 || "";
  // 未税单价 netPrice;
  let netPrice = row.netPrice || "";
  // 报价项 quoteType_dictText
  // 数据字典 srmQuoteType (0: 含税价, 1: 不含税价)
  const quoteType = pageData.quoteType || "";

  if (Decimal) {
    let formula = Decimal.add(1, Decimal.div(taxRate, 100));
    // 计算当前行未税单价 netPrice
    if (quoteType === "0") {
      if (taxRate && price) {
        if (Decimal) {
          let netPrice = Decimal.div(price, formula);
          // 4位小数
          row.netPrice = new Decimal(netPrice).toFixed(4);
        }
      }
    }
    // 计算当前行含税单价 price
    if (quoteType === "1") {
      if (taxRate && netPrice) {
        if (Decimal) {
          let price = Decimal.mul(netPrice, formula);
          // 4位小数
          row.price = new Decimal(price).toFixed(4);
        }
      }
    }
  }
}

税码 taxCode 🎉

json
{
  "groupCode": "purchaseEbiddingItemList",
  "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) {
    return;
  }
  const { taxCode = "", taxRate = "" } = data[0] || {};
  row.taxCode = taxCode;
  row.taxRate = taxRate;
}
js
{
  modalColumns: [
    {
      field: "taxCode",
      title: "税码",
      fieldLabelI18nKey: "i18n_field_taxCode",
      with: 150,
    },
    {
      field: "taxRate",
      title: "税率(%)",
      fieldLabelI18nKey: "i18n_field_taxRate",
      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: ({ row }) => {
    row.taxCode = "";
    row.taxCode_dictText = "";
    row.taxRate = "";
  },
  afterRowClearCallBack: function (Vue, row) {
    row.taxCode = "";
    row.taxRate = "";
  },
}