From 2551631f71dbd6291794b84af8d2f7ded1463521 Mon Sep 17 00:00:00 2001
From: wuxw <928255095@qq.com>
Date: 星期四, 04 一月 2024 22:49:13 +0800
Subject: [PATCH] 优化改造完成批量缴费功能

---
 service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java |  594 ++++++++++++++++++++++++-----------------------------------
 1 files changed, 241 insertions(+), 353 deletions(-)

diff --git a/service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java b/service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java
index 613059f..e3f35d7 100644
--- a/service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java
+++ b/service-fee/src/main/java/com/java110/fee/cmd/fee/PayBatchFeeCmd.java
@@ -11,15 +11,15 @@
 import com.java110.core.factory.Java110TransactionalFactory;
 import com.java110.core.log.LoggerFactory;
 import com.java110.core.smo.IComputeFeeSMO;
-import com.java110.dto.fee.FeeAttrDto;
-import com.java110.dto.fee.FeeConfigDto;
-import com.java110.dto.fee.FeeDetailDto;
-import com.java110.dto.fee.FeeDto;
+import com.java110.dto.account.AccountDto;
+import com.java110.dto.fee.*;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.parking.ParkingSpaceDto;
 import com.java110.dto.repair.RepairDto;
 import com.java110.dto.repair.RepairUserDto;
 import com.java110.dto.user.UserDto;
+import com.java110.fee.bmo.fee.IFinishFeeNotify;
+import com.java110.intf.acct.IAccountInnerServiceSMO;
 import com.java110.intf.community.*;
 import com.java110.intf.fee.*;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
@@ -36,20 +36,14 @@
 import com.java110.utils.exception.CmdException;
 import com.java110.utils.exception.ListenerExecuteException;
 import com.java110.utils.lock.DistributedLock;
-import com.java110.utils.util.Assert;
-import com.java110.utils.util.BeanConvertUtil;
-import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.StringUtil;
+import com.java110.utils.util.*;
 import com.java110.vo.ResultVo;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.math.BigDecimal;
 import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 @Java110Cmd(serviceCode = "fee.payBatchFee")
 public class PayBatchFeeCmd extends Cmd {
@@ -65,38 +59,7 @@
     private IPayFeeDetailV1InnerServiceSMO payFeeDetailNewV1InnerServiceSMOImpl;
 
     @Autowired
-    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
-
-    @Autowired
-    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
-
-    @Autowired
     private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
-
-    @Autowired
-    private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
-    @Autowired
-    private IOwnerCarNewV1InnerServiceSMO ownerCarNewV1InnerServiceSMOImpl;
-
-    @Autowired
-    private IFeeReceiptDetailInnerServiceSMO feeReceiptDetailInnerServiceSMOImpl;
-
-    @Autowired
-    private IRepairUserInnerServiceSMO repairUserInnerServiceSMO;
-
-    @Autowired
-    private IRepairInnerServiceSMO repairInnerServiceSMO;
-
-    @Autowired
-    private IApplyRoomDiscountInnerServiceSMO applyRoomDiscountInnerServiceSMOImpl;
-
-    @Autowired
-    private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
-
-    @Autowired
-    private IRepairPoolV1InnerServiceSMO repairPoolNewV1InnerServiceSMOImpl;
-    @Autowired
-    private IRepairUserV1InnerServiceSMO repairUserNewV1InnerServiceSMOImpl;
 
     @Autowired
     private IComputeFeeSMO computeFeeSMOImpl;
@@ -106,6 +69,12 @@
 
     @Autowired
     private IFeeReceiptInnerServiceSMO feeReceiptInnerServiceSMOImpl;
+
+    @Autowired
+    private IFinishFeeNotify finishFeeNotifyImpl;
+
+    @Autowired
+    private IAccountInnerServiceSMO accountInnerServiceSMOImpl;
 
 
     @Override
@@ -118,28 +87,42 @@
 
         JSONArray fees = reqJson.getJSONArray("fees");
 
-        if (fees == null || fees.size() < 1) {
+        if (ListUtil.isNull(fees)) {
             throw new CmdException("鏈寘鍚垂鐢�");
         }
+
+        //todo 鏌ヨ鐢ㄦ埛淇℃伅
+        String userId = cmdDataFlowContext.getReqHeaders().get("user-id");
+        UserDto userDto = new UserDto();
+        userDto.setUserId(userId);
+        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
+        Assert.listOnlyOne(userDtos, "鐢ㄦ埛鏈櫥褰�");
+
+
         JSONObject paramInObj = null;
+        List<PayFeeDataDto> feeDataDtos = new ArrayList<>();
+        PayFeeDataDto payFeeDataDto = null;
         for (int feeIndex = 0; feeIndex < fees.size(); feeIndex++) {
             paramInObj = fees.getJSONObject(feeIndex);
-            //鍒ゆ柇鏄惁 璐圭敤鐘舵�佷负缂磋垂缁撴潫
+            Assert.hasKeyAndValue(paramInObj, "feeId", "鏈寘鍚垂鐢↖D");
+            Assert.hasKeyAndValue(paramInObj, "tempCycle", "鏈寘鍚即璐瑰懆鏈熺被鍨�");
+            Assert.hasKeyAndValue(paramInObj, "primeRate", "鏈寘鍚即璐圭即璐规柟寮�");
+            Assert.hasKeyAndValue(paramInObj, "receivedAmount", "鏈寘鍚疄鏀堕噾棰�");
+            //todo 鍒ゆ柇鏄惁 璐圭敤鐘舵�佷负缂磋垂缁撴潫
             FeeDto feeDto = new FeeDto();
             feeDto.setFeeId(paramInObj.getString("feeId"));
             feeDto.setCommunityId(reqJson.getString("communityId"));
             List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
             Assert.listOnlyOne(feeDtos, "浼犲叆璐圭敤ID閿欒");
-            feeDto = feeDtos.get(0);
-            if (FeeDto.STATE_FINISH.equals(feeDto.getState())) {
+            if (FeeDto.STATE_FINISH.equals(feeDtos.get(0).getState())) {
                 throw new IllegalArgumentException("鏀惰垂宸茬粡缁撴潫锛屼笉鑳藉啀缂磋垂");
             }
-            Date endTime = feeDto.getEndTime();
+            Date endTime = feeDtos.get(0).getEndTime();
             FeeConfigDto feeConfigDto = new FeeConfigDto();
-            feeConfigDto.setConfigId(feeDto.getConfigId());
+            feeConfigDto.setConfigId(feeDtos.get(0).getConfigId());
             feeConfigDto.setCommunityId(paramInObj.getString("communityId"));
             List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-            if (feeConfigDtos == null || feeConfigDtos.size() != 1) {
+            if (ListUtil.isNull(feeConfigDtos)) {
                 throw new IllegalArgumentException("璐圭敤椤逛笉瀛樺湪");
             }
             Date maxEndTime = feeDtos.get(0).getDeadlineTime();
@@ -154,345 +137,196 @@
                     throw new IllegalArgumentException("缂磋垂鍛ㄦ湡瓒呰繃 缂磋垂缁撴潫鏃堕棿,璇风敤鎸夌粨鏉熸椂闂存柟寮忕即璐�");
                 }
             }
-
+            //todo 灏佽鏁版嵁
+            payFeeDataDto = new PayFeeDataDto();
+            payFeeDataDto.setFeeDto(feeDtos.get(0));
+            payFeeDataDto.setFeeConfigDto(feeConfigDtos.get(0));
+            payFeeDataDto.setCommunityId(reqJson.getString("communityId"));
+            payFeeDataDto.setTempCycle(paramInObj.getString("tempCycle"));
+            payFeeDataDto.setCustEndTime(paramInObj.getString("custEndTime"));
+            payFeeDataDto.setPrimeRate(paramInObj.getString("primeRate"));
+            payFeeDataDto.setRemark(paramInObj.getString("remark"));
+            payFeeDataDto.setReceivedAmount(paramInObj.getString("receivedAmount"));
+            payFeeDataDto.setCashierId(userDtos.get(0).getUserId());
+            payFeeDataDto.setCashierName(userDtos.get(0).getName());
+            payFeeDataDto.setFeeId(paramInObj.getString("feeId"));
+            feeDataDtos.add(payFeeDataDto);
         }
+
+        //todo 璐︽埛鎶垫墸
+        ifHasAccount(reqJson, feeDataDtos);
+
+        reqJson.put("feeDataDtos", feeDataDtos);
+
+
     }
+
 
     @Override
     @Java110Transactional
     public void doCmd(CmdEvent event, ICmdDataFlowContext cmdDataFlowContext, JSONObject reqJson) throws CmdException {
 
-        String userId = cmdDataFlowContext.getReqHeaders().get("user-id");
-        UserDto userDto = new UserDto();
-        userDto.setUserId(userId);
-        List<UserDto> userDtos = userV1InnerServiceSMOImpl.queryUsers(userDto);
-        Assert.listOnlyOne(userDtos, "鐢ㄦ埛鏈櫥褰�");
-
-        //todo 鐢熸垚鏀舵嵁缂栧彿
-        String receiptCode = feeReceiptInnerServiceSMOImpl.generatorReceiptCode(reqJson.getString("communityId"));
-
+        //todo 灏佽濂界殑鍙傛暟
+        List<PayFeeDataDto> feeDataDtos = (List<PayFeeDataDto>) reqJson.get("feeDataDtos");
+        String communityId = reqJson.getString("communityId");
         String payOrderId = reqJson.getString("payOrderId");
 
-
-        JSONArray fees = reqJson.getJSONArray("fees");
-        JSONObject paramInObj = null;
+        //todo 鐢熸垚鏀舵嵁缂栧彿
+        String receiptCode = feeReceiptInnerServiceSMOImpl.generatorReceiptCode(communityId);
         JSONArray details = new JSONArray();
-        for (int feeIndex = 0; feeIndex < fees.size(); feeIndex++) {
-            try {
-                paramInObj = fees.getJSONObject(feeIndex);
-                doDeal(paramInObj, reqJson.getString("communityId"),receiptCode, cmdDataFlowContext, userDtos.get(0),payOrderId);
-            } catch (Exception e) {
-                logger.error("澶勭悊寮傚父", e);
-                throw new CmdException(e.getMessage());
+        //鑾峰彇璁㈠崟ID
+        String oId = Java110TransactionalFactory.getOId();
+
+        for (PayFeeDataDto payFeeDataDto : feeDataDtos) {
+            payFeeDataDto.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+            payFeeDataDto.setPayOrderId(oId);
+            // todo 濡傛灉 鎵爜鏋敮浠� 杈撳叆鏀粯璁㈠崟ID
+            if (!StringUtil.isEmpty(payOrderId)) {
+                payFeeDataDto.setPayOrderId(payOrderId);
             }
-            details.add(paramInObj.getString("detailId"));
+
+            String requestId = DistributedLock.getLockUUID();
+            String key = this.getClass().getSimpleName() + payFeeDataDto.getFeeId();
+            DistributedLock.waitGetDistributedLock(key, requestId);
+            try {
+                doPayFee(payFeeDataDto, receiptCode);
+            } finally {
+                DistributedLock.releaseDistributedLock(key, requestId);
+            }
+            details.add(payFeeDataDto.getDetailId());
         }
 
         JSONObject data = new JSONObject();
-        data.put("details",details);
+        data.put("details", details);
 
         cmdDataFlowContext.setResponseEntity(ResultVo.createResponseEntity(data));
     }
 
-    private void doDeal(JSONObject paramObj, String communityId,String receiptCode,
-                        ICmdDataFlowContext cmdDataFlowContext,
-                        UserDto userDto,
-                        String payOrderId) throws Exception {
-        paramObj.put("communityId", communityId);
-        //鑾峰彇璁㈠崟ID
-        String oId = Java110TransactionalFactory.getOId();
+    private void doPayFee(PayFeeDataDto payFeeDataDto, String receiptCode) {
 
-        //寮�濮嬮攣浠g爜
-        PayFeePo payFeePo = null;
-        String requestId = DistributedLock.getLockUUID();
-        String key = this.getClass().getSimpleName() + paramObj.get("feeId");
-        try {
-            DistributedLock.waitGetDistributedLock(key, requestId);
-            JSONObject feeDetail = addFeeDetail(paramObj);
-            PayFeeDetailPo payFeeDetailPo = BeanConvertUtil.covertBean(feeDetail, PayFeeDetailPo.class);
-            if (StringUtil.isEmpty(oId)) {
-                oId = payFeeDetailPo.getDetailId();
-            }
-            payFeeDetailPo.setPayOrderId(oId);
-            // todo 濡傛灉 鎵爜鏋敮浠� 杈撳叆鏀粯璁㈠崟ID
-            if(!StringUtil.isEmpty(payOrderId)){
-                payFeeDetailPo.setPayOrderId(payOrderId);
-            }
-            payFeeDetailPo.setCashierId(userDto.getUserId());
-            payFeeDetailPo.setCashierName(userDto.getName());
-            payFeeDetailPo.setOpenInvoice("N");
-            //todo 缂撳瓨鏀舵嵁缂栧彿
-            CommonCache.setValue(payFeeDetailPo.getDetailId()+CommonCache.RECEIPT_CODE,receiptCode,CommonCache.DEFAULT_EXPIRETIME_TWO_MIN);
-            int flag = payFeeDetailNewV1InnerServiceSMOImpl.savePayFeeDetailNew(payFeeDetailPo);
-            if (flag < 1) {
-                throw new CmdException("缂磋垂澶辫触");
-            }
-            JSONObject fee = modifyFee(paramObj);
-            payFeePo = BeanConvertUtil.covertBean(fee, PayFeePo.class);
 
-            flag = payFeeV1InnerServiceSMOImpl.updatePayFee(payFeePo);
-            if (flag < 1) {
-                throw new CmdException("缂磋垂澶辫触");
-            }
-        } finally {
-            DistributedLock.releaseDistributedLock(key,requestId);
+        PayFeeDetailPo payFeeDetailPo = payFeeDataDto;
+        payFeeDetailPo.setOpenInvoice("N");
+        payFeeDetailPo.setState(FeeDetailDto.STATE_NORMAL);
+        payFeeDetailPo.setStartTime(DateUtil.getFormatTimeStringA(payFeeDataDto.getFeeDto().getEndTime()));
+
+        //todo 璁$畻 缁撴潫鏃堕棿 搴旀敹  缂磋垂鍛ㄦ湡
+        /**
+         *         payFeeDetailPo.setCycles(cycles.doubleValue() + "");
+         *         payFeeDetailPo.setEndTime(DateUtil.getFormatTimeStringA(targetEndTime));
+         *         payFeeDetailPo.setReceivableAmount(receivableAmount);
+         *         payFeeDetailPo.setPayableAmount(receivableAmount);
+         */
+        computeEndTimeCycleAmount(payFeeDataDto, payFeeDetailPo);
+
+        //todo 缂撳瓨鏀舵嵁缂栧彿
+        CommonCache.setValue(payFeeDetailPo.getDetailId() + CommonCache.RECEIPT_CODE, receiptCode, CommonCache.DEFAULT_EXPIRETIME_TWO_MIN);
+        int flag = payFeeDetailNewV1InnerServiceSMOImpl.savePayFeeDetailNew(payFeeDetailPo);
+        if (flag < 1) {
+            throw new CmdException("缂磋垂澶辫触");
         }
-        //杞﹁締寤舵湡
-        updateOwnerCarEndTime(payFeePo, paramObj);
 
-        //澶勭悊鎶ヤ慨鍗�
-        doDealRepairOrder(paramObj);
+        PayFeePo payFeePo = new PayFeePo();
+        payFeePo.setFeeId(payFeeDataDto.getFeeId());
+        payFeePo.setEndTime(payFeeDetailPo.getEndTime());
+        payFeePo.setState(FeeDto.STATE_FINISH);
+
+        Date maxTime = payFeeDataDto.getFeeDto().getDeadlineTime();
+
+        if (maxTime == null) {
+            maxTime = DateUtil.getDateFromStringA(payFeeDataDto.getFeeConfigDto().getEndTime());
+        }
+        //todo 涓嶆槸涓�娆℃�ц垂鐢�
+        if (!FeeDto.FEE_FLAG_ONCE.equals(payFeeDataDto.getFeeDto().getFeeFlag()) && maxTime != null) {
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(maxTime);
+            calendar.add(Calendar.DAY_OF_MONTH, -5);
+            maxTime = calendar.getTime();
+            if (maxTime.after(DateUtil.getDateFromStringA(payFeeDetailPo.getEndTime()))) {
+                payFeePo.setState(FeeDto.STATE_DOING);
+            }
+        }
+
+        flag = payFeeV1InnerServiceSMOImpl.updatePayFee(payFeePo);
+        if (flag < 1) {
+            throw new CmdException("缂磋垂澶辫触");
+        }
+
+        //todo 璐︽埛鎵f
+        finishFeeNotifyImpl.withholdAccount(payFeeDataDto, payFeeDataDto.getFeeId(), payFeeDataDto.getCommunityId());
+
+        //todo 淇敼杞﹁締
+        finishFeeNotifyImpl.updateCarEndTime(payFeeDataDto.getFeeId(), payFeeDataDto.getCommunityId());
+
+
+        //todo 淇敼鎶ヤ慨鍗�
+        finishFeeNotifyImpl.updateRepair(payFeeDataDto.getFeeId(), payFeeDataDto.getCommunityId(), payFeeDetailPo.getReceivedAmount());
 
     }
 
     /**
-     * 澶勭悊鎶ヤ慨鍗�
+     * 璁$畻 缁撴潫鏃堕棿 缂磋垂鍛ㄦ湡 閲戦
+     * payFeeDetailPo.setCycles(cycles.doubleValue() + "");
+     * payFeeDetailPo.setEndTime(DateUtil.getFormatTimeStringA(targetEndTime));
+     * payFeeDetailPo.setReceivableAmount(receivableAmount);
      *
-     * @param paramObj
+     * @param payFeeDataDto
+     * @param payFeeDetailPo
      */
-    private void doDealRepairOrder(JSONObject paramObj) {
-        int flag;//鍒ゆ柇鏄惁鏈夋淳鍗曞睘鎬D
-        FeeAttrDto feeAttrDto = new FeeAttrDto();
-        feeAttrDto.setCommunityId(paramObj.getString("communityId"));
-        feeAttrDto.setFeeId(paramObj.getString("feeId"));
-        feeAttrDto.setSpecCd(FeeAttrDto.SPEC_CD_REPAIR);
-        List<FeeAttrDto> feeAttrDtos = feeAttrInnerServiceSMOImpl.queryFeeAttrs(feeAttrDto);
-        //淇敼 娲惧崟鐘舵��
-        if (feeAttrDtos != null && feeAttrDtos.size() > 0) {
-            RepairDto repairDto = new RepairDto();
-            repairDto.setRepairId(feeAttrDtos.get(0).getValue());
-            //鏌ヨ鎶ヤ慨璁板綍
-            List<RepairDto> repairDtos = repairInnerServiceSMO.queryRepairs(repairDto);
-            Assert.listOnlyOne(repairDtos, "鎶ヤ慨淇℃伅閿欒锛�");
-            //鑾峰彇鎶ヤ慨娓犻亾
-            String repairChannel = repairDtos.get(0).getRepairChannel();
-            RepairPoolPo repairPoolPo = new RepairPoolPo();
-            repairPoolPo.setRepairId(feeAttrDtos.get(0).getValue());
-            repairPoolPo.setCommunityId(paramObj.getString("communityId"));
-            if (repairChannel.equals("Z")) { //濡傛灉鏄笟涓昏嚜涓绘姤淇紝鐘舵�佸氨鍙樻垚寰呰瘎浠�
-                repairPoolPo.setState(RepairDto.STATE_APPRAISE);
-            } else { //濡傛灉鏄憳宸ヤ唬瀹㈡姤淇垨鐢佃瘽鎶ヤ慨锛岀姸鎬佸氨鍙樻垚寰呭洖璁�
-                repairPoolPo.setState(RepairDto.STATE_RETURN_VISIT);
-            }
-            flag = repairPoolNewV1InnerServiceSMOImpl.updateRepairPoolNew(repairPoolPo);
-            if (flag < 1) {
-                throw new CmdException("鏇存柊寰俊娲惧崟姹犱俊鎭け璐�");
-            }
-
-            repairDto = new RepairDto();
-            repairDto.setRepairId(feeAttrDtos.get(0).getValue());
-            //鏌ヨ鎶ヤ慨璁板綍
-            repairDtos = repairInnerServiceSMO.queryRepairs(repairDto);
-
-            Assert.listOnlyOne(repairDtos, "鎶ヤ慨淇℃伅閿欒锛�");
-            //鑾峰彇鎶ヤ慨娓犻亾
-            repairChannel = repairDtos.get(0).getRepairChannel();
-            RepairUserDto repairUserDto = new RepairUserDto();
-            repairUserDto.setRepairId(feeAttrDtos.get(0).getValue());
-            repairUserDto.setState(RepairUserDto.STATE_PAY_FEE);
-            //鏌ヨ寰呮敮浠樼姸鎬佺殑璁板綍
-            List<RepairUserDto> repairUserDtoList = repairUserInnerServiceSMO.queryRepairUsers(repairUserDto);
-            Assert.listOnlyOne(repairUserDtoList, "淇℃伅閿欒锛�");
-            RepairUserPo repairUserPo = new RepairUserPo();
-            repairUserPo.setRuId(repairUserDtoList.get(0).getRuId());
-            if ("Z".equals(repairChannel)) {  //濡傛灉涓氫富鏄嚜涓绘姤淇紝鐘舵�佸氨鍙樻垚宸叉敮浠橈紝骞舵柊澧炰竴鏉″緟璇勪环鐘舵��
-                repairUserPo.setState(RepairUserDto.STATE_FINISH_PAY_FEE);
-                //濡傛灉鏄緟璇勪环鐘舵�侊紝灏辨洿鏂扮粨鏉熸椂闂�
-                repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
-                repairUserPo.setContext("宸叉敮浠�" + paramObj.getString("feePrice") + "鍏�");
-                //鏂板寰呰瘎浠风姸鎬�
-                RepairUserPo repairUser = new RepairUserPo();
-                repairUser.setRuId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_ruId));
-                repairUser.setStartTime(repairUserPo.getEndTime());
-                repairUser.setState(RepairUserDto.STATE_EVALUATE);
-                repairUser.setContext("寰呰瘎浠�");
-                repairUser.setCommunityId(paramObj.getString("communityId"));
-                repairUser.setCreateTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
-                repairUser.setRepairId(repairUserDtoList.get(0).getRepairId());
-                repairUser.setStaffId(repairUserDtoList.get(0).getStaffId());
-                repairUser.setStaffName(repairUserDtoList.get(0).getStaffName());
-                repairUser.setPreStaffId(repairUserDtoList.get(0).getStaffId());
-                repairUser.setPreStaffName(repairUserDtoList.get(0).getStaffName());
-                repairUser.setPreRuId(repairUserDtoList.get(0).getRuId());
-                repairUser.setRepairEvent("auditUser");
-                flag = repairUserNewV1InnerServiceSMOImpl.saveRepairUserNew(repairUser);
-                if (flag < 1) {
-                    throw new CmdException("鏇存柊寰俊娲惧崟姹犱俊鎭け璐�");
-                }
-            } else {  //濡傛灉鏄憳宸ヤ唬瀹㈡姤淇垨鐢佃瘽鎶ヤ慨锛岀姸鎬佸氨鍙樻垚宸叉敮浠�
-                repairUserPo.setState(RepairUserDto.STATE_FINISH_PAY_FEE);
-                //濡傛灉鏄凡鏀粯鐘舵�侊紝灏辨洿鏂扮粨鏉熸椂闂�
-                repairUserPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
-                repairUserPo.setContext("宸叉敮浠�" + paramObj.getString("feePrice") + "鍏�");
-            }
-            flag = repairUserNewV1InnerServiceSMOImpl.updateRepairUserNew(repairUserPo);
-            if (flag < 1) {
-                throw new CmdException("鏇存柊寰俊娲惧崟姹犱俊鎭け璐�");
-            }
-        }
-    }
-
-    /**
-     * 淇敼杞﹁締 缁撴潫鏃堕棿
-     *
-     * @param payFeePo
-     * @param paramObj
-     * @throws ParseException
-     */
-    private void updateOwnerCarEndTime(PayFeePo payFeePo, JSONObject paramObj) throws ParseException {
-        FeeDto feeInfo = (FeeDto) paramObj.get("feeInfo");
-        int flag;//涓哄仠杞﹁垂鍗曠嫭澶勭悊
-        if (!FeeDto.PAYER_OBJ_TYPE_CAR.equals(feeInfo.getPayerObjType())) {
-            return;
-        }
-        Date feeEndTime = DateUtil.getDateFromString(payFeePo.getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
-        OwnerCarDto ownerCarDto = new OwnerCarDto();
-        ownerCarDto.setCommunityId(feeInfo.getCommunityId());
-        ownerCarDto.setCarId(feeInfo.getPayerObjId());
-        ownerCarDto.setCarTypeCd("1001"); //涓氫富杞﹁締
-        List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
-        Assert.listOnlyOne(ownerCarDtos, "鏌ヨ涓氫富閿欒锛�");
-        //鑾峰彇杞︿綅id
-        String psId = ownerCarDtos.get(0).getPsId();
-        //鑾峰彇杞﹁締鐘舵��(1001 姝e父鐘舵�侊紝2002 娆犺垂鐘舵��  3003 杞︿綅閲婃斁)
-        String carState = ownerCarDtos.get(0).getState();
-        if (!StringUtil.isEmpty(psId) && !StringUtil.isEmpty(carState) && carState.equals("3003")) {
-            ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
-            parkingSpaceDto.setPsId(psId);
-            List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
-            Assert.listOnlyOne(parkingSpaceDtos, "鏌ヨ杞︿綅淇℃伅閿欒锛�");
-            //鑾峰彇杞︿綅鐘舵��(鍑哄敭 S锛屽嚭绉� H 锛岀┖闂� F)
-            String state = parkingSpaceDtos.get(0).getState();
-            if (!StringUtil.isEmpty(state) && !state.equals("F")) {
-                throw new IllegalArgumentException("杞︿綅宸茶浣跨敤锛屼笉鑳藉啀缂磋垂锛�");
-            }
-        }
-
-        Calendar endTimeCalendar = null;
-        //杞︿綅璐圭敤缁
-        for (OwnerCarDto tmpOwnerCarDto : ownerCarDtos) {
-            //鍚庝粯璐� 鎴栬�呬俊鐢ㄦ湡杞﹁締 鍔犱竴涓湀
-            if (FeeConfigDto.PAYMENT_CD_AFTER.equals(feeInfo.getPaymentCd())
-                    || OwnerCarDto.CAR_TYPE_CREDIT.equals(tmpOwnerCarDto.getCarType())) {
-                endTimeCalendar = Calendar.getInstance();
-                endTimeCalendar.setTime(feeEndTime);
-                endTimeCalendar.add(Calendar.MONTH, 1);
-                feeEndTime = endTimeCalendar.getTime();
-            }
-            if (tmpOwnerCarDto.getEndTime().getTime() >= feeEndTime.getTime()) {
-                continue;
-            }
-            OwnerCarPo ownerCarPo = new OwnerCarPo();
-            ownerCarPo.setMemberId(tmpOwnerCarDto.getMemberId());
-            ownerCarPo.setEndTime(DateUtil.getFormatTimeString(feeEndTime, DateUtil.DATE_FORMATE_STRING_A));
-            flag = ownerCarNewV1InnerServiceSMOImpl.updateOwnerCarNew(ownerCarPo);
-            if (flag < 1) {
-                throw new CmdException("缂磋垂澶辫触");
-            }
-        }
-    }
-
-    public JSONObject addFeeDetail(JSONObject paramInJson) {
-        JSONObject businessFeeDetail = new JSONObject();
-        businessFeeDetail.putAll(paramInJson);
-        businessFeeDetail.put("detailId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
-        //鏀粯鏂瑰紡
-        businessFeeDetail.put("primeRate", paramInJson.getString("primeRate"));
-        //璁$畻 搴旀敹閲戦
-        FeeDto feeDto = new FeeDto();
-        feeDto.setFeeId(paramInJson.getString("feeId"));
-        feeDto.setCommunityId(paramInJson.getString("communityId"));
-        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
-        if (feeDtos == null || feeDtos.size() != 1) {
-            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "鏌ヨ璐圭敤淇℃伅澶辫触锛屾湭鏌ュ埌鏁版嵁鎴栨煡鍒板鏉℃暟鎹�");
-        }
-        businessFeeDetail.put("state", FeeDetailDto.STATE_NORMAL);
-
-        feeDto = feeDtos.get(0);
-        businessFeeDetail.put("startTime", DateUtil.getFormatTimeString(feeDto.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
-        int hours = 0;
+    private void computeEndTimeCycleAmount(PayFeeDataDto payFeeDataDto, PayFeeDetailPo payFeeDetailPo) {
         Date targetEndTime = null;
         BigDecimal cycles = null;
-        Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto);
+        String receivableAmount = "";
+        Map feePriceAll = computeFeeSMOImpl.getFeePrice(payFeeDataDto.getFeeDto());
         BigDecimal feePrice = new BigDecimal(feePriceAll.get("feePrice").toString());
+        if ("-101".equals(payFeeDataDto.getTempCycle())) { //todo  鑷畾涔夐噾棰濅氦璐�
+            Date endTime = payFeeDataDto.getFeeDto().getEndTime();
+            Calendar endCalender = Calendar.getInstance();
+            endCalender.setTime(endTime);
+            BigDecimal receivedAmount = new BigDecimal(Double.parseDouble(payFeeDataDto.getReceivedAmount()));
+            //todo 鑰冭檻璐︽埛閲戦
+            if (payFeeDataDto.getAccountAmount() > 0) {
+                receivedAmount = receivedAmount.add(new BigDecimal(payFeeDataDto.getAccountAmount()));
+            }
+            cycles = receivedAmount.divide(feePrice, 4, BigDecimal.ROUND_HALF_EVEN);
+            endCalender = getTargetEndTime(endCalender, cycles.doubleValue());
+            targetEndTime = endCalender.getTime();
+            receivableAmount = payFeeDataDto.getReceivedAmount();
+            //澶勭悊 鍙兘杩樺瓨鍦� 瀹炴敹鎵嬪伐鍑忓厤鐨勬儏鍐�
+        } else if ("-103".equals(payFeeDataDto.getTempCycle())) { //todo 杩欓噷鎸夌即璐圭粨鏉熸椂闂寸即璐�
+            String custEndTime = payFeeDataDto.getCustEndTime();
+            Date endDates = DateUtil.getDateFromStringB(custEndTime);
+            Calendar c = Calendar.getInstance();
+            c.setTime(endDates);
+            c.add(Calendar.DAY_OF_MONTH, 1);
+            endDates = c.getTime();//杩欐槸鏄庡ぉ
+            targetEndTime = endDates;
+            BigDecimal receivedAmount1 = new BigDecimal(Double.parseDouble(payFeeDataDto.getReceivedAmount()));
+            cycles = receivedAmount1.divide(feePrice, 4, BigDecimal.ROUND_HALF_EVEN);
+            receivableAmount = payFeeDataDto.getReceivedAmount();
 
-        targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(feeDto, paramInJson.getString("cycles"));
-        cycles = new BigDecimal(Double.parseDouble(paramInJson.getString("cycles")));
-        double tmpReceivableAmount = cycles.multiply(feePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
-        businessFeeDetail.put("receivableAmount", tmpReceivableAmount);
-        businessFeeDetail.put("payableAmount", tmpReceivableAmount);
+        } else { //鑷畾涔夊懆鏈�
+            targetEndTime = computeFeeSMOImpl.getFeeEndTimeByCycles(payFeeDataDto.getFeeDto(), payFeeDataDto.getCycles());//鏍规嵁缂磋垂鍛ㄦ湡璁$畻 缁撴潫鏃堕棿
+            cycles = new BigDecimal(Double.parseDouble(payFeeDataDto.getCycles()));
+            double tmpReceivableAmount = cycles.multiply(feePrice).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+            receivableAmount = tmpReceivableAmount + "";
+            //鍑虹閫掑闂澶勭悊
+            if (FeeConfigDto.COMPUTING_FORMULA_RANT_RATE.equals(payFeeDataDto.getFeeDto().getComputingFormula())) {
+                computeFeeSMOImpl.dealRentRateCycle(payFeeDataDto.getFeeDto(), cycles.doubleValue());
+                if (payFeeDataDto.getFeeDto().getOweFee() > 0) {
+                    receivableAmount = payFeeDataDto.getFeeDto().getAmountOwed();
 
-        businessFeeDetail.put("endTime", DateUtil.getFormatTimeString(targetEndTime, DateUtil.DATE_FORMATE_STRING_A));
-        paramInJson.put("feeInfo", feeDto);
-        paramInJson.put("detailId", businessFeeDetail.getString("detailId"));
+                }
+            }
+        }
 
-        return businessFeeDetail;
+        payFeeDetailPo.setCycles(cycles.doubleValue() + "");
+        payFeeDetailPo.setEndTime(DateUtil.getFormatTimeStringA(targetEndTime));
+        payFeeDetailPo.setReceivableAmount(receivableAmount);
+        payFeeDetailPo.setPayableAmount(receivableAmount);
+
     }
 
-    /**
-     * 淇敼璐圭敤淇℃伅
-     *
-     * @param paramInJson 鎺ュ彛璋冪敤鏀句紶鍏ュ叆鍙�
-     * @return 璁㈠崟鏈嶅姟鑳藉鎺ュ彈鐨勬姤鏂�
-     */
-    public JSONObject modifyFee(JSONObject paramInJson) {
-        FeeDto feeInfo = (FeeDto) paramInJson.get("feeInfo");
-        Date endTime = feeInfo.getEndTime();
-        Calendar endCalender = Calendar.getInstance();
-        endCalender.setTime(endTime);
-        endCalender.add(Calendar.MONTH, Integer.parseInt(paramInJson.getString("cycles")));
-        if (FeeDto.FEE_FLAG_ONCE.equals(feeInfo.getFeeFlag())) {
-            if (feeInfo.getDeadlineTime() != null) {
-                endCalender.setTime(feeInfo.getDeadlineTime());
-            } else if (!StringUtil.isEmpty(feeInfo.getCurDegrees())) {
-                endCalender.setTime(feeInfo.getCurReadingTime());
-            } else if (feeInfo.getImportFeeEndTime() == null) {
-                endCalender.setTime(feeInfo.getConfigEndTime());
-            } else {
-                endCalender.setTime(feeInfo.getImportFeeEndTime());
-            }
-            //businessFee.put("state",FeeDto.STATE_FINISH);
-            feeInfo.setState(FeeDto.STATE_FINISH);
-        }
-        feeInfo.setEndTime(endCalender.getTime());
-        Date maxEndTime = feeInfo.getDeadlineTime();
-        if (FeeDto.FEE_FLAG_CYCLE.equals(feeInfo.getFeeFlag())) {
-            maxEndTime = feeInfo.getConfigEndTime();
-        }
-        //鍒ゆ柇 缁撴潫鏃堕棿 鏄惁澶т簬 璐圭敤椤� 缁撴潫鏃堕棿锛岃繖閲� 瀹归敊涓�涓嬶紝濡傛灉 璐圭敤缁撴潫鏃堕棿澶т簬 璐圭敤椤圭粨鏉熸椂闂� 30澶� 璧版姤閿� 灞炰簬澶氱即璐�
-        if (maxEndTime != null) {
-            if (feeInfo.getEndTime().getTime() - maxEndTime.getTime() > 30 * 24 * 60 * 60 * 1000L) {
-                throw new IllegalArgumentException("缂磋垂瓒呰繃浜� 璐圭敤椤圭粨鏉熸椂闂�");
-            }
-        }
-        Map feeMap = BeanConvertUtil.beanCovertMap(feeInfo);
-        feeMap.put("startTime", DateUtil.getFormatTimeString(feeInfo.getStartTime(), DateUtil.DATE_FORMATE_STRING_A));
-        feeMap.put("endTime", DateUtil.getFormatTimeString(feeInfo.getEndTime(), DateUtil.DATE_FORMATE_STRING_A));
-        feeMap.put("cycles", paramInJson.getString("cycles"));
-        feeMap.put("configEndTime", feeInfo.getConfigEndTime());
-        JSONObject businessFee = new JSONObject();
-        businessFee.putAll(feeMap);
-        //涓哄仠杞﹁垂鍗曠嫭澶勭悊
-        paramInJson.put("carFeeEndTime", feeInfo.getEndTime());
-        paramInJson.put("carPayerObjType", feeInfo.getPayerObjType());
-        paramInJson.put("carPayerObjId", feeInfo.getPayerObjId());
-
-
-        // 鍛ㄦ湡鎬ф敹璐广�佺即璐瑰悗锛屽埌鏈熸棩鏈熷湪璐圭敤椤圭粓姝㈡棩鏈熷悗锛屽垯璁剧疆缂磋垂鐘舵�佺粨鏉燂紝璁剧疆缁撴潫鏃ユ湡涓鸿垂鐢ㄩ」缁堟鏃ユ湡
-        if (!FeeFlagTypeConstant.ONETIME.equals(feeInfo.getFeeFlag())) {
-            //杩欓噷 瀹归敊浜斿ぉ鏃堕棿
-            Calendar calendar = Calendar.getInstance();
-            calendar.setTime(maxEndTime);
-            calendar.add(Calendar.DAY_OF_MONTH, -5);
-            maxEndTime = calendar.getTime();
-            if (feeInfo.getEndTime().after(maxEndTime)) {
-                businessFee.put("state", FeeConfigConstant.END);
-                businessFee.put("endTime", maxEndTime);
-            }
-        }
-
-        return businessFee;
-    }
 
     private static Calendar getTargetEndTime(Calendar endCalender, Double cycles) {
         if (StringUtil.isInteger(cycles.toString())) {
@@ -508,4 +342,58 @@
         endCalender.add(Calendar.HOUR, hours);
         return endCalender;
     }
+
+
+    private void ifHasAccount(JSONObject reqJson, List<PayFeeDataDto> feeDataDtos) {
+        if (!reqJson.containsKey("accountAmount")) {
+            return;
+        }
+        double accountAmount = reqJson.getDouble("accountAmount");
+        if (accountAmount <= 0) {
+            return;
+        }
+
+        Assert.hasKeyAndValue(reqJson, "acctId", "鏈寘鍚处鎴稩D");
+        String acctId = reqJson.getString("acctId");
+        //todo 鏍¢獙璐︽埛閲戦鏄惁鍏呰冻
+        AccountDto accountDto = new AccountDto();
+        accountDto.setAcctId(acctId);
+        List<AccountDto> accountDtos = accountInnerServiceSMOImpl.queryAccounts(accountDto);
+
+        Assert.listOnlyOne(accountDtos, "璐︽埛涓嶅瓨鍦�");
+
+        if (Double.parseDouble(accountDtos.get(0).getAmount()) < accountAmount) {
+            throw new CmdException("璐︽埛浣欓涓嶈冻");
+        }
+
+        BigDecimal accountAmountDec = null;
+        double receivedAmount = 0.0;
+        BigDecimal receivedAmountDec = null;
+        for (PayFeeDataDto payFeeDataDto : feeDataDtos) {
+            if (accountAmount == 0) {
+                continue;
+            }
+            accountAmountDec = new BigDecimal(accountAmount);
+            receivedAmount = Double.parseDouble(payFeeDataDto.getReceivedAmount());
+            receivedAmountDec = new BigDecimal(receivedAmount);
+            if (receivedAmount >= accountAmount) {
+                receivedAmountDec = receivedAmountDec.subtract(accountAmountDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+                payFeeDataDto.setReceivedAmount(receivedAmountDec.doubleValue() + "");
+                payFeeDataDto.setAccountAmount(accountAmount);
+                payFeeDataDto.setAcctId(acctId);
+                accountAmount = 0.00;
+                continue;
+            }
+
+            payFeeDataDto.setReceivedAmount("0");
+            payFeeDataDto.setAccountAmount(accountAmount);
+            payFeeDataDto.setAcctId(acctId);
+
+            accountAmountDec = accountAmountDec.subtract(receivedAmountDec).setScale(2, BigDecimal.ROUND_HALF_UP);
+            accountAmount = accountAmountDec.doubleValue();
+        }
+
+
+    }
 }
+

--
Gitblit v1.8.0