update process
This commit is contained in:
183
src/1.園児別出欠簿入力/BatchCreateHandler.js
Normal file
183
src/1.園児別出欠簿入力/BatchCreateHandler.js
Normal file
@@ -0,0 +1,183 @@
|
||||
class BatchCreateHandler {
|
||||
|
||||
constructor(headerSpace) {
|
||||
const elements = createBtnGroupArea('batch-action-area', '出欠簿一括作成', this.handleCreateData, {
|
||||
btnElId: 'batch-btn',
|
||||
yearElId: 'batch-year',
|
||||
monthElId: 'batch-month',
|
||||
dateElId: 'batch-date',
|
||||
defaultThisMonth: true,
|
||||
})
|
||||
if (!elements) {
|
||||
return;
|
||||
}
|
||||
headerSpace.appendChild(elements['batch-action-area']);
|
||||
}
|
||||
|
||||
handleCreateData = async (e, { year, month, date }) => {
|
||||
loading(true, '出欠簿一括作成中...');
|
||||
showError(false);
|
||||
const api = new KintoneRestAPIClient();
|
||||
|
||||
// 園児台帳アプリからデータを読み取る
|
||||
const masterRecords = await this.getMasterRecords(api);
|
||||
if (!masterRecords) {
|
||||
// エラー
|
||||
loading(false);
|
||||
return;
|
||||
}
|
||||
|
||||
const today = new Date(year, month - 1, date);
|
||||
const todayString = getFormatDateString(today);
|
||||
const records = this.generateRecords(today, todayString, masterRecords);
|
||||
// console.log(records);
|
||||
|
||||
const result = await this.createData(api, records, todayString);
|
||||
// showSuccess(true, "出欠簿一括作成完了");
|
||||
if (result) {
|
||||
this.showSuccessDialog(result);
|
||||
}
|
||||
|
||||
loading(false);
|
||||
}
|
||||
|
||||
showSuccessDialog(result) {
|
||||
const contentEl = document.createElement('div');
|
||||
contentEl.style.fontSize = '16px';
|
||||
if (result.updateResult && result.insertResult) {
|
||||
contentEl.innerHTML = `${result.insertResult.records.length}件のデータを更新し、${result.insertResult.records.length}件のデータを新規作成しました。`
|
||||
} else if (result.updateResult) {
|
||||
contentEl.innerHTML = `${result.updateResult.records.length}件のデータを更新しました。`;
|
||||
} else if (result.insertResult) {
|
||||
contentEl.innerHTML = `${result.insertResult.records.length}件のデータを生成しました。`;
|
||||
} else {
|
||||
contentEl.innerHTML = `データの更新はありません。既に最新の状態です。`
|
||||
}
|
||||
|
||||
showDialog({
|
||||
title: '出欠簿一括作成完了',
|
||||
content: contentEl,
|
||||
ok: '更新して確認',
|
||||
cancel: false,
|
||||
onClose: () => { location.reload() }
|
||||
});
|
||||
}
|
||||
|
||||
generateRecords = (today, todayString, masterRecords) => {
|
||||
return masterRecords.reduce((acc, masterRecord) => {
|
||||
if (this.needCreateData(masterRecord, today)) {
|
||||
acc.push(this.createRecord(masterRecord, todayString));
|
||||
}
|
||||
return acc;
|
||||
}, []);
|
||||
}
|
||||
|
||||
needCreateData = (record, today) => {
|
||||
// 当日の日付が、退園年月日(「年_退園年月日」「月_退園年月日」「日_退園年月日」を参照)より前の値
|
||||
// ※同日の場合は取得条件に合致とする(取得する)、退園年月日に値が入っていない場合は無条件に取得
|
||||
const era = record["和暦_退園年月日"].value;
|
||||
const lastYear = record["年_退園年月日"].value;
|
||||
const lastMonth = record["月_退園年月日"].value;
|
||||
const lastDate = record["日_退園年月日"].value;
|
||||
if (!era || !lastYear || !lastMonth || !lastDate) {
|
||||
return true;
|
||||
}
|
||||
const todayObj = new Date(today);
|
||||
todayObj.setHours(0, 0, 0, 0);
|
||||
const lastDateObj = new Date(convertToWesternYear(Number(lastYear), era), Number(lastMonth) - 1, Number(lastDate));
|
||||
lastDateObj.setHours(0, 0, 0, 0);
|
||||
return todayObj.getTime() <= lastDateObj.getTime();
|
||||
}
|
||||
|
||||
createRecord = (record, todayString) => {
|
||||
return {
|
||||
'登園日': { 'value': todayString },
|
||||
'園児ユニークキー': { 'value': record['ユニークキー'].value },
|
||||
'担任': { 'value': record['担当者名'].value.map((x)=>x.name).join('、') },
|
||||
'保護者ログインID': { 'value': record['保護者ログインID'].value },
|
||||
}
|
||||
}
|
||||
|
||||
getMasterRecords = async (api) => {
|
||||
try {
|
||||
return await api.record.getAllRecordsWithId({
|
||||
app: env["園児台帳"].appId,
|
||||
fields: ['ユニークキー', '担当者名', "保護者ログインID", "和暦_退園年月日", "年_退園年月日", "月_退園年月日", "日_退園年月日"],
|
||||
});
|
||||
} catch (e) {
|
||||
showError(true, '園児台帳アプリのデータ読み取りエラー\n - ' + e);
|
||||
}
|
||||
}
|
||||
|
||||
createData = async (api, records, todayString) => {
|
||||
try {
|
||||
const alreadyGeneratedKeys = await this.getAlreadyGeneratedKeys(api, records, todayString);
|
||||
// console.log(alreadyGeneratedKeys);
|
||||
if (!alreadyGeneratedKeys) {
|
||||
// エラー
|
||||
return;
|
||||
}
|
||||
|
||||
const param = {
|
||||
app: env["園児別出欠簿入力"].appId,
|
||||
}
|
||||
|
||||
const insert = [];
|
||||
const update = [];
|
||||
records.forEach(record => {
|
||||
const id = alreadyGeneratedKeys[record["園児ユニークキー"].value]
|
||||
if (id) {
|
||||
update.push({
|
||||
id,
|
||||
record
|
||||
});
|
||||
} else {
|
||||
insert.push(record);
|
||||
}
|
||||
});
|
||||
|
||||
let insertResult;
|
||||
if (insert.length) {
|
||||
param.records = insert;
|
||||
insertResult = await api.record.addAllRecords(param);
|
||||
}
|
||||
|
||||
let updateResult;
|
||||
if (update.length) {
|
||||
param.records = update;
|
||||
// 本アプリの当日データでテーブルを上書きし、対応する園児データがない行を【削除】します
|
||||
updateResult = await api.record.updateAllRecords(param);
|
||||
}
|
||||
return {
|
||||
insertResult,
|
||||
updateResult
|
||||
}
|
||||
} catch (e) {
|
||||
showError(true, '本アプリのデータ作成失敗\n - ' + e);
|
||||
}
|
||||
};
|
||||
|
||||
getAlreadyGeneratedKeys = async (api, records, todayString) => {
|
||||
try {
|
||||
const needCreateUniqueKeys = records.map((each) => `"${each["園児ユニークキー"].value}"`).join(',')
|
||||
const alreadyGeneratedResult = await api.record.getAllRecordsWithId({
|
||||
app: env["園児別出欠簿入力"].appId,
|
||||
fields: ["園児ユニークキー"],
|
||||
condition: `登園日 = "${todayString}" and 園児ユニークキー in (${needCreateUniqueKeys})`
|
||||
})
|
||||
return alreadyGeneratedResult.reduce((map, each) => {
|
||||
map[each["園児ユニークキー"].value] = each["$id"].value;
|
||||
return map;
|
||||
}, {});
|
||||
} catch (e) {
|
||||
showError(true, '本アプリのデータ読み取りエラー\n - ' + e);
|
||||
}
|
||||
}
|
||||
|
||||
static getInstance(env, headerSpace) {
|
||||
if (!BatchCreateHandler.instance) {
|
||||
BatchCreateHandler.instance = new BatchCreateHandler(env, headerSpace);
|
||||
}
|
||||
return BatchCreateHandler.instance;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user