/**   * 职责链模式   */  export class Chain {    constructor(fn) {      this.fn = fn      this.successor = null    }      setNextSuccessor(successor) {      return (this.successor = successor)    }      async passRequest() {      const res = await this.fn.apply(this, arguments)      if (res === 'nextSuccessor' && this.successor) {        return await this.successor.passRequest.apply(this.successor, arguments)      }      return res    }  }  /**   * 应用职责链模式进行保留前的校验   * @param {Object} data 须要校验的数据   */  async function validate(data) {    // 校验:小计金额最大值限度    function validateAmountMax() {      const index = data.findIndex((item) => item.Amount >= 99999999)      if (index > -1) {        return new Promise((resolve) => {          const modal = Modal.confirm({            title: '提醒',            content: '小计金额不能超过99999999',            icon: createVNode(ExclamationCircleOutlined),            okText: '确定',            cancelText: createVNode(),            async onOk() {              nextTick(() => modal.destroy())              resolve(false)            }          })        })      }      return 'nextSuccessor'    }    // 校验:洽购价格是否高于加权平均价    function validateInPriceHigherThanAutoPrice() {      // 判断洽购设置中是否启用了:“洽购价格高于加权平均价时,进行提醒”,如果启用了,      // 当存在某一商品的洽购价格高于加权平均价时,弹框提醒      if (purchaseSettings.value.InPriceHigherThanAutoPrice == 'Y') {        const needTip = data.some((item) => item.Price > item.CostPrice)                if (needTip) {          return new Promise((resolve) => {            const modal = Modal.confirm({              title: '确认',              content: '存在商品的以后价格高于加权平均价,是否持续保留?',              icon: createVNode(ExclamationCircleOutlined),              okText: '确定',              cancelText: '勾销',              async onOk() {                nextTick(() => modal.destroy())                resolve('nextSuccessor')              },              async onCancel() {                nextTick(() => modal.destroy())                resolve(false)              }            })          })        }      }      return 'nextSuccessor'    }    // 校验:生鲜商品容许价格高于商品档案进价    function validateFreshAllowInPriceHigherThanItemPrice() {      // 洽购设置中不启用:“生鲜商品容许价格高于商品档案进价”,那么当一个商品为生鲜商品,      // 且价格高于档案进价时,弹框提醒      if (purchaseSettings.value.FreshAllowInPriceHigherThanItemPrice == 'N') {        const needTip = data.some((item) => item.IsFresh && item.Price > item.PurcPrice)        if (needTip) {          return new Promise((resolve) => {            const modal = Modal.confirm({              title: '提醒',              content: '洽购设置设置了不容许生鲜商品价格高于商品档案进价,请从新输出价格!',              icon: createVNode(ExclamationCircleOutlined),              okText: '确定',              cancelText: createVNode(),              async onOk() {                nextTick(() => modal.destroy())                resolve(false)              }            })          })        }      }      return true    }    // 将三个校验函数包装成职责链节点    const valAmount = new Chain(validateAmountMax)    const valCostPrice = new Chain(validateInPriceHigherThanAutoPrice)    const valFresh = new Chain(validateFreshAllowInPriceHigherThanItemPrice)    // 指定节点在职责链中的程序    valAmount.setNextSuccessor(valCostPrice).setNextSuccessor(valFresh)    // 把申请传递给第一个节点    return await valAmount.passRequest()  }  // 保留  async function save(data) {    if (!(await validate(data))) return false    // ....... 调接口进行保留  }