(kintone)changeeventの重複について
解決したいこと
依頼元コードコピーフィールドチェンジ(通常フィールド)
⇒商品コードコピーフィールドチェンジ(サブテーブルフィールド)
で操作を進めると、依頼元コードチェンジから数秒待たないと商品コードチェンジイベント内の処理で容器マスタ・特殊マスタから値を取ってこれないです。
どなたか助けてほしいです。
該当するソースコード
//15_特殊率取得・容器取得
(function () {
("use strict");
// フィールドコード
let customerCopyFieldCode = "依頼元コピー";
let itemCopyFieldCode = "商品コードコピー";
let deliveryDateFieldCode = "納品予定日";
let tableFieldCode = "テーブル";
let orderQuantityFieldCode = "数量";
let specialRateFieldCode = "特殊掛け率";
// アプリID
const currentapp = kintone.app.getId();
let specialRateMasterAppID = currentapp === 265 ? 261 : 50;
let containerMasterAppID = currentapp === 265 ? 257 : 46;
let specialRateOptionFieldCode = "特殊掛け率設定";
let containerQuantityFieldCode = "数量";
// 全レコードを保持する変数
let allSpecialRateRecords = [];
let allContainerRecords = [];
// 前回の値を保持するためのオブジェクト
let previousItemCodeMap = {};
// Kintone REST API Client
const client = new KintoneRestAPIClient();
// 特殊掛け率マスタの中から該当するレコードを検索する関数
function searchSpecialRateRecord(
customerCode,
itemCode,
deliveryDate,
allSpecialRateRecords
) {
for (let j = 0; j < allSpecialRateRecords.length; j++) {
let masterRecord = allSpecialRateRecords[j];
let masterCustomerCode = masterRecord["依頼元コード"].value;
let masterItemCode = masterRecord["商品コード"].value;
let startDate = masterRecord["適用開始日"].value;
let endDate = masterRecord["適用終了日"].value;
if (
customerCode === masterCustomerCode &&
itemCode === masterItemCode &&
startDate &&
endDate &&
deliveryDate
) {
if (startDate <= deliveryDate && endDate >= deliveryDate) {
return masterRecord[specialRateOptionFieldCode].value;
}
}
}
return null;
}
// 容器持ち出しマスタの中から該当するレコードを検索する関数
function searchContainerRecord(
customerCode,
itemCode,
deliveryDate,
allContainerRecords
) {
for (let k = 0; k < allContainerRecords.length; k++) {
let containerMasterRecord = allContainerRecords[k];
let containerMasterCustomerCode =
containerMasterRecord["依頼元コード"].value;
let containerMasterItemCode = containerMasterRecord["商品コード"].value;
let containerStartDate = containerMasterRecord["適用開始日"].value;
let containerEndDate = containerMasterRecord["適用終了日"].value;
if (
customerCode === containerMasterCustomerCode &&
itemCode === containerMasterItemCode &&
deliveryDate &&
containerStartDate &&
containerEndDate
) {
if (
containerStartDate <= deliveryDate &&
containerEndDate >= deliveryDate
) {
return containerMasterRecord[containerQuantityFieldCode].value;
}
}
}
return null;
}
// 特殊掛け率をセットする関数
function setValue(record, index, specialRateValue) {
if (specialRateValue !== null) {
// 受注管理アプリの特殊掛け率フィールドに特殊掛け率の値をセット
record[tableFieldCode].value[index].value[specialRateFieldCode].value =
specialRateValue;
} else {
// 該当レコードが見つからなかった場合、特殊掛け率フィールドの値をクリア
record[tableFieldCode].value[index].value[specialRateFieldCode].value =
null;
}
}
function setQuantityValue(record, index, quantityValue) {
// 基本条件判定用フラグ
const hasMatchingData = quantityValue !== null;
// 合致データなし
if (!hasMatchingData) return;
// 合致データあり
if (hasMatchingData) {
record[tableFieldCode].value[index].value[orderQuantityFieldCode].value =
quantityValue;
}
}
// 依頼元コピー・物品コードコピー・納品予定日からレコードを検索し、特殊掛け率と数量をセットする関数
function processTableRecord(
record,
index,
currentItemCode,
allSpecialRateRecords,
allContainerRecords,
onlySetQuantityValue
) {
// 依頼元コピー・物品コードコピー・納品予定日を取得
let customerCode = record[customerCopyFieldCode].value;
let itemCode = currentItemCode;
let deliveryDate = record[deliveryDateFieldCode].value;
// 特殊掛け率マスタの中から該当するレコードを検索
let specialRateValue = searchSpecialRateRecord(
customerCode,
itemCode,
deliveryDate,
allSpecialRateRecords
);
// 容器持ち出しマスタの中から該当するレコードを検索
let quantityValue = searchContainerRecord(
customerCode,
itemCode,
deliveryDate,
allContainerRecords
);
setValue(record, index, specialRateValue);
setQuantityValue(record, index, quantityValue);
}
// テーブルの変更イベントのトリガー(依頼元コードか納品予定日が変更された場合)
kintone.events.on(
[
"app.record.edit.change." + customerCopyFieldCode,
"app.record.create.change." + customerCopyFieldCode,
//2回目以降、注文情報の数量が置き換わってしまうため、コメントアウト 2024.9.12(西松)
//"app.record.edit.change." + deliveryDateFieldCode,
//"app.record.create.change." + deliveryDateFieldCode,
],
function (event) {
//↓このように即時関数で実行すればエラーになりません。
(async () => {
//特殊掛け率マスタ~
// const customerCode = event.record[customerCopyFieldCode].value;
//const specialRatequery = `依頼元コード = ${customerCode}`;
//allSpecialRateRecords = [];
allSpecialRateRecords = await client.record.getAllRecords({
app: specialRateMasterAppID,
//condition: specialRatequery,
});
console.log(allSpecialRateRecords);
})();
//↓このように即時関数で実行すればエラーになりません。
(async () => {
//容器持ち出しマスタ~
// const customerCode = event.record[customerCopyFieldCode].value;
//const specialRatequery = `依頼元コード = ${customerCode}`;
//allContainerRecords = [];
allContainerRecords = await client.record.getAllRecords({
app: containerMasterAppID,
//condition: specialRatequery,
});
console.log(allContainerRecords);
})();
// サブテーブル内の各行に対して処理を実行
for (let i = 0; i < event.record[tableFieldCode].value.length; i++) {
// 物品コードコピーを取得
let currentItemCode =
event.record[tableFieldCode].value[i].value[itemCopyFieldCode].value;
// 依頼元コピー・物品コードコピー・納品予定日からレコードを検索し、特殊掛け率と数量をセット
processTableRecord(
event.record,
i,
currentItemCode,
allSpecialRateRecords,
allContainerRecords
);
}
// レコードを返却
return event;
}
);
// テーブルの変更イベントのトリガー(商品コードが変更された場合)
kintone.events.on(
[
"app.record.edit.change." + itemCopyFieldCode,
"app.record.create.change." + itemCopyFieldCode,
],
function (event) {
// サブテーブル内の物品コードが変化した行に対して処理を実行
let tableFieldValue = event.record[tableFieldCode].value || []; // テーブルが存在しない場合は空の配列を使用
for (let i = 0; i < tableFieldValue.length; i++) {
// 前回の値を取得
let previousItemCode = previousItemCodeMap[i];
// 現在の値を取得
let currentItemCode = tableFieldValue[i].value[itemCopyFieldCode].value;
// 物品コードコピーが変更されたかをチェック
if (previousItemCode !== currentItemCode) {
// console.log('物品コードコピーが変更されました。行: ' + (i + 1)); //デバッグ用の行なので削除しても問題ない
// 以前の値を更新
previousItemCodeMap[i] = currentItemCode;
processTableRecord(
event.record,
i,
currentItemCode,
allSpecialRateRecords,
allContainerRecords
//true
);
}
}
return event;
}
);
})();
0 likes