package com.topsun.posclient.sales.dialog; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.IDialogConstants; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.SWT; 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.Text; import com.topsun.posclient.common.AppConstants; import com.topsun.posclient.common.ProjectUtil; import com.topsun.posclient.common.ui.style.CommonCss; import com.topsun.posclient.common.ui.utils.FormatUtils; import com.topsun.posclient.datamodel.CashierModel; import com.topsun.posclient.datamodel.Item; import com.topsun.posclient.datamodel.PartSales; import com.topsun.posclient.datamodel.User; import com.topsun.posclient.sales.MessageResources; import com.topsun.posclient.sales.core.SalesDataUtil; import com.topsun.posclient.sales.ui.gold.PartSalesManager; /** * 折扣/抹零确认对话框,输入折扣/抹零值 * * @author Dong * */ public class MAuthConfirmDialog extends Dialog { private int opFlag = 0;//0 折扣 1抹零 private Text inputMauth;//输入折扣和抹零值 public Text salesOffPoint;//折扣 public Text delZero;//抹零 public Text factTotalAmount;//实收金额 private User authUser;//进行折扣/抹零的用户的权限 protected MAuthConfirmDialog(Shell parentShell) { super(parentShell); } protected void configureShell(Shell newShell) { if(this.getOpFlag() == 0){ newShell.setText("请输入折扣值"); }else{ newShell.setText("请输入抹零值"); } super.configureShell(newShell); } protected void okPressed() { String inputMauthStr = inputMauth.getText(); boolean flag = true; if(this.getOpFlag() == 0){ flag = FormatUtils.checkNeatnessFormat(this.getShell(), inputMauthStr,"【折扣值】格式不正确,取值范围【0-1】"); if(!flag){ inputMauth.forceFocus(); inputMauth.setText(""); return; } } if(null == inputMauthStr || "".equals(inputMauthStr)){ if(this.getOpFlag() == 0){ MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "请输入【折扣值】"); inputMauth.forceFocus(); return; } MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "请输入【抹零金额】"); inputMauth.forceFocus(); return; }else{ BigDecimal oldTotalAmount = ProjectUtil.formatString(PartSalesManager.getInstance().getTotalAmount().getText());//原合计金额 oldTotalAmount = oldTotalAmount.subtract(ProjectUtil.formatString(getSalesOffPoint().getText()));//总金额-折扣金额 oldTotalAmount = oldTotalAmount.subtract(ProjectUtil.formatString(getDelZero().getText()));//总金额-抹零金额 BigDecimal mlimit = this.getAuthUser().getMauth().getMlimit(); BigDecimal rate = this.getAuthUser().getMauth().getRate(); if(this.getOpFlag() == 0){ FormatUtils.chenckNumFormat(inputMauth, inputMauth.getText(),"【折扣值】格式不正确"); if(ProjectUtil.formatString(inputMauthStr).compareTo(rate) == -1){ MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "折扣值不能超过权限设定值"); inputMauth.setText(""); inputMauth.forceFocus(); return; } BigDecimal inputMauthVal = ProjectUtil.formatString(inputMauth.getText());//输入的折扣/抹零值 BigDecimal discountAmount = oldTotalAmount.subtract(oldTotalAmount.multiply(inputMauthVal));//被折掉的金额 //分摊到每个单品 PartSales partSales = doAfterMAuth(PartSalesManager.getInstance().getPartSales(),inputMauthVal, oldTotalAmount, opFlag); PartSalesManager.getInstance().setPartSales(partSales); PartSalesManager.getInstance().getPartSales().setDiscountRate(inputMauthVal); PartSalesManager.getInstance().getPartSales().setDiscountAmount(discountAmount); PartSalesManager.getInstance().getPartSales().setMratio(true);//设置是否折扣 }else{ FormatUtils.chenckNumFormat(inputMauth, inputMauth.getText(),"【抹零】格式不正确"); BigDecimal amountZero = new BigDecimal(inputMauth.getText());// 抹零金额 if(ProjectUtil.formatString(inputMauthStr).compareTo(mlimit) == 1){ MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "抹零金额不能超过权限设定值"); inputMauth.setText(""); inputMauth.forceFocus(); return; } BigDecimal factTotalAmountVal = ProjectUtil.formatString(factTotalAmount.getText()); BigDecimal mrateAmount = factTotalAmountVal.multiply(this.getAuthUser().getMauth().getMratio()); if(ProjectUtil.formatString(inputMauthStr).compareTo(mrateAmount) == 1){ MessageDialog.openError(this.getShell(), MessageResources.message_ui_tips, "抹零金额不能超过本单抹零上限值【"+ProjectUtil.formatAmount(null, mrateAmount)+"】"); inputMauth.setText(""); inputMauth.forceFocus(); return; } PartSalesManager.getInstance().getCashierModelTableViewer().refresh(); //分摊到每个单品 PartSales partSales = doAfterMAuth(PartSalesManager.getInstance().getPartSales(),amountZero, oldTotalAmount, opFlag); PartSalesManager.getInstance().setPartSales(partSales); PartSalesManager.getInstance().getPartSales().setMlimit(true);//设置是否抹零 } BigDecimal discountAmount = oldTotalAmount.subtract(oldTotalAmount.multiply(ProjectUtil.formatString(inputMauth.getText())));//被折掉的金额 BigDecimal amountZero = new BigDecimal(inputMauth.getText());// 抹零金额 //折扣抹零之后的合计金额 String totalAmount = PartSalesManager.getInstance().getTotalAmount().getText(); List<CashierModel> cms = (List<CashierModel>)PartSalesManager.getInstance().getCashierModelTableViewer().getInput(); BigDecimal cmAmountCount = new BigDecimal(0); for(CashierModel cm : cms){ cmAmountCount = cmAmountCount.add(cm.getAmount()); } if(cmAmountCount.compareTo(new BigDecimal(0)) == -1){ cmAmountCount = new BigDecimal(0); } BigDecimal cashBackAmount = cmAmountCount.subtract(ProjectUtil.formatString(totalAmount)); cashBackAmount = cashBackAmount.subtract(discountAmount); discountAmount = discountAmount.subtract(amountZero); if(cashBackAmount.compareTo(new BigDecimal(0)) == -1){ cashBackAmount = new BigDecimal(0); } //折扣和抹零之后,重新设置现金找补 // PartSalesManager.getInstance().getCashBack().setText(ProjectUtil.formatAmount(null, cashBackAmount).toString()); super.okPressed(); } } /** * 折扣/抹零之后分摊到单品信息 * @param partSales 零售信息 * @param inputMAuthVal 折扣/抹零值 * @param oldTotalAmount 原合计金额 * @param opFlag 折扣/抹零标识 0 折扣 1抹零 * @return */ private PartSales doAfterMAuth(PartSales partSales, BigDecimal inputMAuthVal, BigDecimal oldTotalAmount, int opFlag){ List<Item> itemList = partSales.getItemList(); partSales.setDiscountAccount(this.getAuthUser().getId()); if(opFlag == 0){//折扣 BigDecimal allDis = oldTotalAmount.subtract(oldTotalAmount.multiply(inputMAuthVal)); allDis = allDis.setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal discountAmount = oldTotalAmount.subtract(allDis);//折扣金额 partSales.setDiscountAmount(discountAmount); partSales.setDiscountRate(inputMAuthVal); BigDecimal disAdd = new BigDecimal(0); for(int i=0; i<itemList.size(); i++){ Item item = itemList.get(i); if(item.getItemType() == AppConstants.ITEM_TYPE_OLDGOLD){ continue; } if(i == itemList.size() - 1){ item.setFactAmount(item.getFactAmount().subtract(allDis.subtract(disAdd)));//更新单品实售金额 }else{ BigDecimal factAmount = item.getFactAmount().multiply(inputMAuthVal); factAmount = factAmount.setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal itemDis = item.getFactAmount().subtract(factAmount); item.setFactAmount(factAmount);//更新单品实售金额 disAdd = disAdd.add(itemDis); } } }else{//抹零 partSales.setDiscountToZero(inputMAuthVal); BigDecimal zeroAdd = new BigDecimal(0); List<Item> newList = new ArrayList<Item>(); for(Item ii : itemList){ if(ii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(ii); } } for(int i=0; i<newList.size(); i++){ Item iii = newList.get(i); //如果是最后一个单品 if(i == newList.size() - 1){ System.out.println(""); System.out.println("单品抹零金额为:"+inputMAuthVal.subtract(zeroAdd)); iii.setFactAmount(iii.getFactAmount().subtract(inputMAuthVal.subtract(zeroAdd)));//更新单品实售金额 }else{ //总金额,用于计算权重时作为单品的被除数基数,重新计算整单中没有旧金的合计金额 BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } BigDecimal subAmount = inputMAuthVal.multiply(iii.getFactAmount()).divide(totalAmount, 4, BigDecimal.ROUND_HALF_UP);//单品抹零 subAmount = subAmount.setScale(2, BigDecimal.ROUND_HALF_UP); System.out.println(""); System.out.println("单品抹零金额为:"+subAmount); iii.setFactAmount(iii.getFactAmount().subtract(subAmount));//更新单品实售金额 zeroAdd = zeroAdd.add(subAmount); } } } partSales.setItemList(itemList);//更新partSales return partSales; } protected Control createContents(Composite parent) { Composite compsite = new Composite(parent, SWT.BORDER); compsite.setLayout(new GridLayout(2, 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); if(this.getOpFlag() == 0){ label.setText("您的最大折扣权限为【"+this.getAuthUser().getMauth().getRate()+"】,请输入本次折扣值"); }else{ BigDecimal factTotalAmountVal = ProjectUtil.formatString(factTotalAmount.getText()); BigDecimal mrateAmount = factTotalAmountVal.multiply(this.getAuthUser().getMauth().getMratio()); label.setText("您的最大抹零权限为【"+this.getAuthUser().getMauth().getMlimit()+"】,本单抹零上限为【"+ProjectUtil.formatAmount(null, mrateAmount)+"】请输入本次抹零金额"); } label.setFont(CommonCss.getDefaultFont(parent.getDisplay())); } { inputMauth = new Text(compsite, SWT.BORDER); GridData data = CommonCss.getTextData(100); inputMauth.setFont(CommonCss.getDefaultFont(parent.getDisplay())); inputMauth.setLayoutData(data); } return super.createContents(parent); } protected void createButtonsForButtonBar(Composite parent) { int buttonWidth = 80; int buttonHight = 45; 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); } public Text getSalesOffPoint() { return salesOffPoint; } public void setSalesOffPoint(Text salesOffPoint) { this.salesOffPoint = salesOffPoint; } public Text getDelZero() { return delZero; } public void setDelZero(Text delZero) { this.delZero = delZero; } public final Text getInputMauth() { return inputMauth; } public final void setInputMauth(Text inputMauth) { this.inputMauth = inputMauth; } public final int getOpFlag() { return opFlag; } public final void setOpFlag(int opFlag) { this.opFlag = opFlag; } public Text getFactTotalAmount() { return factTotalAmount; } public void setFactTotalAmount(Text factTotalAmount) { this.factTotalAmount = factTotalAmount; } public User getAuthUser() { return authUser; } public void setAuthUser(User authUser) { this.authUser = authUser; } }