From 0d80189f7e8c90440c27258426348f16162b4e2b Mon Sep 17 00:00:00 2001 From: lin <642018748@qq.com> Date: Mon, 10 Apr 2023 19:05:32 +0800 Subject: [PATCH] fix rent --- .../iformall/schedule/ContractSchedule.java | 40 ++++++++ .../schedule/CouponOrderNoticeSchedule.java | 3 +- .../iformall/domain/po/WxRentContract.java | 2 + .../service/WxRentContractService.java | 2 + .../impl/WxRentContractServiceImpl.java | 95 +++++++++++++++++++ .../java/com/iformall/utils/DateUtils.java | 38 +++++++- .../resources/mapper/WxBillRentMapper.xml | 2 + .../resources/mapper/WxRentContractMapper.xml | 6 ++ 8 files changed, 184 insertions(+), 4 deletions(-) diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/ContractSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/ContractSchedule.java index 3b92d6833..c736bb667 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/ContractSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/ContractSchedule.java @@ -1,16 +1,23 @@ package com.iformall.schedule; +import com.github.pagehelper.PageInfo; +import com.iformall.domain.po.WxBillRent; import com.iformall.domain.po.WxMall; import com.iformall.domain.po.WxPropertyContract; import com.iformall.domain.po.WxRentContract; import com.iformall.domain.po.base.TenantEntity; import com.iformall.domain.po.msg.WxMsgRecord; +import com.iformall.enums.EnumDelStatus; +import com.iformall.enums.EnumIsPreview; import com.iformall.enums.EnumMsgMqKey; import com.iformall.enums.EnumMsgMqTag; import com.iformall.enums.EnumMsgMqTopic; import com.iformall.enums.EnumMsgRecordType; +import com.iformall.enums.EnumRentContractStatus; +import com.iformall.enums.EnumRentContractType; import com.iformall.mapper.WxMallMapper; import com.iformall.mq.MqBaseProducer; +import com.iformall.service.WxBillRentService; import com.iformall.service.WxPropertyContractService; import com.iformall.service.WxRentContractService; import com.iformall.utils.DateUtils; @@ -23,6 +30,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -47,6 +55,7 @@ public class ContractSchedule { @Autowired private MqBaseProducer mqBaseProducer; + /** * 凌晨5分 */ @@ -209,5 +218,36 @@ public class ContractSchedule { } } } + + + /** + * 凌晨5分,联营扣点和面积联营取高的需要根据接单数据来更新账单,取高的那一个 + */ + @Async + @Scheduled(cron = "0 5 0 * * ?") + public void updateRentBill() { + //查询记租中的联营扣点或者取高的合同,每天更新账单截止时间为前一天的账单。 + List wxMalls = wxMallMapper.findList(null); + for (WxMall wxMall : wxMalls) { + WxRentContract rentContract = new WxRentContract(); + rentContract.updateTenantInfo(wxMall); + List typeList = new ArrayList(); + typeList.add(EnumRentContractType.RENT_BY_JOINT.getCode()); + typeList.add(EnumRentContractType.RENT_BY_AREA_AND_JOINT.getCode()); + rentContract.setTypeList(typeList); + rentContract.setStatus(EnumRentContractStatus.PAING.getCode()); + List contractList = wxRentContractService.findList(rentContract); + if (null != contractList && contractList.size() > 0 ) { + for (int i = 0 ; i < contractList.size(); i++ ) { + WxRentContract rc = contractList.get(i); + try { + wxRentContractService.calcuteByTradeDaily(rc); + }catch(Exception e) { + log.error("rentcontract updateRentBill error.",e); + } + } + } + } + } } \ No newline at end of file diff --git a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java index fd5c6015b..22769c8fe 100644 --- a/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java +++ b/mallinkSchedule/src/main/java/com/iformall/schedule/CouponOrderNoticeSchedule.java @@ -135,7 +135,6 @@ public class CouponOrderNoticeSchedule { }); } } - } @Async @@ -143,7 +142,7 @@ public class CouponOrderNoticeSchedule { public void couponOrderRefundSchedule() { List malls = getMalls(); for (WxMall mall: malls) { - Date oneDayBefore = DateUtils.getTimeAfterDays(1, new Date()); + Date oneDayBefore = DateUtils.getTimeAfterDays(2, new Date()); List list = wxCouponOrderMapper.findExpiredCouponOrderByValidDate(mall.getTenantId(),oneDayBefore); if (null != list && list.size() > 0 ) { list.stream().forEach(co -> { 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 39ad1d098..916961164 100644 --- a/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java +++ b/mallinkService/src/main/java/com/iformall/domain/po/WxRentContract.java @@ -283,6 +283,8 @@ public class WxRentContract extends TenantEntity { @io.swagger.annotations.ApiModelProperty(value = "类型", name = "type") private Integer type; + @TableField(exist = false) + private List typeList; @io.swagger.annotations.ApiModelProperty(value = "调整比例", name = "adjustRatio") private String adjustRatio; diff --git a/mallinkService/src/main/java/com/iformall/service/WxRentContractService.java b/mallinkService/src/main/java/com/iformall/service/WxRentContractService.java index 2bfaee8e0..1475e75e3 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxRentContractService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxRentContractService.java @@ -138,4 +138,6 @@ public interface WxRentContractService { void setEndContractTime(WxRentContract wxRentContract); List findToEndContractList(WxRentContract record); + + void calcuteByTradeDaily(WxRentContract wxRentContract); } 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 d261791bc..252412470 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -130,6 +130,9 @@ public class WxRentContractServiceImpl implements WxRentContractService { @Autowired WxBillRentManageMapper wxBillRentManageMapper; + @Autowired + WxMerchantTradeDailyMapper wxMerchantTradeDailyMapper; + // @Override // public Map listAsPage(WxRentContract record, Integer pageIndex, Integer pageSize) { // //Object rentContractStatusInfo = getRentContractStatusInfo(record); @@ -3213,4 +3216,96 @@ public class WxRentContractServiceImpl implements WxRentContractService { return wxRentContractMapper.findList(wrc); } + @Override + public void calcuteByTradeDaily(WxRentContract wxRentContract) { + WxPayAccountBill wxPayAccountBill = wxPayAccountBillService.getByTenantInfo(wxRentContract); + //查询合同下截止时间为昨天的账单 + WxBillRent bq = new WxBillRent(); + bq.updateTenantInfo(wxRentContract); + bq.setRentContractId(wxRentContract.getId()); + bq.setIsPreview(EnumIsPreview.NO.getCode()); + bq.setEndtime(DateUtils.getDayBegin(DateUtils.getTimeAfterDays(-1, new Date()))); + bq.setIsDel(EnumDelStatus.NOT_DEL.getCode()); + List billList = wxBillRentMapper.findList(bq); + if (null != billList && billList.size() > 0 ) { + WxBillRent br = billList.get(0); + //判断账单是否跨月,如果跨月,需要按照每月来查询解单金额 + int needPay = 0 ; + int months = DateUtils.monthsBetween(br.getStarttime(), br.getEndtime()); + if ( months > 0 ) { + for (int i = 0 ; i < months ; i++ ) { + int _money = 0; + if (i == 0 ) { + _money = sumTradeDailyBySameMonthDay(bq, wxRentContract.getMerchantId(), br.getStarttime(), + DateUtils.getLastDayForMonth(br.getStarttime())); + }else if (i == (months-1)){ + _money = sumTradeDailyBySameMonthDay(bq, wxRentContract.getMerchantId(), + DateUtils.getFirstDayForCurrMonth(DateUtils.getTimeAfterMonths(i,br.getStarttime())), + DateUtils.getDayEnd(DateUtils.getTimeAfterDays(-1, br.getEndtime()))); + }else { + Date _date = DateUtils.getTimeAfterMonths(i,br.getStarttime()); + _money = sumTradeDailyBySameMonthDay(bq, wxRentContract.getMerchantId(), + DateUtils.getFirstDayForCurrMonth(_date), + DateUtils.getLastDayForMonth(_date)); + } + needPay = needPay + _money; + } + }else { + //同一个月 + //合同账单结束的时间是00:00:00,取日期要取前一天 + needPay = sumTradeDailyBySameMonthDay(bq, wxRentContract.getMerchantId(), + br.getStarttime(), DateUtils.getTimeAfterDays(-1, br.getEndtime())); + } + + if (needPay > br.getNeedPay()) { + Long newPay = Long.parseLong(String.valueOf(needPay)); + br.setNeedPay(newPay); + br.setOwe(newPay); + br.setReceivePay(newPay); + br.setUpdatetime(new Date()); + BigDecimal servicePay = new BigDecimal(br.getReceivePay()).multiply(new BigDecimal(wxPayAccountBill.getServiceChargeRate())).divide(new BigDecimal(10000), 2, BigDecimal.ROUND_HALF_UP); + br.setServiceChargePay(servicePay.intValue()); + br.setOwe(br.getReceivePay() + br.getServiceChargePay()); + br.setComments("解单金额["+newPay+"(分)]大于合同计算金额,系统自动更新"); + wxBillRentMapper.updateById(br); + } + } + } + + private int sumTradeDailyBySameMonthDay(TenantEntity tenantEntity,Long merchantId,Date begin ,Date end) { + //如果有按月的,则取按月来算 + WxMerchantTradeDaily tdq = new WxMerchantTradeDaily(); + tdq.updateTenantInfo(tenantEntity); + tdq.setMerchantId(merchantId); + tdq.setDateType(EnumTradeDailyDateType.MONTH.getCode()); + tdq.setReportDate(DateUtils.date2String(begin, DateUtils.DATE_PATTERN_MONTH)); + List monthList = wxMerchantTradeDailyMapper.findList(tdq); + if (null != monthList && monthList.size() > 0 ){ + int monthSums = monthList.get(0).getTradeAmtInteger(); + Date _fistDay = DateUtils.getDayBegin(DateUtils.getFirstDayForCurrMonth(begin)); + Date _lastDay = DateUtils.getLastDayForMonth(begin); + if (begin.equals(_fistDay) && end.equals(_lastDay)) { + //满月 + return monthSums; + }else { + //根据天数计算 + int monthDays = DateUtils.daysBetween(_fistDay, _lastDay); + int _days = DateUtils.daysBetween(begin, end); + if (_days == 0) { + _days = 1;//当天 + } + BigDecimal servicePay = new BigDecimal(monthSums).multiply(new BigDecimal(_days)).divide(new BigDecimal(monthDays), 2, BigDecimal.ROUND_HALF_UP); + return servicePay.intValue(); + } + }else { + WxMerchantTradeDaily tdq1 = new WxMerchantTradeDaily(); + tdq1.updateTenantInfo(tenantEntity); + tdq1.setMerchantId(merchantId); + tdq1.setDateType(EnumTradeDailyDateType.DAY.getCode()); + tdq1.setStartTime(DateUtils.format(begin)); + tdq1.setEndTime(DateUtils.format(end)); + String sumMoney = wxMerchantTradeDailyMapper.findSumMoney(tdq1); + return Integer.parseInt(sumMoney); + } + } } diff --git a/mallinkService/src/main/java/com/iformall/utils/DateUtils.java b/mallinkService/src/main/java/com/iformall/utils/DateUtils.java index 2588fa558..a76cbe59d 100755 --- a/mallinkService/src/main/java/com/iformall/utils/DateUtils.java +++ b/mallinkService/src/main/java/com/iformall/utils/DateUtils.java @@ -24,6 +24,8 @@ public class DateUtils { public final static String DATE_PATTERN = "yyyy-MM-dd"; /** 时间格式(yyyy-MM-dd HH:mm:ss) */ public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss"; + + public final static String DATE_PATTERN_MONTH = "yyyy-MM"; public final static String[] weekObj=new String[]{"日","一","二","三","四","五","六"}; @@ -454,6 +456,20 @@ public class DateUtils { now.set(Calendar.DATE, now.get(Calendar.DATE) + days); return now.getTime(); } + + /** + * 获得当前时间后几个月的时间 + * + * @param days 后几天 + * + * @return + */ + public static Date getTimeAfterMonths(int months, Date myDate) { + Calendar now = Calendar.getInstance(); + now.setTime(myDate); + now.set(Calendar.MONTH, now.get(Calendar.MONTH) + months); + return now.getTime(); + } /** * 获得指定时间前几天,格式yyyy-MM-dd @@ -1147,7 +1163,25 @@ public class DateUtils { } return 0; } - + + public static int monthsBetween(Date begin,Date end) { + Calendar _bc = Calendar.getInstance(); + _bc.setTime(begin); + + Calendar _ec = Calendar.getInstance(); + _ec.setTime(end); + + int i = _ec.get(Calendar.YEAR) - _bc.get(Calendar.YEAR); + int month = 0; + if (i < 0) { + month = -i * 12; + }else { + month = i * 12; + } + int result = _ec.get(Calendar.MONTH) - _bc.get(Calendar.MONTH) + month; + return Math.abs(result); + } + /** * 日期距离今天还有几天 * @param date @@ -1272,7 +1306,7 @@ public class DateUtils { return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR) && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH); } - + /** * 获取上个月的今天 */ diff --git a/mallinkService/src/main/resources/mapper/WxBillRentMapper.xml b/mallinkService/src/main/resources/mapper/WxBillRentMapper.xml index 40e8dcc1a..6c74dcc15 100644 --- a/mallinkService/src/main/resources/mapper/WxBillRentMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxBillRentMapper.xml @@ -95,6 +95,8 @@ and is_preview = #{isPreview} and `pay_way` = #{payWay} and `late_pay_status` = #{latePayStatus} + and `starttime` = #{starttime} + and `endtime` = #{endtime} and id in diff --git a/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml b/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml index 8a719a5f5..35c62baba 100644 --- a/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxRentContractMapper.xml @@ -224,6 +224,12 @@ #{statusItem} + + and type in + + #{typeItem} + + and id in