Bläddra i källkod

优化 间接性费用功能

java110 4 år sedan
förälder
incheckning
89e62ac67a

+ 47 - 3
java110-core/src/main/java/com/java110/core/smo/impl/ComputeFeeSMOImpl.java

@@ -738,6 +738,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
         endCalender.add(Calendar.HOUR, hours);
         if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             return FeeDto.STATE_FINISH;
+        } else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
+            if ((endCalender.getTime()).after(feeDto.getDeadlineTime())) {
+                return FeeDto.STATE_FINISH;
+            }
         } else {
             if ((endCalender.getTime()).after(feeDto.getConfigEndTime())) {
                 return FeeDto.STATE_FINISH;
@@ -769,6 +773,10 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             } else {
                 endCalender.setTime(feeDto.getImportFeeEndTime());
             }
+        } else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
+            if ((endCalender.getTime()).after(feeDto.getDeadlineTime())) {
+                endCalender.setTime(feeDto.getDeadlineTime());
+            }
         } else {
             if ((endCalender.getTime()).after(feeDto.getConfigEndTime())) {
                 endCalender.setTime(feeDto.getConfigEndTime());
@@ -1404,6 +1412,7 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             return targetEndDateAndOweMonth;
         }
         //当前费用为一次性费用
+        Date maxEndTime = feeDto.getConfigEndTime();
         if (FeeDto.FEE_FLAG_ONCE.equals(feeDto.getFeeFlag())) {
             //先取 deadlineTime
             if (feeDto.getDeadlineTime() != null) {
@@ -1411,12 +1420,47 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             } else if (!StringUtil.isEmpty(feeDto.getCurDegrees())) {
                 targetEndDate = feeDto.getCurReadingTime();
             } else if (feeDto.getImportFeeEndTime() == null) {
-                targetEndDate = feeDto.getConfigEndTime();
+                targetEndDate = maxEndTime;
             } else {
                 targetEndDate = feeDto.getImportFeeEndTime();
             }
             //判断当前费用是不是导入费用
             oweMonth = 1.0;
+        }else if(FeeDto.FEE_FLAG_CYCLE_ONCE.equals(feeDto.getFeeFlag())){
+            maxEndTime = feeDto.getDeadlineTime();
+            Date billEndTime = DateUtil.getCurrentDate();
+            //建账时间
+            Date startDate = feeDto.getStartTime();
+            //计费起始时间
+            Date endDate = feeDto.getEndTime();
+            //缴费周期
+            long paymentCycle = Long.parseLong(feeDto.getPaymentCycle());
+            // 当前时间 - 开始时间  = 月份
+            double mulMonth = 0.0;
+            mulMonth = dayCompare(startDate, billEndTime);
+
+            // 月份/ 周期 = 轮数(向上取整)
+            double round = 0.0;
+            if ("1200".equals(feeDto.getPaymentCd())) { // 1200预付费
+                round = Math.floor(mulMonth / paymentCycle) + 1;
+            } else { //2100后付费
+                round = Math.floor(mulMonth / paymentCycle);
+            }
+            // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
+            targetEndDate = getTargetEndTime(round * paymentCycle, startDate);//目标结束时间
+            //费用项的结束时间<缴费的结束时间  费用快结束了   取费用项的结束时间
+            if (maxEndTime.getTime() < targetEndDate.getTime()) {
+                targetEndDate = maxEndTime;
+            }
+            //说明欠费
+            if (endDate.getTime() < targetEndDate.getTime()) {
+                // 目标到期时间 - 到期时间 = 欠费月份
+                oweMonth = dayCompare(endDate, targetEndDate);
+            }
+
+            if (feeDto.getEndTime().getTime() > targetEndDate.getTime()) {
+                targetEndDate = feeDto.getEndTime();
+            }
         } else { //周期性费用
             //当前时间
             Date billEndTime = DateUtil.getCurrentDate();
@@ -1440,8 +1484,8 @@ public class ComputeFeeSMOImpl implements IComputeFeeSMO {
             // 轮数 * 周期 * 30 + 开始时间 = 目标 到期时间
             targetEndDate = getTargetEndTime(round * paymentCycle, startDate);//目标结束时间
             //费用项的结束时间<缴费的结束时间  费用快结束了   取费用项的结束时间
-            if (feeDto.getConfigEndTime().getTime() < targetEndDate.getTime()) {
-                targetEndDate = feeDto.getConfigEndTime();
+            if (maxEndTime.getTime() < targetEndDate.getTime()) {
+                targetEndDate = maxEndTime;
             }
             //说明欠费
             if (endDate.getTime() < targetEndDate.getTime()) {

+ 5 - 2
service-api/src/main/java/com/java110/api/bmo/fee/impl/FeeBMOImpl.java

@@ -337,10 +337,13 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
         if (FeeDto.FEE_FLAG_ONCE.equals(feeInfo.getFeeFlag())) { //缴费结束
             feeMap.put("state", FeeDto.STATE_FINISH);
         }
+        Date maxEndTime = feeInfo.getConfigEndTime();
+        if(!FeeDto.FEE_FLAG_CYCLE.equals(feeInfo.getFeeFlag())){
+            maxEndTime = feeInfo.getDeadlineTime();
+        }
         try {
             Date endTime = DateUtil.getDateFromString(paramInJson.getString("endTime"), DateUtil.DATE_FORMATE_STRING_A);
-            Date configEndTime = feeInfo.getConfigEndTime();
-            if (endTime.getTime() >= configEndTime.getTime()) {
+            if (endTime.getTime() >= maxEndTime.getTime()) {
                 feeMap.put("state", FeeDto.STATE_FINISH);
             }
         } catch (ParseException e) {

+ 1 - 1
service-community/src/main/java/com/java110/community/api/RoomRenovationApi.java

@@ -245,7 +245,7 @@ public class RoomRenovationApi {
                 feeAttrPo3.setSpecCd(FeeAttrDto.SPEC_CD_OWNER_LINK); //联系方式
                 feeAttrPo3.setValue(reqJson.getString("personTel"));
                 feeAttrOwnerLinkPos.add(feeAttrPo3);
-                if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag())) {//一次性费用
+                if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {//一次性费用
                     FeeAttrPo feeAttrPo4 = new FeeAttrPo();
                     feeAttrPo4.setFeeId(payFeePo.getFeeId());
                     feeAttrPo4.setCommunityId(reqJson.getString("communityId"));

+ 5 - 2
service-fee/src/main/java/com/java110/fee/bmo/fee/impl/FeeBMOImpl.java

@@ -344,10 +344,13 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
         if (FeeDto.FEE_FLAG_ONCE.equals(feeInfo.getFeeFlag())) { //缴费结束
             feeMap.put("state", FeeDto.STATE_FINISH);
         }
+        Date maxEndTime = feeInfo.getConfigEndTime();
+        if(!FeeDto.FEE_FLAG_CYCLE.equals(feeInfo.getFeeFlag())){
+            maxEndTime = feeInfo.getDeadlineTime();
+        }
         try {
             Date endTime = DateUtil.getDateFromString(paramInJson.getString("endTime"), DateUtil.DATE_FORMATE_STRING_A);
-            Date configEndTime = feeInfo.getConfigEndTime();
-            if (endTime.getTime() >= configEndTime.getTime()) {
+            if (endTime.getTime() >= maxEndTime.getTime()) {
                 feeMap.put("state", FeeDto.STATE_FINISH);
             }
         } catch (ParseException e) {

+ 2 - 2
service-fee/src/main/java/com/java110/fee/cmd/fee/CreateFeeByComboCmd.java

@@ -130,7 +130,7 @@ public class CreateFeeByComboCmd extends Cmd {
         List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
         Assert.listOnlyOne(feeConfigDtos, "当前费用项ID不存在或存在多条" + reqJson.getString("configId"));
 
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag()) && config.containsKey("endTime")) {
+        if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag()) && config.containsKey("endTime")) {
             Date endTime = null;
             Date configEndTime = null;
             try {
@@ -149,7 +149,7 @@ public class CreateFeeByComboCmd extends Cmd {
 
         feePos.add(BeanConvertUtil.covertBean(addRoomFee(config, reqJson,feeConfigDtos), PayFeePo.class));
 
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag())) {
+        if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
             feeAttrsPos.add(addFeeAttr(reqJson, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
                     config.containsKey("endTime") ? config.getString("endTime") : reqJson.getString("configEndTime")));
         }

+ 11 - 7
service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java

@@ -132,17 +132,21 @@ public class PayBatchFeeCmd extends Cmd {
             feeConfigDto.setConfigId(feeDto.getConfigId());
             feeConfigDto.setCommunityId(paramInObj.getString("communityId"));
             List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-            if (feeConfigDtos != null && feeConfigDtos.size() == 1) {
+            if (feeConfigDtos == null || feeConfigDtos.size() != 1) {
+                throw new IllegalArgumentException("费用项不存在");
+            }
+            Date maxEndTime = feeDtos.get(0).getDeadlineTime();
+            if (FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
                 try {
-                    Date configEndTime = DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
-                    Date newDate = DateUtil.stepMonth(endTime, paramInObj.getInteger("cycles") - 1);
-                    if (newDate.getTime() > configEndTime.getTime()) {
-                        throw new IllegalArgumentException("缴费周期超过 缴费结束时间");
-                    }
-                } catch (Exception e) {
+                    maxEndTime = DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
+                } catch (ParseException e) {
                     logger.error("比较费用日期失败", e);
                 }
             }
+            Date newDate = DateUtil.stepMonth(endTime, paramInObj.getInteger("cycles") - 1);
+            if (newDate.getTime() > maxEndTime.getTime()) {
+                throw new IllegalArgumentException("缴费周期超过 缴费结束时间");
+            }
         }
     }
 

+ 13 - 10
service-fee/src/main/java/com/java110/fee/cmd/fee/PayFeeCmd.java

@@ -55,6 +55,7 @@ import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.math.BigDecimal;
+import java.text.ParseException;
 import java.util.*;
 
 @Java110Cmd(serviceCode = "fee.payFee")
@@ -161,20 +162,22 @@ public class PayFeeCmd extends Cmd {
         feeConfigDto.setCommunityId(reqJson.getString("communityId"));
         List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
 
-        if (feeConfigDtos != null && feeConfigDtos.size() == 1) {
+        if (feeConfigDtos == null || feeConfigDtos.size() != 1) {
+            throw new IllegalArgumentException("费用项不存在");
+        }
+        Date maxEndTime = feeDtos.get(0).getDeadlineTime();
+        if (FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag())) {
             try {
-                Date configEndTime = DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
-                configEndTime = DateUtil.stepDay(configEndTime,5);
-                Date newDate = DateUtil.stepMonth(endTime, reqJson.getDouble("cycles").intValue());
-
-                if (newDate.getTime() > configEndTime.getTime()) {
-                    throw new IllegalArgumentException("缴费周期超过 缴费结束时间");
-                }
-
-            } catch (Exception e) {
+                maxEndTime = DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
+            } catch (ParseException e) {
                 logger.error("比较费用日期失败", e);
             }
         }
+        Date newDate = DateUtil.stepMonth(endTime, reqJson.getDouble("cycles").intValue());
+        if (newDate.getTime() > maxEndTime.getTime()) {
+            throw new IllegalArgumentException("缴费周期超过 缴费结束时间");
+        }
+        
         String selectUserAccount = reqJson.getString("selectUserAccount");
         JSONArray params = JSONArray.parseArray(selectUserAccount);
         for (int paramIndex = 0; paramIndex < params.size(); paramIndex++) {

+ 2 - 2
service-fee/src/main/java/com/java110/fee/cmd/fee/SaveContractCreateFeeCmd.java

@@ -97,7 +97,7 @@ public class SaveContractCreateFeeCmd extends Cmd {
         reqJson.put("feeFlag", feeConfigDtos.get(0).getFeeFlag());
         reqJson.put("configEndTime", feeConfigDtos.get(0).getEndTime());
 
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag()) && reqJson.containsKey("endTime")) {
+        if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag()) && reqJson.containsKey("endTime")) {
             Date endTime = null;
             Date configEndTime = null;
             try {
@@ -176,7 +176,7 @@ public class SaveContractCreateFeeCmd extends Cmd {
             curFailRoomCount++;
             feePos.add(BeanConvertUtil.covertBean(feeBMOImpl.addContractFee(contractDtos.get(roomIndex), reqJson, context), PayFeePo.class));
             if (!StringUtil.isEmpty(contractDtos.get(roomIndex).getObjId())) {
-                if (FeeDto.FEE_FLAG_ONCE.equals(reqJson.getString("feeFlag"))) {
+                if (!FeeDto.FEE_FLAG_CYCLE.equals(reqJson.getString("feeFlag"))) {
                     feeAttrsPos.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
                             reqJson.containsKey("endTime") ? reqJson.getString("endTime") : reqJson.getString("configEndTime")));
                 }

+ 2 - 2
service-fee/src/main/java/com/java110/fee/cmd/fee/SaveParkingSpaceCreateFeeCmd.java

@@ -91,7 +91,7 @@ public class SaveParkingSpaceCreateFeeCmd extends Cmd {
         reqJson.put("feeFlag", feeConfigDtos.get(0).getFeeFlag());
         reqJson.put("configEndTime", feeConfigDtos.get(0).getEndTime());
 
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag()) && reqJson.containsKey("endTime")) {
+        if (!FeeDto.FEE_FLAG_CYCLE.equals(feeConfigDtos.get(0).getFeeFlag()) && reqJson.containsKey("endTime")) {
             Date endTime = null;
             Date configEndTime = null;
             try {
@@ -227,7 +227,7 @@ public class SaveParkingSpaceCreateFeeCmd extends Cmd {
             curFailRoomCount++;
             feePos.add(BeanConvertUtil.covertBean(feeBMOImpl.addFee(ownerCarDtos.get(ownerCarIndex), reqJson, context), PayFeePo.class));
             if (!StringUtil.isEmpty(ownerCarDtos.get(ownerCarIndex).getOwnerId())) {
-                if (FeeDto.FEE_FLAG_ONCE.equals(reqJson.getString("feeFlag"))) {
+                if (!FeeDto.FEE_FLAG_CYCLE.equals(reqJson.getString("feeFlag"))) {
                     feeAttrsPos.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
                             reqJson.containsKey("endTime") ? reqJson.getString("endTime") : reqJson.getString("configEndTime")));
                 }

+ 1 - 1
service-user/src/main/java/com/java110/user/cmd/owner/SaveHandoverCmd.java

@@ -235,7 +235,7 @@ public class SaveHandoverCmd extends Cmd {
                     throw new CmdException("保存费用失败");
                 }
 
-                if (FeeDto.FEE_FLAG_ONCE.equals(businessUnit.getString("feeFlag"))) {
+                if (!FeeDto.FEE_FLAG_CYCLE.equals(businessUnit.getString("feeFlag"))) {
                     feeAttrPo = addFeeAttr(businessUnit, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
                             paramInJson.containsKey("endTime") ? paramInJson.getString("endTime") : feeConfigDtos.get(0).getEndTime());
                     flag = feeAttrInnerServiceSMOImpl.saveFeeAttr(feeAttrPo);