Một bài toán xử lý bất đồng bộ trong kintone để lấy số requet quá giới hạn (OK)
Last updated
Last updated
Bài toán được đặt ra: Mỗi lần Request Tối đa của kintone chỉ được 500 records; vậy nếu trong bảng có khoảng 800 dòng dữ liệu vậy phải làm gì để có thể đọc hết được 🤣🤣🤣
Lời giải: Chúng ta dùng cơ chế bất đồng bộ cộng thêm với hàm Đệ quy (hàm lồng trong)
// == console.log(resp); Fech Lần 1 được 2 kết quả.
{
"records": [{
"水槽": {
"type": "SINGLE_LINE_TEXT",
"value": "テスト水槽"
},
"更新者": {
"type": "MODIFIER",
"value": {
"code": "t.pham@tiahgroup.com",
"name": "Tuong"
}
},
"作成者": {
"type": "CREATOR",
"value": {
"code": "t.pham@tiahgroup.com",
"name": "Tuong"
}
},
"魚種": {
"type": "DROP_DOWN",
"value": "トラフグ"
},
"ロット日付": {
"type": "DATE",
"value": "2022-02-16"
},
"原価": {
"type": "NUMBER",
"value": "1"
},
"出荷済み原価": {
"type": "NUMBER",
"value": "1"
},
"選別元ID": {
"type": "RECORD_NUMBER",
"value": "6"
},
"$revision": {
"type": "__REVISION__",
"value": "7"
},
"更新日時": {
"type": "UPDATED_TIME",
"value": "2022-03-18T04:35:00Z"
},
"選別日": {
"type": "DATE",
"value": "2022-02-18"
},
"斃死数": {
"type": "NUMBER",
"value": "1"
},
"終了フラグ": {
"type": "CHECK_BOX",
"value": []
},
"作業者1": {
"type": "SINGLE_LINE_TEXT",
"value": "河原 邦正"
},
"出荷数": {
"type": "NUMBER",
"value": "1"
},
"ロットID": {
"type": "NUMBER",
"value": ""
},
"尾数": {
"type": "NUMBER",
"value": "1"
},
"水槽ID": {
"type": "NUMBER",
"value": "1"
},
"作成日時": {
"type": "CREATED_TIME",
"value": "2022-03-18T04:27:00Z"
},
"棟": {
"type": "SINGLE_LINE_TEXT",
"value": "A"
},
"$id": {
"type": "__ID__",
"value": "6"
}
}, {
"水槽": {
"type": "SINGLE_LINE_TEXT",
"value": "テスト水槽"
},
"更新者": {
"type": "MODIFIER",
"value": {
"code": "t.pham@tiahgroup.com",
"name": "Tuong"
}
},
"作成者": {
"type": "CREATOR",
"value": {
"code": "t.pham@tiahgroup.com",
"name": "Tuong"
}
},
"魚種": {
"type": "DROP_DOWN",
"value": "トラフグ"
},
"ロット日付": {
"type": "DATE",
"value": "2022-02-10"
},
"原価": {
"type": "NUMBER",
"value": "0"
},
"出荷済み原価": {
"type": "NUMBER",
"value": ""
},
"選別元ID": {
"type": "RECORD_NUMBER",
"value": "5"
},
"$revision": {
"type": "__REVISION__",
"value": "6"
},
"更新日時": {
"type": "UPDATED_TIME",
"value": "2022-03-18T04:26:00Z"
},
"選別日": {
"type": "DATE",
"value": "2022-02-14"
},
"斃死数": {
"type": "NUMBER",
"value": ""
},
"終了フラグ": {
"type": "CHECK_BOX",
"value": []
},
"作業者1": {
"type": "SINGLE_LINE_TEXT",
"value": "河原 邦正"
},
"出荷数": {
"type": "NUMBER",
"value": ""
},
"ロットID": {
"type": "NUMBER",
"value": "1"
},
"尾数": {
"type": "NUMBER",
"value": "12"
},
"水槽ID": {
"type": "NUMBER",
"value": "1"
},
"作成日時": {
"type": "CREATED_TIME",
"value": "2022-02-21T07:41:00Z"
},
"棟": {
"type": "SINGLE_LINE_TEXT",
"value": "A"
},
"$id": {
"type": "__ID__",
"value": "5"
}
}],
"totalCount": null
}
// == console.log(resp); Fech Lần 2 được 1 kết quả.
{
"records": [{
"水槽": {
"type": "SINGLE_LINE_TEXT",
"value": ""
},
"更新者": {
"type": "MODIFIER",
"value": {
"code": "yamashita",
"name": "山下"
}
},
"作成者": {
"type": "CREATOR",
"value": {
"code": "yamashita",
"name": "山下"
}
},
"魚種": {
"type": "DROP_DOWN",
"value": "トラフグ"
},
"ロット日付": {
"type": "DATE",
"value": "2022-02-10"
},
"原価": {
"type": "NUMBER",
"value": ""
},
"出荷済み原価": {
"type": "NUMBER",
"value": ""
},
"選別元ID": {
"type": "RECORD_NUMBER",
"value": "1"
},
"$revision": {
"type": "__REVISION__",
"value": "1"
},
"更新日時": {
"type": "UPDATED_TIME",
"value": "2022-02-10T02:28:00Z"
},
"選別日": {
"type": "DATE",
"value": "2022-02-10"
},
"斃死数": {
"type": "NUMBER",
"value": ""
},
"終了フラグ": {
"type": "CHECK_BOX",
"value": []
},
"作業者1": {
"type": "SINGLE_LINE_TEXT",
"value": ""
},
"出荷数": {
"type": "NUMBER",
"value": ""
},
"ロットID": {
"type": "NUMBER",
"value": "1"
},
"尾数": {
"type": "NUMBER",
"value": "100"
},
"水槽ID": {
"type": "NUMBER",
"value": ""
},
"作成日時": {
"type": "CREATED_TIME",
"value": "2022-02-10T02:28:00Z"
},
"棟": {
"type": "SINGLE_LINE_TEXT",
"value": "A"
},
"$id": {
"type": "__ID__",
"value": "1"
}
}],
"totalCount": null
}
Code xử lý
function fetch(app_id, opt_query, opt_offset, opt_records) {
var offset = opt_offset || 0;
var records = opt_records || [];
var query = opt_query || '';
var id = app_id || kintone.app.getId();
var params = {
app: id,
query: query + ' limit 2 offset ' + offset
};
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
console.log(resp);
records = records.concat(resp.records);
if (resp.records.length === 2) {
return fetch(id, query, offset + 2, records);
}
return records;
});
}
Toàn bộ code: https://gbalb-demo.cybozu.com/k/admin/app/3412/plugin/config?pluginId=fdeplpmkengkldpdlaiegpokgmaabkkb
(function() {
"use strict";
function fetch(app_id, opt_query, opt_offset, opt_records) {
var offset = opt_offset || 0;
var records = opt_records || [];
var query = opt_query || '';
var id = app_id || kintone.app.getId();
var params = {
app: id,
query: query + ' limit 2 offset ' + offset
};
return kintone.api('/k/v1/records', 'GET', params).then(function(resp) {
console.log(resp);
records = records.concat(resp.records);
if (resp.records.length === 2) {
return fetch(id, query, offset + 2, records);
}
return records;
});
}
const appGetData = 3411;
kintone.events.on(['app.record.create.show', 'app.record.edit.show', ], function(event) {
if (document.getElementById('button-get') != null) {
return;
}
var button = document.createElement('button');
button.id = "button-get";
button.className = "gaia-ui-actionmenu-save";
button.innerHTML = '清算作成';
var all = document.getElementsByClassName("gaia-ui-actionmenu-save");
button.onclick = async function() {
var tedestatement = [];
var obj = kintone.app.record.get();
var d = new Date(obj.record.給餌日.value);
var day = d.getDate();
var new_day = day - 50;
d.setDate(new_day);
var datap = moment(d).format('YYYY-MM-DD');
const resp = await fetch(appGetData, 'ロット日付 > "' + String(datap) + '" and ロット日付 <= "' + String(obj.record.給餌日.value) + '" and 棟 = "' + obj.record.棟.value + '" and 終了フラグ not in ("終了") ').then(function(records) {
return records;
});
resp.forEach(function(rcord, index) {
var {
水槽: { value: 水槽 },
更新者: { value: 更新者 },
作成者: { value: 作成者 },
魚種: { value: 魚種 },
ロット日付: { value: ロット日付 },
原価: { value: 原価 },
尾数: { value: 尾数 },
出荷済み原価: { value: 出荷済み原価 },
選別元ID: { value: 選別元ID },
更新日時: { value: 更新日時 },
選別日: { value: 選別日 },
斃死数: { value: 斃死数 },
終了フラグ: { value: 終了フラグ },
出荷数: { value: 出荷数 },
ロットID: { value: ロットID },
作成日時: { value: 作成日時 },
棟: { value: 棟 },
$id: { value: $id }
} = rcord;
tedestatement.push({
"value": {
"水槽": {
"type": "SINGLE_LINE_TEXT",
"value": 水槽
},
"水槽ID": {
"type": "NUMBER",
"value": undefined
},
"魚種": {
"type": "SINGLE_LINE_TEXT",
"value": 魚種
},
"ロット日付": {
"type": "DATE",
"value": ロット日付
},
"尾数": {
"type": "NUMBER",
"value": 尾数
},
"数量": {
"type": "NUMBER",
"value": undefined
},
"単価": {
"type": "NUMBER",
"value": undefined
},
"金額": {
"type": "CALC",
"value": undefined
},
"餌ID": {
"type": "NUMBER",
"value": undefined
},
"選別ID": {
"type": "NUMBER",
"value": 選別元ID
},
"ロットID": {
"type": "NUMBER",
"value": ロットID
},
"餌": {
"type": "SINGLE_LINE_TEXT",
"value": ""
}
},
});
});
obj.record.給餌テーブル.value = tedestatement;
kintone.app.record.set(obj);
}
kintone.app.record.getSpaceElement('space').appendChild(button);
});
kintone.events.on(["app.record.create.submit.success", "app.record.edit.submit.success"], function(event) {
const record = event.record;
var table = record.給餌テーブル.value;
var bodyPut = {
app: appGetData,
records: []
};
table.forEach(function(element) {
if (element.value.選別ID.value) {
let item = {
id: element.value.選別ID.value,
record: {
原価: { value: element.value.金額.value }
}
};
bodyPut.records.push(item);
}
});
kintone.api(kintone.api.url('/k/v1/records.json', true), 'PUT', bodyPut, function(resp) {
// success
}, function(error) {
// error
console.log(error);
});
});
})();