package org.xmx0632.deliciousfruit.erp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.xmx0632.deliciousfruit.erp.bo.ErpAddress;
import org.xmx0632.deliciousfruit.erp.bo.ErpApiInputRequest;
import org.xmx0632.deliciousfruit.erp.bo.ErpApiReadRequest;
import org.xmx0632.deliciousfruit.erp.bo.ErpCard;
import org.xmx0632.deliciousfruit.erp.bo.ErpCash;
import org.xmx0632.deliciousfruit.erp.bo.ErpChangeCard;
import org.xmx0632.deliciousfruit.erp.bo.ErpChangeCash;
import org.xmx0632.deliciousfruit.erp.bo.ErpChangeCoin;
import org.xmx0632.deliciousfruit.erp.bo.ErpChangePoint;
import org.xmx0632.deliciousfruit.erp.bo.ErpCustomer;
import org.xmx0632.deliciousfruit.erp.bo.ErpOrder;
import org.xmx0632.deliciousfruit.erp.bo.ErpOrderCard;
import org.xmx0632.deliciousfruit.erp.bo.ErpOrderCash;
import org.xmx0632.deliciousfruit.erp.bo.ErpOrderProduct;
import org.xmx0632.deliciousfruit.erp.bo.ErpProduct;
import org.xmx0632.deliciousfruit.erp.bo.ErpPromotion;
import com.google.common.collect.Lists;
@Component
public class ErpApiService {
private static final String QUERY_KEY_ERP_ORDER = "erpOrder";
private static final String QUERY_KEY_ID = "id";
private static Logger log = LoggerFactory.getLogger(ErpApiService.class);
private String url = "";
private String username = "";
private String password = "";
private ErpMessageSender erpMessageSender;
private ErpMessageParser erpMessageParser;
@Autowired(required = true)
public void setErpMessageParser(ErpMessageParser erpMessageParser) {
this.erpMessageParser = erpMessageParser;
}
@Autowired(required = true)
public void setErpMessageSender(ErpMessageSender erpMessageSender) {
this.erpMessageSender = erpMessageSender;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setUrl(String url) {
this.url = url;
}
// TODO--read-----------------------------------------------------------------------
public ErpCustomer getCustomerBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Customer);
return erpMessageParser.parseResponse(resp, new ErpCustomer());
}
public ErpPromotion getPromotionBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Promotion);
return erpMessageParser.parseResponse(resp, new ErpPromotion());
}
public ErpAddress getAddress() {
ErpAddress c = new ErpAddress();
return c;
}
public ErpCard getCardBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Card);
return erpMessageParser.parseResponse(resp, new ErpCard());
}
public ErpCash getCashBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Cash);
return erpMessageParser.parseResponse(resp, new ErpCash());
}
public ErpProduct getProductBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Product);
return erpMessageParser.parseResponse(resp, new ErpProduct());
}
public ErpOrder getOrderBy(String id) {
String resp = sendGetRequest(id, ErpApiType.Order);
return erpMessageParser.parseResponse(resp, new ErpOrder());
}
private String sendGetRequest(String id, ErpApiType erpApiType) {
return sendGetRequest(id, QUERY_KEY_ID, erpApiType);
}
public ErpOrderCard getOrderCardBy(String id) {
String resp = sendGetRequest(id, QUERY_KEY_ERP_ORDER,
ErpApiType.OrderCard);
return erpMessageParser.parseResponse(resp, new ErpOrderCard());
}
private String sendGetRequest(String id, String key, ErpApiType erpApiType) {
ErpApiReadRequest erpApiReadRequest = new ErpApiReadRequest(erpApiType,
username, password);
Map<String, String> map = new HashMap<String, String>();
map.put(key, id);
erpApiReadRequest.setData(map);
String json = erpMessageParser.toJson(erpApiReadRequest);
String resp = erpMessageSender.sendPostMsg(json, url);
log.info("[{}]\nreq:{}\nresp:{}", erpApiType, json, resp);
return resp;
}
// TODO--input-----------------------------------------------------------------------
public boolean saveOrUpdateCustomer(ErpCustomer customer) {
return sendSetMessage(customer, ErpApiType.Customer);
}
public boolean changeCard(ErpChangeCard changeCard) {
return sendSetMessage(changeCard, ErpApiType.ChangeCard);
}
public boolean changeCash(ErpChangeCash changeCash) {
return sendSetMessage(changeCash, ErpApiType.ChangeCash);
}
public boolean changeCoin(ErpChangeCoin changeCoin) {
return sendSetMessage(changeCoin, ErpApiType.ChangeCoin);
}
public boolean changePoint(ErpChangePoint changePoint) {
return sendSetMessage(changePoint, ErpApiType.ChangePoint);
}
public boolean orderCard(ErpOrderCard orderCard) {
return sendSetMessage(orderCard, ErpApiType.OrderCard);
}
public boolean orderCash(ErpOrderCash orderCash) {
return sendSetMessage(orderCash, ErpApiType.OrderCash);
}
public boolean orderProduct(ErpOrderProduct orderProduct) {
return sendSetMessage(orderProduct, ErpApiType.OrderProduct);
}
public boolean order(ErpOrder order) {
return sendSetMessage(order, ErpApiType.Order);
}
private <T> boolean sendSetMessage(T customer, ErpApiType type) {
ErpApiInputRequest<T> inputRequest1 = new ErpApiInputRequest<T>(type,
username, password);
@SuppressWarnings("unchecked")
ArrayList<T> list = Lists.newArrayList(customer);
inputRequest1.setData(list);
ErpApiInputRequest<T> inputRequest = inputRequest1;
String json = erpMessageParser.toJson(inputRequest);
String resp1 = erpMessageSender.sendPostMsg(json, url);
log.info(" \nreq:{}\nresp:{}", json, resp1);
String resp = resp1;
log.info("resp:{}", resp);
return resp.contains("\"result\":0");
}
}