需求规划
【下推收款单】:
1 审核通过的应收单才允许关联收款单,支持选择多行合并选单,生成收款单需要后台重复校验,记录选单次数和金额,后台记录可推收款单金额(剩余金额)=总金额-(对应核销明细的核销金额+已推收款单金额);
(选单规则:
1.过滤同一个销售公司,
2. 同一家客户;
3.判断选择明细行是否都满足剩余金额大于0,核销状态为未核销或者部分核销;
4.判断选择明细行单据状态是否为审核通过;
5.判断应收单是否同一币种;
6.判断应收单类型是否相同;)
如果不满足以上要求,给出错误提示,要求重新选择明细数据;
这些需求其实就是对查询页,进行数据按钮操作时的校验,只不过是真的比较多。以前写过,用的方法是很简单的那种for循环遍历,然后进行push()方法数组。今天在此优化一下。
handlePushPayment = async (keys, rows) => {
console.log(keys, rows); // 这种判断多项的一看就是支持多选的其概况,假设我们目前已经选中了第一条和第二条数据,其实就是对后台返回的data数据进行循环遍历比较每一项的值。
// 判断是否选中,没有选中直接return掉。
if (rows.length == 0) return;
const firstRow = rows[0]; // 定义一个常量,接收选中的第一条数据作为基值。
const checkFieldObj = { // 定义一个对象来接收要比较的那几条条件值进行对比。
ouId: '销售公司',
kehu: '客户',
currCode: '币种',
apTypeId: '应收单类型'
};
let errStr = ''; // 定义一个错误信息提示的变量,因为判断条件比较多,没不满足的时候都要进行提示。
// Object.keys()方法会返回一个由一个给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和用for ... in 循环遍历该对象时返回的顺序一致。如果对象的键-值都不可枚举,那将返回由键组成的数组。
// 也就是说 Object.keys()成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键名。 下边有例子
let checkFields = Object.keys(checkFieldObj);
for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
const row = rows[rowIndex];
if (row.verifyState == 'weihexiao' || row.verifyState == 'bufenbexiao') {
errStr = `选择行核销状态必须为【未核销或者部分核销】,请重新选择`;
break;
}
if (row.orderState !== 'COMPLETE') {
errStr = `选择行单据状态为必须为【审核通过】,请重新选择`;
break;}
if (rowIndex !== 0) {
for (
let checkFieldIndex = 0;
checkFieldIndex < checkFields.length;
checkFieldIndex++
) {
const key = checkFields[checkFieldIndex];
const name = checkFieldObj[key];
if (row[key] !== firstRow[key]) {
errStr = `选择行项的${name}必须一致,请重新选择`;
break;
}
}
if (errStr) {
break;
}
}
}
if (errStr) {
ElNotification({
type: 'error',
message: errStr
});
} else {
this.setState({
createPayModalVisible: true, // 下推弹框显示
createPayModalParams: {
ids: keys
}
});
}
};
例子
1 传入对象,返回属性名
var data={a:1,b:2,c:9,d:4,e:5};
console.log(Object.keys(data));//["a", "b", "c", "d", "e"]
Object.keys(data).map((key,item)=>{
console.log(key,data[key]);//key=>属性名 data[key]=>属性值
});
2 传入字符串,返回索引
var str = 'ab1234';
console.log(Object.keys(str )); //[0,1,2,3,4,5]
3 传入数组 返回索引
var arr = [“a”, “b”, “c”];
console.log(Object.keys(arr)); // console: [“0”, “1”, “2”]
4 构造函数 返回空数组或者属性名
function Pasta(name, age, gender) {
this.name = name;
this.age = age;
this.gender = gender;
this.toString = function () {
return (this.name + ", " + this.age + ", " + this.gender);
}
}
console.log(Object.keys(Pasta)); //console: []
var spaghetti = new Pasta("Tom", 20, "male");
console.log(Object.keys(spaghetti)); //console: ["name", "age", "gender", "toString"]
扩展
Object.values() ; Object.entries()
Object.values方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值。
Object.entries方法返回一个数组,成员是参数对象自身的(不含继承的)所有可遍历( enumerable )属性的键值对数组。