From b35e64d4002e5f994ec4471b79a222edb420ce09 Mon Sep 17 00:00:00 2001 From: gongbiao Date: Mon, 14 Jan 2019 11:22:16 +0800 Subject: [PATCH] =?UTF-8?q?[=E7=A7=9F=E8=B5=81=E5=90=88=E5=90=8C][?= =?UTF-8?q?=E4=BF=AE=E6=94=B9][=E5=AD=97=E6=AE=B5=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=8F=8A=E7=94=9F=E6=88=90=E8=B4=A6=E5=8D=95]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../iformall/domain/po/WxRentContract.java | 8 +- .../enums/EnumRentContractAdjustPeriod.java | 37 ++++ .../impl/WxRentContractServiceImpl.java | 204 +++++++++++------- 3 files changed, 168 insertions(+), 81 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java diff --git a/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java b/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java index cc827da5b..1d5529d2f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java @@ -163,9 +163,9 @@ public class WxRentContract implements Serializable { private Integer type; @io.swagger.annotations.ApiModelProperty(value = "调整比例", name = "adjustRatio") - private Integer adjustRatio; + private String adjustRatio; - @io.swagger.annotations.ApiModelProperty(value = "调整周期", name = "adjustPeriod") + @io.swagger.annotations.ApiModelProperty(value = "计租周期 1日2月", name = "adjustPeriod") private Integer adjustPeriod; @io.swagger.annotations.ApiModelProperty(value = "支付比例", name = "payRatio") @@ -408,11 +408,11 @@ public class WxRentContract implements Serializable { this.type = type; } - public Integer getAdjustRatio() { + public String getAdjustRatio() { return adjustRatio; } - public void setAdjustRatio(Integer adjustRatio) { + public void setAdjustRatio(String adjustRatio) { this.adjustRatio = adjustRatio; } diff --git a/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java b/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java new file mode 100644 index 000000000..dcdba0369 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/enums/EnumRentContractAdjustPeriod.java @@ -0,0 +1,37 @@ +package com.iformall.enums; + + +/** + * @author gongbiao + */ + +public enum EnumRentContractAdjustPeriod { + + ADJUST_PERIOD_DAY(1, "按日计租"), + ADJUST_PERIOD_MONTH(2, "按月计租"),; + + public static EnumRentContractAdjustPeriod getEnum(Integer code) { + for (EnumRentContractAdjustPeriod value : values()) { + if (value.getCode().equals(code)) { + return value; + } + } + return null; + } + + private Integer code; + private String message; + + EnumRentContractAdjustPeriod(Integer code, String message) { + this.code = code; + this.message = message; + } + + public Integer getCode() { + return code; + } + + public String getMessage() { + return message; + } +} diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java index cae2b4440..c4c197d0e 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -1,6 +1,7 @@ package com.iformall.service.impl; import cn.afterturn.easypoi.word.WordExportUtil; +import com.alibaba.fastjson.JSONArray; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.iformall.common.ErrorCode; @@ -282,6 +283,8 @@ public class WxRentContractServiceImpl implements WxRentContractService { int needpay = wxRentContract.getDeposit(); wxBillDeposit.setNeedPay(needpay); wxBillDeposit.setOwe(needpay); + //找到计租方式 + int dayType = wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_MONTH.getCode()) ? Calendar.DAY_OF_MONTH : Calendar.MONTH; Date date = new Date(); Calendar instance = Calendar.getInstance(); @@ -298,7 +301,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { //账单结束时间 instance.clear(); instance.setTime(wxBillDeposit.getReceiveDate()); - instance.add(Calendar.MONTH, wxRentContract.getLease()); + instance.add(dayType, wxRentContract.getLease()); wxBillDeposit.setEndtime(instance.getTime()); //截止收租日在当前时间之前 @@ -342,27 +345,86 @@ public class WxRentContractServiceImpl implements WxRentContractService { wxRentContract = list.get(0); int receivePeriod = wxRentContract.getReceivePeriod().intValue(); Integer lease = wxRentContract.getLease(); - int extralease = lease % receivePeriod; - int extracount = extralease > 0 ? 1 : 0; - int paycount = lease / receivePeriod + extracount; - int index = paycount - 1; - final IdWorker idWorker = IdWorker.get(); - for (int i = 0; i < paycount; i++) { - WxBillRent wxBillRent = new WxBillRent(); - wxBillRent.setId(idWorker.nextId()); - wxBillRent.setRentContractId(wxRentContract.getId()); - wxBillRent.setReceivePay(0); - wxBillRent.setPay(0); - int needpay = wxRentContract.getPrice() * receivePeriod; - - Date date = new Date(); - Calendar instance = Calendar.getInstance(); - instance.setTime(wxRentContract.getRentalStartDate()); - instance.add(Calendar.MONTH, receivePeriod * i); - instance.add(Calendar.DAY_OF_MONTH, -1); - Date time = instance.getTime(); - wxBillRent.setReceiveDate(time); + Date rentalStartDate = wxRentContract.getRentalStartDate(); + Integer price = wxRentContract.getPrice(); + //按月计租 + if (wxRentContract.getAdjustPeriod().equals(EnumRentContractAdjustPeriod.ADJUST_PERIOD_MONTH.getCode())) { + buildRentMonth(wxMerchant, userId, wxRentContract, receivePeriod, lease, rentalStartDate, price); + } else { + //按日计租 + buildRent(lease, receivePeriod, price, rentalStartDate, Calendar.DAY_OF_MONTH, wxRentContract, userId, wxMerchant); + } + } + } + + public void buildRentMonth(WxMerchant wxMerchant, Long userId, WxRentContract wxRentContract, int receivePeriod, Integer lease, Date rentalStartDate, Integer price) { + String adjustRatio = wxRentContract.getAdjustRatio(); + List integers = JSONArray.parseArray(adjustRatio, Integer.class); + integers.add(0, 0); + int size = integers.size(); + int[] priceArr = new int[size]; + priceArr[0] = price; + double priceD = price; + for (int i = 1; i < size; i++) { + priceD = priceD + priceD * integers.get(i) / 10000.0; + priceArr[i] = new BigDecimal(priceD).setScale(0, RoundingMode.HALF_EVEN).intValue(); + } + int month = 12; + int divide = lease / month; + int mod = lease % month; + int[] leaseArr = new int[size]; + for (int i = 0; i < divide; i++) { + leaseArr[i] = month; + } + if (mod > 0) { + leaseArr[divide] = mod; + } + + for (int i = 0; i < size; i++) { + Calendar instance = Calendar.getInstance(); + instance.setTime(rentalStartDate); + //开始时间 + instance.add(Calendar.MONTH, month * i); + buildRent(leaseArr[i], receivePeriod, priceArr[i], instance.getTime(), Calendar.MONTH, wxRentContract, userId, wxMerchant); + } + } + + public void buildRent(int lease, int receivePeriod, int price, Date startdate, int dayType, WxRentContract wxRentContract, long userId, WxMerchant wxMerchant) { + + int extralease = lease % receivePeriod; + int extracount = extralease > 0 ? 1 : 0; + int paycount = lease / receivePeriod + extracount; + int index = paycount - 1; + final IdWorker idWorker = IdWorker.get(); + for (int i = 0; i < paycount; i++) { + WxBillRent wxBillRent = new WxBillRent(); + wxBillRent.setId(idWorker.nextId()); + wxBillRent.setRentContractId(wxRentContract.getId()); + wxBillRent.setReceivePay(0); + wxBillRent.setPay(0); + int needpay = price * receivePeriod; + Date date = new Date(); + Calendar instance = Calendar.getInstance(); + instance.setTime(startdate); + instance.add(dayType, receivePeriod * i); + 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); + wxBillRent.setStarttime(instance.getTime()); + //账单结束时间 + instance.clear(); + instance.setTime(wxBillRent.getStarttime()); + instance.add(dayType, receivePeriod); + instance.add(Calendar.DAY_OF_MONTH, -1); + wxBillRent.setEndtime(instance.getTime()); + + if (extracount > 0 && i == index) { //账单开始时间 instance.clear(); instance.setTime(wxBillRent.getReceiveDate()); @@ -371,64 +433,50 @@ public class WxRentContractServiceImpl implements WxRentContractService { //账单结束时间 instance.clear(); instance.setTime(wxBillRent.getStarttime()); - instance.add(Calendar.MONTH, receivePeriod); + instance.add(dayType, extralease); instance.add(Calendar.DAY_OF_MONTH, -1); wxBillRent.setEndtime(instance.getTime()); + needpay = price * extralease; + } + wxBillRent.setNeedPay(needpay); + wxBillRent.setOwe(needpay); - if (extracount > 0 && i == index) { - //账单开始时间 - instance.clear(); - instance.setTime(wxBillRent.getReceiveDate()); - instance.add(Calendar.DAY_OF_MONTH, 1); - wxBillRent.setStarttime(instance.getTime()); - //账单结束时间 - instance.clear(); - instance.setTime(wxBillRent.getStarttime()); - instance.add(Calendar.MONTH, extralease); - instance.add(Calendar.DAY_OF_MONTH, -1); - wxBillRent.setEndtime(instance.getTime()); - needpay = wxRentContract.getPrice() * extralease; - } - wxBillRent.setNeedPay(needpay); - wxBillRent.setOwe(needpay); - - //截止收租日在当前时间之前 - if (wxBillRent.getReceiveDate().before(date)) { - long day = (time.getTime() - date.getTime()) / (24 * 60 * 60 * 1000); - wxBillRent.setStatus(EnumBillRentStatus.NOT_PAID.getCode()); - wxBillRent.setExpiredDay(day); - } else {//截止收租日在当前时间之后 - Calendar now = Calendar.getInstance(); - now.add(Calendar.MONTH, receivePeriod); - Date currenttime = now.getTime(); - //当前日期加上周期后小于截止收租日就是没有到期,否则当前待缴 - if (currenttime.before(wxBillRent.getReceiveDate())) { - wxBillRent.setStatus(EnumBillRentStatus.NOT_EXPIRED.getCode()); - wxBillRent.setExpiredDay(0L); - } else { - wxBillRent.setStatus(EnumBillRentStatus.WAIT_PAY.getCode()); - wxBillRent.setExpiredDay(0L); - } - } - - wxBillRent.setTenantId(wxMerchant.getTenantId()); - wxBillRent.setIsDel(0); - wxBillRent.setMerchantId(wxMerchant.getId()); - wxBillRent.setUserId(userId); - wxBillRent.setShopId(wxRentContract.getShopId()); - wxBillRent.setCreatetime(date); - wxBillRent.setUpdatetime(date); - wxBillRent.setIsDel(EnumDelStatus.NOT_DEL.getCode()); - - try { - wxBillRentMapper.insertSelective(wxBillRent); - } catch (Exception e) { - logger.error("添加租赁账单失败,e:" + e.getMessage()); - throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + //截止收租日在当前时间之前 + if (wxBillRent.getReceiveDate().before(date)) { + long day = (time.getTime() - date.getTime()) / (24 * 60 * 60 * 1000); + wxBillRent.setStatus(EnumBillRentStatus.NOT_PAID.getCode()); + wxBillRent.setExpiredDay(day); + } else {//截止收租日在当前时间之后 + Calendar now = Calendar.getInstance(); + now.add(Calendar.MONTH, receivePeriod); + Date currenttime = now.getTime(); + //当前日期加上周期后小于截止收租日就是没有到期,否则当前待缴 + if (currenttime.before(wxBillRent.getReceiveDate())) { + wxBillRent.setStatus(EnumBillRentStatus.NOT_EXPIRED.getCode()); + wxBillRent.setExpiredDay(0L); + } else { + wxBillRent.setStatus(EnumBillRentStatus.WAIT_PAY.getCode()); + wxBillRent.setExpiredDay(0L); } } + wxBillRent.setTenantId(wxMerchant.getTenantId()); + wxBillRent.setIsDel(0); + wxBillRent.setMerchantId(wxMerchant.getId()); + wxBillRent.setUserId(userId); + wxBillRent.setShopId(wxRentContract.getShopId()); + wxBillRent.setCreatetime(date); + wxBillRent.setUpdatetime(date); + wxBillRent.setIsDel(EnumDelStatus.NOT_DEL.getCode()); + + try { + wxBillRentMapper.insertSelective(wxBillRent); + } catch (Exception e) { + logger.error("添加租赁账单失败,e:" + e.getMessage()); + throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "DB FAILD " + e.getMessage()); + } } + } @@ -715,7 +763,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { @Override public ResultData updateRentContractStatus(Long id, Long userId) { - if(id == null) { + if (id == null) { return new ResultData(ErrorCode.SYS_PARAMETER_ERROR); } //更新合同状态为签约 @@ -826,8 +874,9 @@ public class WxRentContractServiceImpl implements WxRentContractService { } } result.put("brand", brand); - double adjustRatio = wxRentContract.getAdjustRatio() != null ? wxRentContract.getAdjustRatio() / 100.0 : 0; - result.put("adjustRatio", adjustRatio); + // TODO + //double adjustRatio = wxRentContract.getAdjustRatio() != null ? wxRentContract.getAdjustRatio() / 100.0 : 0; + result.put("adjustRatio", 0); double priceRent = new BigDecimal(wxRentContract.getPrice()) .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("priceRent", priceRent); @@ -853,14 +902,14 @@ public class WxRentContractServiceImpl implements WxRentContractService { int count = paycount - 1; BigDecimal rentPrice = new BigDecimal(priceRent); if (wxRentContract.getType().equals(EnumRentContractType.RENT_BY_AREA.getCode())) { - areaWay(wxRentContract, result, lease, adjustRatio, extralease, extracount, paycount, index, count, rentPrice); + areaWay(wxRentContract, result, lease, 0, extralease, extracount, paycount, index, count, rentPrice); } else { //保底 double revenue = new BigDecimal(wxRentContract.getRevenue()) .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("revenue", revenue); result.put("revenueUpper", digitUppercase(revenue)); - ratioWay(wxRentContract, result, lease, adjustRatio, extralease, extracount, paycount, index, count, rentPrice); + ratioWay(wxRentContract, result, lease, 0, extralease, extracount, paycount, index, count, rentPrice); } //物业合同信息 WxPropertyContract propertyContract = new WxPropertyContract(); @@ -1207,4 +1256,5 @@ public class WxRentContractServiceImpl implements WxRentContractService { public void updateApplyStatus(WxRentContract wxRentContract) { wxRentContractMapper.updateApplyStatus(wxRentContract); } + }