package com.topsun.posclient.sales.dialog; import java.math.BigDecimal; import java.math.MathContext; import java.text.NumberFormat; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TextCellEditor; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import com.topsun.posclient.common.AppConstants; import com.topsun.posclient.common.POSException; import com.topsun.posclient.common.ProjectUtil; import com.topsun.posclient.common.ui.style.CommonCss; import com.topsun.posclient.datamodel.CashierModel; import com.topsun.posclient.datamodel.Item; import com.topsun.posclient.datamodel.PartSales; import com.topsun.posclient.datamodel.dto.CashierModeDTO; import com.topsun.posclient.sales.MessageResources; import com.topsun.posclient.sales.core.service.IGoldBookingService; import com.topsun.posclient.sales.core.service.impl.GoldBookingServiceImpl; import com.topsun.posclient.sales.ui.gold.GoldSalesFacade; import com.topsun.posclient.sales.ui.gold.GoldSalesManager; import com.topsun.posclient.sales.ui.table.CashierModelItemCellModify; import com.topsun.posclient.sales.ui.table.CashierModelTableContentProvider; import com.topsun.posclient.sales.ui.table.CashierModelTableLableProvider; /** * * 预订对话框 * @author Dong * */ public class BookingDialog extends Dialog{ CashierModelItemCellModify cashierModelItemCellModify; IGoldBookingService goldBookingService = new GoldBookingServiceImpl(); public TableViewer tableViewer; private List<CashierModel> cashierModels ; private String price;//合计金额 private String docNum;//单据号 public Text cashBack;//找零金额 public PartSales partSales;//投资金条预订信息 // public Text custDocNum;//手工单号 private Text tradeOrder; public final PartSales getPartSales() { return partSales; } public final void setPartSales(PartSales partSales) { this.partSales = partSales; } public final String getDocNum() { return docNum; } public final void setDocNum(String docNum) { this.docNum = docNum; } public List<CashierModel> getCashierModels() { return cashierModels; } public void setCashierModels(List<CashierModel> cashierModels) { this.cashierModels = cashierModels; } public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public BookingDialog(Shell parent) { super(parent); } protected void configureShell(Shell newShell) { newShell.setText("结算"); super.configureShell(newShell); } protected void okPressed() { BigDecimal count = ProjectUtil.formatString(getPrice()); BigDecimal payCount = new BigDecimal(0); List<CashierModel> cmList = (List<CashierModel>)getTableViewer().getInput(); for(CashierModel cmodel : cmList){ payCount = payCount.add(cmodel.getAmount()); } if(payCount.compareTo(count) == -1){ MessageDialog.openError(this.getShell(), "错误", "收款金额不能小于合计金额"); return; } partSales.setCashierModelList(cmList); partSales.setCountAmount(count); partSales.setCashBackAmount(ProjectUtil.formatString(cashBack.getText())); partSales.setDocNum(tradeOrder.getText()); try { goldBookingService.checkPartSalesDocNum(partSales); } catch (POSException e1) { MessageDialog.openWarning(this.getShell(), "提示", "单据号校验失败,请修改"); return; } partSales.setCashBackAmount(ProjectUtil.formatString(cashBack.getText())); try { goldBookingService.checkPartSalesDocNum(partSales); goldBookingService.saveGoldBookingData(partSales); } catch (POSException e1) { if(null != e1.getErrorCode() && e1.getErrorCode().equals("15")){//错误码=15,单据号重复,不保存且不重置表单 MessageDialog.openError(this.getShell(), "错误", e1.getErrorMessage()); return; }else{ MessageDialog.openError(this.getShell(), "错误", e1.getErrorMessage()); try { GoldSalesFacade.restGoldBookingView(); } catch (POSException e) { MessageDialog.openError(this.getShell(), "错误", e.getErrorMessage()); return; } this.close(); super.okPressed(); return; } } try { GoldSalesFacade.restGoldBookingView(); } catch (POSException e) { MessageDialog.openError(this.getShell(), "错误", e.getErrorMessage()); return; } GoldSalesManager.getInstance().getGoldSalesBtn().setEnabled(true); GoldSalesManager.getInstance().getGoldBookingBtn().setEnabled(true); GoldSalesManager.getInstance().getGoldTimeoutBtn().setEnabled(true); GoldSalesManager.getInstance().getQueryBtn().setEnabled(true); GoldSalesManager.getInstance().getAddBookingBtn().setEnabled(true); GoldSalesManager.getInstance().getAddCurrentProductBtn().setEnabled(true); this.close(); super.okPressed(); } protected Control createContents(Composite parent) { Composite compsite = new Composite(parent, SWT.BORDER); compsite.setLayout(new GridLayout(3, false)); GridData layoutData = new GridData(GridData.FILL_BOTH); compsite.setLayoutData(layoutData); { Label label = new Label(compsite, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL); label.setLayoutData(data); label.setText("交易单号(F6):"); label.setFont(CommonCss.getDefaultFont(parent.getDisplay())); } { tradeOrder = new Text(compsite, SWT.BORDER); GridData data = CommonCss.getDefaultTextData(); tradeOrder.setFont(CommonCss.getDefaultFont(parent.getDisplay())); tradeOrder.setLayoutData(data); tradeOrder.setEditable(false); tradeOrder.setText(docNum); } { List<Item> items = GoldSalesFacade.getCurrentItemList(); Button btn = new Button(compsite, SWT.NONE); btn.setFont(CommonCss.getDefaultFont(parent.getDisplay())); GridData data = new GridData(); data.widthHint = 30; btn.setLayoutData(data); btn.setText("+"); if(items != null || items.size() != 0){ if(AppConstants.ITEM_TYPE_BOOKING.equals(items.get(0).getItemType())){ btn.setEnabled(false); }; } btn.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { String tradeOrderNum = tradeOrder.getText(); String subStr = tradeOrderNum.substring(tradeOrderNum.length()-4,tradeOrderNum.length()); NumberFormat formatter = NumberFormat.getNumberInstance(); formatter.setMinimumIntegerDigits(4); formatter.setGroupingUsed(false); BigDecimal bigDecimal = new BigDecimal(subStr,MathContext.DECIMAL32); BigDecimal value = bigDecimal.add(new BigDecimal(1)); String regex = "^([0]+)([\\d]*)"; Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(new StringBuffer(subStr)); String zeroPrefix = ""; if(matcher.find()) { zeroPrefix = matcher.group(1); subStr = matcher.group(2);//除0后的值 } String prifix = tradeOrderNum.substring(0,tradeOrderNum.length()-4); if(value.compareTo(new BigDecimal(9999)) == 1){ MessageDialog.openError(tableViewer.getTable().getShell(), "错误", "单据号允许的最大序号为9999"); return; } String setStr = prifix + formatter.format(value); tradeOrder.setText(setStr); // custDocNum.setText(setStr); } public void widgetDefaultSelected(SelectionEvent e) { } }); } { Label label = new Label(compsite, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL); label.setLayoutData(data); label.setText("合计金额:"); label.setFont(CommonCss.getDefaultFont(parent.getDisplay())); } { Text text = new Text(compsite, SWT.BORDER); GridData data = CommonCss.getDefaultTextData(); data.horizontalSpan = 2; text.setLayoutData(data); text.setFont(CommonCss.getDefaultFont(parent.getDisplay())); text.setEditable(false); text.setText(getPrice()); } { tableViewer = new TableViewer(compsite,SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER | SWT.FULL_SELECTION); tableViewer.setContentProvider(new CashierModelTableContentProvider()); tableViewer.setLabelProvider(new CashierModelTableLableProvider()); String[] cloumsProperties = new String[]{"typeName","amount","cardno"}; tableViewer.setColumnProperties(cloumsProperties); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.horizontalSpan = 3; data.heightHint = 250; Table table = tableViewer.getTable(); table.setFont(CommonCss.getDefaultFont(parent.getDisplay())); CellEditor[] editors = new CellEditor[3]; editors[0] = new TextCellEditor(table); editors[1] = new TextCellEditor(table); editors[2] = new TextCellEditor(table); tableViewer.setCellEditors(editors); table.setLayoutData(data); cashierModelItemCellModify = new CashierModelItemCellModify(tableViewer,cashBack,getPrice()); tableViewer.setCellModifier(cashierModelItemCellModify); table.setLinesVisible(false); table.setHeaderVisible(true); { TableColumn column = new TableColumn(table, SWT.NONE); column.setText("收银方式(F3)"); column.setWidth(100); } { TableColumn column = new TableColumn(table, SWT.NONE); column.setText("收款金额"); column.setWidth(100); } { TableColumn column = new TableColumn(table, SWT.NONE); column.setText("卡号"); column.setWidth(170); } List<CashierModel> cashierModeList = null; try { CashierModeDTO dto = goldBookingService.getAllCashierMode(); if(null != dto){ cashierModeList = dto.getCashierModeList(); } } catch (POSException e) { e.printStackTrace(); MessageDialog.openError(parent.getShell(), MessageResources.message_ui_tips, e.getErrorMessage()); } tableViewer.setInput(cashierModeList); } { Label label = new Label(compsite, SWT.NONE); GridData data = new GridData(GridData.FILL_HORIZONTAL); label.setLayoutData(data); label.setText("现金找补:"); label.setFont(CommonCss.getDefaultFont(parent.getDisplay())); } { cashBack = new Text(compsite, SWT.BORDER); GridData data = CommonCss.getDefaultTextData(); data.horizontalSpan = 2; cashBack.setLayoutData(data); cashBack.setFont(CommonCss.getDefaultFont(parent.getDisplay())); cashBack.setEditable(false); cashBack.setText(""); } cashierModelItemCellModify.setCashBack(cashBack); return super.createContents(parent); } public TableViewer getTableViewer() { return tableViewer; } public void setTableViewer(TableViewer tableViewer) { this.tableViewer = tableViewer; } protected void createButtonsForButtonBar(Composite parent) { int buttonWidth = 120; int buttonHight = 38; parent.setLayout(new GridLayout(5,false)); Button okbtn = createButton(parent, IDialogConstants.OK_ID, "确认",true); GridData btnLayout = new GridData(); btnLayout.widthHint = buttonWidth; btnLayout.heightHint = buttonHight; okbtn.setLayoutData(btnLayout); Button cancelBtn = createButton(parent, IDialogConstants.CANCEL_ID, "取消", false); cancelBtn.setLayoutData(btnLayout); } protected Button createButton(Composite parent, int id, String label, boolean defaultButton) { return super.createButton(parent, id, label, defaultButton); } }