Skip to content
On this page

采购订单

业务模板

表行编辑规则

js
{
  groupName: "订单明细信息",
  groupNameI18nKey: "i18n_field_ItRHVH_ca63399",
  groupCode: "purchaseOrderItemList",
  groupType: "item",
  sortOrder: "2",
  extend: {
    vxeGridConfig: {
      editConfig: {
        trigger: "click", // 点击触发编辑
        mode: "cell", // 行编辑模式
        beforeEditMethod: function (
          pageData,
          { row, rowIndex, column, columnIndex },
        ) {
          let formData = pageData.value;
          let orderStatus = formData.orderStatus;
          let freeze = row.freeze;
          let sourceType = row.sourceType;
          let mustMaterialNumber = formData.mustMaterialNumber;

          if (orderStatus == "7" && column.property == "jit") {
            return false;
          }
          if (
            sourceType == "1" &&
            (column.property == "price" ||
              column.property == "taxCode" ||
              column.property == "factory" ||
              column.property == "returned")
          ) {
            return false;
          }
          if (
            sourceType == "7" &&
            (column.property == "factory" || column.property == "returned")
          ) {
            return false;
          }
          if (
            freeze == "1" &&
            (column.property == "taxCode" ||
              column.property == "storageLocation" ||
              column.property == "factory" ||
              column.property == "purchaseType" ||
              column.property == "returned")
          ) {
            return false;
          }
          if (
            mustMaterialNumber == "1" &&
            (column.property == "materialDesc" ||
              column.property == "materialName")
          ) {
            return false;
          }
          if (
            row["deleteOrder"] == "1" &&
            (column.property == "requireDate" || column.property == "price")
          ) {
            return false;
          }
          if (
            (row["freeze"] == "1" ||
              row["itemStatus"] == "1" ||
              row["itemStatus"] == "2" ||
              row["itemStatus"] == "4") &&
            (column.property == "supplierRemark" ||
              column.property == "rejectReason" ||
              column.property == "responsibleParty" ||
              column.property == "responsibleReason")
          ) {
            return false;
          }
          let tableData = pageData.value.saleOrderItemList
            ? pageData.value.saleOrderItemList
            : [];
          if (tableData.length > 0) {
            let filterData = tableData.filter((item) => {
              return item.itemNumber === row.orderItemNumber;
            });
            if (
              filterData.length > 0 &&
              filterData[0]["rejectReason"] != "2" &&
              (column.property == "planDeliveryDate" ||
                column.property == "planDeliveryQuantity")
            ) {
              return false;
            }
            if (
              (row["deletePlan"] == "1" ||
                row["freeze"] == "1" ||
                row["close"] == "1" ||
                row["confirmStatus"] != "3") &&
              (column.property == "planDeliveryDate" ||
                column.property == "planDeliveryQuantity")
            ) {
              return false;
            }
          }
          return true;
        },
      },
    },
  },
}

对方 ELS 账号 toElsAccount

json
{
  "groupCode": "baseForm",
  "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) {
    return;
  }
  pageData.toElsAccount = data[0].toElsAccount || "";
  pageData.supplierCode = data[0].supplierCode || "";
  pageData.supplierName = data[0].supplierName || "";
  pageData.isTeamwork = data[0].needCoordination || "";
}
js
{
  modalColumns: [
    {
      field: "toElsAccount",
      title: "供应商账号",
      fieldLabelI18nKey: "i18n_title_supplierAccount",
      with: 150,
    },
    {
      field: "supplierName",
      title: "供应商名称",
      fieldLabelI18nKey: "i18n__RdXRL_8e11f650",
      with: 150,
    },
    {
      field: "supplierCode",
      title: "供应商编码",
      fieldLabelI18nKey: "i18n_field_toCompanyCode",
      with: 150,
    },
    {
      field: "needCoordination_dictText",
      title: "供应商协同方式",
      fieldLabelI18nKey: "i18n_dict_RdXMeCK_5095b760",
      with: 150,
    },
  ],
  modalUrl: "/supplier/supplierMaster/list",
  modalParams: {
    frozenFunctionValue: "0",
  },
  beforeCheckedCallBack(parentRef, pageData, groupData, form) {
    return new Promise((resolve, reject) => {
      let orderStatus = form.orderStatus || "";
      let sourceType = form.sourceType || "";

      if (sourceType === "2") {
        reject("当前单据来源于采购申请,不能操作");
      } else if (orderStatus !== "0") {
        reject("只允许操作新建状态单据");
      } else {
        resolve("success");
      }
    });
  },
  mobileHandleBefore(Vue, { _pageData, _form, _cacheAllData, _value }) {
    return new Promise((resolve, reject) => {
      let orderStatus = _cacheAllData.orderStatus || "";
      let sourceType = _cacheAllData.sourceType || "";

      if (sourceType === "2") {
        reject("当前单据来源于采购申请,不能操作");
      } else if (orderStatus !== "0") {
        reject("只允许操作新建状态单据");
      } else {
        resolve("success");
      }
    });
  },
  afterClearCallBack: function (form, pageData, col) {
    form.toElsAccount = "";
    form.supplierCode = "";
    form.supplierName = "";
    form.isTeamwork = "";
  },
}

订单状态 orderStatus

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "订单状态",
  "fieldName": "orderStatus",
  "dictCode": "srmOrderStatus",
  "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,
  },
) {
  let flag = !Number(pageData.orderStatus) && !Number(pageData.sourceType);
  console.log(
    "orderStatus flag",
    pageData.orderStatus,
    pageData.sourceType,
    pageData.orderStatus === "0" && pageData.sourceType === "0",
  );
  let props = ["purchaseOrg", "toElsAccount", "company"];
  props.forEach((key) => setItemDisabled("baseForm", key, !flag));
}

公司 company

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "公司",
  "fieldName": "company",
  "dictCode": "company",
  "defaultValue": "{{companyCode}}",
  "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,
  },
) {
  // 本地页面处理复杂绑定函数需求
  topEmit && topEmit();
}

币别 currency

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "币别",
  "fieldName": "currency",
  "dictCode": "srmCurrency",
  "defaultValue": "CNY",
  "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 http = ctx.appContext.config.globalProperties.$http;
  if (value != "" && pageData.chargeCurrency) {
    if (value == pageData.chargeCurrency) {
      pageData.exchange = "1";
      pageData.standardUnit = "1";
    } else {
      http
        .request({
          url:
            "/exchange/bpExchangeRate/getByOrderData?originalCurrency=" +
            value +
            "&targetCurrency=" +
            pageData.chargeCurrency +
            "&orderDate=" +
            pageData.orderDate,
          method: "get",
        })
        .then((res) => {
          if (res.success && res.result.length > 0) {
            pageData.exchange = res.result[0].exchange;
            pageData.standardUnit = res.result[0].standardUnit_dictText;
          } else {
            pageData.exchange = "";
            pageData.standardUnit = "";
          }
        });
    }
  }
}

合同编号 contractNumber

json
{
  "groupCode": "baseForm",
  "fieldType": "selectModal",
  "fieldLabel": "合同编号",
  "fieldName": "contractNumber",
  "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 { contractName = "", contractNumber = "" } = data[0] || {};
  pageData.contractName = contractName;
  pageData.contractNumber = contractNumber;
}
js
{
  modalColumns: [
    {
      field: "contractNumber",
      title: "合同编码",
      fieldLabelI18nKey: "i18n_field_contractNumber",
      with: 150,
    },
    {
      field: "contractName",
      title: "合同名称",
      fieldLabelI18nKey: "i18n_title_contractNoCode",
      with: 150,
    },
  ],
  modalUrl: "/contract/purchaseContractHead/list",
  modalParams: {
    contractStatus: "6",
  },
  params: ({ pageData, userInfo }) => {
    return { contractStatus: "6" };
  },
  afterClearCallBack: function (form, pageData, col) {
    form.contractName = "";
    form.contractNumber = "";
  },

  linkConfig: {
    primaryKey: "contractNumber",
    actionPath: "/srm/contract/purchase/PurchaseContractHeadListSimple",
    bindKey: "contractNumber",
    otherQuery: { linkFilter: true },
  },
  handleBefore: function ({ pageData, linkConfig }) {
    if (pageData.tempRole == "sale") {
      linkConfig.actionPath = "/srm/contract/sale/SaleContractHeadList";
    }
    if (pageData.tempRole == "purchase") {
      linkConfig.actionPath = "/srm/contract/purchase/PurchaseContractHeadList";
    }
    return Promise.resolve();
  },
}

采购方负责人 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;
  }
  let { 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: {},
}

供方负责人 supplierPrincipal

json
{
  "groupCode": "baseForm",
  "fieldType": "remoteSelect",
  "fieldLabel": "供方负责人",
  "fieldName": "supplierPrincipal",
  "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.supplierPrincipal = `${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: {},
}

是否需要审批 isAudit

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "是否需要审批",
  "fieldName": "isAudit",
  "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,
  },
) {
  if (!data || !data.length) {
    return;
  }
  setItemDisabled("baseForm", "isSend", value === "0");
}

来源类型 sourceType

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "来源类型",
  "fieldName": "sourceType",
  "dictCode": "srmOrderSourceType",
  "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,
  },
) {
  let flag = !Number(pageData.orderStatus) && !Number(pageData.sourceType);
  let props = ["purchaseOrg", "toElsAccount", "company"];
  props.forEach((key) => setItemDisabled("baseForm", key, !flag));
}

物料是否必填 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,
  },
) {
  let flag = value === "1";
  let props = ["materialNumber", "materialDesc"];

  props.forEach((key) => setItemRequired("baseForm", key, flag));
}

附加费用规则 orderCostName

json
{
  "groupCode": "baseForm",
  "fieldType": "selectModal",
  "fieldLabel": "附加费用规则",
  "fieldName": "orderCostName",
  "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) {
    let orderCostIds = data
      .map(function (obj, index) {
        return obj.id;
      })
      .join(",");
    let orderCostNames = data
      .map(function (obj, index) {
        return obj.costType_dictText;
      })
      .join(",");
    pageData.isOrderCost = orderCostIds;
    pageData.orderCostName = orderCostNames;

    const dataNew = data.map((item, index) => {
      const { documentNumber, costType, costType_dictText, taxCode, taxRate } =
        item;
      return {
        itemNumber: `${index + 1}`,
        costCode: documentNumber || "",
        costType_dictText: costType_dictText || "",
        costType: costType || "",
        costAmount: "",
        costNetAmount: "",
        taxCode: taxCode || "",
        taxRate: taxRate || "",
      };
    });
    const groups = layoutConfig.groups.filter((group) => {
      return group.groupCode === "purchaseOrderCostList" && group.show;
    });
    if (dataNew.length > 0 && groups.length === 1) {
      pageData.purchaseOrderCostList = [...dataNew];
    }
  }
}
js
{
  modalColumns: [
    {
      field: "documentNumber",
      title: "费用编码",
      fieldLabelI18nKey: "",
      with: 150,
    },
    {
      field: "costType_dictText",
      title: "费用类型",
      fieldLabelI18nKey: "",
      with: 150,
    },
    {
      field: "costPlan_dictText",
      title: "计费方式",
      fieldLabelI18nKey: "",
      with: 150,
    },
  ],
  modalUrl: "/orderAddCost/purchaseOrderAddCost/list",
  modalParams: {},
  selectModal: "multiple",
  handleAfter: ({ pageData, userInfo }) => {
    pageData.isOrderCost = "";
    pageData.orderCostName = "";

    pageData.purchaseOrderCostList = [];
  },
}

附加费用规则 isOrderCost

json
{
  "groupCode": "baseForm",
  "fieldType": "hiddenField",
  "fieldLabel": "附加费用规则",
  "fieldName": "isOrderCost",
  "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) {
    let orderCostIds =
      data &&
      data
        .map(function (obj, index) {
          return obj.id;
        })
        .join(",");
    pageData.isOrderCost = orderCostIds;
  }
}
js
{
  modalColumns: [
    {
      field: "documentNumber",
      title: "费用编码",
      fieldLabelI18nKey: "",
      with: 150,
    },
    {
      field: "costType_dictText",
      title: "费用类型",
      fieldLabelI18nKey: "",
      with: 150,
    },
    {
      field: "costPlan_dictText",
      title: "计费方式",
      fieldLabelI18nKey: "",
      with: 150,
    },
    {
      field: "costPlan_dictText",
      title: "计费方式",
      fieldLabelI18nKey: "",
      with: 150,
    },
  ],
  modalUrl: "/orderAddCost/purchaseOrderAddCost/list",
  modalParams: {},
  selectModel: "multiple",
}

是否启用电签 isEsign

json
{
  "groupCode": "baseForm",
  "fieldType": "select",
  "fieldLabel": "是否启用电签",
  "fieldName": "isEsign",
  "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,
  },
) {
  topEmit && topEmit();
}

要求交期 requireDate 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "date",
  "title": "要求交期",
  "field": "requireDate",
  "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 planTableData =
    pageData.purchaseOrderDeliveryPlanList || pageData.cacheDeliveryList;
  if (!planTableData) return;
  let planOrderItemNumber = planTableData.filter(
    (item) => item.orderItemNumber === row.itemNumber,
  );

  if (planOrderItemNumber.length > 1) {
    planOrderItemNumber.forEach((rex) => {
      if (rex.orderItemNumber == row.itemNumber) {
        rex.planDeliveryDate = rex.planDeliveryDate || value;
        rex.requireDate = value;
      }
    });
  }
  if (planOrderItemNumber.length === 1) {
    planOrderItemNumber.forEach((rex) => {
      if (rex.orderItemNumber == row.itemNumber) {
        rex.planDeliveryDate = rex.planDeliveryDate || value;
        rex.requireDate = value;
      }
    });
  }
  planOrderItemNumber.forEach((item) => {
    const index = pageData.purchaseOrderDeliveryPlanList.findIndex(
      (v) => v._X_ROW_KEY == item._X_ROW_KEY,
    );
    if (index > -1) {
      pageData.purchaseOrderDeliveryPlanList.splice(index, 1, item);
    }
    if (
      pageData.purchaseOrderDeliveryPlanList &&
      pageData.purchaseOrderDeliveryPlanList.length > 0
    ) {
      const updateIndex = pageData.purchaseOrderDeliveryPlanList.findIndex(
        (v) => v._X_ROW_KEY == item._X_ROW_KEY,
      );
      if (updateIndex > -1 && item.id) {
        // 存在且有id
        pageData.purchaseOrderDeliveryPlanList.splice(updateIndex, 1, item);
      } else {
        if (item.id) {
          // 不存在但有id
          pageData.purchaseOrderDeliveryPlanList.push(item);
        }
      }
    }
  });
}

数量 quantity 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "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,
  },
) {
  if (!Decimal) {
    return;
  }

  // 小数位数
  const DIGIT = 4;
  const taxRate = row.taxRate || "0";
  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  // 含税单价 price;
  const price = row.price || "";
  // 数量
  const quantity = row.quantity || "";
  // 计算当前行未税单价 netPrice
  if (taxRate && price) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      const priceUnit = row.priceUnit || "1"; // 价格基数
      const countPrice = Decimal.div(price, priceUnit);
      let taxAmount = Decimal.mul(countPrice, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }
  }

  let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
  // 汇总计算
  let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.taxAmount || "0");
  }, new Decimal(0));
  let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.netAmount || "0");
  }, new Decimal(0));
  pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
  pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);

  if (row.jit == "0") {
    // 数量同步到交货计划未交货数量,计划交货数量
    let deliveryData = pageData.purchaseOrderDeliveryPlanList;
    let notDeliveryQuantityT = deliveryData.reduce((pval, nval) => {
      if (row.itemNumber === nval.orderItemNumber) {
        pval = Number(pval) + Number(nval.notDeliveryQuantity);
      }
      return pval;
    }, 0);

    deliveryData.map((item) => {
      if (row.itemNumber === item.orderItemNumber) {
        item.planDeliveryQuantity =
          notDeliveryQuantityT == row.quantity
            ? item.planDeliveryQuantity
            : row.quantity;
        item.notDeliveryQuantity =
          notDeliveryQuantityT == row.quantity
            ? item.notDeliveryQuantity
            : row.quantity;
        item.quantity = row.quantity;
      }
    });

    pageData.purchaseOrderDeliveryPlanList = deliveryData;
  }

  // 数量同步更新毛重和净重
  if (value) {
    const netWeight = Decimal.mul(row.netWeight, value);
    const grossWeight = Decimal.mul(row.grossWeight, value);
    row.netWeight = new Decimal(netWeight).toFixed(DIGIT);
    row.grossWeight = new Decimal(grossWeight).toFixed(DIGIT);
  }
}

税码 taxCode 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "remoteSelect",
  "title": "税码",
  "field": "taxCode",
  "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 (Array.isArray(data) && data.length) {
    row.taxCode = data[0].taxCode;
    row.taxRate = data[0].taxRate;
  }

  if (!Decimal) {
    return;
  }

  // 小数位数
  const DIGIT = 4;
  const taxRate = row.taxRate || "0";
  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  // 含税单价 price;
  const price = row.price || "";
  // 数量
  const quantity = row.quantity || "";
  // 计算当前行未税单价 netPrice
  if (taxRate && price) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      const priceUnit = row.priceUnit || "1"; // 价格基数
      const countPrice = Decimal.div(price, priceUnit);
      let taxAmount = Decimal.mul(countPrice, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }
  }

  let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
  // 汇总计算
  let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.taxAmount || "0");
  }, new Decimal(0));
  let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.netAmount || "0");
  }, new Decimal(0));
  pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
  pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}
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",
  selectModel: "single",
  modalParams(pageData) {
    return { purchaseAccount: pageData.toElsAccount };
  },
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {
    return { purchaseAccount: _cacheAllData.toElsAccount };
  },
  afterRowClearCallBack: function (Vue, row) {
    row.taxCode = "";
    row.taxRate = "";
  },
}

价格基数 priceUnit 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "input",
  "title": "价格基数",
  "field": "priceUnit",
  "defaultValue": "1",
  "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,
  },
) {
  if (!Decimal) {
    return;
  }

  // 小数位数
  const DIGIT = 4;
  const taxRate = row.taxRate || "0";
  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  // 含税单价 price;
  const price = row.price || "";
  // 数量
  const quantity = row.quantity || "";
  // 计算当前行未税单价 netPrice
  if (taxRate && price) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      const priceUnit = row.priceUnit || "1"; // 价格基数
      const countPrice = Decimal.div(price, priceUnit);
      let taxAmount = Decimal.mul(countPrice, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }
  }

  let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
  // 汇总计算
  let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.taxAmount || "0");
  }, new Decimal(0));
  let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.netAmount || "0");
  }, new Decimal(0));
  pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
  pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}

含税单价 price 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "float",
  "title": "含税单价",
  "field": "price",
  "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 (!Decimal) {
    return;
  }

  // 小数位数
  const DIGIT = 4;
  const taxRate = row.taxRate || "0";
  const formula = Decimal.add(1, Decimal.div(taxRate, 100));
  // 含税单价 price;
  const price = row.price || "";
  // 数量
  const quantity = row.quantity || "";
  // 计算当前行未税单价 netPrice
  if (taxRate && price) {
    let netPrice = Decimal.div(price, formula);
    // 4位小数
    row.netPrice = new Decimal(netPrice).toFixed(DIGIT);
    if (quantity) {
      const priceUnit = row.priceUnit || "1"; // 价格基数
      const countPrice = Decimal.div(price, priceUnit);
      let taxAmount = Decimal.mul(countPrice, quantity);
      let netAmount = Decimal.div(taxAmount, formula);
      row.taxAmount = new Decimal(taxAmount).toFixed(DIGIT);
      row.netAmount = new Decimal(netAmount).toFixed(DIGIT);
    }
  }

  let purchaseOrderItemList = pageData.purchaseOrderItemList || [];
  // 汇总计算
  let totalTaxAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.taxAmount || "0");
  }, new Decimal(0));
  let totalNetAmount = purchaseOrderItemList.reduce((acc, row) => {
    return Decimal.add(acc, row.netAmount || "0");
  }, new Decimal(0));
  pageData.totalTaxAmount = new Decimal(totalTaxAmount).toFixed(DIGIT);
  pageData.totalNetAmount = new Decimal(totalNetAmount).toFixed(DIGIT);
}

交货地址 deliveryAddress 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "selectModal",
  "title": "交货地址",
  "field": "deliveryAddress",
  "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 {
        deliveryAddress = "",
        receiveContact = "",
        receivePhone = "",
      } = data[0] || {};

      row.deliveryAddress = deliveryAddress;
      row.receiveContact = receiveContact;
      row.receivePhone = receivePhone;
    } else {
      const {
        address = "",
        consignee = "",
        purchasePhone = "",
      } = data[0] || {};

      row.deliveryAddress = address;
      row.receiveContact = consignee;
      row.receivePhone = purchasePhone;
    }
  }
}
js
{
  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",
  selectModal: "single",
  modalParams: {},
  params: {},
  // 表行弹窗清除按钮回调
  handleAfter: function ({ row }) {
    row.deliveryAddress = "";
    row.receiveContact = "";
    row.receivePhone = "";
  },
}

退货标识 returned 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "select",
  "title": "退货标识",
  "field": "returned",
  "dictCode": "yn",
  "defaultValue": "0",
  "required": "0",
  "helpText": "0:正常交货行、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 deliveryData = pageData.purchaseOrderDeliveryPlanList;
  let rData = deliveryData.filter((rs) => row.itemNumber == rs.orderItemNumber);
  if (value == "1") {
    // 删除

    for (let i of rData) {
      for (let [j, idx] of deliveryData.entries()) {
        if (j.orderItemNumber == i.orderItemNumber) {
          deliveryData.splice(idx, 1);
          break;
        }
      }
    }
  } else {
    // 新增
    if (rData.length > 0) {
      return;
    }
    const insertTpl = {
      requireDate: row.requireDate,
      orderItemNumber: row.itemNumber,
      planDeliveryDate: row.requireDate,
      quantity: row.quantity,
      planDeliveryQuantity: row.quantity, //订单数量 = 计划交货数量
      originalPlanDeliveryDate: null,
      originalPlanDeliveryQuantity: null,
      receiveQuantity: 0,
      onWayQuantity: 0,
      deliveryQuantity: 0,
      performanceBaseDate: null,
      supplierRemark: null,
      purchaseRemark: null,
      publishStatus: "0",
      confirmStatus: "0",
      deletePlan: "0",
      close: "0",
      freeze: "0",
    };
    deliveryData.push(insertTpl);
  }
}

送货安排 jit 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "select",
  "title": "送货安排",
  "field": "jit",
  "dictCode": "deliveryArrange",
  "defaultValue": "4",
  "required": "0",
  "helpText": "订单行:供应商基于采购订单行发货; 交货计划:供应商基于交货计划发货,交货计划与订单一同确认; 送货通知:关联采购订单行的交货安排; JIT送货通知:基于采购订单所有可交货数量生成。 为空时默认为“订单行”;送货预约:供应商基于送货预约发货,确认预约才能发货"
}
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 _jit = value;
  let tableData =
    pageData.cacheDeliveryList || pageData.purchaseOrderDeliveryPlanList || [];
  if (_jit != 0 && _jit != null && tableData && tableData.length) {
    var removeData = pageData.cacheDeliveryList.filter(
      (item) => row.itemNumber == item.orderItemNumber,
    );
    tableData = tableData.filter(
      (item) => row.itemNumber != item.orderItemNumber,
    );

    if (pageData.cacheDeliveryList && pageData.cacheDeliveryList.length > 0) {
      // 删除缓存交货计划列表对应的orderItemNumber项
      removeData.forEach((delData) => {
        // 删除的项,如果带了id。则push到列表里
        if (delData.id) {
          if (pageData.cacheRemoveList) pageData.cacheRemoveList.push(delData);
        } else {
          const index = pageData.cacheAddList.findIndex(
            (v) => v._X_ROW_KEY === delData._X_ROW_KEY,
          );
          if (index > -1) {
            pageData.cacheAddList.splice(index, 1);
          }
        }
        pageData.cacheDeliveryList.forEach((deliver, i) => {
          if (delData.orderItemNumber === deliver.orderItemNumber) {
            pageData.cacheDeliveryList.splice(i, 1);
          }
        });
      });
    }
    // _self.$refs['purchaseOrderDeliveryPlanList'].loadData(tableData)
    pageData.purchaseOrderDeliveryPlanList = tableData;
  }
  if (_jit == 0) {
    const planRow = tableData.filter(
      (item) => row.itemNumber == item.orderItemNumber,
    );
    console.log("planRow", tableData, planRow);
    // jit 为否,对应交付计划没有,则创建一条
    if (planRow.length === 0) {
      let deliveryPlanItem = {
        orderItemNumber: row.itemNumber,
        requireDate: row.requireDate, // 要求交期
        planDeliveryDate: row.planDeliveryDate || row.requireDate, // 计划交期
        quantity: row.quantity, // 订单数量
        planDeliveryQuantity: row.quantity, //计划交货数量
        originalPlanDeliveryDate: null,
        originalPlanDeliveryQuantity: null,
        receiveQuantity: 0,
        onWayQuantity: 0,
        deliveryQuantity: 0,
        performanceBaseDate: null,
        supplierRemark: null,
        purchaseRemark: null,
        publishStatus: "0",
        confirmStatus: "0",
        deletePlan: "0",
        close: "0",
        freeze: "0",
      };

      pageData.purchaseOrderDeliveryPlanList &&
        pageData.purchaseOrderDeliveryPlanList.push(deliveryPlanItem);
      // 新增的,往cache列表push
      if (pageData.cacheDeliveryList)
        pageData.cacheDeliveryList =
          pageData.cacheDeliveryList.concat(deliveryPlanItem);
      if (pageData.cacheAddList)
        pageData.cacheAddList = pageData.cacheAddList.concat(deliveryPlanItem);
    }
  }
}

进度模板名称 orderProgressTemplateName 🎉

json
{
  "groupCode": "purchaseOrderItemList",
  "fieldType": "selectModal",
  "title": "进度模板名称",
  "field": "orderProgressTemplateName",
  "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 {
        orderProgressTemplateNumber = "",
        orderProgressTemplateName = "",
        orderProgressTemplateId = "",
      } = data[0] || {};

      row.orderProgressTemplateNumber = orderProgressTemplateNumber;
      row.orderProgressTemplateName = orderProgressTemplateName;
      row.orderProgressTemplateId = orderProgressTemplateId;
    } else {
      const {
        progressTemplateNumber = "",
        progressTemplateName = "",
        id = "",
      } = data[0] || {};

      row.orderProgressTemplateNumber = progressTemplateNumber;
      row.orderProgressTemplateName = progressTemplateName;
      row.orderProgressTemplateId = id;
    }
  }
}
js
{
  modalColumns: [
    {
      field: "progressTemplateNumber",
      title: "进度模板编码",
      fieldLabelI18nKey: "",
      width: 150,
    },
    {
      field: "progressTemplateName",
      title: "进度模板名称",
      fieldLabelI18nKey: "",
      width: 150,
    },
    {
      field: "applicableScope",
      title: "适用范围",
      fieldLabelI18nKey: "",
      width: 150,
    },
  ],
  modalUrl: "/progressTemplate/purchaseOrderProgressHead/list",
  selectModal: "single",
  params({ pageData, userInfo }) {
    return {
      progressTemplateStatus: "1",
    };
  },
  modalParams(Vue, form, row) {
    return {
      progressTemplateStatus: "1",
    };
  },
  mobileModalParams(Vue, { _pageData, _cacheAllData }) {},
  handleAfter: function ({ row }) {
    row.orderProgressTemplateName = "";
    row.orderProgressTemplateNumber = "";
  },
}