update process

This commit is contained in:
2025-09-15 09:47:59 +08:00
parent 1d06e25626
commit c5cf6c0c22
48 changed files with 163 additions and 59 deletions

View File

@@ -0,0 +1,207 @@
class Link2Handler {
constructor(headerSpace) {
const elements = createBtnGroupArea('link-2-action-area', '2歳以上日誌データ連携', this.handleLink, {
btnElId: 'link-2-btn',
yearElId: 'link-2-year',
monthElId: 'link-2-month',
dateElId: 'link-2-date',
defaultThisMonth: true,
})
if (!elements) {
return;
}
headerSpace.appendChild(elements['link-2-action-area']);
}
handleLink = async (e, { year, month, date }) => {
loading(true, '日誌データ連携中...');
showError(false);
const api = new KintoneRestAPIClient();
const dateString = getFormatDateString(year, month, date)
// 本アプリからデータを読み取る
const currentAppRecords = await this.getRecords(api, dateString);
if (!currentAppRecords) {
// エラー
loading(false);
return;
}
const groupedRecords = this.groupingAndSort(currentAppRecords);
const records = [];
for (const item of groupedRecords) {
records.push(this.generateRecord(dateString, item));
}
const result = await this.insertOrUpdateData(api, records, dateString);
if (result) {
// showSuccess(true, "日誌データ連携作成完了");
this.showSuccessDialog(result, year, month, date);
}
loading(false);
}
showSuccessDialog(result, year, month, date) {
const dateString = year + '年' + month + '月' + date + '日';
const contentEl = document.createElement('div');
contentEl.style.fontSize = '16px';
if (!result.size) {
contentEl.innerHTML = `${dateString}の園児別テーブルに追加するデータはありませんでした。`;
} else if (!result.insert) {
contentEl.innerHTML = `${dateString}の園児別テーブルに${result.size}件のデータを再作成しました。`;
} else if (!result.update) {
contentEl.innerHTML = `${dateString}の日誌は生成しましたが、園児別テーブルに${result.size}件のデータを追加しました。`;
} else {
contentEl.innerHTML = `${dateString}${result.update}人の園児の日誌を更新し、${result.insert}人の園児の日誌を新規作成しました。`
}
showDialog({
title: '日誌データ連携作成完了',
content: contentEl,
ok: 'アプリへ行く',
cancel: '閉じる',
dataHolder: result,
onOk: () => { window.open(`${location.origin}/k/${env["2歳以上日誌出力用"].appId}/`) },
});
}
getRecords = async (api, dateString) => {
try {
return await api.record.getAllRecordsWithId({
app: env["園児別出欠簿入力"].appId,
fields: ['クラス', '学年', "園児名", "園での様子_伝達事項", "評価反省"],
condition: `学年 not in ("", "0歳児", "1歳児") and 登園日 = "${dateString}"`
});
} catch (e) {
showError(true, '本アプリのデータ読み取りエラー\n - ' + e);
loading(false);
}
}
groupingAndSort = (data) => {
const groupedByGrade = {};
// 1. group by 学年
data.forEach((record) => {
const grade = record['学年'].value;
if (!groupedByGrade[grade]) {
groupedByGrade[grade] = [];
}
groupedByGrade[grade].push(record);
});
// 2. sort by クラス
const classOrder = {};
classItems.forEach((item, index) => {
classOrder[item.value] = index;
});
for (const grade in groupedByGrade) {
groupedByGrade[grade].sort((a, b) => {
return classOrder[a["クラス"].value] - classOrder[b["クラス"].value];
});
}
// 3. return a list
return termItems.reduce((acc, term) => {
const grade = term.value;
// Skip 0歳児 and 1歳児
if (grade === "0歳児" || grade === "1歳児") {
return acc;
}
acc.push({
grade: grade,
items: groupedByGrade[grade] || []
});
return acc;
}, []);
}
generateRecord = (todayString, groupedRecords) => {
return {
'登園日': { 'value': todayString },
'学年': { 'value': groupedRecords.grade },
'園児別テーブル': {
'value': groupedRecords.items.map((record) => {
return {
'value': {
'クラス名': { 'value': record['クラス'].value },
'名前': { 'value': record['園児名'].value },
'子どもの様子': { 'value': record['園での様子_伝達事項'].value },
'反省評価_園児別テーブル': { 'value': record['評価反省'].value },
}
}
})
}
};
}
insertOrUpdateData = async (api, records, dateString) => {
const results = [];
const generatedRecords = await api.record.getAllRecordsWithId({
app: env["2歳以上日誌出力用"].appId,
fields: ["$id", "学年"],
condition: `登園日 = "${dateString}"`
})
const existIdMap = generatedRecords.reduce((map, item) => {
const grade = item['学年'].value;
const id = item['$id'].value;
map[grade] = id;
return map;
}, {});
for (const record of records) {
try {
const generatedRecordId = existIdMap[record["学年"].value];
const param = {
app: env["2歳以上日誌出力用"].appId,
record
}
const result = {
id: generatedRecordId,
type: generatedRecordId ? 'update' : 'insert',
size: record["園児別テーブル"].value.length,
};
let awaitResult;
if (result.type === 'update') {
param.id = generatedRecordId;
// 本アプリの当日データでテーブルを上書きし、対応する園児データがない行を【削除】します
awaitResult = await api.record.updateRecord(param);
} else {
awaitResult = await api.record.addRecord(param);
}
Object.assign(result, awaitResult);
results.push(result);
} catch (e) {
showError(true, '日誌データ連携作成失敗\n - ' + e);
}
}
return results.reduce((result, item) => {
// Sum all sizes
result.size += item.size;
// Sum based on type
if (item.type === 'insert') {
result.insert += item.size;
} else if (item.type === 'update') {
result.update += item.size;
}
return result;
}, {
size: 0, // Total sum of all sizes
insert: 0, // Sum of insert sizes
update: 0 // Sum of update sizes
});;
};
static getInstance(headerSpace) {
if (!Link2Handler.instance) {
Link2Handler.instance = new Link2Handler(headerSpace);
}
return Link2Handler.instance;
}
}