package com.example.kucun2.entity.data;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import com.example.kucun2.entity.*;
import com.example.kucun2.function.MyAppFnction;
import com.example.kucun2.function.SafeLogger;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.*;
import java.util.stream.Collectors;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
public class Data {
// 数据集合声明(保持原有属性名不变)
public static SynchronizedList<Bancai> bancais = new SynchronizedList<>(Bancai.class);
public static SynchronizedList<Caizhi> caizhis = new SynchronizedList<>(Caizhi.class);
public static SynchronizedList<Mupi> mupis = new SynchronizedList<>(Mupi.class);
public static SynchronizedList<Chanpin> chanpins = new SynchronizedList<>(Chanpin.class);
public static SynchronizedList<Chanpin_Zujian> chanpin_zujians = new SynchronizedList<>(Chanpin_Zujian.class);
public static SynchronizedList<Dingdan> dingdans = new SynchronizedList<>(Dingdan.class);
public static SynchronizedList<Dingdan_Chanpin> dingdan_chanpins = new SynchronizedList<>(Dingdan_Chanpin.class);
public static SynchronizedList<Dingdan_chanpin_zujian> Dingdan_chanpin_zujians = new SynchronizedList<>(Dingdan_chanpin_zujian.class);
public static SynchronizedList<Kucun> kucuns = new SynchronizedList<>(Kucun.class);
public static SynchronizedList<Zujian> zujians = new SynchronizedList<>(Zujian.class);
public static SynchronizedList<User> users = new SynchronizedList<>(User.class);
public static SynchronizedList<Jinhuo> jinhuos = new SynchronizedList<>(Jinhuo.class);
public static final Map<Class, SynchronizedList<SynchronizableEntity>> dataCollectionMap = new HashMap<>();
private static final Gson gson = GsonFactory.createWithIdSerialization();
private static OkHttpClient client;
private static final String TAG = "DataLoader";
static {
// 静态初始化块:在类加载时执行,保证所有静态字段已初始化
try {
Field[] fields = Data.class.getDeclaredFields();
for (Field field : fields) {
if (SynchronizedList.class.equals(field.getType())) {
SynchronizedList<?> list = (SynchronizedList<?>) field.get(null);
if (list != null) {
dataCollectionMap.put(list.getEntityType(), (SynchronizedList<SynchronizableEntity>) list);
}
}
}
} catch (IllegalAccessException e) {
throw new RuntimeException("初始化dataCollectionMap失败", e);
}
}
public static void loadAllData(Context context, LoadDataCallback callback) {
ensurePreservedObjects();
if (Looper.myLooper() != Looper.getMainLooper()) {
throw new IllegalStateException("Data.loadAllData must be called on main thread");
}
if (client == null) {
client = MyAppFnction.getClient();
}
SynchronizableEntity.setSyncEnabled(false);
String url = MyAppFnction.getStringResource("string", "url") +
MyAppFnction.getStringResource("string", "url_all");
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(TAG, "Failed to load data", e);
SynchronizableEntity.setSyncEnabled(true);
safeCallback(callback, false);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
Log.e(TAG, "Unexpected response code: " + response.code());
safeCallback(callback, false);
return;
}
String responseData = response.body().string();
SynchronizableEntity.setSyncEnabled(true);
ensurePreservedObjects();
parseAndAssignData(responseData, context, callback);
}
});
}
// 解析并赋值数据(全面空值处理)
private static void parseAndAssignData(String jsonData, Context context, LoadDataCallback callback) {
Type informationType = new TypeToken<Information<AllDataResponse>>() {}.getType();
Information<AllDataResponse> information = null;
try {
information = gson.fromJson(jsonData, informationType);
} catch (Exception e) {
Log.e(TAG, "JSON解析失败: " + e.getMessage());
safeCallback(callback, false);
return;
}
if (information == null || information.getData() == null || information.getStatus() != 200) {
Log.e(TAG, "无效响应数据");
safeCallback(callback, false);
return;
}
AllDataResponse allData = information.getData();
SafeLogger.d("data", "原始数据: " + gson.toJson(allData));
// 安全初始化所有列表(处理空列表)
safeInitializeList(allData.bancais);
safeInitializeList(allData.caizhis);
safeInitializeList(allData.mupis);
safeInitializeList(allData.chanpins);
safeInitializeList(allData.chanpin_zujians);
safeInitializeList(allData.dingdans);
safeInitializeList(allData.dingdan_chanpins);
safeInitializeList(allData.Dingdan_chanpin_zujians);
safeInitializeList(allData.kucuns);
safeInitializeList(allData.zujians);
safeInitializeList(allData.users);
safeInitializeList(allData.jinhuos);
// 过滤掉所有列表中的空值
allData.bancais = filterNulls(allData.bancais);
allData.caizhis = filterNulls(allData.caizhis);
allData.mupis = filterNulls(allData.mupis);
allData.chanpins = filterNulls(allData.chanpins);
allData.chanpin_zujians = filterNulls(allData.chanpin_zujians);
allData.dingdans = filterNulls(allData.dingdans);
allData.dingdan_chanpins = filterNulls(allData.dingdan_chanpins);
allData.Dingdan_chanpin_zujians = filterNulls(allData.Dingdan_chanpin_zujians);
allData.kucuns = filterNulls(allData.kucuns);
allData.zujians = filterNulls(allData.zujians);
allData.users = filterNulls(allData.users);
allData.jinhuos = filterNulls(allData.jinhuos);
// 更新列表(保留预置对象)
updateList(bancais, allData.bancais);
updateList(caizhis, allData.caizhis);
updateList(mupis, allData.mupis);
updateList(chanpins, allData.chanpins);
updateList(chanpin_zujians, allData.chanpin_zujians);
updateList(dingdans, allData.dingdans);
updateList(dingdan_chanpins, allData.dingdan_chanpins);
updateList(Dingdan_chanpin_zujians, allData.Dingdan_chanpin_zujians);
updateList(kucuns, allData.kucuns);
updateList(zujians, allData.zujians);
updateList(users, allData.users);
updateList(jinhuos, allData.jinhuos);
SynchronizableEntity.setSyncEnabled(false);
// 自动关联实体(全面空值防护)
automaticAssociation();
// 设置所有实体状态
setAllEntitiesState(SynchronizableEntity.SyncState.MODIFIED);
ensurePreservedObjects();
SynchronizableEntity.setSyncEnabled(true);
safeCallback(callback, true);
}
// 安全回调方法
public static void safeCallback(LoadDataCallback callback, boolean success) {
new Handler(Looper.getMainLooper()).post(() -> {
if (callback != null) {
if (success) {
callback.onSuccess();
} else {
callback.onFailure();
}
}
});
}
// 更新列表内容但保持对象引用不变(空值防护)
private static <T extends SynchronizableEntity> void updateList(List<T> existingList, List<T> newList) {
if (newList == null) return;
// 创建临时列表保留预置对象
List<T> preservedObjects = new ArrayList<>();
for (T item : existingList) {
if (item != null && item.isPreservedObject()) {
preservedObjects.add(item);
}
}
// 清除原有列表并添加保留对象
existingList.clear();
existingList.addAll(preservedObjects);
// 添加新数据,跳过空值和无效ID
for (T newItem : newList) {
if (newItem != null && newItem.getId() != null && newItem.getId() != -1) {
existingList.add(newItem);
}
}
}
// 添加确保预置对象存在的方法(空值防护)
private static void ensurePreservedObjects() {
if (!containsPreservedObject(bancais)) bancais.add(createInstance(Bancai.class));
if (!containsPreservedObject(caizhis)) caizhis.add(createInstance(Caizhi.class));
if (!containsPreservedObject(mupis)) mupis.add(createInstance(Mupi.class));
if (!containsPreservedObject(chanpins)) chanpins.add(createInstance(Chanpin.class));
if (!containsPreservedObject(chanpin_zujians)) chanpin_zujians.add(createInstance(Chanpin_Zujian.class));
if (!containsPreservedObject(dingdans)) dingdans.add(createInstance(Dingdan.class));
if (!containsPreservedObject(kucuns)) kucuns.add(createInstance(Kucun.class));
if (!containsPreservedObject(zujians)) zujians.add(createInstance(Zujian.class));
if (!containsPreservedObject(Dingdan_chanpin_zujians)) Dingdan_chanpin_zujians.add(createInstance(Dingdan_chanpin_zujian.class));
if (!containsPreservedObject(dingdan_chanpins)) dingdan_chanpins.add(createInstance(Dingdan_Chanpin.class));
if (!containsPreservedObject(jinhuos)) jinhuos.add(createInstance(Jinhuo.class));
if (!containsPreservedObject(users)) users.add(createInstance(User.class));
automaticAssociation();
}
// 检查列表是否包含预置对象
private static <T extends SynchronizableEntity> boolean containsPreservedObject(List<T> list) {
for (T item : list) {
if (item != null && item.isPreservedObject()) {
return true;
}
}
return false;
}
// 自动关联实体(全面空值防护)
private static void automaticAssociation() {
try {
for (Class t : dataCollectionMap.keySet()) {
setDefaultAssociation(Objects.requireNonNull(dataCollectionMap.get(t)));
}
} catch (IllegalAccessException | ClassNotFoundException e) {
Log.e(TAG, "自动关联失败", e);
}
}
/**
* 自动关联实体(加强空值处理)
*/
private static <T extends SynchronizableEntity> void setDefaultAssociation(SynchronizedList<T> list)
throws IllegalAccessException, ClassNotFoundException {
for (T t : list) {
if (t == null) continue; // 跳过空对象
Class clazz = t.getClass();
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
f.setAccessible(true);
Class fieldType = f.getType();
// 处理实体引用字段
if (SynchronizableEntity.class.isAssignableFrom(fieldType)) {
SynchronizableEntity currentValue = (SynchronizableEntity) f.get(t);
// 处理空值或无效ID
if (t.getId() < 0 || currentValue == null || currentValue.getId() == null) {
// 设置为对应类型的预置对象
SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(fieldType);
if (targetList != null && !targetList.isEmpty()) {
f.set(t, targetList.stream()
.filter(item -> item.isPreservedObject())
.findFirst()
.orElse(null));
}
} else {
// 查找匹配的实体
SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(fieldType);
if (targetList != null) {
SynchronizableEntity found = targetList.stream()
.filter(item -> currentValue.getId().equals(item.getId()))
.findFirst()
.orElse(null);
// 如果找不到,使用预置对象作为回退
f.set(t, found != null ? found :
targetList.stream()
.filter(SynchronizableEntity::isPreservedObject)
.findFirst()
.orElse(null));
}
}
}
// 处理列表字段
else if (List.class.isAssignableFrom(fieldType)) {
Type genericType = f.getGenericType();
if (genericType instanceof ParameterizedType) {
ParameterizedType pt = (ParameterizedType) genericType;
Type[] types = pt.getActualTypeArguments();
if (types.length > 0) {
Class itemType = Class.forName(types[0].getTypeName());
if (SynchronizableEntity.class.isAssignableFrom(itemType)) {
List<SynchronizableEntity> currentList = (List<SynchronizableEntity>) f.get(t);
if (currentList == null) {
currentList = new ArrayList<>();
f.set(t, currentList);
}
// 过滤掉空值
currentList.removeAll(Collections.singleton(null));
// 处理空列表或无效ID
if (currentList.isEmpty() || t.getId() < 0) {
SynchronizedList<SynchronizableEntity> sourceList = dataCollectionMap.get(itemType);
if (sourceList != null && !sourceList.isEmpty()) {
currentList.add(sourceList.stream()
.filter(SynchronizableEntity::isPreservedObject)
.findFirst()
.orElse(null));
}
} else {
// 更新列表中的引用
SynchronizedList<SynchronizableEntity> sourceList = dataCollectionMap.get(itemType);
if (sourceList != null) {
for (int i = 0; i < currentList.size(); i++) {
SynchronizableEntity item = currentList.get(i);
if (item == null) continue;
SynchronizableEntity found = sourceList.stream()
.filter(e -> e.getId().equals(item.getId()))
.findFirst()
.orElse(null);
// 如果找不到,使用预置对象作为回退
currentList.set(i, found != null ? found :
sourceList.stream()
.filter(SynchronizableEntity::isPreservedObject)
.findFirst()
.orElse(null));
}
}
}
}
}
}
}
// 处理基本类型字段
else {
Object value = f.get(t);
if (value == null) {
// 设置类型安全的默认值
if (String.class.equals(fieldType)) {
f.set(t, "无");
} else if (Integer.class.equals(fieldType) || int.class.equals(fieldType)) {
f.set(t, -1);
} else if (Double.class.equals(fieldType) || double.class.equals(fieldType)) {
f.set(t, -1.0);
} else if (Boolean.class.equals(fieldType) || boolean.class.equals(fieldType)) {
f.set(t, false);
} else if (Date.class.equals(fieldType)) {
f.set(t, new Date());
}
}
}
}
}
}
/**
* 根据传入的Class对象创建对应类型的实例(加强空值防护)
*/
public static <T> T createInstance(Class<T> clazz) {
try {
T instance = clazz.getDeclaredConstructor().newInstance();
// 设置默认值
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
Class<?> type = field.getType();
if (type == String.class) {
field.set(instance, "无");
} else if (type == Integer.class || type == int.class) {
field.set(instance, -1);
} else if (type == Double.class || type == double.class) {
field.set(instance, -1.0);
} else if (type == Boolean.class || type == boolean.class) {
field.set(instance, false);
} else if (type == Date.class) {
field.set(instance, new Date());
} else if (SynchronizableEntity.class.isAssignableFrom(type)) {
// 设置为对应类型的预置对象
SynchronizedList<SynchronizableEntity> targetList = dataCollectionMap.get(type);
if (targetList != null && !targetList.isEmpty()) {
field.set(instance, targetList.stream()
.filter(SynchronizableEntity::isPreservedObject)
.findFirst()
.orElse(null));
}
} else if (List.class.isAssignableFrom(type)) {
// 初始化为空列表
field.set(instance, new ArrayList<>());
}
}
// 设置特殊字段
clazz.getMethod("setId", Integer.class).invoke(instance, -1);
clazz.getMethod("setState", SynchronizableEntity.SyncState.class)
.invoke(instance, SynchronizableEntity.SyncState.PRESERVED);
return instance;
} catch (Exception e) {
Log.e("Data", "创建实例失败: " + clazz.getName(), e);
return createSafeFallback(clazz);
}
}
// 安全回退创建
private static <T> T createSafeFallback(Class<T> clazz) {
try {
return clazz.getDeclaredConstructor().newInstance();
} catch (Exception ex) {
throw new RuntimeException("创建回退实例失败", ex);
}
}
// 辅助方法:确保列表不为null
private static <T> void safeInitializeList(List<T> list) {
if (list == null) {
list = new ArrayList<>();
}
}
// 辅助方法:过滤列表中的空值
private static <T> List<T> filterNulls(List<T> list) {
if (list == null) return new ArrayList<>();
return list.stream()
.filter(Objects::nonNull)
.collect(Collectors.toList());
}
// 回调接口
public interface LoadDataCallback {
void onSuccess();
void onFailure();
}
// 内部类用于解析JSON响应
public static class AllDataResponse {
public List<Bancai> bancais;
public List<Caizhi> caizhis;
public List<Mupi> mupis;
public List<Chanpin> chanpins;
public List<Chanpin_Zujian> chanpin_zujians;
public List<Dingdan> dingdans;
public List<Dingdan_Chanpin> dingdan_chanpins;
public List<Dingdan_chanpin_zujian> Dingdan_chanpin_zujians;
public List<Kucun> kucuns;
public List<Zujian> zujians;
public List<User> users;
public List<Jinhuo> jinhuos;
}
// 新增方法:设置所有实体状态
private static void setAllEntitiesState(SynchronizableEntity.SyncState state) {
setListState(bancais, state);
setListState(caizhis, state);
setListState(mupis, state);
setListState(Dingdan_chanpin_zujians, state);
setListState(dingdans, state);
setListState(chanpins, state);
setListState(chanpin_zujians, state);
setListState(zujians, state);
setListState(jinhuos, state);
setListState(kucuns, state);
setListState(users, state);
}
private static <T extends SynchronizableEntity> void setListState(List<T> list, SynchronizableEntity.SyncState state) {
for (T entity : list) {
if (entity != null) {
entity.setState(state);
}
}
}
}结构简化加入详细注释