package com.topsun.posclient.sales.core; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import com.topsun.posclient.common.AppConstants; import com.topsun.posclient.datamodel.Item; import com.topsun.posclient.datamodel.PartSales; /** * 数据处理助手 * * @author TanDong * */ public class SalesDataUtilHelper { /** * 获取打印总页数(含拆票处理) * @param partSales * @return */ public static int getPrintPageCount(PartSales partSales){ List<Item> newList = new ArrayList<Item>(); List<Item> items = partSales.getItemList(); //如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品 if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){ continue; }else{ newList.add(items.get(i)); } } }else{ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(items.get(i)); } } } int ret = 0; for(Item item : newList){ if(item.getFactAmount().compareTo(new BigDecimal(100000)) == 1){ int size = item.getFactAmount().divide(new BigDecimal(100000), 0, BigDecimal.ROUND_UP).intValue(); ret = ret+size; }else{ ret = ret + 1; } } return ret; } /** * 获取最后一个拆票item的旧金抵扣金额 * @param itemCode 用单品编码作为参数,是因为传过来的是被拆之后的item, * 而在partSales中的是没有拆的,所以根据itemCode去获取没有拆之前的item从而计算权重,得到抵扣金额 * @param partSales * @return */ public static BigDecimal getOldAmountForLastCPItem(String itemCode, PartSales partSales){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } List<Item> newList = new ArrayList<Item>(); //如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品 if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){ continue; }else{ newList.add(items.get(i)); } } }else{ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(items.get(i)); } } } //零售数据中的所有旧金金额合计 BigDecimal oldAmountCount = new BigDecimal(0); for(Item iii : partSales.getItemList()){ if(iii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ oldAmountCount = oldAmountCount.add(iii.getFactAmount());//旧金抵扣金额合计 } } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算旧金抵扣之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算旧金抵扣之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } BigDecimal oldGoldAmountAdd = new BigDecimal(0); for(Item item : newList){ if(item.getItemCode().equals(itemCode)){ ret = oldAmountCount.subtract(oldGoldAmountAdd); }else{ //多个被拆票的单品,只用最后一个做为旧金抵扣累加 if(!(item.getFactAmount().compareTo(new BigDecimal(100000)) == 0)){ BigDecimal amount = oldAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP); oldAmountCount = oldAmountCount.add(amount); } } } return ret; } /** * 获取拆票item的旧金抵扣金额 * @param itemCode * @param partSales * @return */ public static BigDecimal getOldAmountForCPItem(String itemCode, PartSales partSales){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } //零售数据中的所有旧金金额合计 BigDecimal oldAmountCount = new BigDecimal(0); for(Item iii : partSales.getItemList()){ if(iii.getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ oldAmountCount = oldAmountCount.add(iii.getFactAmount());//旧金抵扣金额合计 } } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算旧金抵扣之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算旧金抵扣之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } for(Item item : items){ if(item.getItemCode().equals(itemCode)){ ret = oldAmountCount.multiply(item.getFactAmount()).divide(totalAmount,4,BigDecimal.ROUND_HALF_UP); } } ret = ret.setScale(2, BigDecimal.ROUND_HALF_UP); return ret; } /** * 获取拆票Item的不开票金额 * @param itemCode 单品的编码 * @param partSales 零售数据 * @param noInvoiceAmountCount 不开票金额合计 * @return 拆票Item的不开票金额 */ public static BigDecimal getNoInvoiceAmountForCPItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } for(Item item : items){ if(item.getItemCode().equals(itemCode)){ ret = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP); } } return ret; } /** * 获取最后一个拆票Item的不开票金额 * @param itemCode 最后一个单品的编码 * @param partSales 零售数据 * @param noInvoiceAmountCount 不开票金额合计 * @return 最后一个拆票Item的不开票金额 */ public static BigDecimal getNoInvoiceAmountForLastCPItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } List<Item> newList = new ArrayList<Item>(); //如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品 if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){ continue; }else{ newList.add(items.get(i)); } } }else{ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(items.get(i)); } } } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } BigDecimal itemNoInvoiceAmountAdd = new BigDecimal(0); for(Item item : newList){ if(item.getItemCode().equals(itemCode)){ ret = noInvoiceAmountCount.subtract(itemNoInvoiceAmountAdd); }else{ //多个被拆票的单品,只用最后一个做为不开票金额累加 if(!(item.getFactAmount().compareTo(new BigDecimal(100000)) == 0)){ BigDecimal amount = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP); itemNoInvoiceAmountAdd = itemNoInvoiceAmountAdd.add(amount); } } } return ret; } /** * 获取最后一个单品的不开票金额 * @param itemCode 最后一个单品的单品编码 * @param partSales 零售数据 * @param noInvoiceAmountCount 不开票金额合计 * @return 最后一个单品的不开票金额 */ public static BigDecimal getNoInvoiceAmountForLastItem(String itemCode, PartSales partSales, BigDecimal noInvoiceAmountCount){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } List<Item> newList = new ArrayList<Item>(); //如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品 if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){ continue; }else{ newList.add(items.get(i)); } } }else{ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(items.get(i)); } } } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } BigDecimal itemNoInvoiceAmountAdd = new BigDecimal(0); for(Item item : newList){ if(item.getItemCode().equals(itemCode)){ ret = noInvoiceAmountCount.subtract(itemNoInvoiceAmountAdd); }else{ BigDecimal amount = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP); itemNoInvoiceAmountAdd = itemNoInvoiceAmountAdd.add(amount); } } return ret; } /** * 获取单品的不开票金额 * @param item 最后一个单品 * @param partSales 零售数据 * @param noInvoiceAmountCount 不开票金额合计 * @return 最后一个单品的不开票金额 */ public static BigDecimal getNoInvoiceAmountForItem(Item item, PartSales partSales, BigDecimal noInvoiceAmountCount){ BigDecimal ret = new BigDecimal(0); List<Item> items = partSales.getItemList(); if(null == items || items.size() == 0){ return ret; } List<Item> newList = new ArrayList<Item>(); //如果销售类型为换货,被换购的单品就不需要打印发票所以直接continue遍历下一个单品 if(partSales.getSalesType() == AppConstants.SALES_TYPE_EXECHANGE){ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_RETURNED)){ continue; }else{ newList.add(items.get(i)); } } }else{ for(int i=0; i<items.size(); i++){ if(items.get(i).getItemType().equals(AppConstants.ITEM_TYPE_OLDGOLD)){ continue; }else{ newList.add(items.get(i)); } } } BigDecimal totalAmount = SalesDataUtil.calculateFactAmountTotalNoOldGoldAndReturned(partSales); //如果在计算开票金额之前整单有抹零金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的抹零金额来保证后面权重的正确性 if(partSales.getDiscountToZero().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountToZero()); } //如果在计算开票金额之前整单有店长折扣金额,则在抹零的时候已经修改了单品item的factAmount,这里需要再合计金额中也减去 //整单的折扣金额来保证后面权重的正确性 if(partSales.getDiscountAmount().compareTo(new BigDecimal(0)) == 1){ totalAmount = totalAmount.subtract(partSales.getDiscountAmount()); } ret = noInvoiceAmountCount.multiply(item.getFactAmount()).divide(totalAmount,2,BigDecimal.ROUND_HALF_UP); return ret; } }