package com.topsun.posclient.sales.core.service.impl;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import com.topsun.posclient.common.AppConstants;
import com.topsun.posclient.common.LoggerUtil;
import com.topsun.posclient.common.POSClientApp;
import com.topsun.posclient.common.POSException;
import com.topsun.posclient.common.ProjectUtil;
import com.topsun.posclient.common.service.impl.BaseServiceImpl;
import com.topsun.posclient.datamodel.CashierModel;
import com.topsun.posclient.datamodel.GoldPrice;
import com.topsun.posclient.datamodel.Item;
import com.topsun.posclient.datamodel.PartSales;
import com.topsun.posclient.datamodel.Retail;
import com.topsun.posclient.datamodel.dto.CashierModeDTO;
import com.topsun.posclient.datamodel.dto.GoldPriceDTO;
import com.topsun.posclient.datamodel.dto.RetailDTO;
import com.topsun.posclient.sales.core.SalesCoreActivator;
import com.topsun.posclient.sales.core.SalesDataUtil;
import com.topsun.posclient.sales.core.dao.PartSaleDao;
import com.topsun.posclient.sales.core.service.IGoldBookingService;
import com.topsun.posclient.sales.core.service.IGoldTimeOutService;
import com.topsun.posclient.webservice.POSServerCaller;
import com.topsun.posclient.webservice.dto.ArrayOfgoldPrice;
import com.topsun.posclient.webservice.dto.GetGoldPriceData;
import com.topsun.posclient.webservice.dto.GetGoldPriceDataReq;
import com.topsun.posclient.webservice.dto.GetGoldPriceDataReqCondition;
import com.topsun.posclient.webservice.dto.GetGoldPriceDataResponse;
import com.topsun.posclient.webservice.dto.GetGoldPriceDataResult;
import com.topsun.posclient.webservice.dto.GetRetailDocNum;
import com.topsun.posclient.webservice.dto.GetRetailDocNumReq;
import com.topsun.posclient.webservice.dto.GetRetailDocNumReqCondition;
import com.topsun.posclient.webservice.dto.GetRetailDocNumResponse;
import com.topsun.posclient.webservice.dto.GetRetailDocNumResult;
import com.topsun.posclient.webservice.dto.RetailE;
import com.topsun.posclient.webservice.dto.Retail_P;
/**
* 投资金条预订服务
*
* @author Dong
*
*/
public class GoldBookingServiceImpl extends SalesServiceImpl implements IGoldBookingService {
/**
* 零售数据访问
*/
private PartSaleDao partSaleDao = new PartSaleDao();
/* (non-Javadoc)
* @see com.topsun.posclient.sales.core.service.IGoldBookingService#saveGoldBookingData(com.topsun.posclient.datamodel.PartSales)
*/
public void saveGoldBookingData(PartSales partSales) throws POSException {
RetailDTO retailDTO = new RetailDTO();
Retail retail = convertPartSalesToRetail(partSales);
List<Retail> retailList = new ArrayList<Retail>();
retailList.add(retail);
retailDTO.setRetailList(retailList);
partSaleDao.saveRetailGoldBooking(retailDTO, partSales.getDocNum());//保存预订数据
}
public List<CashierModel> queryCashierModelDetailByDocNum(String docNum) throws POSException {
if(null == docNum || "".equals(docNum)){
return null;
}
GetRetailDocNumReqCondition condition = new GetRetailDocNumReqCondition();
condition.setDocNum(docNum);
GetRetailDocNumReq req = new GetRetailDocNumReq();
req.setCondition(condition);
req.setUserCredential(POSServerCaller.getDefaultUserCredential());
GetRetailDocNum getRetailDocNum74 = new GetRetailDocNum();
getRetailDocNum74.setGetRetailDocNumReq(req);
try {
GetRetailDocNumResponse response = POSServerCaller.getWebService().getRetailDocNum(getRetailDocNum74);
String flag = response.getGetRetailDocNumResult().getResult().getFlag();
if(flag.equals(POSServerCaller.SUCCESS)){
GetRetailDocNumResult result = response.getGetRetailDocNumResult();
Retail_P[] retailPs = result.getRetail().getRetail_Ps().getRetail_P();
List<CashierModel> models = new ArrayList<CashierModel>();
IGoldTimeOutService goldTimeOutService = new GoldTimeOutServiceImpl();
CashierModeDTO dto = goldTimeOutService.getAllCashierMode();
if(null != dto){
models = dto.getCashierModeList();
}
for (CashierModel cashierModel : models) {
for (Retail_P retail_P : retailPs) {
if(retail_P.getPayModeID() == cashierModel.getID()){
cashierModel.setAmount(retail_P.getSum());
cashierModel.setRate(retail_P.getPoundage());
}
}
}
return models;
}else{
throw new POSException(response.getGetRetailDocNumResult().getResult().getMsg()+" 单据编号【"+docNum+"】");
}
} catch (Exception e) {
LoggerUtil.logError(SalesCoreActivator.PLUGIN_ID, "单据信息查询失败", e);
throw new POSException("预订信息查询出错,单据编号【"+docNum+"】");
}
}
/* (non-Javadoc)
* @see com.topsun.posclient.sales.core.service.IGoldBookingService#queryRetailDetailByDocNum(String)
*/
public List<Item> queryRetailDetailByDocNum(String docNum) throws POSException {
if(null == docNum || "".equals(docNum)){
return null;
}
GetRetailDocNumReqCondition condition = new GetRetailDocNumReqCondition();
condition.setDocNum(docNum);
GetRetailDocNumReq req = new GetRetailDocNumReq();
req.setCondition(condition);
req.setUserCredential(POSServerCaller.getDefaultUserCredential());
GetRetailDocNum getRetailDocNum74 = new GetRetailDocNum();
getRetailDocNum74.setGetRetailDocNumReq(req);
try {
GetRetailDocNumResponse response = POSServerCaller.getWebService().getRetailDocNum(getRetailDocNum74);
String flag = response.getGetRetailDocNumResult().getResult().getFlag();
if(flag.equals(POSServerCaller.SUCCESS)){
GetRetailDocNumResult result = response.getGetRetailDocNumResult();
RetailE retailE = result.getRetail();
return SalesDataUtil.convertRetailEToItemList(retailE, docNum);
}else{
throw new POSException(response.getGetRetailDocNumResult().getResult().getMsg()+" 单据编号【"+docNum+"】");
}
} catch (Exception e) {
LoggerUtil.logError(SalesCoreActivator.PLUGIN_ID, "单据信息查询失败", e);
throw new POSException("预订信息查询出错,单据编号【"+docNum+"】");
}
}
/**
* 投资金条预订时,将零售信息转换成Retail
* @param partSales 销售信息
* @return
* @throws POSException
*/
private Retail convertPartSalesToRetail(PartSales partSales) throws POSException{
if(null == partSales){
return null;
}
//设置基本信息
Retail retail = SalesDataUtil.getRetailFromPartSales(partSales);
//设置明细
retail.setRetailMList(SalesDataUtil.getRetailMsFromPartSales(partSales));
//零售结算 拆分到每个商品的结算金额
retail.setRetailMPList(SalesDataUtil.calculateRetailMPList(partSales));
//零售结算 整单结算金额分配
retail.setRetailPList(SalesDataUtil.calculateRetailPList(partSales));
return retail;
}
public BigDecimal getServerGoldPrice(String mtartCode) throws POSException {
//如何是在线状态,先同步物料数据
if(POSServerCaller.isConnected()){
GetGoldPriceDataReqCondition conditions = new GetGoldPriceDataReqCondition();
conditions.setShopID(Integer.valueOf(POSClientApp.get().getSysConfig().getOwnerShop()));
GetGoldPriceDataReq req = new GetGoldPriceDataReq();
req.setCondition(conditions);
req.setUserCredential(POSServerCaller.getDefaultUserCredential());
GetGoldPriceData getGoldPriceData70 = new GetGoldPriceData();
getGoldPriceData70.setGetGoldPriceDataReq(req);
try {
GetGoldPriceDataResponse response = POSServerCaller.getWebService().getGoldPriceData(getGoldPriceData70);
GetGoldPriceDataResult result = response.getGetGoldPriceDataResult();
String flag = result.getResult().getFlag();
if (!flag.equals(POSServerCaller.SUCCESS)) {
LoggerUtil.logError(SalesCoreActivator.PLUGIN_ID, result.getResult().getMsg());
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME);
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME_BACK);
}
ArrayOfgoldPrice aop = result.getGoldPrices();
if (null == aop) {
// 没有实时金价数据,删除旧的实时金价数据
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME);
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME_BACK);
}
com.topsun.posclient.webservice.dto.GoldPrice[] gpArray = aop.getGoldPrice();
if (null == gpArray) {
// 没有实时金价数据,删除旧的实时金价数据
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME);
partSaleDao.getLocalProcessor().deleteDataFile(AppConstants.DATA_GOLDPRICE_FILENAME_BACK);
}
GoldPriceDTO goldPriceDTO = new GoldPriceDTO();
List<com.topsun.posclient.datamodel.GoldPrice> goldPs = new ArrayList<com.topsun.posclient.datamodel.GoldPrice>();
for (int i = 0; i < gpArray.length; i++) {
com.topsun.posclient.webservice.dto.GoldPrice gp = gpArray[i];
com.topsun.posclient.datamodel.GoldPrice goldP = new com.topsun.posclient.datamodel.GoldPrice();
goldP.setID(gp.getId());
goldP.setMtartCode(gp.getMaraGrpCode());
goldP.setMtartName(gp.getGrpDescribe());
goldP.setPrice(gp.getPrice());
goldP.setLastSyncTime(ProjectUtil.getCurrentDateByFormat("yyyy-MM-dd hh:mm:ss"));
goldPs.add(goldP);
}
goldPriceDTO.setGoldPriceList(goldPs);
// 更新本地数据文件
partSaleDao.getLocalProcessor().updateLocalDataFile(goldPriceDTO, AppConstants.DATA_GOLDPRICE_FILENAME_BACK, AppConstants.DATA_GOLDPRICE_FILENAME);
} catch (Exception e) {
LoggerUtil.logError(SalesCoreActivator.PLUGIN_ID, "下载实时金价数据失败", e);
}
}
GoldPrice returnGoldPrice = null;
GoldPriceDTO goldPriceDTO = null;
BigDecimal retPrice = null;
try {
goldPriceDTO = partSaleDao.getAllGoldPrice();
if (null != goldPriceDTO) {
List<GoldPrice> goldPriceList = goldPriceDTO.getGoldPriceList();
if (null == goldPriceList || goldPriceList.size() <= 0) {
return null;
}
for (GoldPrice goldPrice : goldPriceList) {
if (goldPrice.getMtartCode().equals(mtartCode)) {
returnGoldPrice = goldPrice;
}
}
}
if (null != returnGoldPrice) {
retPrice = new BigDecimal(returnGoldPrice.getPrice());
}
} catch (Exception e) {
LoggerUtil.logError(SalesCoreActivator.PLUGIN_ID, "查询实时金价信息出错", e);
throw new POSException("查询实时金价信息出错");
}
if(null == retPrice){
throw new POSException("没有相应的实时金价数据");
}
return retPrice;
}
}