职责链模式在项目中的运用
/**
* 职责链模式
*/
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
// ....... 调接口进行保存
}
版权声明
本文仅代表作者观点,不代表博信信息网立场。