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
Was this helpful?
Last updated
Was this helpful?
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);
});
});
})();