Commit 133c6526 by Jeong Gilmo

#33190 マスタデータ新着更新

- CMSでメンテナンスされるHACCPマスタデータをアプリから取得できるように
  サーバから受信したmasterData から各JSONオブジェクトを取得し、内容をJSON文字列化してファイルに書き出す処理を追加
- 取得したマスタデータを指定したパースにJSONファイルを保存
- fechDateの値をデバイスに保持し、次回API呼び出し時のパラメータに設定ができる処理を追加
parent 9d305a6e
...@@ -21,6 +21,7 @@ import jp.agentec.abook.abv.bl.acms.client.json.ContentCheckDeliverableJSON; ...@@ -21,6 +21,7 @@ import jp.agentec.abook.abv.bl.acms.client.json.ContentCheckDeliverableJSON;
import jp.agentec.abook.abv.bl.acms.client.json.ContentVersionsJSON; import jp.agentec.abook.abv.bl.acms.client.json.ContentVersionsJSON;
import jp.agentec.abook.abv.bl.acms.client.json.GroupsJSON; import jp.agentec.abook.abv.bl.acms.client.json.GroupsJSON;
import jp.agentec.abook.abv.bl.acms.client.json.LogSendFlagJSON; import jp.agentec.abook.abv.bl.acms.client.json.LogSendFlagJSON;
import jp.agentec.abook.abv.bl.acms.client.json.MasterDataJSON;
import jp.agentec.abook.abv.bl.acms.client.json.NewAppStoreLoginJSON; import jp.agentec.abook.abv.bl.acms.client.json.NewAppStoreLoginJSON;
import jp.agentec.abook.abv.bl.acms.client.json.RequirePasswordChangeJSON; import jp.agentec.abook.abv.bl.acms.client.json.RequirePasswordChangeJSON;
import jp.agentec.abook.abv.bl.acms.client.json.ResultJSON; import jp.agentec.abook.abv.bl.acms.client.json.ResultJSON;
...@@ -194,6 +195,8 @@ public class AcmsClient implements AcmsClientResponseListener { ...@@ -194,6 +195,8 @@ public class AcmsClient implements AcmsClientResponseListener {
dto.userId = json.userId; dto.userId = json.userId;
dto.workerCode = json.workerCode; dto.workerCode = json.workerCode;
// dto.resourcePatternType = json.resourcePatternType; // 文言リソースパターンを取得する。
if (json.result) { if (json.result) {
dto.invalidPasswordCount = (short) 0; dto.invalidPasswordCount = (short) 0;
dto.lastLoginDate = json.presentTime; dto.lastLoginDate = json.presentTime;
...@@ -959,4 +962,17 @@ public class AcmsClient implements AcmsClientResponseListener { ...@@ -959,4 +962,17 @@ public class AcmsClient implements AcmsClientResponseListener {
} }
} }
} }
/**
* ACMSから、マスタデータ情報を取得します。
* @param param {@link AcmsParameters} オブジェクトです。
* @return コンテンツバージョン情報を格納した {@link ContentDto} のリストを返します。
* 情報の変更がない(HttpStatus 304)場合はnullを返す。
* @since 1.0.0
*/
public MasterDataJSON masterData(AcmsParameters param) throws NetworkDisconnectedException, AcmsException {
HttpResponse response = send(AcmsApis.ApiGetMasterData, param);
MasterDataJSON json = new MasterDataJSON(response.httpResponseBody);
return json;
}
} }
package jp.agentec.abook.abv.bl.acms.client.json;
import java.util.HashMap;
import java.util.Map;
import jp.agentec.abook.abv.bl.acms.client.AcmsClient;
import jp.agentec.abook.abv.bl.common.exception.AcmsException;
import jp.agentec.abook.abv.bl.common.exception.JSONValidationException;
import jp.agentec.abook.abv.bl.common.log.Logger;
import org.json.adf.JSONArray;
import org.json.adf.JSONObject;
/**
* {@link AcmsClient#contentVersion} の戻り値です。
* @author Taejin Hong
* @version 1.0.0
*/
public class MasterDataJSON extends AcmsCommonJSON {
public static final String MasterData = "masterData";
public static final String BelongGroup = "belongGroup";
public static final String Staff = "staff";
public static final String Selective = "selective";
public static final String InspectCheck = "inspectCheck";
public static final String InspectNumber = "inspectNumber";
public static final String FetchDate = "fetchDate";
public String fetchDate; // 取得日時(Timestamp yyyy-MM-dd HH:mm:ssGMT)
public Map<String, String> masterDataMap; // JSONマスタ(JSONオブジェクト)
public MasterDataJSON(String jsonString) throws AcmsException {
super(jsonString);
}
@Override
protected void parse(JSONObject json) throws JSONValidationException {
// fechDateの値をデバイスに保持し、次回API呼び出し時のパラメータに設定する。
if (json.has(FetchDate)) {
fetchDate = json.getString(FetchDate);
}
// マスタデータを取得する。
if (json.has(MasterData)) {
masterDataMap = new HashMap<String, String>();
JSONObject masterData = json.getJSONObject(MasterData);
// belongGroupの報告対象マスタ(JSONオブジェクト)
if (masterData.has(BelongGroup)) {
JSONObject belognGroupJson = masterData.getJSONObject(BelongGroup);
masterDataMap.put(BelongGroup, belognGroupJson.toString());
}
// staffの報告者マスタ(JSONオブジェクト)
if (masterData.has(Staff)) {
JSONObject staffJson = masterData.getJSONObject(Staff);
masterDataMap.put(Staff, staffJson.toString());
}
// selectiveの選択型マスタ(JSONオブジェクト)
if (masterData.has(Selective)) {
JSONObject selectiveJson = masterData.getJSONObject(Selective);
masterDataMap.put(Selective, selectiveJson.toString());
}
// inspectCheckの点検チェック型マスタ(JSONオブジェクト)
if (masterData.has(InspectCheck)) {
JSONObject inspectCheckJson = masterData.getJSONObject(InspectCheck);
masterDataMap.put(InspectCheck, inspectCheckJson.toString());
}
// inspectNumberの点検数値型マスタ(JSONオブジェクト)
if (masterData.has(InspectNumber)) {
JSONObject inspectNumberJson = masterData.getJSONObject(InspectNumber);
masterDataMap.put(InspectNumber, inspectNumberJson.toString());
}
} else {
throw new JSONValidationException(json.toString(), MasterData + " property not found.");
}
}
}
...@@ -154,6 +154,9 @@ public class AcmsApis { ...@@ -154,6 +154,9 @@ public class AcmsApis {
public static final String ApiSendRoutineTaskData = "routineTaskData"; public static final String ApiSendRoutineTaskData = "routineTaskData";
// HACCPマスタデータ取得
public static final String ApiGetMasterData = "getMasterData";
// download // download
/** /**
* コンテンツのZIPファイルを取得<br> * コンテンツのZIPファイルを取得<br>
...@@ -196,7 +199,8 @@ public class AcmsApis { ...@@ -196,7 +199,8 @@ public class AcmsApis {
apiValue = Constant.ApiValue.nuapi; apiValue = Constant.ApiValue.nuapi;
} else if (methodName.equals(ApiOperationList) || methodName.equals(ApiWorkingGroupList) || methodName.equals(ApiSendTaskData) || methodName.equals(ApiGetOperationData) || } else if (methodName.equals(ApiOperationList) || methodName.equals(ApiWorkingGroupList) || methodName.equals(ApiSendTaskData) || methodName.equals(ApiGetOperationData) ||
methodName.equals(ApiGetTaskFile) || methodName.equals(ApiSceneEntry) || methodName.equals(ApiTaskContentEntry) || methodName.equals(ApiGetTaskFile) || methodName.equals(ApiSceneEntry) || methodName.equals(ApiTaskContentEntry) ||
methodName.equals(ApiSendPushMessage) || methodName.equals(ApiGetPushMessages) || methodName.equals(ApiSendRoutineTaskData)) { methodName.equals(ApiSendPushMessage) || methodName.equals(ApiGetPushMessages) || methodName.equals(ApiSendRoutineTaskData) ||
methodName.equals(ApiGetMasterData)) {
apiValue = Constant.ApiValue.checkapi; apiValue = Constant.ApiValue.checkapi;
} }
......
...@@ -62,6 +62,9 @@ public class ABVEnvironment { ...@@ -62,6 +62,9 @@ public class ABVEnvironment {
// Serverから取得したcontentVersion時のリソースパターンを一時的に保存するための変数 // Serverから取得したcontentVersion時のリソースパターンを一時的に保存するための変数
public int resourcePatternType; public int resourcePatternType;
// Serverから取得したmasterDataのfetchDateを一時的に保存するための変数
public String tempMasterDataFetchDate = "";
////////////////////////////// 定数 ////////////////////////////////// ////////////////////////////// 定数 //////////////////////////////////
private static final String ServerTimeKey = "ABook"; private static final String ServerTimeKey = "ABook";
...@@ -177,7 +180,10 @@ public class ABVEnvironment { ...@@ -177,7 +180,10 @@ public class ABVEnvironment {
public static final boolean DebugContentDownload = false; public static final boolean DebugContentDownload = false;
public boolean enableToastMessage = true; public boolean enableToastMessage = true;
// マスタ参照パス
public static final String OperationMasterDataDirFormat = "%s/ABook/operation/master";
private ABVEnvironment() { private ABVEnvironment() {
} }
...@@ -766,4 +772,10 @@ public class ABVEnvironment { ...@@ -766,4 +772,10 @@ public class ABVEnvironment {
return reportDate; return reportDate;
} }
} }
// MasterDataに対したJSONファイルの位置
// 経路:root/files/operation/master
public String getMasterFilePath() {
return String.format(OperationMasterDataDirFormat, rootDirectory);
}
} }
package jp.agentec.abook.abv.bl.download; package jp.agentec.abook.abv.bl.download;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -29,6 +28,7 @@ import jp.agentec.abook.abv.bl.logic.ContentReadingLogLogic; ...@@ -29,6 +28,7 @@ import jp.agentec.abook.abv.bl.logic.ContentReadingLogLogic;
import jp.agentec.abook.abv.bl.logic.ContractLogic; import jp.agentec.abook.abv.bl.logic.ContractLogic;
import jp.agentec.abook.abv.bl.logic.EnqueteLogic; import jp.agentec.abook.abv.bl.logic.EnqueteLogic;
import jp.agentec.abook.abv.bl.logic.GroupLogic; import jp.agentec.abook.abv.bl.logic.GroupLogic;
import jp.agentec.abook.abv.bl.logic.MasterDataLogic;
import jp.agentec.abook.abv.bl.logic.OperationLogic; import jp.agentec.abook.abv.bl.logic.OperationLogic;
import jp.agentec.adf.util.CollectionUtil; import jp.agentec.adf.util.CollectionUtil;
import jp.agentec.adf.util.DateTimeUtil; import jp.agentec.adf.util.DateTimeUtil;
...@@ -62,6 +62,9 @@ public class ContentRefresher { ...@@ -62,6 +62,9 @@ public class ContentRefresher {
private boolean initializingRefreshing = false; private boolean initializingRefreshing = false;
private static final int refreshSleepInterval = 500; private static final int refreshSleepInterval = 500;
private static final int maxRefreshWorker = 2; private static final int maxRefreshWorker = 2;
// masterDataを取得するため登録
private MasterDataLogic masterDataLogic = AbstractLogic.getLogic(MasterDataLogic.class);
public static ContentRefresher getInstance() { public static ContentRefresher getInstance() {
if (instance == null) { if (instance == null) {
...@@ -157,6 +160,15 @@ public class ContentRefresher { ...@@ -157,6 +160,15 @@ public class ContentRefresher {
groupLogic.initializeGroups(); // グループ設定(グループ変更の場合、FetchDateをクリアする) groupLogic.initializeGroups(); // グループ設定(グループ変更の場合、FetchDateをクリアする)
categoryLogic.initializeCategories(); // カテゴリ設定 categoryLogic.initializeCategories(); // カテゴリ設定
// マスタデータの最新更新された時のFetchDateを一時に保存する。
Logger.d(TAG, "before fetchDate : " + ABVEnvironment.getInstance().tempMasterDataFetchDate);
// CMSでメンテナンスされるHACCPマスタデータをアプリから取得できるようにJSONファイルを生成する。
String fetchDate = masterDataLogic.initializeMasterData(ABVEnvironment.getInstance().tempMasterDataFetchDate);
Logger.d(TAG, "after fetchDate : " + fetchDate);
// マスタデータの最新更新された時のFetchDateを一時に保存する。
ABVEnvironment.getInstance().tempMasterDataFetchDate = fetchDate;
if (interrupt) { // この時点で停止要求が来た場合先には進まない。(ServiceOption/Group/Categoryの更新は1セットで行う(トランザクションはそれぞれ別)) if (interrupt) { // この時点で停止要求が来た場合先には進まない。(ServiceOption/Group/Categoryの更新は1セットで行う(トランザクションはそれぞれ別))
Logger.d(TAG, "stop refresh worker before content update."); Logger.d(TAG, "stop refresh worker before content update.");
setFail(); setFail();
...@@ -416,5 +428,4 @@ public class ContentRefresher { ...@@ -416,5 +428,4 @@ public class ContentRefresher {
Logger.e("batchSendDownloadLog failed.", e); // 例外は上にあげない。失敗したら次送られるはず(要確認) Logger.e("batchSendDownloadLog failed.", e); // 例外は上にあげない。失敗したら次送られるはず(要確認)
} }
} }
} }
package jp.agentec.abook.abv.bl.logic;
import java.io.IOException;
import java.util.Map;
import jp.agentec.abook.abv.bl.acms.client.AcmsClient;
import jp.agentec.abook.abv.bl.acms.client.json.MasterDataJSON;
import jp.agentec.abook.abv.bl.acms.client.parameters.FetchDateParameters;
import jp.agentec.abook.abv.bl.common.ABVEnvironment;
import jp.agentec.abook.abv.bl.common.exception.ABVException;
import jp.agentec.abook.abv.bl.common.exception.AcmsException;
import jp.agentec.abook.abv.bl.common.exception.NetworkDisconnectedException;
import jp.agentec.abook.abv.bl.common.log.Logger;
import jp.agentec.abook.abv.bl.data.dao.AbstractDao;
import jp.agentec.abook.abv.bl.data.dao.AcmsDao;
import jp.agentec.adf.util.FileUtil;
public class MasterDataLogic extends AbstractLogic {
private static final java.lang.String TAG = "MasterDataLogic";
/**
* グループ情報をサーバから受信し、ローカルに保存します。既存のデータは上書きされます。また、サーバにないグループがローカルにある場合、そのグループは削除されます。
* マスタデータ情報をサーバから受信し、ローカルにJSONで保存する。で、
* データ単位で項目はあるが要素が0件のデータは削除、
* データ単位で項目が存在しないデータは変更無し
* @throws ABVException キャッシュにユーザ情報がありません。再度ログインする必要があります。
* @throws AcmsException
* @throws Exception その他、例外です。
* @since 1.0.0
*/
public String initializeMasterData(String lastFetchDate) throws NetworkDisconnectedException, AcmsException, IOException {
// コンテンツバージョン用lastFetchDateの取得
AcmsDao dao = AbstractDao.getDao(AcmsDao.class);
String daoLastFetchDate = dao.selectContentVersionLastFetchDate();
// ローカルに保存されている fetchDateがない場合、contentversionのlastFetchDateを利用する。
if (lastFetchDate.length() < 1) {
lastFetchDate = daoLastFetchDate;
}
FetchDateParameters param = new FetchDateParameters(cache.getMemberInfo().sid, lastFetchDate);
MasterDataJSON masterDataJson = AcmsClient.getInstance(cache.getUrlPath(), networkAdapter).masterData(param);
// get MAP
Map<String, String> masterDataMap = masterDataJson.masterDataMap;
// Map に保存されたデータをJSONに変換する。
for (Map.Entry<String, String> entry : masterDataMap.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
try {
createMasterDataJson(entry.getKey(), entry.getValue());
} catch (IOException e) {
Logger.e(TAG, "masterDataJSON error : ", e);
throw e;
}
}
// masterData の fetchDateを渡す。
return masterDataJson.fetchDate;
}
/**
* content.jsonファイル作成
*
* @param jsonKeyData
* @param jsonValueData
* @throws IOException
*/
private void createMasterDataJson(String jsonKeyData, String jsonValueData) throws IOException {
// マスタデータの保存されるパース
String masterDataJsonPath = ABVEnvironment.getInstance().getMasterFilePath() + "/" + jsonKeyData + ".json";
if (jsonValueData.contains(",")) {
// マスタデータのJSONのパース設定
FileUtil.createFile(masterDataJsonPath, jsonValueData);
} else {
// データ単位で項目はあるが要素が0件のデータは削除
FileUtil.deleteFileOnly(masterDataJsonPath);
}
}
}
...@@ -775,6 +775,9 @@ public class OperationLogic extends AbstractLogic { ...@@ -775,6 +775,9 @@ public class OperationLogic extends AbstractLogic {
jsonObject.put("attachedPath", "../../../../files/ABook/operation/" + operationId); jsonObject.put("attachedPath", "../../../../files/ABook/operation/" + operationId);
jsonObject.put("attachedMoviePath", ABVEnvironment.getInstance().getAttachedMoviesFilePath(contentId)); jsonObject.put("attachedMoviePath", ABVEnvironment.getInstance().getAttachedMoviesFilePath(contentId));
// マスタデータのパースを参照するために「content.json」に保存する。
jsonObject.put("masterPath", ABVEnvironment.getInstance().getMasterFilePath());
FileUtil.createFile(contentPath + "/content.json", jsonObject.toString()); FileUtil.createFile(contentPath + "/content.json", jsonObject.toString());
} }
......
...@@ -60,6 +60,8 @@ public interface AppDefType { ...@@ -60,6 +60,8 @@ public interface AppDefType {
String BLUETOOTH_DEVICE_TEMPERATURE_NAME = "bleDeviceTemperatureName"; // 温度計機器の名 String BLUETOOTH_DEVICE_TEMPERATURE_NAME = "bleDeviceTemperatureName"; // 温度計機器の名
String BLUETOOTH_DEVICE_TEMPERATURE_ADDRESS = "bleDeviceTemperatureAddress"; // 温度計機器のアドレス String BLUETOOTH_DEVICE_TEMPERATURE_ADDRESS = "bleDeviceTemperatureAddress"; // 温度計機器のアドレス
String BLUETOOTH_DEVICE_TEMPERATURE_CONNECTED = "bleDeviceTemperatureConnected"; // 芯温計機器と接続可否 String BLUETOOTH_DEVICE_TEMPERATURE_CONNECTED = "bleDeviceTemperatureConnected"; // 芯温計機器と接続可否
String MASTER_DATA_FETCH_DATE = "masterDataFetchDate"; // マスタデータのFetchDate
} }
/** /**
......
...@@ -384,6 +384,8 @@ public class OperationListActivity extends ABVUIActivity { ...@@ -384,6 +384,8 @@ public class OperationListActivity extends ABVUIActivity {
getABVUIDataCache().saveLastUpdateTime(); getABVUIDataCache().saveLastUpdateTime();
// リソースパターンを取得し、ローカルに保存する。 // リソースパターンを取得し、ローカルに保存する。
setResourcePattern(); setResourcePattern();
// マスタデータ最新更新する時fetchDateをローカルに保存する。
setMasterDataFetchDate();
refreshOperationList(); refreshOperationList();
} }
} }
...@@ -426,6 +428,9 @@ public class OperationListActivity extends ABVUIActivity { ...@@ -426,6 +428,9 @@ public class OperationListActivity extends ABVUIActivity {
}); });
} }
// masterDataの fetchDateの取得する。
ABVEnvironment.getInstance().tempMasterDataFetchDate = getUserPref(AppDefType.UserPrefKey.MASTER_DATA_FETCH_DATE, "");
if (!activityResultFlg && operationId == -1) { if (!activityResultFlg && operationId == -1) {
dataRefresh(true); dataRefresh(true);
} }
...@@ -1753,6 +1758,10 @@ public class OperationListActivity extends ABVUIActivity { ...@@ -1753,6 +1758,10 @@ public class OperationListActivity extends ABVUIActivity {
refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(lastUpdateTimeLabel); refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(lastUpdateTimeLabel);
} }
} }
// masterDataの fetchDateの取得する。
ABVEnvironment.getInstance().tempMasterDataFetchDate = getUserPref(AppDefType.UserPrefKey.MASTER_DATA_FETCH_DATE, "");
CommonExecutor.execute(new Runnable() { CommonExecutor.execute(new Runnable() {
@Override @Override
public void run() { public void run() {
...@@ -1873,4 +1882,9 @@ public class OperationListActivity extends ABVUIActivity { ...@@ -1873,4 +1882,9 @@ public class OperationListActivity extends ABVUIActivity {
Logger.d(TAG, "ABVEnvironment.getInstance().resourcePatternType : " + ABVEnvironment.getInstance().resourcePatternType); Logger.d(TAG, "ABVEnvironment.getInstance().resourcePatternType : " + ABVEnvironment.getInstance().resourcePatternType);
putUserPref(AppDefType.UserPrefKey.RESOURCE_PATTERN_TYPE, ABVEnvironment.getInstance().resourcePatternType); putUserPref(AppDefType.UserPrefKey.RESOURCE_PATTERN_TYPE, ABVEnvironment.getInstance().resourcePatternType);
} }
private void setMasterDataFetchDate() {
Logger.d(TAG, "ABVEnvironment.getInstance().tempMasterDataFetchDate : " + ABVEnvironment.getInstance().tempMasterDataFetchDate);
putUserPref(AppDefType.UserPrefKey.MASTER_DATA_FETCH_DATE, ABVEnvironment.getInstance().tempMasterDataFetchDate);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment