一种场景的优雅处理方式

业务逻辑:比如说用户还款100元,有a、b、c3个账户要换。

若用户的账户类型a,3个账户的优先级是a>b>c,先还a,还了还有的多,再还b,依次类推。。。

若用户的账户类型b,3个账户的优先级是b>a>c,先还b,还了还有的多,再还a,依次类推。。。

若用户的账户类型c,3个账户的优先级是c>a>b,先还c,还了还有的多,再还a,依次类推。。。

后面账户增加了,变成a、b、c、d了,要能优雅的扩展。

之前是单个判断的,把我搞晕了,来看下之前3个账户的代码:

/* 比较实收金额和账户金额
amount: 用户还款金额
curAccountType:用户账户类型
*/
var amount = 90
var a = 20
var b = 100
var c = 10
var curAccountType = 'c'
var curAccount = ''
switch (curAccountType) {
    case 'a':
        curAccount = a
        break
    case 'b':
        curAccount = b
        break
    case 'c':
        curAccount = c
        break
}
if (amount > curAccount) {
    if (amount > (a + b + c)) {
        tip = '用户还款账户余额不足,请先登帐后再申请!'
    } else {
        var cDis = amount - a - b
        var bDis = amount - a - c
        var disAmount = ''
        var disTip = ''
        if (curAccountType === 'a') {
            disAmount = amount - a
            if (amount <= a + b) {
                disTip = 'b类账户划拨' + disAmount + '元'
            } else {
                disTip = 'b类账户划拨' + b + '元<br/>c类账户划拨' + cDis + '元'
            }
        } else if (curAccountType === 'b') {
            disAmount = amount - b
            if (amount <= a + b) {
                disTip = 'a类账户划拨' + disAmount + '元'
            } else {
                disTip = 'a类账户划拨' + a + '元<br/>c类账户划拨' + cDis + '元'
            }
        } else if (curAccountType === 'c') {
            disAmount = amount - c
            if (amount <= a + c) {
                disTip = 'a类账户划拨' + disAmount + '元'
            } else {
                disTip = 'a类账户划拨' + a + '元<br/>b类账户划拨' + bDis+ '元'
            }
        }
        tip = '当前用户账户销账余额不足,是否划拨其他账户余额' + disAmount + '元,用于本笔申请单销账?<br/>' + disTip
    }
} else {
    tip = '确认实收金额' + amount + '元?';
}
alert(tip)

老代码未抽出公共方法,当新增d账户时很难维护。再来看下修改后的新代码:

/* 比较实收金额和账户金额
amount: 用户还款金额
curAccountType:用户账户类型
orderArr: 账户类型对应的账户金额优先级数组
orderArrName: 账户类型优先级数组
*/
var amount = 140
var a = 20
var b = 100
var c = 10
var d = 30
var curAccountType = 'c'
var curAccount = ''
var orderArr = []
var orderArrName = []
var account = {
    'a': {
        'key': 'a',
        'text': 'a类'
    },
    'b': {
        'key': 'b',
        'text': 'b类'
    },
    'c': {
        'key': 'c',
        'text': 'c类'
    },
    'd': {
        'key': 'd',
        'text': 'd类'
    }
}
switch (curAccountType) {
    case 'a':
        curAccount = a
        orderArrName = ['a', 'b', 'c', 'd']
        orderArr = [a, b, c, d]
        break
    case 'b':
        curAccount = b
        orderArrName = ['b', 'a', 'c', 'd']
        orderArr = [b, a, c, d]
        break
    case 'c':
        curAccount = c
        orderArrName = ['c', 'a', 'b', 'd']
        orderArr = [c, a, b, d]
        break
    case 'd':
        curAccount = d
        orderArrName = ['d', 'a', 'b', 'c']
        orderArr = [d, a, b, c]
        break
}
if (amount > curAccount) {
    if (amount > (a + b + c + d)) {
        tip = '用户还款账户余额不足,请先登帐后再申请!'
    } else {
        var disTip = ''
        var disAmount = amount - orderArr[0]
        if (amount > orderArr[0] + orderArr[1] + orderArr[2]) {
            disTip = account[orderArrName[1]].text + '账户划拨' + orderArr[1] + '元<br/>' + account[orderArrName[2]].text + '账户划拨' + orderArr[2] + '元<br/>' + account[orderArrName[3]].text + '账户划拨' + (amount - orderArr[0] - orderArr[1] - orderArr[2]) + '元'
        } else if (amount > orderArr[0] + orderArr[1]) {
            disTip = account[orderArrName[1]].text + '账户划拨' + orderArr[1] + '元<br/>' + account[orderArrName[2]].text + '账户划拨' + (amount - orderArr[0] - orderArr[1]) + '元'
        } else {
            disTip = account[orderArrName[1]].text + '账户划拨' + (amount - orderArr[0]) + '元'
        }
        tip = '当前用户账户销账余额不足,是否划拨其他账户余额' + disAmount + '元,用于本笔申请单销账?<br/>' + disTip
    }
} else {
    tip = '确认实收金额' + amount + '元?';
}
alert(tip)

仔细观察公共方法,发现还可以再抽象,数组的长度可以通过length获取,再次修改代码如下:

/* 比较实收金额和账户金额
amount: 用户还款金额
curAccountType:用户账户类型
orderArr: 账户类型对应的账户金额优先级数组
orderArrName: 账户类型优先级数组
*/
var amount = 140
var a = 20
var b = 100
var c = 10
var d = 30
var curAccountType = 'c'
var curAccount = ''
var orderArr = []
var orderArrName = []
var tip = ''
var account = {
    'a': {
        'key': 'a',
        'text': 'a类'
    },
    'b': {
        'key': 'b',
        'text': 'b类'
    },
    'c': {
        'key': 'c',
        'text': 'c类'
    },
    'd': {
        'key': 'd',
        'text': 'd类'
    }
}
switch (curAccountType) {
    case 'a':
        curAccount = a
        orderArrName = ['a', 'b', 'c', 'd']
        orderArr = [a, b, c, d]
        break
    case 'b':
        curAccount = b
        orderArrName = ['b', 'a', 'c', 'd']
        orderArr = [b, a, c, d]
        break
    case 'c':
        curAccount = c
        orderArrName = ['c', 'a', 'b', 'd']
        orderArr = [c, a, b, d]
        break
    case 'd':
        curAccount = d
        orderArrName = ['d', 'a', 'b', 'c']
        orderArr = [d, a, b, c]
        break
}
// 数组项求和
var sum = function(i) {
    return orderArr.slice(0, i).reduce(function(prev, next) {
        return prev + next
    })
}
if (amount > curAccount) {
    if (amount > sum(orderArr.length)) {
        tip = '用户还款账户余额不足,请先登帐后再申请!'
    } else {
        var disTip = ''
        var disAmount = amount - orderArr[0]
        // 从数组倒数第二项开始循环,符合条件即跳出循环
        for (var i = orderArr.length - 1; i > 0; i--) {
            if (amount > sum(i)) {
                for (k = 1; k < i; k++) {
                    disTip += account[orderArrName[k]].text + '账户划拨' + orderArr[k] + '元<br/>'
                }
                disTip += account[orderArrName[i]].text + '账户划拨' + (amount - sum(i)) + '元'
                break
            }
        }
        tip = '当前用户账户销账余额不足,是否划拨其他账户余额' + disAmount + '元,用于本笔申请单销账?<br/>' + disTip
    }
} else {
    tip = '确认实收金额' + amount + '元?';
}
alert(tip)

精简到这步,再增加账户加下配置项即可,公共方法就不用再动了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值