package com.jcommerce.gwt.client.panels.order;
import java.util.Date;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.HorizontalPanel;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.TableLayout;
import com.google.gwt.user.client.Element;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.jcommerce.gwt.client.ContentWidget;
import com.jcommerce.gwt.client.ModelNames;
import com.jcommerce.gwt.client.PageState;
import com.jcommerce.gwt.client.form.BeanObject;
import com.jcommerce.gwt.client.model.IOrderInfo;
import com.jcommerce.gwt.client.model.IUser;
import com.jcommerce.gwt.client.panels.system.Success;
import com.jcommerce.gwt.client.resources.Resources;
import com.jcommerce.gwt.client.service.ReadService;
import com.jcommerce.gwt.client.service.RemoteService;
import com.jcommerce.gwt.client.service.UpdateService;
import com.jcommerce.gwt.client.service.WaitService;
public class OrderFeePanel extends ContentWidget{
public static interface Constants {
public String orderFee_ok();
public String orderFee_pre();
public String orderFee_cancel();
public String orderFee_goodsAmount();
public String orderFee_orderAmount();
public String orderFee_shippingFee();
public String orderFee_payFee();
public String orderFee_insurance();
public String orderFee_moneyPaid();
public String orderFee_userSurplus();
public String orderFee_moneyShouldPay();
public String orderFee_surplus();
public String orderFee_title();
}
private static OrderFeePanel instance = null;
protected State getCurState() {
return (State)curState;
}
@Override
public String getDescription() {
return "cwBasicTextDescription";
}
@Override
public String getName() {
if(getCurState().getIsEdit())
return Resources.constants.orderFee_title();
else
return Resources.constants.OrderUser_title();
}
public OrderFeePanel() {
curState = new State();
}
public static OrderFeePanel getInstance(){
if (instance == null) {
instance = new OrderFeePanel();
}
return instance;
}
public static class State extends PageState {
public static final String PKID = "pkId";
public static final String USERID = "userId";
public static final String ISEDIT = "isEdit";
public void setId(String id){
setValue(PKID, id);
}
public String getPkId(){
return (String)getValue(PKID);
}
public void setUserId(String id){
setValue(USERID, id);
}
public String getUserId(){
return (String)getValue(USERID);
}
public void setIsEdit(boolean isEdit){
setValue(ISEDIT, String.valueOf(isEdit));
}
public boolean getIsEdit(){
return Boolean.valueOf((String)getValue(ISEDIT)).booleanValue();
}
@Override
public String getPageClassName() {
return OrderFeePanel.class.getName();
}
}
ContentPanel panel ;
Label goodsAmountLabel = new Label("");
Label totalAmountLabel = new Label("");
TextField<String> shippingFeeField = new TextField<String>();
Label moneyPaidFeeLabel = new Label("");
TextField<String> insuranceField = new TextField<String>();
HorizontalPanel surplusPanel = new HorizontalPanel();
TextField<String> surplusField = new TextField<String>();
Label surplusLabel = new Label("");
TextField<String> payFeeField = new TextField<String>();
Label orderAmountLabel = new Label("");
Button btnPre;
Button btnOk;
@Override
protected void onRender(Element parent, int index) {
super.onRender(parent, index);
panel = new ContentPanel();
TableLayout tl = new TableLayout(4);
tl.setWidth("60%");
panel.setLayout(tl);
panel.add(new Label(Resources.constants.orderFee_goodsAmount() + ": "));
panel.add(goodsAmountLabel);
panel.add(new Label(Resources.constants.orderFee_orderAmount() + ": "));
panel.add(totalAmountLabel);
panel.add(new Label(Resources.constants.orderFee_shippingFee() + ":"));
panel.add(shippingFeeField);
panel.add(new Label(Resources.constants.orderFee_moneyPaid() + ":"));
panel.add(moneyPaidFeeLabel);
panel.add(new Label(Resources.constants.orderFee_insurance() + ":"));
panel.add(insuranceField);
panel.add(new Label(Resources.constants.orderFee_userSurplus() + ":"));
surplusPanel.add(surplusField);
surplusField.setVisible(false);
surplusPanel.add(surplusLabel);
panel.add(surplusPanel);
panel.add(new Label(Resources.constants.orderFee_payFee() + ": "));
panel.add(payFeeField);
panel.add(new Label(Resources.constants.orderFee_moneyShouldPay() + ":"));
panel.add(orderAmountLabel);
panel.setButtonAlign(HorizontalAlignment.CENTER);
btnPre = new Button(Resources.constants.orderFee_pre(), new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
OrderPayPanel.State newState = new OrderPayPanel.State();
newState.setUserId(getCurState().getUserId());
newState.setIsEdit(false);
newState.setId(getCurState().getPkId());
newState.execute();
}
});
panel.addButton(btnPre);
btnOk = new Button(Resources.constants.orderFee_ok(), new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
updateOrder();
new WaitService(new WaitService.Job() {
public boolean isReady() {
if(!updateIsReady) {
return false;
}
else {
return true;
}
}
public void run() {
if(!getCurState().getIsEdit()) {
OrderDetailPanel.State newState = new OrderDetailPanel.State();
newState.setId(getCurState().getPkId());
newState.execute();
}
else {
if(!isChange) {
OrderDetailPanel.State newState = new OrderDetailPanel.State();
newState.setId(getCurState().getPkId());
newState.execute();
}
else if(isIncrease) {
Success.State newState = new Success.State();
newState.setMessage(Resources.constants.OrderDetail_orderAmountIncrease());
OrderDetailPanel.State choice1 = new OrderDetailPanel.State();
choice1.setId(getCurState().getPkId());
newState.addChoice(OrderDetailPanel.getInstance().getName(), choice1);
newState.execute();
}
else {
Success.State newState = new Success.State();
newState.setMessage(Resources.constants.OrderDetail_orderAmountDecrease());
OrderDetailPanel.State choice1 = new OrderDetailPanel.State();
choice1.setId(getCurState().getPkId());
newState.addChoice(OrderDetailPanel.getInstance().getName(), choice1);
newState.execute();
}
}
}
});
}
});
panel.addButton(btnOk);
panel.addButton(new Button(Resources.constants.orderFee_cancel(),new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
cancel();
}
}));
add(panel);
}
BeanObject user;
BeanObject order;
@Override
public void refresh() {
isChange = false;
user = null;
order = null;
btnPre.setVisible(false);
if(!getCurState().getIsEdit()) {
btnPre.setVisible(true);
}
String orderId = getCurState().getPkId();
String userId = getCurState().getUserId();
surplusField.setVisible(false);
new ReadService().getBean(ModelNames.ORDER, orderId, new ReadService.Listener() {
public void onSuccess(BeanObject bean) {
order = bean;
Double goodsAmount = order.get(IOrderInfo.GOODS_AMOUNT);
Double shippingFee = order.get(IOrderInfo.SHIPPING_FEE);
Double insurance = order.get(IOrderInfo.INSURE_FEE);
Double payFee = order.get(IOrderInfo.PAY_FEE);
Double moneyPaid = order.get(IOrderInfo.MONEY_PAID);
Double surplus = order.get(IOrderInfo.SURPLUS);
Double orderAmount = order.get(IOrderInfo.ORDER_AMOUNT);
double totalAmount = goodsAmount + shippingFee + payFee + insurance;
goodsAmountLabel.setText("¥" + goodsAmount);
totalAmountLabel.setText("¥" + totalAmount);
shippingFeeField.setValue(String.valueOf(shippingFee));
moneyPaidFeeLabel.setText("¥" + moneyPaid);
insuranceField.setValue(String.valueOf(insurance));
payFeeField.setValue(String.valueOf(payFee));
orderAmountLabel.setText("¥" + orderAmount);
surplusField.setValue(String.valueOf(surplus));
surplusLabel.setText(Resources.constants.orderFee_surplus() + ":0");
}
});
if(userId != null) {
new ReadService().getBean(ModelNames.USER, userId, new ReadService.Listener() {
public void onSuccess(BeanObject bean) {
user = bean;
surplusField.setVisible(true);
Double surplus = bean.get(IUser.MONEY);
surplusLabel.setText(Resources.constants.orderFee_surplus() + ":" + surplus);
}
});
}
}
boolean updateIsReady;
boolean isChange = false;
boolean isIncrease = false;
private void updateOrder() {
updateIsReady = false;
final String orderId = getCurState().getPkId();
String userId = getCurState().getUserId();
final double insurance = getDoubleValue(insuranceField);
final double shippingFee = getDoubleValue(shippingFeeField);
final double payFee = getDoubleValue(payFeeField);
final Double moneyPaid = order.get(IOrderInfo.MONEY_PAID);
double surplus = 0;
if(userId != null) {
surplus = getDoubleValue(surplusField);
if(surplus > (Double)user.get(IUser.MONEY)) {
surplus = 0;
} else {
//待解决,生日为null
if(user.get(IUser.BIRTHDAY) == null)
user.set(IUser.BIRTHDAY, new Date());
user.set(IUser.MONEY, (Double)user.get(IUser.MONEY) - surplus);
new UpdateService().updateBean(userId, user, null);
}
}
Double goodsAmount = order.get(IOrderInfo.GOODS_AMOUNT);
double orderAmount = goodsAmount + shippingFee + insurance + payFee - surplus - moneyPaid;
if(getCurState().getIsEdit()) {
if(order.getInt(IOrderInfo.PAY_STATUS) == IOrderInfo.PS_PAYED && (Double)order.get(IOrderInfo.ORDER_AMOUNT) != orderAmount) {
isChange = true;
if((Double)order.get(IOrderInfo.ORDER_AMOUNT) > orderAmount)
isIncrease = false;
else {
isIncrease = true;
order.set(IOrderInfo.PAY_STATUS, IOrderInfo.PS_UNPAYED);
}
}
}
order.set(IOrderInfo.INSURE_FEE, insurance);
order.set(IOrderInfo.SHIPPING_FEE, shippingFee);
order.set(IOrderInfo.PAY_FEE, payFee);
order.set(IOrderInfo.SURPLUS, surplus);
order.set(IOrderInfo.ORDER_AMOUNT, orderAmount);
new UpdateService().updateBean(orderId, order, new UpdateService.Listener() {
public void onSuccess(Boolean success) {
updateIsReady = true;
}
});
}
private double getDoubleValue(TextField<String> field) {
double value;
try {
value = Double.valueOf(field.getValue());
} catch(NumberFormatException e) {
value = 0;
}
return value;
}
private void cancel() {
if(getCurState().getIsEdit()) {
OrderDetailPanel.State newState = new OrderDetailPanel.State();
newState.setId(getCurState().getPkId());
newState.execute();
}
else {
//删除订单及订单商品
new RemoteService().getSpecialService().deleteOrder(getCurState().getPkId(), new AsyncCallback<Boolean>(){
public void onFailure(Throwable caught) {
}
public void onSuccess(Boolean result) {
}
});
OrderListPanel.State newState = new OrderListPanel.State();
newState.execute();
}
}
}