业务逻辑:比如说用户还款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)
精简到这步,再增加账户加下配置项即可,公共方法就不用再动了。