package com.bonus.settlement.calc; import java.text.ParseException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; import org.apache.log4j.Logger; import com.bonus.core.DateTimeHelper; import com.bonus.core.StringHelper; import com.bonus.settlement.beans.SettlementDetailsBean; public class BalanceAgreementCodeModelCalc implements IModelCalc { private Logger logger = Logger.getLogger(BalanceAgreementCodeModelCalc.class); private String settlementDate; private List collars; private List backs; public BalanceAgreementCodeModelCalc(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 collar = collars.get(i); SettlementDetailsBean back = findBackByCode(collar); maps.put(collar, back); } return calc(maps); } // 租赁结算清单 private List calc( Map maps) throws ParseException { List bacrList = new ArrayList(); // 获取出租 Set collarSet = maps.keySet(); for (SettlementDetailsBean collarBean : collarSet) { SettlementDetailsBean back = maps.get(collarBean); BalanceAgreementModelCodeResultBean r = calcResult(collarBean, back); bacrList.add(r); } return groupAndCombine(bacrList); } //同一个规格、出租时间、退组时间租赁费用合并 private List groupAndCombine(List bacrList) { Map> maps = new HashMap>(); for(BalanceAgreementModelCodeResultBean bean : bacrList) { String key = bean.getTypeId() + bean.getLeaseDate() + bean.getReturnDate(); List tmps = maps.get(key); if(tmps == null){ tmps = new ArrayList(); } tmps.add(bean); maps.put(key, tmps); } Set keys = maps.keySet(); List list = new ArrayList(); for(String key : keys){ List tmps = maps.get(key); BalanceAgreementModelResultBean b = combine(tmps); b.setIsCount(false); list.add(b); } return list; } private BalanceAgreementModelResultBean combine(List tmps){ BalanceAgreementModelResultBean f = new BalanceAgreementModelResultBean(); float leaseNum = 0; float leaseMoney = 0; float returnNum = 0; boolean tf = true; for(BalanceAgreementModelCodeResultBean b: tmps) { if(tf){ f.setAgreementCode(b.getAgreementCode()); f.setCollar(b.getCollar()); f.setBack(b.getBack()); f.setDeviceModel(b.getDeviceModel()); f.setDeviceName(b.getDeviceName()); f.setDeviceUnit(b.getDeviceUnit()); f.setDays(b.getDays()); f.setSettlementDate(settlementDate); f.setLeasePrice(b.getLeasePrice()); f.setBuyPrice(b.getBuyPrice()); f.setProjectName(b.getProjectName()); f.setReturnDate(b.getReturnDate()); tf = false; } leaseNum += 1; if(b.getBack() != null){ returnNum += 1; } leaseMoney += b.getLeaseMoney(); } f.setLeaseNum(leaseNum); f.setReturnNum(returnNum); f.setLeaseMoney(leaseMoney); return f; } private BalanceAgreementModelCodeResultBean calcResult(SettlementDetailsBean collarBean,SettlementDetailsBean back) throws ParseException { BalanceAgreementModelCodeResultBean bacrBean = new BalanceAgreementModelCodeResultBean(); if (back == null) { bacrBean.setCollar(collarBean); String deviceName = collarBean.getDeviceName(); String deviceModel = collarBean.getDeviceModel(); String deviceUnit = collarBean.getDeviceUnit(); String projectName = collarBean.getProjectName(); if(StringHelper.isEmpty(settlementDate)){ settlementDate = DateTimeHelper.getNowDate(); } int days = DateTimeHelper.calcDate(collarBean.getLeaseDate(), settlementDate) + 1; float leasePrice = parse(collarBean.getLeasePrice()); float buyPrice = parse(collarBean.getBuyPrice()); float leaseMoney = leasePrice * days; bacrBean.setDeviceName(deviceName); bacrBean.setDeviceModel(deviceModel); bacrBean.setDeviceUnit(deviceUnit); bacrBean.setLeaseMoney(leaseMoney); bacrBean.setBuyPrice(buyPrice); bacrBean.setDays(days); bacrBean.setLeasePrice(leasePrice); bacrBean.setProjectName(projectName); bacrBean.setReturnDate(settlementDate); bacrBean.setSettlementDate(settlementDate); bacrBean.setAgreementCode(collarBean.getAgreementId()); } else { bacrBean.setAgreementCode(collarBean.getAgreementCode()); bacrBean.setCollar(collarBean); String deviceName = collarBean.getDeviceName(); String deviceModel = collarBean.getDeviceModel(); String deviceUnit = collarBean.getDeviceUnit(); String projectName = collarBean.getProjectName(); int days = DateTimeHelper.calcDate(collarBean.getLeaseDate(), back.getReturnDate()) + 1; float leasePrice = parse(collarBean.getLeasePrice()); float buyPrice = parse(collarBean.getBuyPrice()); float leaseMoney = leasePrice * days; bacrBean.setDeviceName(deviceName); bacrBean.setDeviceModel(deviceModel); bacrBean.setDeviceUnit(deviceUnit); bacrBean.setBuyPrice(buyPrice); bacrBean.setLeaseMoney(leaseMoney); bacrBean.setDays(days); bacrBean.setProjectName(projectName); bacrBean.setSettlementDate(settlementDate); bacrBean.setLeasePrice(leasePrice); bacrBean.setAgreementCode(collarBean.getAgreementId()); bacrBean.setBack(back); } return bacrBean; } private float parse(String num) { if(StringHelper.isEmpty(num)){ num ="0"; } return Float.parseFloat(num); } private SettlementDetailsBean findBackByCode(SettlementDetailsBean collar) throws Exception { int size = backs.size(); String leaseCode = collar.getDeviceCode(); for (int i = 0; i < size; i++) { SettlementDetailsBean bean = backs.get(i); String backCode = bean.getDeviceCode(); if(leaseCode.equals(backCode)){ backs.remove(i); return bean; } } return null; } }