package com.bonus.settlement.calc; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.commons.beanutils.BeanUtils; import org.apache.log4j.Logger; import com.bonus.core.DateTimeHelper; import com.bonus.core.StringHelper; import com.bonus.settlement.beans.SettlementDetailsBean; public class BalanceAgreementNumberModelCalc implements IModelCalc { private Logger logger = Logger.getLogger(BalanceAgreementNumberModelCalc.class); private String settlementDate; private List collars; private List backs; public BalanceAgreementNumberModelCalc(BalanceAgreementModelBean bean, String settlementDate) { super(); this.collars = bean.getCollars(); this.backs = bean.getBacks(); this.settlementDate = settlementDate; } public List calc() throws Exception { Collections.sort(collars, new CollarDateComparator()); Collections.sort(backs, new BackDateComparator()); Map maps = new LinkedHashMap(); for (int i = 0; i < collars.size(); i++) { SettlementDetailsBean bean = collars.get(i); Map tmps = matchCollarAndBack(bean); maps.putAll(tmps); } return calc(maps); } private Map matchCollarAndBack( SettlementDetailsBean collar) throws Exception { float collorNum = parse(collar.getLeaseNum()); Map tmps = new LinkedHashMap(); float backNumSum = 0; int size = backs.size(); for (int i = 0; i < size; i++) { SettlementDetailsBean bean = backs.remove(0); float backNum = parse(bean.getReturnNum()); backNumSum += backNum; if (collorNum == backNumSum) { SettlementDetailsBean key = (SettlementDetailsBean) BeanUtils.cloneBean(collar); key.setLeaseNum(backNum + ""); tmps.put(key, bean); break; } else if (collorNum < backNumSum) { List dd = splitBackByNum(bean, collorNum, backNumSum); SettlementDetailsBean key = (SettlementDetailsBean) BeanUtils.cloneBean(collar); key.setLeaseNum(dd.get(0).getReturnNum()); tmps.put(key, dd.get(0)); backs.add(0, dd.get(1)); break; } else { SettlementDetailsBean key = (SettlementDetailsBean) BeanUtils.cloneBean(collar); key.setLeaseNum(backNum + ""); tmps.put(key, bean); } } // 产生丢失的费用 float remainNum = collorNum - backNumSum; if (remainNum > 0) { SettlementDetailsBean key = (SettlementDetailsBean) BeanUtils.cloneBean(collar); key.setLeaseNum(remainNum + ""); tmps.put(key, null); } return tmps; } private List splitBackByNum(SettlementDetailsBean bean, float collorNum, float backNumSum) throws Exception { List tmps = new ArrayList(); SettlementDetailsBean backBean1 = (SettlementDetailsBean) BeanUtils.cloneBean(bean); float backNum1 = parse(bean.getReturnNum()) - (backNumSum - collorNum); backBean1.setReturnNum(backNum1+""); SettlementDetailsBean backBean2 = (SettlementDetailsBean) BeanUtils.cloneBean(bean); float backNum2 = backNumSum - collorNum; backBean2.setReturnNum(backNum2 + ""); tmps.add(backBean1); tmps.add(backBean2); return tmps; } private BalanceAgreementModelResultBean calcCost(SettlementDetailsBean collarBean, SettlementDetailsBean backBean) { BalanceAgreementModelResultBean resultBean = new BalanceAgreementModelResultBean(); if (backBean == null) { resultBean.setCollar(collarBean); String deviceName = collarBean.getDeviceName(); String deviceModel = collarBean.getDeviceModel(); String deviceUnit = collarBean.getDeviceUnit(); String projectName = collarBean.getProjectName(); int days = DateTimeHelper.calcDate(collarBean.getLeaseDate(), settlementDate) + 1; float leasePrice = parse(collarBean.getLeasePrice()); float buyPrice = parse(collarBean.getBuyPrice()); float leaseNum = parse(collarBean.getLeaseNum()); float leaseMoney = leasePrice * leaseNum * days; resultBean.setDeviceName(deviceName); resultBean.setDeviceModel(deviceModel); resultBean.setDeviceUnit(deviceUnit); resultBean.setLeaseMoney(leaseMoney); resultBean.setDays(days); resultBean.setProjectName(projectName); resultBean.setLeasePrice(leasePrice); resultBean.setBuyPrice(buyPrice); resultBean.setLeaseNum(leaseNum); resultBean.setReturnNum(0); resultBean.setReturnDate(settlementDate); resultBean.setSettlementDate(settlementDate); resultBean.setIsCount(true); resultBean.setAgreementCode(collarBean.getAgreementId()); } else { resultBean.setAgreementCode(collarBean.getAgreementCode()); resultBean.setCollar(collarBean); String deviceName = collarBean.getDeviceName(); String deviceModel = collarBean.getDeviceModel(); String deviceUnit = collarBean.getDeviceUnit(); String projectName = collarBean.getProjectName(); int days = DateTimeHelper.calcDate(collarBean.getLeaseDate(), backBean.getReturnDate()) + 1; // backs float leasePrice = parse(collarBean.getLeasePrice()); float buyPrice = parse(collarBean.getBuyPrice()); float leaseNum = parse(collarBean.getLeaseNum()); float returnNum = parse(backBean.getReturnNum()); float leaseMoney = leasePrice * leaseNum * days; if (days < 1) { days -= 2; leaseMoney = 0; } resultBean.setDeviceName(deviceName); resultBean.setDeviceModel(deviceModel); resultBean.setDeviceUnit(deviceUnit); resultBean.setLeaseMoney(leaseMoney); resultBean.setBuyPrice(buyPrice); resultBean.setDays(days); resultBean.setProjectName(projectName); resultBean.setSettlementDate(settlementDate); resultBean.setLeasePrice(leasePrice); resultBean.setLeaseNum(leaseNum); resultBean.setReturnNum(returnNum); resultBean.setAgreementCode(collarBean.getAgreementId()); resultBean.setBack(backBean); } resultBean.setIsCount(true); return resultBean; } // 租赁结算清单 private List calc(Map maps) { List bacrList = new ArrayList(); // 获取出租 Set collarSet = maps.keySet(); for (SettlementDetailsBean collarBean : collarSet) { SettlementDetailsBean backBean = maps.get(collarBean); BalanceAgreementModelResultBean tmps = calcCost(collarBean, backBean); bacrList.add(tmps); } return bacrList; } private float parse(String num) { if(StringHelper.isEmpty(num)) { num="0"; } return Float.parseFloat(num); } }