@@ -670,7 +670,7 @@ public class WxRentContractServiceImpl implements WxRentContractService {
rentList = buildRentMonth(wxMerchant, userId, wxRentContract, receivePeriod, lease, rentalStartDate, price,isPreview);
} else {
//按日计租
Map<String, Object> resultMap = buildRent(lease, receivePeriod, price, rentalStartDate, Calendar.DAY_OF_MONTH, wxRentContract, userId, wxMerchant, 0, isPreview, null);
Map<String, Object> resultMap = buildRent(lease, receivePeriod, price, rentalStartDate, Calendar.DAY_OF_MONTH, wxRentContract, userId, wxMerchant, 0, isPreview, null,false );
rentList = ( List<WxBillRent>)resultMap.get("billList");
}
}
@@ -771,10 +771,22 @@ public class WxRentContractServiceImpl implements WxRentContractService {
List<WxBillRent> resultList = new ArrayList<>();
for (int i = 0; i < size; i++) {
Calendar instance = Calendar.getInstance();
instance.setTime(rentalStartDate);
//开始时间
instance.add(Calendar.MONTH, month * i);
Map<String, Object> resultMap = buildRent(leaseArr[i], receivePeriod, priceArrs[i], instance.getTime(), Calendar.MONTH, wxRentContract, userId, wxMerchant, billcount, isPreview, shopInfos.isEmpty() ? null : shopInfos.get(i));
Date startDate;
//自然月
if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
if(i == 0){ //第一期
startDate = rentalStartDate;
}else{
instance.setTime(rentalStartDate);
instance.add(Calendar.MONTH, month * i);
startDate = DateUtils.getFirstDayForCurrMonth(instance.getTime());
}
}else{
instance.setTime(rentalStartDate);
instance.add(Calendar.MONTH, month * i);
startDate = instance.getTime();
}
Map<String, Object> resultMap = buildRent(leaseArr[i], receivePeriod, priceArrs[i], startDate, Calendar.MONTH, wxRentContract, userId, wxMerchant, billcount, isPreview, shopInfos.isEmpty() ? null : shopInfos.get(i),i==size-1?true:false);
List<WxBillRent> billRentList = (List<WxBillRent>)resultMap.get("billList");
billcount = (Integer)resultMap.get("billcount");
resultList.addAll(billRentList);
@@ -790,7 +802,10 @@ public class WxRentContractServiceImpl implements WxRentContractService {
return false;
}
public Map<String, Object> buildRent(int lease, int receivePeriod, int price, Date startdate, int dayType, WxRentContract wxRentContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview, Map<String, Object> shopInfo) {
public Map<String, Object> buildRent(int lease, int receivePeriod, int price, Date startdate, int dayType, WxRentContract wxRentContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview, Map<String, Object> shopInfo,boolean isLastYesr) {
System.out.println("------lease:"+lease+"receivePeriod:"+receivePeriod+"price:"+price+"start:"+DateUtils.date2String(startdate,"yyyy-MM-dd")
+"dayType:"+dayType+"billcount:"+billcount);
String shopInfoStr = null;
if (shopInfo != null) {
shopInfoStr = JSONObject.toJSONString(shopInfo);
@@ -802,34 +817,39 @@ public class WxRentContractServiceImpl implements WxRentContractService {
int paycount = lease / receivePeriod + extracount;
int index = paycount - 1;
final IdWorker idWorker = IdWorker.get();
//自然月 n+1
if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())
&& !isFirstDay(wxRentContract.getRentalStartDate())
){
paycount ++;
}
for (int i = 0; i < paycount; i++) {
//自然月,而且残月,而且整除,最后一个月单独一个周期
// if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())
// && !isFirstDay(wxRentContract.getRentalStartDate()) && isLastYesr
// && (wxRentContract.getLease()/wxRentContract.getReceivePeriod() == 0)
// ){
// paycount ++;
// }
for(int i = 0; i < paycount; i++){
WxBillRent wxBillRent = new WxBillRent();
wxBillRent.setIsPreview(isPreview);
wxBillRent.setId(idWorker.nextId());
wxBillRent.setRentContractId(wxRentContract.getId());
wxBillRent.setPay(0);
System.out.println("-----------price:"+price+",receivePeriod:"+receivePeriod);
// System.out.println("-----------price:"+price+",receivePeriod:"+receivePeriod);
int needpay = price * receivePeriod;
System.out.println("--------needpay:"+needpay);
// System.out.println("--------needpay:"+needpay);
Calendar instance = Calendar.getInstance();
Date date = new Date();
instance.setTime(startdate);
instance.add(dayType, receivePeriod * i);
instance.add(Calendar.DAY_OF_MONTH, -1);
if(!wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
instance.add(Calendar.DAY_OF_MONTH, -1);
}
Date time = instance.getTime();
wxBillRent.setReceiveDate(time);
//账单开始时间
instance.clear();
instance.setTime(wxBillRent.getReceiveDate());
instance.add(Calendar.DAY_OF_MONTH, 1);
if(!wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
instance.add(Calendar.DAY_OF_MONTH, 1);
}
wxBillRent.setStarttime(instance.getTime());
//账单结束时间
instance.clear();
@@ -843,7 +863,9 @@ public class WxRentContractServiceImpl implements WxRentContractService {
//账单开始时间
instance.clear();
instance.setTime(wxBillRent.getReceiveDate());
instance.add(Calendar.DAY_OF_MONTH, 1);
if(!wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
instance.add(Calendar.DAY_OF_MONTH, 1);
}
wxBillRent.setStarttime(instance.getTime());
//账单结束时间
instance.clear();
@@ -857,25 +879,28 @@ public class WxRentContractServiceImpl implements WxRentContractService {
//自然月,开始日期、缴款日,结束日期
if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
if(i == 0){//第一周期
wxBillRent.setReceiveDate(wxRentContract.getRentalStartDate());
wxBillRent.setStarttime(wxRentContract.getRentalStartDate());
double oneDayProce = (double) price / DateUtils.getMonthDayCount(wxRentContract.getRentalStartDate());
int startDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxRentContract.getRentalStartDate()));
double oneDayProce = (double) price / DateUtils.getMonthDayCount(wxBillRent.getStarttime());
int startDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxBillRent.getStarttime()));
double needPayDouble;
if(receivePeriod <= 1) {//周期为一个月
wxBillRent.setEndtime(DateUtils.getLastDayForMonth(wxRentContract .getRental StartDa te()));
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxRentContract .getRental StartDa te())-startDateInt+1);
wxBillRent.setEndtime(DateUtils.getLastDayForMonth(wxBill Rent.getStarttim e()));
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBill Rent.getStarttim e())-startDateInt+1);
}else{ //周期大于一个月
wxBillRent.setEndtime(DateUtils.getLastDayForMonth(wxRentContract.getRentalStartDate(),receivePeriod - 1));
Date firstDay = DateUtils.getFirstDayForCurrMonth(wxBillRent.getStarttime());
instance.clear();
instance.setTime(firstDay);
instance.add(dayType, extralease);
instance.add(Calendar.DAY_OF_MONTH, -1);
wxBillRent.setEndtime(instance.getTime());
// [A/31 *(31-12+1)]+A+A
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxRentContract.getRentalStartDate())-startDateInt+1);
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBill Rent.getStarttim e())-startDateInt+1);
needPayDouble += price * (receivePeriod - 1);
}
DecimalFormat format = new DecimalFormat("0");
needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入
}else if(i < paycount - 1){//中间周期
Date receiveDate = DateUtils.getFirstDayOfNextMonth(wxRentContract.getRentalStartDate() ,receivePeriod * i);
Date receiveDate = DateUtils.getFirstDayOfNextMonth(startdate ,receivePeriod * i);
wxBillRent.setReceiveDate(receiveDate);
wxBillRent.setStarttime(receiveDate);
wxBillRent.setEndtime(DateUtils.getLastDayForMonth(receiveDate,receivePeriod * i));
@@ -904,6 +929,39 @@ public class WxRentContractServiceImpl implements WxRentContractService {
needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入
}
}
//最后一个周期
if (isLastYesr) {
if(wxRentContract.getLease()/wxRentContract.getReceivePeriod() == 0){
wxBillRent.setStarttime(startdate);
int endDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxRentContract.getRentalEndDate()));
String endDateStr = DateUtils.date2String(startdate,"yyyy-MM")+ "-" +(endDateInt - 1);
wxBillRent.setEndtime(DateUtils.stringToDate(endDateStr,"yyyy-MM-dd"));
double needPayDouble;
double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillRent.getEndtime());
needPayDouble = oneDayProce * endDateInt;
DecimalFormat format = new DecimalFormat("0");
needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入
}else{
wxBillRent.setStarttime(startdate);
int endDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxRentContract.getRentalEndDate()));
instance.clear();
instance.setTime(DateUtils.getLastDayOfNextMonth(startdate,lease));
instance.add(dayType, receivePeriod);
instance.add(Calendar.DAY_OF_MONTH, endDateInt-1);
wxBillRent.setEndtime(instance.getTime());
double needPayDouble;
double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillRent.getEndtime());
needPayDouble = oneDayProce * endDateInt;
DecimalFormat format = new DecimalFormat("0");
needpay = Integer.parseInt(format.format(needPayDouble)); //分做四舍五入
}
}
wxBillRent.setNeedPay(needpay);
wxBillRent.setOwe(needpay);