zhengfangyuan 3 лет назад
Родитель
Сommit
320e1933a1
4 измененных файлов: 173 добавлений и 154 удалений
  1. +1
    -1
      mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java
  2. +6
    -6
      mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java
  3. +155
    -0
      mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java
  4. +11
    -147
      mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java

+ 1
- 1
mallinkAdmin/src/main/java/com/iformall/config/ShiroConfig.java Просмотреть файл

@@ -162,7 +162,7 @@ public class ShiroConfig {
filterChainDefinitionMap.put("/logout", "authc");

filterChainDefinitionMap.put("/**", "corsFilter,token,authc");
filterChainDefinitionMap.put("/**", "anon");
// filterChainDefinitionMap.put("/**", "anon");


shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);


+ 6
- 6
mallinkAdmin/src/main/java/com/iformall/controller/base/BaseController.java Просмотреть файл

@@ -46,12 +46,12 @@ public class BaseController {
});
}
public MallUserInfo getUser(){
//MallUserInfo user = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
MallUserInfo user = new MallUserInfo();
user.setId(321127266275430400L);
user.setName("富茂光谷测试版管理员");
user.setTenantId("789");
user.setParentTenantId(null);
MallUserInfo user = (MallUserInfo) SecurityUtils.getSubject().getSession().getAttribute(UserSession.userInfo);
// MallUserInfo user = new MallUserInfo();
// user.setId(321127266275430400L);
// user.setName("富茂光谷测试版管理员");
// user.setTenantId("789");
// user.setParentTenantId(null);
return user;
}



+ 155
- 0
mallinkService/src/main/java/com/iformall/service/helper/WxRentContractHelper.java Просмотреть файл

@@ -2,10 +2,19 @@ package com.iformall.service.helper;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Months;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
@@ -14,6 +23,8 @@ import com.iformall.enums.EnumMissTimeType;
import com.iformall.enums.EnumRentContractAdjustRatioWay;
import com.iformall.enums.EnumRentContractRentInputWay;
import com.iformall.enums.EnumRentContractType;
import com.iformall.service.impl.WxRentContractServiceImpl;
import com.iformall.utils.DateUtils;

public class WxRentContractHelper {

@@ -339,5 +350,149 @@ public class WxRentContractHelper {
return priceList;
}
/**
* 按月计租 根据每月的日期总数计算needpay
* @param monthPrice
* @param start
* @param end
* @return
*/
public static double getMonthNeedPay(Double price,Date start,Date end,int dayType,int receivePeriod,boolean part){
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdM = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat sdD = new SimpleDateFormat("d");
Double total = new Double(0);
int[] diff;

//同一天
if(sd.format(start).equals(sd.format(end))){
int dayCount = DateUtils.getMonthDayCount(start);
return 1 * (price/dayCount);
}

//同月
if(sdM.format(start).equals(sdM.format(end))){

diff = DateUtils.getDiff(start,end);
int dayCount = DateUtils.getMonthDayCount(start);
total += (diff[1]+1) * (price/dayCount);
return total;
}

//判断是否满足整月
boolean isFullMonth = false;
if(part){
int startInt = Integer.parseInt(sdD.format(start));
int endInt = Integer.parseInt(sdD.format(DateUtils.getDaySet(end,Calendar.DATE,1)));
if(startInt == endInt){
isFullMonth = true;
}
}else{
Calendar instance = Calendar.getInstance();
instance.setTime(start);
instance.add(dayType, receivePeriod);
instance.add(Calendar.DATE, -1);
if(sd.format(instance.getTime()).equals(sd.format(end))){
isFullMonth = true;
}
}

if(isFullMonth){
int months = getMonths(sdM.format(start)+"-01",sdM.format(DateUtils.getDaySet(end,Calendar.DATE,1))+"-01");
return (months) * price;
}

//第一个月
Date lastMonthDay = DateUtils.getLastDayForMonth(start);
diff = DateUtils.getDiff(start,lastMonthDay);
int dayCount = DateUtils.getMonthDayCount(start);
total += (diff[1]+1) * (price/dayCount);

//中间月份
Date newStartDate = DateUtils.getDaySet(lastMonthDay,Calendar.DATE,1);
int months = getMonths(sdM.format(newStartDate)+"-01",sdM.format(end)+"-01");
total += months * price;

//最后一个月
diff = DateUtils.getDiff(DateUtils.getFirstDayForCurrMonth(end),end);
dayCount = DateUtils.getMonthDayCount(end);
total += (diff[1]+1) * (price/dayCount);
return total;
}
public static int getMonths(String startStr,String endStr){
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime start = formatter.parseDateTime(startStr);
DateTime end = formatter.parseDateTime(endStr);
int months = Months.monthsBetween(start, end).getMonths();
return months;
}

/**
* 按日计租 根据每月的日期总数计算needpay
* @param monthPrice
* @param start
* @param end
* @return
*/
public static double getNeedPay(long monthPrice,Double dayPrice,Date start,Date end){
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdM = new SimpleDateFormat("yyyy-MM");
Double total;
int[] diff;

int dayCount = DateUtils.getMonthDayCount(start);
double price;
if(monthPrice > 0){
price = (double) monthPrice/dayCount;
}else{
price = dayPrice;
}

//同一天
if(sd.format(start).equals(sd.format(end))){
return 1 * price; //算1天
}
//同月
if(sdM.format(start).equals(sdM.format(end))){
diff = DateUtils.getDiff(start,end);
return (diff[1]+1) * price;
}

Date currEnd = DateUtils.getLastDayForMonth(start);
diff = DateUtils.getDiff(start,currEnd);
total = (diff[1]+1) * price;

int warnCount = 0;
while (true){
Date monthStartDate = DateUtils.getDaySet(currEnd,Calendar.DATE,1);
dayCount = DateUtils.getMonthDayCount(monthStartDate);
if(monthPrice > 0){
price = (double) monthPrice/dayCount;
}else{
price = dayPrice;
}

//最后一个月
if(sdM.format(monthStartDate).equals(sdM.format(end))){
diff = DateUtils.getDiff(monthStartDate,end);
total += price * (diff[1]+1);
break;
}else{
currEnd = DateUtils.getLastDayForMonth(monthStartDate);
diff = DateUtils.getDiff(monthStartDate,currEnd);
total += price * (diff[1]+1);
}

//预警
if(warnCount >= 1000){
Logger logger = LoggerFactory.getLogger(WxRentContractServiceImpl.class);
logger.error("getNeedPay() warnCount max error !!! monthPrice:{},dayPrice:{},start:{},end:{}",monthPrice,dayPrice,sd.format(start),sd.format(end));
break;
}
warnCount ++;
}
return total;
}
}

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

@@ -1450,7 +1450,7 @@ public class WxRentContractServiceImpl implements WxRentContractService {
//按日
if (wxRentContract.getPriceUnit().equals(EnumPriceUnit.D.getCode())){
Double priceD = new Double(price);
double needpayD = WxRentContractServiceImpl.getNeedPay(0,priceD,startDate,endDate);
double needpayD = WxRentContractHelper.getNeedPay(0,priceD,startDate,endDate);
//取整
//needpay = new Double(needpayD).longValue();
//四舍五入
@@ -1477,7 +1477,7 @@ public class WxRentContractServiceImpl implements WxRentContractService {
//生成金额直接计算
if(!saveDb){
//needpay = new Double(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,part)).longValue();
needpay = new BigDecimal(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,part)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
needpay = new BigDecimal(WxRentContractHelper.getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,part)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
return needpay;
}

@@ -1491,43 +1491,43 @@ public class WxRentContractServiceImpl implements WxRentContractService {
instance.add(dayType, receivePeriod);
instance.add(Calendar.DATE, -1);
if(sd.format(instance.getTime()).equals(sd.format(endDate))){
int months = getMonths(sdM.format(startDate)+"-01",sdM.format(DateUtils.getDaySet(endDate,Calendar.DATE,1))+"-01");
int months = WxRentContractHelper.getMonths(sdM.format(startDate)+"-01",sdM.format(DateUtils.getDaySet(endDate,Calendar.DATE,1))+"-01");
needpay = new Double(months * priceD).longValue();
}else{
//needpay = new Double(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).longValue();
needpay = new BigDecimal(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
needpay = new BigDecimal(WxRentContractHelper.getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}
}else if(i == 0){//第一期
if(wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_NAR_MONTH.getCode())){
if(isFirstDay(startDate)){
int months = getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
int months = WxRentContractHelper.getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
months++;
needpay = new Double(months * priceD).longValue();
}else{
//needpay = new Double(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).longValue();
needpay = new BigDecimal(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
needpay = new BigDecimal(WxRentContractHelper.getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}
}else{
if(isFirstDay(startDate)){
int months = getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
int months = WxRentContractHelper.getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
if(isFirstDay(startDate)){
months++;
}
needpay = new Double(months * priceD).longValue();
}else{
//needpay = new Double(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).longValue();
needpay = new BigDecimal(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
needpay = new BigDecimal(WxRentContractHelper.getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}
}
}else{//中间
int months = getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
int months = WxRentContractHelper.getMonths(sdM.format(startDate)+"-01",sdM.format(endDate)+"-01");
if(isFirstDay(startDate)){
months++;
}
//如果当月费用需要按天计算
if (monthCalDay) {
//needpay = new Double(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).longValue();
needpay = new BigDecimal(getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
needpay = new BigDecimal(WxRentContractHelper.getMonthNeedPay(priceD, startDate, endDate,dayType,receivePeriod,false)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
}else {
needpay = new Double(months * priceD).longValue();
}
@@ -1567,14 +1567,6 @@ public class WxRentContractServiceImpl implements WxRentContractService {
return false;
}

public static int getMonths(String startStr,String endStr){
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd");
DateTime start = formatter.parseDateTime(startStr);
DateTime end = formatter.parseDateTime(endStr);
int months = Months.monthsBetween(start, end).getMonths();
return months;
}


@Transactional(rollbackFor = {Exception.class})
@Override
@@ -2786,135 +2778,7 @@ public class WxRentContractServiceImpl implements WxRentContractService {
// return wxRentContractMapper.getShopType(wxRentContract);
// }

public static double getMonthNeedPay(Double price,Date start,Date end,int dayType,int receivePeriod,boolean part){
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdM = new SimpleDateFormat("yyyy-MM");
SimpleDateFormat sdD = new SimpleDateFormat("d");
Double total = new Double(0);
int[] diff;

//同一天
if(sd.format(start).equals(sd.format(end))){
int dayCount = DateUtils.getMonthDayCount(start);
return 1 * (price/dayCount);
}

//同月
if(sdM.format(start).equals(sdM.format(end))){

diff = DateUtils.getDiff(start,end);
int dayCount = DateUtils.getMonthDayCount(start);
total += (diff[1]+1) * (price/dayCount);
return total;
}

//判断是否满足整月
boolean isFullMonth = false;
if(part){
int startInt = Integer.parseInt(sdD.format(start));
int endInt = Integer.parseInt(sdD.format(DateUtils.getDaySet(end,Calendar.DATE,1)));
if(startInt == endInt){
isFullMonth = true;
}
}else{
Calendar instance = Calendar.getInstance();
instance.setTime(start);
instance.add(dayType, receivePeriod);
instance.add(Calendar.DATE, -1);
if(sd.format(instance.getTime()).equals(sd.format(end))){
isFullMonth = true;
}
}

if(isFullMonth){
int months = getMonths(sdM.format(start)+"-01",sdM.format(DateUtils.getDaySet(end,Calendar.DATE,1))+"-01");
return (months) * price;
}

//第一个月
Date lastMonthDay = DateUtils.getLastDayForMonth(start);
diff = DateUtils.getDiff(start,lastMonthDay);
int dayCount = DateUtils.getMonthDayCount(start);
total += (diff[1]+1) * (price/dayCount);

//中间月份
Date newStartDate = DateUtils.getDaySet(lastMonthDay,Calendar.DATE,1);
int months = getMonths(sdM.format(newStartDate)+"-01",sdM.format(end)+"-01");
total += months * price;

//最后一个月
diff = DateUtils.getDiff(DateUtils.getFirstDayForCurrMonth(end),end);
dayCount = DateUtils.getMonthDayCount(end);
total += (diff[1]+1) * (price/dayCount);
return total;
}

/**
* 按日计租 根据每月的日期总数计算needpay
* @param monthPrice
* @param start
* @param end
* @return
*/
public static double getNeedPay(long monthPrice,Double dayPrice,Date start,Date end){
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sdM = new SimpleDateFormat("yyyy-MM");
Double total;
int[] diff;

int dayCount = DateUtils.getMonthDayCount(start);
double price;
if(monthPrice > 0){
price = (double) monthPrice/dayCount;
}else{
price = dayPrice;
}

//同一天
if(sd.format(start).equals(sd.format(end))){
return 1 * price; //算1天
}
//同月
if(sdM.format(start).equals(sdM.format(end))){
diff = DateUtils.getDiff(start,end);
return (diff[1]+1) * price;
}

Date currEnd = DateUtils.getLastDayForMonth(start);
diff = DateUtils.getDiff(start,currEnd);
total = (diff[1]+1) * price;

int warnCount = 0;
while (true){
Date monthStartDate = DateUtils.getDaySet(currEnd,Calendar.DATE,1);
dayCount = DateUtils.getMonthDayCount(monthStartDate);
if(monthPrice > 0){
price = (double) monthPrice/dayCount;
}else{
price = dayPrice;
}

//最后一个月
if(sdM.format(monthStartDate).equals(sdM.format(end))){
diff = DateUtils.getDiff(monthStartDate,end);
total += price * (diff[1]+1);
break;
}else{
currEnd = DateUtils.getLastDayForMonth(monthStartDate);
diff = DateUtils.getDiff(monthStartDate,currEnd);
total += price * (diff[1]+1);
}

//预警
if(warnCount >= 1000){
Logger logger = LoggerFactory.getLogger(WxRentContractServiceImpl.class);
logger.error("getNeedPay() warnCount max error !!! monthPrice:{},dayPrice:{},start:{},end:{}",monthPrice,dayPrice,sd.format(start),sd.format(end));
break;
}
warnCount ++;
}
return total;
}

public static List<BillTimeVo> initBillTimeList(Date start,Date end,Integer adjustPeriod,Integer dayType,int receivePeriod){
List<BillTimeVo> list = new ArrayList<>();


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