Просмотр исходного кода

[合同优化][修改][修改预览账单]

release_toaliyun_real
luozukai 7 лет назад
Родитель
Сommit
3299b986fa
2 измененных файлов: 62 добавлений и 240 удалений
  1. +59
    -226
      mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java
  2. +3
    -14
      mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java

+ 59
- 226
mallinkService/src/main/java/com/iformall/service/impl/WxPropertyContractServiceImpl.java Просмотреть файл

@@ -9,6 +9,7 @@ import com.iformall.common.IdWorker;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.*;
import com.iformall.domain.vo.BillTimeVo;
import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
import com.iformall.mapper.*;
@@ -247,9 +248,6 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
if (record.getPrice().longValue() <= 0) {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "物业费要大于0");
}
if (record.getDeposit().longValue() <= 0) {
return new ResultData(ErrorCode.SYS_PARAMETER_ERROR.getCode(), "押金要大于0");
}

WxPropertyContract propertyContract = new WxPropertyContract();
propertyContract.setTenantId(record.getTenantId());
@@ -508,6 +506,8 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService

int billcount = 0;
List<WxBillProperty> resultList = new ArrayList<>();

List<Date> yearList = new ArrayList<>();
for (int i = 0; i < size; i++) {
Calendar instance = Calendar.getInstance();
Date startDate;
@@ -525,241 +525,79 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
instance.add(Calendar.MONTH, month * i);
startDate = instance.getTime();
}
Map<String, Object> resultMap = buildRent(leaseArr[i], receivePeriod, priceArr[i], startDate, Calendar.MONTH, wxPropertyContract, userId, wxMerchant, billcount, isPreview, shopInfo,i==size-1?true:false);
List<WxBillProperty> billRentList = (List<WxBillProperty>)resultMap.get("billList");
billcount = (Integer)resultMap.get("billcount");
resultList.addAll(billRentList);
yearList.add(startDate);
}
Map<String, Object> resultMap = buildRent(receivePeriod, priceArr, yearList, Calendar.MONTH, wxPropertyContract, userId, wxMerchant, billcount, isPreview, shopInfo);
List<WxBillProperty> billRentList = (List<WxBillProperty>)resultMap.get("billList");
resultList.addAll(billRentList);
return resultList;
}

public boolean isFirstDay(Date date){
int dateInt = Integer.parseInt(new SimpleDateFormat("d").format(date));
if(dateInt == 1){
return true;
}
return false;
}

public boolean isCrossMonth(Date start,Date end){
int startInt = Integer.parseInt(new SimpleDateFormat("M").format(start));
int endInt = Integer.parseInt(new SimpleDateFormat("M").format(end));

if(startInt != endInt){
return true;
}
return false;
}

public Map<String, Object> buildRent(int lease, int receivePeriod, long price, Date startdate, int dayType, WxPropertyContract wxPropertyContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview, Map<String, Object> shopInfo, boolean isLastYesr) {
public Map<String, Object> buildRent(int receivePeriod,long[] priceArrs, List<Date> yearList,int dayType, WxPropertyContract wxPropertyContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview,Map<String, Object> shopInfo) {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
Map<String,Object> resultMap = new HashedMap();
List<WxBillProperty> resultList = new ArrayList<>();
int extralease = lease % receivePeriod;
int extracount = extralease > 0 ? 1 : 0;
int paycount = lease / receivePeriod + extracount;
int index = paycount - 1;
final IdWorker idWorker = IdWorker.get();
//自然月,而且残月,周期整除,n+1,最后一个周期作为残月
if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())
&& !isFirstDay(wxPropertyContract.getRentalStartDate())
&& (wxPropertyContract.getLease() % wxPropertyContract.getReceivePeriod() == 0)
&& isLastYesr
&& isCrossMonth(wxPropertyContract.getRentalStartDate(),wxPropertyContract.getRentalEndDate())
){
paycount ++;
}
for(int i = 0; i < paycount; i++){
WxBillProperty wxBillProperty = new WxBillProperty();
wxBillProperty.setIsPreview(isPreview);

wxBillProperty.setId(idWorker.nextId());
wxBillProperty.setPropertyContractId(wxPropertyContract.getId());
wxBillProperty.setPay(0L);
long needpay = new BigDecimal(price).multiply(new BigDecimal(receivePeriod)).longValue();

Date date = new Date();
Calendar instance = Calendar.getInstance();
instance.setTime(startdate);
instance.add(dayType, receivePeriod * i);
if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) {
instance.add(Calendar.DAY_OF_MONTH, -1);
}
Date time = instance.getTime();
wxBillProperty.setReceiveDate(time);

//账单开始时间
instance.clear();
instance.setTime(wxBillProperty.getReceiveDate());
if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) {
instance.add(Calendar.DAY_OF_MONTH, 1);
}
wxBillProperty.setStarttime(instance.getTime());
//账单结束时间
instance.clear();
instance.setTime(wxBillProperty.getStarttime());
instance.add(dayType, receivePeriod);
instance.add(Calendar.DAY_OF_MONTH, -1);
wxBillProperty.setEndtime(instance.getTime());
Date endDate = null;
if(yearList.size() > 1){
endDate = yearList.get(1);
}

if (extracount > 0 && i == index) {
//账单开始时间
instance.clear();
instance.setTime(wxBillProperty.getReceiveDate());
if(!wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())) {
instance.add(Calendar.DAY_OF_MONTH, 1);
}
wxBillProperty.setStarttime(instance.getTime());
//账单结束时间
instance.clear();
instance.setTime(wxBillProperty.getStarttime());
instance.add(dayType, extralease);
instance.add(Calendar.DAY_OF_MONTH, -1);
wxBillProperty.setEndtime(instance.getTime());
needpay = new BigDecimal(price).multiply(new BigDecimal(extralease)).longValue();
}
List<BillTimeVo> billTimeVoList = WxRentContractServiceImpl.initBillTimeList(wxPropertyContract.getRentalStartDate(),wxPropertyContract.getRentalEndDate(),wxPropertyContract.getAdjustPeriod(),dayType,receivePeriod);

//自然月,开始日期、缴款日,结束日期
if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
int rentStartDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxPropertyContract.getRentalStartDate()));
int startDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxBillProperty.getStarttime()));
int endDateInt = Integer.parseInt(new SimpleDateFormat("d").format(wxPropertyContract.getRentalEndDate()));

if(i == 0){//第一周期
double oneDayProce = (double) price / DateUtils.getMonthDayCount(wxBillProperty.getStarttime());
double needPayDouble;

if(receivePeriod <= 1) {//周期为一个月
wxBillProperty.setEndtime(DateUtils.getLastDayForMonth(wxBillProperty.getStarttime()));
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBillProperty.getStarttime())-startDateInt+1);
}else{ //周期大于一个月
Date firstDay = DateUtils.getFirstDayForCurrMonth(wxBillProperty.getStarttime());
instance.clear();
instance.setTime(firstDay);
//最后一个期有余,加上残月,不整除时,最后一个月有余,否则为0
if(extralease > 0 && (i == paycount - 1)){
instance.add(dayType, extralease);
instance.add(Calendar.DAY_OF_MONTH, rentStartDateInt-1);
}else{
instance.add(dayType, receivePeriod);
}
instance.add(Calendar.DAY_OF_MONTH, -1);

wxBillProperty.setEndtime(instance.getTime());
if(isLastYesr && (i == paycount - 1)){ //最后一年 最后一期
needPayDouble = 0;
oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillProperty.getEndtime());
if(receivePeriod > 1) {
needPayDouble += price * extralease;
}
if(!isFirstDay(wxPropertyContract.getRentalStartDate())) { //残月才加
needPayDouble += oneDayProce * endDateInt;
}
}else{
//[A/31 *(31-12+1)]+A+A
needPayDouble = oneDayProce * (DateUtils.getMonthDayCount(wxBillProperty.getStarttime())-startDateInt+1);
needPayDouble += price * (receivePeriod - 1);
}
}
DecimalFormat format = new DecimalFormat("0");
needpay = Long.parseLong(format.format(needPayDouble)); //分做四舍五入
}else if(i < paycount - 1){//中间周期
Date receiveDate = DateUtils.getFirstDayOfNextMonth(startdate,receivePeriod * i);
wxBillProperty.setReceiveDate(receiveDate);
wxBillProperty.setStarttime(receiveDate);
wxBillProperty.setEndtime(DateUtils.getLastDayForMonth(wxBillProperty.getStarttime(),receivePeriod * i));

instance.clear();
instance.setTime(receiveDate);
instance.add(dayType, receivePeriod);
instance.add(Calendar.DAY_OF_MONTH, -1);
wxBillProperty.setEndtime(instance.getTime());
}else if(i == paycount - 1) {//最后周期
//receivePeriod * i 得到开始日期
Date receiveDate = DateUtils.getFirstDayOfNextMonth(startdate,receivePeriod * i);
wxBillProperty.setReceiveDate(receiveDate);
wxBillProperty.setStarttime(receiveDate);

//得到开始日期第一天
Date firstDay = DateUtils.getFirstDayForCurrMonth(wxBillProperty.getStarttime());
instance.clear();
instance.setTime(firstDay);

//若最后一期有余,带上残月,(不整除时,最后一个月有余,否则extralease=0)
if(isFirstDay(wxPropertyContract.getRentalStartDate())){ //月第一天起租
if(receivePeriod > 1){
if(isLastYesr && extralease > 0){
instance.add(dayType, extralease);
}else{
instance.add(dayType, receivePeriod);
}
}else{
instance.add(dayType, receivePeriod);
}
}else{
if(isLastYesr) {
instance.add(dayType, extralease);
instance.add(Calendar.DAY_OF_MONTH, rentStartDateInt - 1);
}else{
instance.add(dayType, receivePeriod);
}
}
int index = 0;
for (BillTimeVo billTimeVo : billTimeVoList){
if(yearList.size() > 1) {
if (sd.format(billTimeVo.getStartDate()).equals(sd.format(endDate)) || billTimeVo.getStartDate().after(endDate)) {
logger.info("=====billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate())+" endDate:"+sd.format(endDate));

//先减一个月 后加上残月
instance.add(Calendar.DAY_OF_MONTH, -1);
wxBillProperty.setEndtime(instance.getTime());

//逻辑同计算endtime
double needPayDouble = 0;
double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxBillProperty.getEndtime());
if(isFirstDay(wxPropertyContract.getRentalStartDate())){
if(receivePeriod > 1) {
if(isLastYesr && extralease > 0) {
needPayDouble += price * extralease;
}else{
needPayDouble += price * receivePeriod;
}
}else {
needPayDouble += price * receivePeriod;
}
}else{
if(isLastYesr) {
needPayDouble += price * extralease;
needPayDouble += oneDayProce * endDateInt;
}else{
needPayDouble += price * receivePeriod;
}
index++;
if(index >= yearList.size()-1){
endDate = wxPropertyContract.getRentalEndDate();
}else {
endDate = yearList.get(index);
}
DecimalFormat format = new DecimalFormat("0");
needpay = Long.parseLong(format.format(needPayDouble)); //分做四舍五入
logger.info("==========cross:"+sd.format(endDate));
}
}

//最后一期截止到结束日期
if(i == paycount - 1 && isLastYesr){
wxBillProperty.setEndtime(wxPropertyContract.getRentalEndDate());
//当天也算,加1天
Date newEndDate = DateUtils.getDaySet(wxBillProperty.getEndtime(),Calendar.DATE,1);
//按日
if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_DAY.getCode())){
int dayCount = DateUtils.daysBetween(wxBillProperty.getStarttime(),newEndDate);
needpay = dayCount*price;
}else{
//按月
int[] diff = DateUtils.getDiff(wxBillProperty.getStarttime(),newEndDate);
needpay = diff[0]*price;
//获取price 、shopInfo
long price = priceArrs[index];

double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxPropertyContract.getRentalEndDate());
needpay += diff[1] * oneDayProce;
}
}
WxBillProperty wxBillProperty = new WxBillProperty();
wxBillProperty.setIsPreview(isPreview);
wxBillProperty.setId(idWorker.nextId());
wxBillProperty.setPropertyContractId(wxPropertyContract.getId());
wxBillProperty.setPay(0L);
wxBillProperty.setStarttime(billTimeVo.getStartDate());
wxBillProperty.setEndtime(billTimeVo.getEndDate());
wxBillProperty.setReceiveDate(billTimeVo.getReceiveDate());

long needpay;

//当天也算,加1天
Date newEndDate = DateUtils.getDaySet(wxBillProperty.getEndtime(),Calendar.DATE,1);
//按日
if(wxPropertyContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_DAY.getCode())){
int dayCount = DateUtils.daysBetween(wxBillProperty.getStarttime(),newEndDate);
needpay = dayCount*price;
}else{
//按月
int[] diff = DateUtils.getDiff(wxBillProperty.getStarttime(),newEndDate);
needpay = diff[0]*price;

double oneDayProce = (double) price/DateUtils.getMonthDayCount(wxPropertyContract.getRentalEndDate());
needpay += diff[1] * oneDayProce;
}
wxBillProperty.setNeedPay(needpay);
wxBillProperty.setOwe(needpay);
wxBillProperty.setReceivePay(needpay);

//截止收租日在当前时间之前
Date date = new Date();
if (wxBillProperty.getReceiveDate().before(date)) {
long day = (time.getTime() - date.getTime()) / (24 * 60 * 60 * 1000);
long day = (wxBillProperty.getReceiveDate().getTime() - date.getTime()) / (24 * 60 * 60 * 1000);
wxBillProperty.setStatus(EnumBillRentStatus.NOT_PAID.getCode());
wxBillProperty.setExpiredDay(day);
} else {//截止收租日在当前时间之后
@@ -775,7 +613,6 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
wxBillProperty.setExpiredDay(0L);
}
}

wxBillProperty.setTenantId(wxMerchant.getTenantId());
wxBillProperty.setIsDel(0);
wxBillProperty.setMerchantId(wxMerchant.getId());
@@ -789,14 +626,10 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
if (shopInfo != null) {
wxBillProperty.setShopInfo(JSONObject.toJSONString(shopInfo));
}
try {
wxBillPropertyMapper.insertSelective(wxBillProperty);
resultList.add(wxBillProperty);
} catch (Exception e) {
logger.error("添加租赁账单失败,e:" + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage());
}
wxBillPropertyMapper.insertSelective(wxBillProperty);
resultList.add(wxBillProperty);
}

resultMap.put("billcount",billcount);
resultMap.put("billList",resultList);
return resultMap;
@@ -840,9 +673,9 @@ public class WxPropertyContractServiceImpl implements WxPropertyContractService
result = buildRentMonth(wxMerchant, userId, propertyContract, receivePeriod, lease, rentalStartDate, price,isPreview);
} else {
//如果按日
//处理lease
lease = DateUtils.daysBetween(propertyContract.getRentalStartDate(),propertyContract.getRentalEndDate());
Map<String, Object> resultMap = buildRent(lease, receivePeriod, price, rentalStartDate, Calendar.DAY_OF_MONTH, propertyContract, userId, wxMerchant, 0, isPreview, null,false);
List<Date> yearList = new ArrayList<>();
yearList.add(rentalStartDate);
Map<String, Object> resultMap = buildRent(receivePeriod,new long[]{price}, yearList, Calendar.DAY_OF_MONTH, propertyContract, userId, wxMerchant, 0, isPreview, null);
result = (List<WxBillProperty>)resultMap.get("billList");
}
}


+ 3
- 14
mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java Просмотреть файл

@@ -855,14 +855,11 @@ public class WxRentContractServiceImpl implements WxRentContractService {

Map<String, Object> resultMap = buildRent(receivePeriod, priceArrs, yearList, Calendar.MONTH, wxRentContract, userId, wxMerchant, billcount, isPreview, shopInfos);
List<WxBillRent> billRentList = (List<WxBillRent>)resultMap.get("billList");
billcount = (Integer)resultMap.get("billcount");
resultList.addAll(billRentList);
return resultList;
}

public Map<String, Object> buildRent(int receivePeriod,long[] priceArrs, List<Date> yearList,int dayType, WxRentContract wxRentContract, Long userId, WxMerchant wxMerchant, int billcount, Integer isPreview,List<Map<String, Object>> shopInfoList) {
// System.out.println("------+receivePeriod:"+receivePeriod+"price:"+price+"start:"+DateUtils.date2String(startdate,"yyyy-MM-dd")
// +"dayType:"+dayType+"billcount:"+billcount);
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
Map<String,Object> resultMap = new HashedMap();
List<WxBillRent> resultList = new ArrayList<>();
@@ -873,21 +870,13 @@ public class WxRentContractServiceImpl implements WxRentContractService {
endDate = yearList.get(1);
}

if(endDate == null){
// endDate = wxRentContract.getRentalEndDate();
}else{
//- 1天
//endDate = DateUtils.getDaySet(endDate,Calendar.DATE,-1);
}
List<BillTimeVo> billTimeVoList = initBillTimeList(wxRentContract.getRentalStartDate(),wxRentContract.getRentalEndDate(),wxRentContract.getAdjustPeriod(),dayType,receivePeriod);

int index = 0;

for (BillTimeVo billTimeVo : billTimeVoList){
if(yearList.size() > 1) {
if (billTimeVo.getStartDate().after(endDate)) {
System.out.println("==========billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate()));
System.out.println("==========endDate:"+sd.format(endDate));
if (sd.format(billTimeVo.getStartDate()).equals(sd.format(endDate)) || billTimeVo.getStartDate().after(endDate)) {
logger.info("=====billTimeVo.getStartDate():"+sd.format(billTimeVo.getStartDate())+" endDate:"+sd.format(endDate));

index++;
if(index >= yearList.size()-1){
@@ -895,7 +884,7 @@ public class WxRentContractServiceImpl implements WxRentContractService {
}else {
endDate = yearList.get(index);
}
System.out.println("==========cross:"+sd.format(endDate));
logger.info("==========cross:"+sd.format(endDate));
}
}



Загрузка…
Отмена
Сохранить