package com.jcommerce.gwt.client.panels.orders;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
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.store.ListStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Info;
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.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.jcommerce.gwt.client.ModelNames;
import com.jcommerce.gwt.client.form.BeanObject;
import com.jcommerce.gwt.client.model.IBrand;
import com.jcommerce.gwt.client.model.IGoods;
import com.jcommerce.gwt.client.model.IOrder;
import com.jcommerce.gwt.client.model.IOrderGoods;
import com.jcommerce.gwt.client.model.IUser;
import com.jcommerce.gwt.client.model.IUserRank;
import com.jcommerce.gwt.client.model.RegularExConstants;
import com.jcommerce.gwt.client.resources.Resources;
import com.jcommerce.gwt.client.service.Condition;
import com.jcommerce.gwt.client.service.Criteria;
import com.jcommerce.gwt.client.service.ListService;
import com.jcommerce.gwt.client.service.ReadService;
import com.jcommerce.gwt.client.service.WaitService;
import com.jcommerce.gwt.client.widgets.ActionCellRenderer;
import com.jcommerce.gwt.client.widgets.ColumnPanel;
/**
* @author monkey
*/
public class SelectGoodsPanel extends ContentPanel{
// private String searchField = null;
private ListStore<BeanObject> store;
private BeanObject order = new BeanObject(ModelNames.ORDER);
private BeanObject user = new BeanObject(ModelNames.USER);
private List<BeanObject> selectedGoods = new ArrayList<BeanObject>();
private TextBox goodsNumberBox = new TextBox();
private TextBox nameBox = new TextBox();
private TextBox brandBox = new TextBox();
private TextBox priceBox = new TextBox();
private TextBox attributeBox = new TextBox();
private TextField<String> amountBox = new TextField<String>();
private List<BeanObject> orderGoods;
private int marking = 0;
private double discount = 0;
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
Grid<BeanObject> grid;
private static SelectGoodsPanel instance;
PagingToolBar toolBar;
public static SelectGoodsPanel getInstance() {
if (instance == null) {
instance = new SelectGoodsPanel();
}
return instance;
}
private native void initJS(SelectGoodsPanel me) /*-{
$wnd.deleteOrderGoods = function (id) {
me.@com.jcommerce.gwt.client.panels.orders.SelectGoodsPanel::deleteOrderGoods(Ljava/lang/String;)(id);
};
}-*/;
public boolean isNoData() {
boolean isNoData = true;
if(grid.getStore().getCount() > 0) {
isNoData = false;
}
return isNoData;
}
public ContentPanel initailGoodsListPanel()
{
int pageSize = 1;
store = new ListStore<BeanObject>();
toolBar = new PagingToolBar(pageSize);
//The beanobject in table is IOrderGoods
columns.add(new ColumnConfig(IOrderGoods.ID, "物件", 80));
columns.add(new ColumnConfig(IOrderGoods.GOODS, "商品编号", 100));
columns.add(new ColumnConfig(IOrderGoods.GOODSNAME, "商品名称", 100));
columns.add(new ColumnConfig(IOrderGoods.GOODSSN, "货号", 80));
columns.add(new ColumnConfig(IOrderGoods.GOODSPRICE, "价格", 80));
ColumnConfig noColumn = new ColumnConfig(IOrderGoods.GOODSNUMBER, "数量", 80);
columns.add(noColumn);
columns.add(new ColumnConfig(IOrderGoods.MARKETPRICE, "小计", 80));
ColumnConfig actcol = new ColumnConfig("Action", Resources.constants.action(), 80);
columns.add(actcol);
ColumnModel cm = new ColumnModel(columns);
grid = new EditorGrid<BeanObject>(store, cm);
grid.setLoadMask(true);
grid.setBorders(true);
grid.setSize(750, 200);
//add a deleteOrdergoodsAction to table
ActionCellRenderer render = new ActionCellRenderer(grid);
ActionCellRenderer.ActionInfo act = null;
act = new ActionCellRenderer.ActionInfo();
// act.setText(" 删除");
act.setImage("icon_trash.gif");
act.setAction("deleteOrderGoods($id)");
render.addAction(act);
actcol.setRenderer(render);
final ContentPanel panel = new ContentPanel();
panel.setFrame(true);
panel.setCollapsible(true);
panel.setButtonAlign(HorizontalAlignment.CENTER);
panel.add(grid);
panel.setSize(780, 200);
panel.setBottomComponent(toolBar);
return panel;
}
public List<BeanObject> getOderGoodsLlist()
{
List<BeanObject> orderGoodsList = new ArrayList<BeanObject>();
for(int i=0; i<store.getCount(); i++)
{
orderGoodsList.add(store.getAt(i));
}
return orderGoodsList;
}
public SelectGoodsPanel() {
initJS(this);
ContentPanel goodsPanel = initailGoodsListPanel();
/**
* search panel
*/
ContentPanel contentSearch = new ContentPanel();
HorizontalPanel search = new HorizontalPanel();
final TextField nameField = new TextField();
nameField.setFieldLabel("按商品编号或商品名称或商品货号搜索");
final ListBox searchResultBox = new ListBox();
searchResultBox.addItem("--请选择--");
searchResultBox.addClickListener(new ClickListener() {
//Read the selected Goods info to textfields.
public void onClick(Widget sender) {
if(searchResultBox.getItemCount() > 1 && searchResultBox.getSelectedIndex()!=0) {
int index = searchResultBox.getSelectedIndex();
// get object by index
BeanObject selectedBean = selectedGoods.get(index);
nameBox.setText(selectedBean.getString(IGoods.NAME));
goodsNumberBox.setText(selectedBean.getString(IGoods.SN));
String brandID = selectedBean.getString(IGoods.BRAND);
new ReadService().getBean(ModelNames.BRAND, brandID, new ReadService.Listener() {
public synchronized void onSuccess(BeanObject result) {
brandBox.setText(result.getString(IBrand.NAME));
}
});
priceBox.setText(selectedBean.getString(IGoods.SHOPPRICE));
attributeBox.setText(selectedBean.getString(IGoods.ATTRIBUTES));
marking = index;
}
}
});
Button searchButton = new Button("搜索");
searchButton.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
if(nameField.getValue() == null)
{
return ;
}
searchResultBox.clear();
selectedGoods.clear();
searchResultBox.addItem("--请选择--");
selectedGoods.add(null);
// use goods_name or goods_sn to search info.
Criteria criteria = new Criteria(Criteria.OR);
criteria.addCondition(new Condition(IGoods.NAME,
Condition.EQUALS, nameField.getValue().toString()));
criteria.addCondition(new Condition(IGoods.SN,
Condition.EQUALS, nameField.getValue().toString()));
new ListService().listBeans(ModelNames.GOODS, criteria,
new ListService.Listener()
{
public void onSuccess(List<BeanObject> beans)
{
if(beans.size() < 1)
{
Window.alert("未找到与"+ nameField.getValue().toString() +"匹配的商品!");
}
for (Iterator<BeanObject> it = beans.iterator(); it.hasNext();)
{
BeanObject goods = it.next();
searchResultBox.addItem(goods.getString(IGoods.NAME),
goods.getString(IGoods.ID));
selectedGoods.add(goods);
}
}
});
}
});
searchButton.setHeight("22");
search.add(new Label("按商品名称或商品货号搜索:"));
search.add(nameField);
search.add(new Label(" "));
search.add(searchButton);
search.add(new Label(" "));
search.add(searchResultBox);
contentSearch.add(search);
contentSearch.setBodyBorder(true);
contentSearch.setHeight("70px");
/**
* search goods panel
*/
ContentPanel contentSearchGoods = new ContentPanel();
ColumnPanel contentPanel = new ColumnPanel();
nameBox.setWidth("600px");
nameBox.setEnabled(false);
contentPanel.createPanel(IGoods.NAME, "商品名称:", nameBox);
goodsNumberBox.setWidth("600px");
goodsNumberBox.setEnabled(false);
contentPanel.createPanel(IGoods.SN, "货号", goodsNumberBox);
brandBox.setWidth("600px");
brandBox.setEnabled(false);
contentPanel.createPanel(IBrand.NAME, "品牌名称:", brandBox);
priceBox.setWidth("600px");
priceBox.setEnabled(false);
contentPanel.createPanel(IGoods.SHOPPRICE, "价格", priceBox);
attributeBox.setWidth("600px");
attributeBox.setEnabled(false);
contentPanel.createPanel(IGoods.BRIEF, "属性", attributeBox);
amountBox.setWidth("100px");
amountBox.setEnabled(true);
amountBox.setRegex(RegularExConstants.POSITIVEINT);
amountBox.getMessages().setRegexText(RegularExConstants.POSITIVEINTREGMSG);
amountBox.setValue("1");
contentPanel.createPanel(IOrder.GOODSAMOUNT, "数量", amountBox);
com.extjs.gxt.ui.client.widget.button.Button orderButton = new com.extjs.gxt.ui.client.widget.button.Button();
orderButton.setText("加入订单");
//convert goods to ordergoods. and write it into table
orderButton.addSelectionListener(new SelectionListener<ButtonEvent>() {
public void componentSelected(ButtonEvent ce) {
if(nameBox.getText() != null && nameBox.getText().trim().length() != 0) {
orderGoods = new ArrayList<BeanObject>();
BeanObject goods = selectedGoods.get(marking);
if(!(amountBox.isValid()))
{
Info.display("Error", "Please type a correct number" +
" for the goods you want to buy");
return;
}
orderGoods.add(convertGoodsToOrderGoods(goods));
store.add(orderGoods);
}
nameBox.setText("");
goodsNumberBox.setText("");
brandBox.setText("");
priceBox.setText("");
attributeBox.setText("");
nameField.setValue(new StringBuffer(""));
searchResultBox.clear();
searchResultBox.addItem("--请选择--");
}
});
contentSearchGoods.addButton(orderButton);
contentSearchGoods.setFrame(true);
contentSearchGoods.setCollapsible(true);
contentSearchGoods.setButtonAlign(HorizontalAlignment.CENTER);
contentSearchGoods.setIconStyle("icon-table");
contentSearchGoods.setButtonAlign(HorizontalAlignment.CENTER);
contentSearchGoods.add(contentPanel);
this.add(goodsPanel);
this.add(contentSearch);
this.add(contentSearchGoods);
this.setHeading("选择商品");
this.setSize(780, 555);
}
//We get Goods info from database first. then We need convert them to OrderGoods. After this
//we can insert OrderGoods BeanObject into database.
public BeanObject convertGoodsToOrderGoods(BeanObject goods)
{
BeanObject bean = new BeanObject();
bean.set(IOrderGoods.ID, store.getCount()+1);
bean.set(IOrderGoods.GOODS, goods.getString(IGoods.ID));
bean.set(IOrderGoods.GOODSNAME, goods.getString(IGoods.NAME));
bean.set(IOrderGoods.GOODSSN, goods.getString(IGoods.SN));
bean.set(IOrderGoods.GOODSPRICE, goods.getString(IGoods.SHOPPRICE));
int number = Integer.parseInt(amountBox.getValue().toString());
bean.set(IOrderGoods.GOODSNUMBER, number);
float unitPrice = Float.parseFloat(priceBox.getText());
bean.set(IOrderGoods.MARKETPRICE, number*unitPrice*(100-discount)/100);
if(null !=order.getString(IOrder.PAYNOTE))
{
order.set(IOrder.PAYNOTE, Double.parseDouble(order.getString(IOrder.PAYNOTE)) + number*unitPrice);
}
else
{
order.set(IOrder.PAYNOTE, number*unitPrice);
}
return bean;
}
//get the line id. and delete the beanobject from table.
private void deleteOrderGoods(String id)
{
int idInt = Integer.parseInt(id);
BeanObject orderGoods = store.getAt(idInt-1);
System.out.println(orderGoods.getString(IOrderGoods.GOODSNAME));
store.remove(store.getAt(idInt-1));
toolBar.refresh();
}
public ListStore<BeanObject> getOrderGoodsStore()
{
return store;
}
public BeanObject getOrder()
{
return order;
}
public void setOrder(BeanObject order)
{
this.order = order;
}
public void setUser(BeanObject user)
{
this.user = user;
}
public double caculateDiscount()
{
if(user != null)
{
final ReadListener listener = new ReadListener();
new ReadService().getBean(ModelNames.USERRANK, user.getString(IUser.RANK),
listener);
new WaitService(new WaitService.Job() {
public boolean isReady()
{
return listener.isFinished();
}
public void run()
{
BeanObject rank = listener.getUserRank();
double theDiscount = Double.parseDouble(rank.getString(IUserRank.DISCOUNT));
double integral = Double.parseDouble(user.getString(IUser.PAYPOINTS));
discount = theDiscount + integral;
Info.display("Info", "The member has a " + discount + " discount");
order.set(IOrder.DISCOUNT, discount);
}
});
}
return 0;
}
class ReadListener extends ReadService.Listener {
private boolean finished = false;
private BeanObject userRank = new BeanObject(ModelNames.USERRANK);
public BeanObject getUserRank() {
return userRank;
}
public void onFailure(Throwable caught) {
finished = true;
}
boolean isFinished() {
return finished;
}
public void onSuccess(BeanObject bean)
{
userRank = bean;
finished = true;
}
}
}