package com.topsun.posclient.system.service;
import java.util.Stack;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import com.topsun.posclient.common.LoggerUtil;
import com.topsun.posclient.common.POSClientApp;
import com.topsun.posclient.common.POSException;
import com.topsun.posclient.datamodel.SettingData;
import com.topsun.posclient.system.MessageResources;
import com.topsun.posclient.system.SyncProgress;
import com.topsun.posclient.system.SystemActivator;
import com.topsun.posclient.system.service.impl.SyncCardRuleServiceImpl;
import com.topsun.posclient.system.service.impl.SyncCashierModeDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncGoldPriceDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncInvoiceDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncItemDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncMaterialDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncPartSalesDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncPointDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncPromotionDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncShopDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncTemplateDataServiceImpl;
import com.topsun.posclient.system.service.impl.SyncUserDataServiceImpl;
import com.topsun.posclient.webservice.POSServerCaller;
public class SyncDataManager implements ISyncDataListener{
public Stack<ISyncDataService> syncStack = new Stack<ISyncDataService>();
public SyncProgress progress;
private static SyncDataManager dataManager;
public static SyncDataManager getInstance(){
if(dataManager == null){
dataManager = new SyncDataManager();
return dataManager;
}
return dataManager;
}
private SyncDataManager(){
SyncDataListenerManager.getInstance().addKeyListener(this);
}
public void doSyncData(final SyncProgress progress) throws POSException{
if(POSServerCaller.isConnected()){
this.progress = progress;
checkRegistrySyncType();
int size = syncStack.size();
int count = 0;
progress.getInfoText().setText("");
progress.getBar().setVisible(true);
for (int i = 0; i < syncStack.size(); i++) {
count = count + (100/size);
syncStack.get(i).syncData(progress,count);
}
syncStack.clear();
Display.getDefault().asyncExec(new Runnable() {
public void run() {
Shell shell = progress.getBar().getShell();
progress.getBar().setSelection(100);
//更新最后一次同步时间
SettingData settingData = POSClientApp.get().getSysConfig();
settingData.setLastUpdateTime(String.valueOf(System.currentTimeMillis()));
try {
POSClientApp.get().updateSysConfig(settingData);
} catch (Exception e) {
LoggerUtil.logError(SystemActivator.PLUGIN_ID, "同步时间保存出错", e);
MessageDialog.openError(shell, "错误", "同步时间保存出错");
}
MessageDialog.openInformation(shell, MessageResources.message_tips, "数据同步完成");
progress.getBar().setSelection(0);
}
});
}else{
throw new POSException(MessageResources.message_error_notconnection);
}
}
private void regsitryService(ISyncDataService dataService){
syncStack.push(dataService);
}
public void checkRegistrySyncType(){
//upload
regsitryService(new SyncPartSalesDataServiceImpl());
//dowload
regsitryService(new SyncUserDataServiceImpl());
regsitryService(new SyncShopDataServiceImpl());
regsitryService(new SyncItemDataServiceImpl());
regsitryService(new SyncCashierModeDataServiceImpl());
regsitryService(new SyncMaterialDataServiceImpl());
regsitryService(new SyncPromotionDataServiceImpl());
regsitryService(new SyncGoldPriceDataServiceImpl());
regsitryService(new SyncCardRuleServiceImpl());
regsitryService(new SyncPointDataServiceImpl());
regsitryService(new SyncInvoiceDataServiceImpl());
regsitryService(new SyncTemplateDataServiceImpl());
}
@Override
public void onChange(final String message,int count) {
String str = progress.getInfoText().getText() + "\r\n";
progress.getInfoText().setText(str + message);
progress.getBar().setSelection(count);
System.err.println(str + message + "::::::::::" + count);
// Display.getDefault().asyncExec(new Runnable() {
// @Override
// public void run() {
//
//
// }
// });
}
@Override
public void onChange(String message) {
String str = progress.getInfoText().getText() + "\r\n";
progress.getInfoText().setText(str + message);
}
}