Skip to content
On this page

采购申请

业务模板

表行编辑规则

js
{
  groupName: "采购申请行信息",
  groupNameI18nKey: "i18n_title_purchaseRequisitionInfo",
  groupCode: "purchaseRequestItemList",
  groupType: "item",
  sortOrder: "2",
  extend: {
    vxeGridConfig: {
      editConfig: {
        trigger: "click", // 单击击触发编辑
        mode: "cell", // 单元格编辑模式
        /**
         * @description: 表行编辑规则
         * @param {Object} pageData 页面所有数据, ref响应对象,注意在使用时须带上.value
         * @param {Object} row 表行数据
         * @param {number} rowIndex 表行索引值
         * @param {Object} column 列配置
         * @param {number} columnIndex 列索引
         * @return {boolean} 返回布尔值, 为 true 时允许编辑
         */
        beforeEditMethod(pageData, { row, rowIndex, column, columnIndex }) {
          console.log("row :>> ", row);
          console.log("rowIndex :>> ", rowIndex);
          console.log("column :>> ", column);
          console.log("columnIndex :>> ", columnIndex);
          console.log("pageData :>> ", pageData.value);
          const tableData = pageData.value.purchaseRequestItemList;
          const mustMaterialNumber = pageData.value.mustMaterialNumber;
          const filterData = tableData.filter((item) => {
            return item.id === row.id;
          });
          if (filterData && filterData.length) {
            if (
              row["itemStatus"] &&
              row["itemStatus"] !== "0" &&
              row["itemStatus"] !== "-1"
            ) {
              return false;
            }
          } else {
            return false;
          }
          if (
            mustMaterialNumber == "1" &&
            (column.property == "materialDesc" ||
              column.property == "materialName" ||
              column.property == "materialSpec")
          ) {
            return false;
          }

          //只有新建和退回的单据才可以编辑  return false 是不能编辑
          if (row["itemStatus"] == "-1") {
            return true;
          }
          if (row["itemStatus"] == "0") {
            return true;
          }
          return true;
        },
      },
    },
  },
}

采购负责人 purchasePrincipal

json
{
  "groupCode": "baseForm",
  "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) {
    return;
  }
  let { subAccount = "", realname = "" } = data[0] || {};
  pageData.purchasePrincipal = subAccount + "_" + realname;
}
js
{
  modalColumns: [
    {
      field: "subAccount",
      title: "子账号",
      fieldLabelI18nKey: "i18n_field_subAccount",
      width: 150,
    },
    {
      field: "realname",
      title: "姓名",
      fieldLabelI18nKey: "i18n_field_realname",
      width: 150,
    },
  ],
  modalUrl: "/account/elsSubAccount/page",
  selectModel: "single",
  params: {
    status: "1",
  },
}

申请人 applicant

json
{
  "groupCode": "baseForm",
  "fieldType": "remoteSelect",
  "fieldLabel": "申请人",
  "fieldName": "applicant",
  "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;
  }
  pageData.applicant = data[0].subAccount + "_" + data[0].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",
  selectModel: "single",
  params: {
    status: "1",
  },
}

物料编号必填 mustMaterialNumber

json
{
  "groupCode": "baseForm",
  "fieldType": "switch",
  "fieldLabel": "物料编号必填",
  "fieldName": "mustMaterialNumber",
  "dictCode": "yn",
  "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,
  },
) {
  setItemRequired("purchaseRequestItemList", "materialNumber", value === "1");
}

要求交期 deliveryDate 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "date",
  "title": "要求交期",
  "field": "deliveryDate",
  "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 (pageData.ifLeadTime == 1) {
    if (pageData.applyDate == "" || pageData.applyDate == null) {
      return new Error("请先填写表头的采购申请日期");
    } else {
      var stime = Date.parse(new Date(pageData.applyDate));
      var etime = Date.parse(new Date(pageData["deliveryDate"]));
      // // 两个时间戳相差的毫秒数
      var usedTime = etime - stime;
      // 计算相差的天数
      var days = Math.floor(usedTime / (24 * 3600 * 1000));
      if (pageData["leadTime"] - days > 0) {
        return new Error("当前不满足采购提前期");
      }
    }
  }
}

需求数量 repertoryQuantity 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "float",
  "title": "需求数量",
  "field": "repertoryQuantity",
  "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 (row.price && row.taxRate) {
    let taxRate = row.taxRate;
    let price = row.price;
    let tax = Decimal.add(1, Decimal.div(taxRate, 100));
    let netPrice = Decimal.div(price, tax);
    netPrice = new Decimal(netPrice).toFixed(4);
    row.netPrice = netPrice;

    if (row.repertoryQuantity) {
      let quantity = row.repertoryQuantity;

      let taxAmount = Decimal.mul(price, quantity);
      taxAmount = new Decimal(taxAmount).toFixed(4);
      row.taxAmount = taxAmount;

      let netAmount = Decimal.div(taxAmount, tax);
      netAmount = new Decimal(netAmount).toFixed(4);
      row.netAmount = netAmount;
      let tableData = pageData.purchaseRequestItemList;
      let totalTaxAmount = 0;
      let totalNetAmount = 0;
      tableData.forEach((item) => {
        if (item.taxAmount) {
          totalTaxAmount += Number(item.taxAmount);
        }
        if (item.netAmount) {
          totalNetAmount += Number(item.netAmount);
        }
      });
      pageData.totalTaxAmount = totalTaxAmount;
      pageData.totalNetAmount = totalNetAmount;
    }
  }
}

含税单价 price 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "hiddenField",
  "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,
  },
) {
  if (row.price && row.taxRate) {
    let taxRate = row.taxRate;
    let price = row.price;
    let tax = Decimal.add(1, Decimal.div(taxRate, 100));
    let netPrice = Decimal.div(price, tax);
    netPrice = new Decimal(netPrice).toFixed(4);
    row.netPrice = netPrice;

    if (row.repertoryQuantity) {
      let quantity = row.repertoryQuantity;

      let taxAmount = Decimal.mul(price, quantity);
      taxAmount = new Decimal(taxAmount).toFixed(4);
      row.taxAmount = taxAmount;

      let netAmount = Decimal.div(taxAmount, tax);
      netAmount = new Decimal(netAmount).toFixed(4);
      row.netAmount = netAmount;
      let tableData = pageData.purchaseRequestItemList;
      let totalTaxAmount = 0;
      let totalNetAmount = 0;
      tableData.forEach((item) => {
        if (item.taxAmount) {
          totalTaxAmount += Number(item.taxAmount);
        }
        if (item.netAmount) {
          totalNetAmount += Number(item.netAmount);
        }
      });
      pageData.totalTaxAmount = totalTaxAmount;
      pageData.totalNetAmount = totalNetAmount;
    }
  }
}

税码 taxCode 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "hiddenField",
  "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) return;
  row.taxCode = data[0].taxCode || "";
  row.taxRate = data[0].taxRate || "";
  // ...
  if (row.price && row.taxRate) {
    let taxRate = row.taxRate;
    let price = row.price;
    if (Decimal) {
      let formula = Decimal.add(1, Decimal.div(taxRate, 100));
      let netPrice = Decimal.div(price, formula);
      // 4位小数
      row.netPrice = new Decimal(netPrice).toFixed(4);
      let tax = Decimal.add(1, Decimal.div(taxRate, 100));
      if (row.repertoryQuantity) {
        let quantity = row.repertoryQuantity;

        let taxAmount = Decimal.mul(price, quantity);
        row.taxAmount = new Decimal(taxAmount).toFixed(4);

        let netAmount = Decimal.div(taxAmount, tax);
        row.netAmount = new Decimal(netAmount).toFixed(4);

        let totalTaxAmount = 0;
        let totalNetAmount = 0;
        pageData.purchaseRequestItemList.forEach((item) => {
          if (item.taxAmount) {
            totalTaxAmount += Number(item.taxAmount);
          }
          if (item.netAmount) {
            totalNetAmount += Number(item.netAmount);
          }
        });
        pageData.totalTaxAmount = totalTaxAmount;
        pageData.totalNetAmount = totalNetAmount;
      }
    }
  }
}
js
{
  modalColumns: [
    {
      field: "taxCode",
      title: "税码",
      fieldLabelI18nKey: "i18n_field_taxCode",
      with: 150,
    },
    {
      field: "taxRate",
      title: "税率(%)",
      fieldLabelI18nKey: "i18n_field_fIW_1d82c0c",
      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: {},
  selectModel: "single",
  beforeCheckedCallBack(Vue, row, column) {
    console.log("row", row);
    return new Promise((resolve, reject) => {
      return row.itemStatus !== "-1" && row.itemStatus !== "0"
        ? reject("只有新建和退回状态的单据才允许编辑")
        : resolve("success");
    });
  },
  afterRowClearCallBack: function (Vue, row) {
    row.taxCode = "";
    row.taxRate = "";
  },
}

期望供应商 ELS 账号 expectSupplierEls 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "remoteSelect",
  "title": "期望供应商ELS账号",
  "field": "expectSupplierEls",
  "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) {
    // 填充操作时 _isFill 判断标识值为 true
    // 且 data 参数为当前所选行缓存数据
    // 如果赋值操作中字段属性不同, 需要加条件判断区分取值
    // 如果各属性名称相同, 则不用修改
    if (_isFill) {
      const { expectSupplierEls = "", expectSupplierName = "" } = data[0] || {};
      row.expectSupplierEls = expectSupplierEls;
      row.expectSupplierName = expectSupplierName;
    } else {
      const { toElsAccount = "", supplierName = "" } = data[0] || {};
      row.expectSupplierEls = address;
      row.expectSupplierName = consignee;
    }
  }
}
js
{
  modalColumns: [
    { field: "toElsAccount", title: "供应商账号", with: 150 },
    { field: "supplierName", title: "供应商名称", with: 150 },
    { field: "supplierCode", title: "供应商编码", with: 150 },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  modalParams: {},
}

收货地址 receivedAddress 🎉

json
{
  "groupCode": "purchaseRequestItemList",
  "fieldType": "selectModal",
  "title": "收货地址",
  "field": "receivedAddress",
  "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) {
    // 填充操作时 _isFill 判断标识值为 true
    // 且 data 参数为当前所选行缓存数据
    // 如果赋值操作中字段属性不同, 需要加条件判断区分取值
    // 如果各属性名称相同, 则不用修改
    if (_isFill) {
      const {
        receivedAddress = "",
        receivedUser = "",
        receivedPhone = "",
      } = data[0] || {};
      row.receivedAddress = receivedAddress;
      row.receivedUser = receivedUser;
      row.receivedPhone = receivedPhone;
    } else {
      const {
        address = "",
        consignee = "",
        purchasePhone = "",
      } = data[0] || {};
      row.receivedAddress = address;
      row.receivedUser = consignee;
      row.receivedPhone = purchasePhone;
    }
  }
}
js
{
  selectModal: "single",
  modalColumns: [
    {
      field: "address",
      title: "收货地址",
      fieldLabelI18nKey: "i18n_field_receiveAddress",
      with: 150,
    },
    {
      field: "consignee",
      title: "收货人",
      fieldLabelI18nKey: "i18n_field_consignee",
      with: 150,
    },
    {
      field: "purchasePhone",
      title: "收货人联系电话",
      fieldLabelI18nKey: "i18n_field_receivedPhone",
      with: 150,
    },
  ],
  modalUrl: "/delivery/deliveryOrderAddress/list",
  modalParams: {},
  // 表行弹窗清除按钮回调
  handleAfter: function ({ pageData, row }) {
    row.receivedAddress = "";
    row.receivedUser = "";
    row.receivedPhone = "";
  },
}