1
MrShi
2025-01-06 d7dca690cedd12e271f0ee0b9050679d73796f5c
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/YwContractServiceImpl.java
@@ -31,6 +31,7 @@
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.stream.Collectors;
@@ -74,13 +75,20 @@
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer create(YwContract model) {
        isParamValidCreated(model);
        model.setCreator(model.getLoginUserInfo().getId());
        model.setIsdeleted(Constants.ZERO);
        model.setCreateDate(new Date());
        model.setStatus(Constants.ZERO);
        model.setEditDate(model.getCreateDate());
        model.setEditor(model.getCreator());
        model.setStatus(Constants.ZERO);//待执行
        if(model.getStartDate().getTime() > System.currentTimeMillis()){
            model.setStatus(Constants.ZERO);
        }else if(model.getStartDate().getTime() <= System.currentTimeMillis() && model.getEndDate().getTime() > System.currentTimeMillis()){
            model.setStatus(Constants.ONE);
        }else{
            model.setStatus(Constants.TWO);
        }
        model.setRemark(getRemarlByParam(model));
        ywContractMapper.insert(model);
        dealDetailListBiz(model);//处理条款信息
@@ -268,7 +276,7 @@
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getRentArea())));
        }
        model.setRoomList(rooms);
    }
@@ -307,16 +315,19 @@
                .replace("{param3}",DateUtil.getDateLongSlash(model.getBtDate()))
                .replace("{param4}",fee.compareTo(new BigDecimal(0)) >=0?"收":"付")
                .replace("{param5}",(fee.compareTo(new BigDecimal(0)) >=0?
                        Constants.formatBigdecimal(model.getBtFee()).intValue()
                        :(Constants.formatBigdecimal(model.getBtFee()).intValue() * -1))+"" );
                        Constants.formatBigdecimal2Float(model.getBtFee())
                        :(Constants.formatBigdecimal2Float(model.getBtFee()).multiply(new BigDecimal(-1)))).toString());
        return  str;
    }
    private String getbackRentLogByParam(YwContract model) {
        BigDecimal fee = Constants.formatBigdecimal(model.getBtFee());
        String str = "【退租日{param1},退租原因:{param2},退租协议中统计的费用总计{param3}元。】";
        String str = "【退租日{param1},退租原因:{param2},退租协议中统计的费用总计需{param4}{param5}元。】";
        str = str.replace("{param1}",DateUtil.getDateLongSlash(model.getBtDate()))
                .replace("{param2}",StringUtils.defaultString(model.getBtInfo(),""))
                .replace("{param3}",Constants.formatBigdecimal2Float(model.getBtFee()).doubleValue()+"");
                .replace("{param4}",fee.compareTo(new BigDecimal(0)) >=0?"收":"付")
                .replace("{param5}",(fee.compareTo(new BigDecimal(0)) >=0?
                        Constants.formatBigdecimal2Float(model.getBtFee())
                        :(Constants.formatBigdecimal2Float(model.getBtFee()).multiply(new BigDecimal(-1)))).toString());
        return  str;
    }
@@ -353,9 +364,6 @@
        update.setBtFee(param.getBtFee());
        update.setBtRemark(getbackRentRemarkByParam(param));
        ywContractMapper.updateById(update);
//        if(1==1){
//            throw new BusinessException(ResponseStatus.NOT_ALLOWED);
//        }
        dealLogBiz(param,Constants.YwLogType.CONTRACT_BACK, param.getLoginUserInfo().getRealname(),getbackRentLogByParam(param));
        return param.getId();
    }
@@ -391,6 +399,7 @@
        List<YwContractBill> noBills = new ArrayList<>();//不需要结算的账单
        List<YwContractBill> yjBills = new ArrayList<>();//押金账单
        List<YwContractBill> canBills = new ArrayList<>();//可退租修改数据
        Integer canBillCount = Constants.ZERO;
        List<YwContractBill> allBills = ywContractBillMapper.selectList(new QueryWrapper<YwContractBill>().
                select("*," +
                        "( select ifnull(sum(case when yw.REVENUE_TYPE = 0 then yw.ACT_RECEIVABLE_FEE  else  -yw.ACT_RECEIVABLE_FEE end),0) from  yw_contract_revenue yw where yw.bill_id = yw_contract_bill.id and yw.status = 0 and yw.isdeleted = 0 ) as  actReceivableFee " )
@@ -410,30 +419,25 @@
                }
                if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                        ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                    if(bill.getStartDate().getTime()<param.getBtDate().getTime()){
                    if(bill.getStartDate().getTime()<=param.getBtDate().getTime()){
                        canBills.add(bill);
                        canBillCount = canBillCount ++;
                    }else{
                        //如果还没开始,账单直接关闭
                        closeBills.add(bill);
                        noBills.add(bill);
                    }
//                    if(bill.getStartDate().getTime()>param.getEditDate().getTime()){
//                        //如果还没开始,账单直接关闭
//                        closeBills.add(bill);
//                        noBills.add(bill);
//                    }else{
//                        canBills.add(bill);
//                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.ONE) ){
                    if(bill.getStartDate().getTime()>param.getBtDate().getTime()){
//                    if(bill.getEndDate().getTime()<param.getEditDate().getTime()){
                        //如果已结清,账单直接关闭
                        noBills.add(bill);
                    }else{
                        canBills.add(bill);
                        canBillCount = canBillCount ++;
                    }
                }else  if(Constants.equalsInteger(bill.getPayStatus(),Constants.TWO) ){
                     canBills.add(bill);
                    canBillCount = canBillCount ++;
                }
            }
        }
@@ -450,25 +454,26 @@
        BigDecimal totalBackFee = new BigDecimal(0);
        if(canBills.size()>0){
            //直接关闭关闭账单
            //
            for(YwContractBill b : canBills){
                BigDecimal fee = new BigDecimal(0);
                YwContractBill editBill = getEditBillFromListByParam(b,param.getCanBackRentBills());
                if(editBill != null){
                    //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                    //如果账单信息做了编辑,金额计算 实收金额 和 修改后应收金额作对比,判断是否应该退款
                    fee = Constants.formatBigdecimal(b.getActReceivableFee()).subtract(editBill.getReceivableFee());
                    fee = editBill.getReceivableFee().subtract(Constants.formatBigdecimal(b.getActReceivableFee()));
                    if(fee.compareTo(new BigDecimal(0))== 0){
                        //如果费用正好,则修改账单信息为已结清
                        b.setPayStatus(Constants.ONE);
                        canBillCount = canBillCount --;
                    }else if(fee.compareTo(new BigDecimal(0))> 0){
                        //如果需要进行退款,更新账单信息为待退款
                        b.setPayStatus(Constants.FOUR);
                    }else if(fee.compareTo(new BigDecimal(0)) < 0){
                        //如果账单还有款待收,则保持状态不变
                    }
                    b.setReceivableFee(editBill.getReceivableFee());
                }
                b.setReceivableFee(editBill.getReceivableFee());
                b.setEditDate(param.getEditDate());
                b.setEditor(param.getEditor());
                b.setBtActDate(param.getBtActDate());
@@ -487,21 +492,25 @@
            for(YwContractBill addBill : param.getAddBillList()){
                addBill.setIsdeleted(Constants.ZERO);
                addBill.setContractId(param.getId());
                addBill.setType(Constants.ONE);
                addBill.setCreateDate(new Date());
                addBill.setCreator(param.getEditor());
                addBill.setType(Constants.TWO);
                addBill.setStatus(Constants.ZERO);
                addBill.setTotleFee(addBill.getReceivableFee());
                addBill.setCompanyId(param.getCompanyId());
                if(Constants.equalsInteger(addBill.getFeeType(),Constants.ONE)){
                    addBill.setStartDate(addBill.getPlanPayDate());
                    addBill.setEndDate(addBill.getPlanPayDate());
                }
                if(Constants.equalsInteger(addBill.getBillType(),Constants.ZERO)){
                    //如果是收款
                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
//                    totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setPayStatus(Constants.ZERO);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()));
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getReceivableFee()));
                }else{
                    //如果是付款
                    addBill.setPayStatus(Constants.THREE);
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                    addBill.setBtFee(Constants.formatBigdecimal(addBill.getReceivableFee()).multiply(new BigDecimal(-1)));
                }
                totalBackFee = totalBackFee.add(Constants.formatBigdecimal(addBill.getBtFee()));
                addBill.setEditDate(param.getEditDate());
@@ -530,15 +539,23 @@
                        yjBill.setEditDate(param.getEditDate());
                        yjBill.setEditor(param.getEditor());
                        yjBill.setReceivableFee(BigDecimal.ZERO);
                        yjBill.setPayStatus(Constants.FOUR);
                        yjBill.setPlanPayDate(canBill.getPlanPayDate());
                        if(Constants.formatBigdecimal(canBill.getActReceivableFee()).compareTo(new BigDecimal(0)) == 0){
                            //未支付的押金,直接关闭
                            yjBill.setStatus(Constants.ONE);
                            closeBills.add(yjBill);
                        }else{
                            yjBill.setBtFee(Constants.formatBigdecimal(canBill.getActReceivableFee()).multiply(new BigDecimal(-1)));
                            yjBill.setPayStatus(Constants.FOUR);
                            yjBill.setPlanPayDate(canBill.getPlanPayDate());
                            totalBackFee = totalBackFee.add(Constants.formatBigdecimal(yjBill.getBtFee()));
                            yjNoBills ++;
                        }
                        ywContractBillMapper.updateById(yjBill);
                    }
                }
                yjNoBills ++;
            }
        }
        param.setBtWaitBill(canBills.size() + newBills.size()+yjNoBills);//未清算的账单数量
        param.setBtWaitBill(canBillCount  + newBills.size()+yjNoBills);//未清算的账单数量
        param.setBtCLoseBill(closeBills.size());
        param.setBtFee(totalBackFee);
    }
@@ -690,12 +707,22 @@
        }
        int num =1;
        for(int i=0;i<billList1.size();i++){
            billList1.get(i).setSortnum(num);
            num++;
            if(Constants.formatBigdecimal(billList1.get(i).getReceivableFee()).compareTo(new BigDecimal(0)) == 0){
                billList1.get(i).setPayStatus(Constants.ONE);
            }
            if(Constants.equalsInteger(billList1.get(i).getCostType(),Constants.ZERO)){
                billList1.get(i).setSortnum(num);
                num++;
            }
        }
        for(int i=0;i<billList2.size();i++){
            billList2.get(i).setSortnum(num);
            num++;
            if(Constants.formatBigdecimal(billList2.get(i).getReceivableFee()).compareTo(new BigDecimal(0)) == 0){
                billList2.get(i).setPayStatus(Constants.ONE);
            }
            if(Constants.equalsInteger(billList2.get(i).getCostType(),Constants.ONE)) {
                billList2.get(i).setSortnum(num);
                num++;
            }
        }
        if(model.getId()!=null){
            ywContractBillMapper.insert(billList1);
@@ -841,34 +868,37 @@
        BigDecimal totalFee = new BigDecimal(0);
        DateCompare dateCompare =   DateCompare.dayCompare(bill.getStartDate(),bill.getEndDate(),freeStart, freeEnd);
        if(Constants.equalsInteger(d.getCircleType(),Constants.ZERO)){
            //0=元每平米天
            //0=元每平米天 账单金额=账单周期的天数*租赁面积*单价;
            int days = dateCompare.getDay() ;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            totalFee = new BigDecimal(days).multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.ONE)){
            //1=元每平米月
            //1=元每平米月 账单金额=账单周期的月数(开始日期计算自然月)*租赁面积*单价+不满一个月的天数*租赁面积*单价*12/365;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            BigDecimal month =dateCompare.getMonthFloat();
            totalFee = month.multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.TWO)){
            //2=元每平米年
            //2=元每平米年 账单金额=账单周期的月数(开始日期计算自然月)*单价*面积/12+不满一个月的天数*租赁面积*单价/365;
            BigDecimal areas = getAreasNumBYRooms(model.getRoomList());
            BigDecimal year =  dateCompare.getYearFloat();
            totalFee = year.multiply(areas).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
            BigDecimal month = new BigDecimal(dateCompare.getMonth());
            totalFee = ((month.multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(12),2, RoundingMode.HALF_UP))
                    .add(new BigDecimal(dateCompare.getMonthDays()).multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(365),2, RoundingMode.HALF_UP)))
                    .multiply(areas);//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.THREE)){
            //3=元每天
            //3=元每天 账单金额=账单周期的天数*单价;
            int days = dateCompare.getDay() ;
            totalFee = new BigDecimal(days).multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.FOUR)){
            //4=元每月
            //4=元每月 账单金额=账单周期的月数(开始日期计算自然月)*单价+不满一个月的天数*单价*12/365
            BigDecimal month = dateCompare.getMonthFloat();
            totalFee = month.multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.FIVE)){
            //5=元每年
            BigDecimal year =  dateCompare.getYearFloat();
            totalFee = year.multiply(Constants.formatBigdecimal(d.getPrice()));//总价格
            //5=元每年 账单金额=账单周期的月数(开始日期计算自然月)*单价*面积/12+不满一个月的天数*租赁面积*单价/365;
            BigDecimal month = new BigDecimal(dateCompare.getMonth());
            totalFee =( month.multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(12),2, RoundingMode.HALF_UP))
                    .add(new BigDecimal(dateCompare.getMonthDays()).multiply(Constants.formatBigdecimal(d.getPrice())).divide(new BigDecimal(365),2, RoundingMode.HALF_UP));//总价格
        }else  if(Constants.equalsInteger(d.getCircleType(),Constants.SIX)){
            //6=元每场
            //6=元每场 账单金额=单价;只有选择一次性付款时,才能选择该单价维度;
            totalFee =Constants.formatBigdecimal(d.getPrice());
        }
        if(Constants.equalsInteger(model.getRoundedUp(),Constants.ONE)){
@@ -939,7 +969,7 @@
        BigDecimal data= new BigDecimal(0);
        if(roomList!=null){
            for(YwRoom r :roomList){
                data = data.add(Constants.formatBigdecimal(r.getArea()));
                data = data.add(Constants.formatBigdecimal(r.getRentArea()));
            }
        }
@@ -1133,7 +1163,7 @@
        }
        model.setTotalArea(new BigDecimal(0));
        for(YwRoom r : rooms){
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getArea())));
            model.setTotalArea(model.getTotalArea().add(Constants.formatBigdecimal(r.getRentArea())));
        }
        model.setRoomList(rooms);
        YwCustomer customer = customerMapper.selectById(model.getRenterId());
@@ -1307,13 +1337,17 @@
        }
        model.setCanBackRentBills(new ArrayList<>());
        long nowStart = Utils.Date.getStart(date).getTime();
        long nowEnd = Utils.Date.getEnd(date).getTime();
        long nowEnd = Utils.Date.getDayEnd(date).getTime();
        if(model.getBillList()!=null && model.getBillList().size()>0){
            for(YwContractBill bill: model.getBillList()){
                //付款状态:0=待收款;1=已结清;2=部分结清;3=待付款;4=待退款;5=已关闭
                if( Constants.formatBigdecimal(bill.getReceivableFee()).compareTo(new BigDecimal(0)) ==0){
                    //如果还没开始,账单直接关闭
                    continue;
                }
                if(Constants.equalsInteger(bill.getPayStatus(),Constants.ZERO)
                        ||Constants.equalsInteger(bill.getPayStatus(),Constants.THREE)){
                    if(bill.getStartDate().getTime()>nowEnd){
                    if(bill.getStartDate().getTime()>nowEnd ){
                        //如果还没开始,账单直接关闭
                        continue;
                    }
@@ -1490,6 +1524,11 @@
            queryWrapper.ge(YwContract::getWyFreeEndDate, Utils.Date.getStart(pageWrap.getModel().getWyFreeEndDate()));
            queryWrapper.le(YwContract::getWyFreeEndDate, Utils.Date.getEnd(pageWrap.getModel().getWyFreeEndDate()));
        }
        if (pageWrap.getModel().getZlTotalFee() != null) {
            queryWrapper.eq(YwContract::getZlTotalFee, pageWrap.getModel().getZlTotalFee());
        }