Một bài toán xử lý bất đồng bộ trong kintone để lấy số requet quá giới hạn (OK)

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);
		});
	});
})();

Last updated