From 46582766037074e59d1520d03edf9da7294f62df Mon Sep 17 00:00:00 2001
From: chengf <cgf12138@163.com>
Date: 星期三, 22 十月 2025 18:27:02 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java |  889 +++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 778 insertions(+), 111 deletions(-)

diff --git a/service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java b/service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java
index 4ec0832..00ec98e 100644
--- a/service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java
+++ b/service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java
@@ -1,39 +1,62 @@
 package com.java110.job.importData.adapt;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.smo.IComputeFeeSMO;
+import com.java110.core.smo.impl.ComputeFeeSMOImpl;
 import com.java110.dto.PropertyWhiteListFlowDto;
-import com.java110.dto.fee.FeeAttrDto;
-import com.java110.dto.fee.FeeConfigDto;
-import com.java110.dto.fee.FeeDto;
+import com.java110.dto.community.CommunityDto;
+import com.java110.dto.contract.ContractDto;
+import com.java110.dto.contract.ContractPartyaDto;
+import com.java110.dto.fee.*;
 import com.java110.dto.importData.ImportRoomFee;
 import com.java110.dto.log.AssetImportLogDetailDto;
+import com.java110.dto.owner.OwnerCarDto;
 import com.java110.dto.owner.OwnerRoomRelDto;
+import com.java110.dto.payFee.PayFeeDetailDiscountDto;
 import com.java110.dto.room.RoomDto;
 import com.java110.dto.system.ComponentValidateResult;
+import com.java110.fee.api.FeeDiscountApi;
+import com.java110.fee.cmd.fee.PayFeeCmd;
+import com.java110.fee.cmd.fee.PayFeePreCmd;
 import com.java110.intf.IImportPropertyWhiteListfFlowServiceSMO;
+import com.java110.intf.common.ICarInoutInnerServiceSMO;
+import com.java110.intf.community.ICommunityInnerServiceSMO;
 import com.java110.intf.community.IRoomInnerServiceSMO;
 import com.java110.intf.fee.*;
+import com.java110.intf.store.IContractInnerServiceSMO;
+import com.java110.intf.store.IContractPartyaInnerServiceSMO;
 import com.java110.intf.user.IOwnerCarInnerServiceSMO;
 import com.java110.intf.user.IOwnerRoomRelV1InnerServiceSMO;
+import com.java110.job.cmd.importCarInout.CarInout;
 import com.java110.job.importData.DefaultImportData;
 import com.java110.job.importData.IImportDataAdapt;
+import com.java110.po.car.CarInoutPo;
 import com.java110.po.fee.FeeAttrPo;
 import com.java110.po.fee.PayFeeDetailPo;
 import com.java110.po.fee.PayFeePo;
+import com.java110.po.payFee.PayFeeDetailDiscountPo;
+import com.java110.utils.constant.ResponseConstant;
 import com.java110.utils.constant.StatusConstant;
-import com.java110.utils.util.BeanConvertUtil;
-import com.java110.utils.util.DateUtil;
-import com.java110.utils.util.ListUtil;
-import com.java110.utils.util.StringUtil;
+import com.java110.utils.exception.DAOException;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.*;
+import com.java110.vo.ResultVo;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.text.ParseException;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * 鎴垮眿缂磋垂淇℃伅瀵煎叆 閫傞厤鍣�
@@ -43,6 +66,11 @@
 @Service("importHistoryFeeDetailQueueData")
 public class ImportHistoryFeeDetailQueueDataAdapt extends DefaultImportData implements IImportDataAdapt {
 
+    @Autowired
+    private FeeDiscountApi feeDiscountApi;
+
+    @Autowired
+    private IComputeFeeSMO computeFeeSMOImpl;
 
     @Autowired
     private IImportFeeDetailInnerServiceSMO importFeeDetailInnerServiceSMOImpl;
@@ -63,6 +91,9 @@
     private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
 
     @Autowired
+    private PayFeeCmd payFeeCmd;
+
+    @Autowired
     private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
 
     @Autowired
@@ -71,74 +102,460 @@
     @Autowired
     private IRoomInnerServiceSMO iRoomInnerServiceSMOImpl;
 
+    @Autowired
+    private ICarInoutInnerServiceSMO carInoutInnerServiceSMOImpl;
+
+    @Autowired
+    private ImportCarHistoryFeeDetailQueueDataAdapt importCarHistoryFeeDetailQueueDataAdapt;
+
+    @Autowired
+    private IContractPartyaInnerServiceSMO contractPartyaInnerServiceSMOImpl;
+
+    @Autowired
+    private IContractInnerServiceSMO contractInnerServiceSMOImpl;
+
+    @Autowired
+    private IPayFeeDetailDiscountNewV1InnerServiceSMO payFeeDetailDiscountNewV1InnerServiceSMOImpl;
+
+    @Autowired
+    private ImportRoomFeeQueueDataAdapt importRoomFeeQueueDataAdapt;
+
+    @Autowired
+    private ICommunityInnerServiceSMO communityInnerServiceSMO;
+
+    @Autowired
+    private ComputeFeeSMOImpl calculateFeeSMOImpl;
+
     @Override
     public void importData(List<AssetImportLogDetailDto> assetImportLogDetailDtos) {
-        importDatas(assetImportLogDetailDtos);
-    }
-
-    private void importDatas(List<AssetImportLogDetailDto> infos) {
-
-        List<ImportRoomFee> importRoomFees = new ArrayList<>();
-        for (AssetImportLogDetailDto assetImportLogDetailDto : infos) {
-            JSONObject data = JSONObject.parseObject(assetImportLogDetailDto.getContent());
-            ImportRoomFee importRoomFee = BeanConvertUtil.covertBean(data, ImportRoomFee.class);
-            RoomDto roomDto = new RoomDto();
-            roomDto.setDoorRoomNum(importRoomFee.getDoorRoomNum());
-            List<RoomDto> roomDtos = iRoomInnerServiceSMOImpl.queryRooms(roomDto);
-            try {
-                importRoomFee.setRoomId(roomDtos.get(0).getRoomId());
-            }catch (Exception e){
-                e.printStackTrace();
+        String communityId = assetImportLogDetailDtos.get(0).getCommunityId();
+        CommunityDto communityDto = new CommunityDto();
+        communityDto.setCommunityId(communityId);
+        List<CommunityDto> communityDtos = communityInnerServiceSMO.queryCommunitys(communityDto);
+        Set<String> invoiceObjects = new HashSet<>();
+        for (AssetImportLogDetailDto obj : assetImportLogDetailDtos) {
+            String context = obj.getContent();
+            if (context != null && context.contains("frequency")) {
+                invoiceObjects.add(JSONObject.parseObject(context).getString("frequency"));
             }
-            importRoomFee.setFeeName(data.getString("secondaryFeeTypeCd"));
-            importRoomFee.setDetailId(assetImportLogDetailDto.getDetailId());
-            importRoomFee.setStartTime(data.getString("chargeStart"));
-            importRoomFee.setEndTime(data.getString("chargeEnd"));
-            importRoomFee.setCreateTime(data.getString("inputTime"));
-            importRoomFee.setReceivableAmount(data.getString("bankDepositAmount"));
-            importRoomFee.setAmount(data.getString("chargeAmount"));
-            importRoomFee.setStaffName(data.getString("charger"));
-            importRoomFee.setOpenInv(data.containsKey("invoiceReceiptNo") && data.getString("invoiceReceiptNo") != null ? "Y" : "N");
-//            if(importRoomFee.getPayerObjName())
-            importRoomFees.add(importRoomFee);
+        }
+        for (AssetImportLogDetailDto assetImportLogDetailDto : assetImportLogDetailDtos) {
+            if (!assetImportLogDetailDto.getMessage().equals("寰呭鍏�")){
+                continue;
+            }
+            JSONObject jsonObject = JSONObject.parseObject(assetImportLogDetailDto.getContent());
+            if (jsonObject.containsKey("frequency")){
+                if (jsonObject.getString("frequency").contains("閫�璐�-") && !jsonObject.getString("frequency").contains("琚��璐�-")){
+                    String invoce =  jsonObject.getString("frequency").split("-")[1];
+                    for (AssetImportLogDetailDto ass : assetImportLogDetailDtos){
+                        if (JSONObject.parseObject(ass.getContent()).getString("invoiceReceiptNo").equals(invoce)){
+                            try {
+                                assetImportLogDetailDto.setTakeTime(communityDtos.get(0).getTakeTime());
+                                assetImportLogDetailDto.setOutTime(communityDtos.get(0).getOutTime());
+                                assetImportLogDetailDto.setState("1300");
+                                importDatas(assetImportLogDetailDto);
+                                updateImportLogDetailState(assetImportLogDetailDto.getDetailId());
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                updateImportLogDetailState(assetImportLogDetailDto.getDetailId(), e);
+                            }
+                            try {
+                                ass.setTakeTime(communityDtos.get(0).getTakeTime());
+                                ass.setOutTime(communityDtos.get(0).getOutTime());
+                                ass.setState("1100");
+                                importDatas(ass);
+                                updateImportLogDetailState(ass.getDetailId());
+                            } catch (Exception e) {
+                                e.printStackTrace();
+                                updateImportLogDetailState(ass.getDetailId(), e);
+                            }
+                            break;
+                        }
+                    }
+                    continue;
+                }
+            }
+            try {
+                assetImportLogDetailDto.setTakeTime(communityDtos.get(0).getTakeTime());
+                assetImportLogDetailDto.setOutTime(communityDtos.get(0).getOutTime());
+                String invoce = "閫�璐�-"+JSONObject.parseObject(assetImportLogDetailDto.getContent()).getString("invoiceReceiptNo");
+                if (invoiceObjects.contains(invoce)){
+                    continue;
+                }
+                importDatas(assetImportLogDetailDto);
+                updateImportLogDetailState(assetImportLogDetailDto.getDetailId());
+            } catch (Exception e) {
+                e.printStackTrace();
+                updateImportLogDetailState(assetImportLogDetailDto.getDetailId(), e);
+            }
         }
 
-        if (ListUtil.isNull(importRoomFees)) {
+    }
+
+    private void importDatas(AssetImportLogDetailDto assetImportLogDetailDto) {
+
+        List<ImportRoomFee> importRoomFees = new ArrayList<>();
+        List<ImportRoomFee> importCarFees = new ArrayList<>();
+        List<CarInoutPo> carInoutPos = new ArrayList<>();
+        String communityId = assetImportLogDetailDto.getCommunityId();
+        JSONObject data = JSONObject.parseObject(assetImportLogDetailDto.getContent());
+        ImportRoomFee importRoomFee = BeanConvertUtil.covertBean(data, ImportRoomFee.class);
+        if (assetImportLogDetailDto.getState().equals("1100") || assetImportLogDetailDto.getState().equals("1300")) {
+            importRoomFee.setState(assetImportLogDetailDto.getState());
+        }
+        if (importRoomFee.getFrequency()==null) {
+            importRoomFee.setFrequency("姝e父璐圭敤");
+        }
+//        if (DateUtil.getDateFromStringB(data.getString("chargeStart").split(" ")[0]).getTime() <= DateUtil.getDateFromStringB(assetImportLogDetailDto.getTakeTime().split(" ")[0]).getTime()){
+//            throw new IllegalStateException("璇ヨ垂鐢ㄤ负璧峰鏃堕棿灏忎簬灏忓尯鎺ョ鏃堕棿涓嶈繘琛屽鍏�");
+//        }
+        if (importRoomFee.getEndTime() != null){
+            String[] split = importRoomFee.getEndTime().split(" ");
+            importRoomFee.setEndTime(split[0] + " 23:59:59");
+        }
+//            List<String> roomTypes = Arrays.asList("浣忓畢鐗╀笟璐�","鍟嗛摵鐗╀笟璐�","缁翠慨鏀跺叆","缁翠慨鍩洪噾鏀跺叆","鐢佃垂鍙婄鐞嗚垂","浠f敹姘磋垂","鍚勭被鎶奸噾","绉熼噾鏀跺叆");
+        List<String> carTypes = Arrays.asList("涓存椂鍋滆溅璐�", "涓氫富浜ф潈杩囬亾鍋滆溅璐�", "灏忎笟涓讳骇鏉冭溅杈嗙鐞嗚垂","鍦颁笅鍋滆溅璐�","鍦伴潰鍋滆溅璐�");
+        List<String> contractTypes = Arrays.asList("鍨冨溇娓呰繍璐�","鍏朵粬鏀跺叆","琛ヨ创璐圭敤","鍦哄湴浣跨敤璐�","鐢垫骞垮憡锛堜笟濮斾細锛�","蹇�掓煖","鐢垫骞垮憡锛堣仈璁級","鎴夸骇涓粙","闈炴満鍔ㄨ溅绠$悊璐�","鍏朵粬骞垮憡");
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setCommunityId(importRoomFee.getCommunityId());
+        feeConfigDto.setFeeNameEq(data.getString("secondaryFeeTypeCd"));
+//        feeConfigDto.setFeeTypeCds(new String[]{"630000007","630000017"});
+        importRoomFee.setInvoiceNo(data.getString("invoiceReceiptNo"));
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+        if(feeConfigDtos.size() > 0){
+            for(FeeConfigDto feeConfigDto1 : feeConfigDtos){
+                if(feeConfigDto1.getIsContractFee() != null && feeConfigDto1.getIsContractFee().equals("true")){
+                    importRoomFee.setObjType("7777");
+                }
+            }
+        }
+//        if (importRoomFee.getDoorRoomNum() != null && importRoomFee.getDoorRoomNum().split("-").length < 2) {
+//            importRoomFee.setObjType("7777");
+//        }
+        if(importRoomFee.getSecondaryFeeTypeCd()!= null && importRoomFee.getSecondaryFeeTypeCd().equals("涓存椂鍋滆溅璐�-鍏朵粬") &&(importRoomFee.getObjType() == null || !(importRoomFee.getObjType().equals("7777")))){
+                CarInoutPo carInout = new CarInoutPo();
+                carInout.setCommunityId(communityId);
+                carInout.setCarNum("A888888");
+                carInout.setVehicleType("temp");
+                carInout.setDirection("entry");
+                carInout.setState("100300");
+                carInout.setInTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("chargeStart"));
+                carInout.setStatusCd("0");
+
+                carInout.setCreateTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("chargeTime"));
+                carInout.setbId(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("batchId"));
+
+                carInout.setInoutId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_inoutId));
+                carInout.setDetailId(assetImportLogDetailDto.getDetailId());
+                carInoutPos.add(carInout);
+
+// 濡傛灉鏈夌粨鏉熸椂闂达紝鍒涘缓鏂扮殑瀵硅薄浣滀负鍑哄彛璁板綍
+                if(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).containsKey("chargeEnd")){
+                    // 鍒涘缓鏂扮殑瀵硅薄锛岃�屼笉鏄慨鏀瑰凡娣诲姞鐨勫璞�
+                    CarInoutPo exitCarInout = new CarInoutPo();
+                    // 澶嶅埗鍩烘湰灞炴��
+                    exitCarInout.setbId(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("batchId"));
+                    exitCarInout.setCommunityId(carInout.getCommunityId());
+                    exitCarInout.setCarNum(carInout.getCarNum());
+                    exitCarInout.setVehicleType(carInout.getVehicleType());
+                    exitCarInout.setInTime(carInout.getInTime());
+                    exitCarInout.setStatusCd(carInout.getStatusCd());
+                    exitCarInout.setCreateTime(carInout.getCreateTime());
+
+                    // 璁剧疆鍑哄彛鐩稿叧灞炴��
+                    exitCarInout.setOutTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("chargeEnd"));
+                    exitCarInout.setDirection("exit");
+                    exitCarInout.setState("100400");
+                    exitCarInout.setInoutId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_inoutId));
+                    exitCarInout.setPaymentAmount(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("chargeAmount"));
+                    exitCarInout.setDetailId(assetImportLogDetailDto.getDetailId());
+                    carInoutPos.add(exitCarInout);
+                }
+
+            }
+            else if(contractTypes.contains(JSONObject.parseObject(assetImportLogDetailDto.getContent()).get("category22")) || (importRoomFee.getObjType() != null && importRoomFee.getObjType().equals("7777"))){
+                importRoomFee.setFeeName(data.getString("secondaryFeeTypeCd"));
+
+                importRoomFee.setCommunityId(communityId);
+                importRoomFee.setDetailId(assetImportLogDetailDto.getDetailId());
+                importRoomFee.setStartTime(data.getString("chargeStart"));
+                importRoomFee.setEndTime(data.getString("chargeEnd").split(" ")[0]+" 23:59:59");
+                importRoomFee.setCreateTime(data.getString("chargeTime"));
+                importRoomFee.setReceivableAmount(data.getString("bankDepositAmount"));
+                importRoomFee.setAmount(data.getString("chargeAmount"));
+                importRoomFee.setStaffName(data.getString("charger"));
+                importRoomFee.setIsContractFee("O");
+                importRoomFee.setContractId(data.getString("licensePlate"));
+                importRoomFee.setInvoiceNo(data.containsKey("invoiceReceiptNo") && data.getString("invoiceReceiptNo") != null ? "Y" : "N");
+                importRoomFee.setObjType("7777");
+                importRoomFee.setCycle((DateUtil.dayCompare(
+                        DateUtil.getDateFromStringA(importRoomFee.getStartTime()),
+                        DateUtil.getDateFromStringA(importRoomFee.getEndTime())
+                )) + "");
+                if (new BigDecimal(importRoomFee.getAmount()).doubleValue() < 0){
+                    importRoomFee.setCycle("-"+importRoomFee.getCycle());
+                }
+//            if(importRoomFee.getPayerObjName())
+                importCarFees.add(importRoomFee);
+            }
+            else if(carTypes.contains(JSONObject.parseObject(assetImportLogDetailDto.getContent()).get("category22"))){
+                importRoomFee.setCommunityId(communityId);
+                importRoomFee.setFeeName(data.getString("secondaryFeeTypeCd"));
+                importRoomFee.setDetailId(assetImportLogDetailDto.getDetailId());
+                importRoomFee.setStartTime(data.getString("chargeStart"));
+                importRoomFee.setEndTime(data.getString("chargeEnd").split(" ")[0]+" 23:59:59");
+                importRoomFee.setCreateTime(data.getString("chargeTime"));
+                importRoomFee.setReceivableAmount(data.getString("bankDepositAmount"));
+                importRoomFee.setAmount(data.getString("chargeAmount"));
+                importRoomFee.setCarNum(data.getString("licensePlate"));
+                importRoomFee.setStaffName(data.getString("charger"));
+                importRoomFee.setOpenInv(data.containsKey("invoiceReceiptNo") && data.getString("invoiceReceiptNo") != null ? "Y" : "N");
+//            if(importRoomFee.getPayerObjName())
+                importRoomFee.setObjType("6666");
+                importRoomFee.setCycle((DateUtil.dayCompare(
+                        DateUtil.getDateFromStringA(importRoomFee.getStartTime()),
+                        DateUtil.getDateFromStringA(importRoomFee.getEndTime())
+                )) + "");
+                if (new BigDecimal(importRoomFee.getAmount()).doubleValue() < 0){
+                    importRoomFee.setCycle("-"+importRoomFee.getCycle());
+                }
+                importCarFees.add(importRoomFee);
+            }
+            else{
+                importRoomFee.setCommunityId(communityId);
+                importRoomFee.setFeeName(data.getString("secondaryFeeTypeCd"));
+                importRoomFee.setDetailId(assetImportLogDetailDto.getDetailId());
+                importRoomFee.setStartTime(data.getString("chargeStart"));
+                importRoomFee.setEndTime(data.getString("chargeEnd").split(" ")[0]+" 23:59:59");
+                importRoomFee.setCreateTime(data.getString("chargeTime"));
+                importRoomFee.setReceivableAmount(data.getString("bankDepositAmount"));
+                importRoomFee.setAmount(data.getString("chargeAmount"));
+                importRoomFee.setStaffName(data.getString("charger"));
+                importRoomFee.setOpenInv(data.containsKey("invoiceReceiptNo") && data.getString("invoiceReceiptNo") != null ? "Y" : "N");
+                importRoomFee.setCycle((DateUtil.dayCompare(
+                        DateUtil.getDateFromStringA(importRoomFee.getStartTime()),
+                        DateUtil.getDateFromStringA(importRoomFee.getEndTime())
+                )) + "");
+                if (new BigDecimal(importRoomFee.getAmount()).doubleValue() < 0){
+                    importRoomFee.setCycle("-"+importRoomFee.getCycle());
+                }
+//            if(importRoomFee.getPayerObjName())
+                importRoomFees.add(importRoomFee);
+            }
+        importFeeDetailsByCarInout(carInoutPos);
+
+        if (ListUtil.isNull(importRoomFees) && ListUtil.isNull(importCarFees)) {
             return;
         }
 
-        importFeeDetails(importRoomFees.get(0).getStoreId(), importRoomFees.get(0).getUserId(), importRoomFees, importRoomFees.get(0).getBatchId());
+        try{
+            if(!(ListUtil.isNull(importRoomFees))){
+                if (DateUtil.getDateFromStringB(data.getString("chargeStart").split(" ")[0]).getTime() < DateUtil.getDateFromStringB(assetImportLogDetailDto.getTakeTime().split(" ")[0]).getTime() && !assetImportLogDetailDto.getState().equals("1100") && !assetImportLogDetailDto.getState().equals("1300")){
+                    ImportRoomFee original = importRoomFees.get(0);
+                    ImportRoomFee importRoomFee1 = (ImportRoomFee) original.clone(); // 鍏嬮殕鏂板璞�
+                    ImportRoomFee importRoomFee2 = (ImportRoomFee) original.clone(); // 鍏嬮殕鍙︿竴涓柊瀵硅薄
+                    double cycle = (DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee1.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee1.getEndTime())
+                    )) ;
+                    double amount = Double.parseDouble(importRoomFee1.getAmount());
+                    importRoomFees = new ArrayList<>();
+                    importRoomFee1.setEndTime(DateUtil.getAddDayStringB(DateUtil.getDateFromStringB(assetImportLogDetailDto.getTakeTime().split(" ")[0]),-1) + " 23:59:59");
+                    importRoomFee1.setCycle((DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee1.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee1.getEndTime())
+                    )) + "");
+                    importRoomFee1.setAmount((amount/cycle) * Double.parseDouble(importRoomFee1.getCycle()) + "");
+                    importRoomFee2.setStartTime(assetImportLogDetailDto.getTakeTime().split(" ")[0] + " 00:00:00");
+                    importRoomFee2.setCycle((DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee2.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee2.getEndTime())
+                    )) + "");
+                    importRoomFee2.setAmount(Double.parseDouble(importRoomFee2.getAmount()) - Double.parseDouble(importRoomFee1.getAmount()) + "");
+                    importRoomFee1.setState("1600");
+                    importRoomFee2.setState("1400");
 
+                    importRoomFees.add(importRoomFee1);
+                    importRoomFees.add(importRoomFee2);
+                }
+                if (DateUtil.getDateFromStringB(data.getString("chargeEnd").split(" ")[0]).getTime() > DateUtil.getDateFromStringB(assetImportLogDetailDto.getOutTime().split(" ")[0]).getTime()
+                        && !assetImportLogDetailDto.getState().equals("1100") && !assetImportLogDetailDto.getState().equals("1300")){
+                    ImportRoomFee importRoomFeeLast = importRoomFees.get(importRoomFees.size()-1);
+                    double cycle = Double.parseDouble(importRoomFeeLast.getCycle());
+                    double amount = Double.parseDouble(importRoomFeeLast.getAmount());
 
+                    ImportRoomFee importRoomFeeEnd = (ImportRoomFee) importRoomFeeLast.clone();
 
+                    importRoomFeeLast.setEndTime(assetImportLogDetailDto.getOutTime() + " 23:59:59");
+                    double cycle1 = (DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFeeLast.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFeeLast.getEndTime())
+                    ));
+                    double amount1 = amount/cycle * cycle1;
 
+                    importRoomFeeEnd.setStartTime(DateUtil.getAddDayStringB(DateUtil.getDateFromStringB(assetImportLogDetailDto.getOutTime()),1) + " 00:00:00");
+                    importRoomFeeEnd.setCycle(DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFeeEnd.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFeeEnd.getEndTime())
+                    ) + "");
+                    importRoomFeeEnd.setAmount(amount - amount1 + "");
+                    importRoomFeeEnd.setState("1900");
+                    importRoomFees.add(importRoomFeeEnd);
+                }
+                importFeeDetails(importRoomFees.get(0).getStoreId(), importRoomFees.get(0).getUserId(), importRoomFees, importRoomFees.get(0).getBatchId());
+            }
+            if(!(ListUtil.isNull(importCarFees))){
+                importRoomFees = importCarFees;
+                if (DateUtil.getDateFromStringB(data.getString("chargeStart").split(" ")[0]).getTime() < DateUtil.getDateFromStringB(assetImportLogDetailDto.getTakeTime().split(" ")[0]).getTime() && !assetImportLogDetailDto.getState().equals("1100") && !assetImportLogDetailDto.getState().equals("1300")){
+                    ImportRoomFee original = importRoomFees.get(0);
+                    ImportRoomFee importRoomFee1 = (ImportRoomFee) original.clone(); // 鍏嬮殕鏂板璞�
+                    ImportRoomFee importRoomFee2 = (ImportRoomFee) original.clone(); // 鍏嬮殕鍙︿竴涓柊瀵硅薄
+                    double cycle = (DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee1.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee1.getEndTime())
+                    )) ;
+                    double amount = Double.parseDouble(importRoomFee1.getAmount());
+                    importRoomFees = new ArrayList<>();
+                    importRoomFee1.setEndTime(DateUtil.getAddDayStringB(DateUtil.getDateFromStringB(assetImportLogDetailDto.getTakeTime().split(" ")[0]),-1) + " 23:59:59");
+                    importRoomFee1.setCycle((DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee1.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee1.getEndTime())
+                    )) + "");
+                    importRoomFee1.setAmount((amount/cycle) * Double.parseDouble(importRoomFee1.getCycle()) + "");
+                    importRoomFee2.setStartTime(assetImportLogDetailDto.getTakeTime().split(" ")[0] + " 00:00:00");
+                    importRoomFee2.setCycle((DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFee2.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFee2.getEndTime())
+                    )) + "");
+                    importRoomFee2.setAmount(Double.parseDouble(importRoomFee2.getAmount()) - Double.parseDouble(importRoomFee1.getAmount()) + "");
+                    importRoomFee1.setState("1600");
+                    importRoomFee2.setState("1400");
+
+                    importRoomFees.add(importRoomFee1);
+                    importRoomFees.add(importRoomFee2);
+                }
+                if (DateUtil.getDateFromStringB(data.getString("chargeEnd").split(" ")[0]).getTime() > DateUtil.getDateFromStringB(assetImportLogDetailDto.getOutTime().split(" ")[0]).getTime()
+                        && !assetImportLogDetailDto.getState().equals("1100") && !assetImportLogDetailDto.getState().equals("1300")){
+                    ImportRoomFee importRoomFeeLast = importRoomFees.get(importRoomFees.size()-1);
+                    double cycle = Double.parseDouble(importRoomFeeLast.getCycle());
+                    double amount = Double.parseDouble(importRoomFeeLast.getAmount());
+
+                    ImportRoomFee importRoomFeeEnd = (ImportRoomFee) importRoomFeeLast.clone();
+
+                    importRoomFeeLast.setEndTime(assetImportLogDetailDto.getOutTime() + " 23:59:59");
+                    double cycle1 = (DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFeeLast.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFeeLast.getEndTime())
+                    ));
+                    double amount1 = amount/cycle * cycle1;
+
+                    importRoomFeeEnd.setStartTime(DateUtil.getAddDayStringB(DateUtil.getDateFromStringB(assetImportLogDetailDto.getOutTime()),1) + " 00:00:00");
+                    importRoomFeeEnd.setCycle(DateUtil.dayCompare(
+                            DateUtil.getDateFromStringA(importRoomFeeEnd.getStartTime()),
+                            DateUtil.getDateFromStringA(importRoomFeeEnd.getEndTime())
+                    ) + "");
+                    importRoomFeeEnd.setAmount(amount - amount1 + "");
+                    importRoomFeeEnd.setState("1900");
+                    importRoomFees.add(importRoomFeeEnd);
+                }
+                importCarFeeDetails2(importCarFees.get(0).getStoreId(), importCarFees.get(0).getUserId(), importRoomFees, importCarFees.get(0).getBatchId());
+            }
+        }catch (IllegalStateException e){
+            throw new IllegalArgumentException(e.getMessage());
+        }catch (IllegalArgumentException e){
+            throw new IllegalArgumentException(e.getMessage());
+        }
+        catch (Exception e){
+            throw new IllegalArgumentException("鏈煡閿欒:"+e);
+        }
     }
+
+    public void importCarFeeDetails2(String storeId, String userId, List<ImportRoomFee> importCarFees, String batchId) {
+
+        importCarFees = ownerCarInnerServiceSMOImpl.freshCarIds(importCarFees);
+        for (ImportRoomFee importCarFee : importCarFees) {
+            try {
+                if (StringUtil.isEmpty(importCarFee.getCarNum())) {
+                    if(importCarFee.getObjType() != null && (importCarFee.getObjType().equals("7777"))){
+                        importFeeDetail(importCarFee, storeId, userId, batchId);
+                        updateImportLogDetailState(importCarFee.getDetailId());
+                    }
+                }
+                else{
+                    OwnerCarDto ownerCarDto = new OwnerCarDto();
+                    ownerCarDto.setCommunityId(importCarFee.getCommunityId());
+                    ownerCarDto.setCarNum(importCarFee.getCarNum());
+                    List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+                    if (ownerCarDtos != null && ownerCarDtos.size() > 0) {
+                        importCarFee.setCarId(ownerCarDtos.get(0).getCarId());
+                    }else{
+                        throw new IllegalStateException("杞︾墝鍙蜂笉瀛樺湪鎴栧瓨鍦ㄥ杈嗛噸澶嶈溅鐗屽彿杞�");
+                    }
+                    importFeeDetail(importCarFee, storeId, userId, batchId);
+                    updateImportLogDetailState(importCarFee.getDetailId());
+                }
+            } catch (Exception e) {
+                updateImportLogDetailState(importCarFee.getDetailId(), e);
+                throw new IllegalArgumentException(e.getMessage());
+            }
+        }
+    }
+
+    private void importFeeDetailsByCarInout(List<CarInoutPo> carInoutPos) {
+
+        for (CarInoutPo carInoutPo : carInoutPos) {
+            try {
+                ArrayList<CarInoutPo> carInoutPos1 = new ArrayList<>();
+                carInoutPos1.add(carInoutPo);
+                carInoutInnerServiceSMOImpl.batchSaveCarInout2(carInoutPos1);
+                updateImportLogDetailState(carInoutPo.getDetailId());
+            }catch (Exception e){
+                updateImportLogDetailState(carInoutPo.getDetailId(),e);
+                throw new IllegalArgumentException(e.getMessage());
+            }
+        }
+    }
+
 
     private void importFeeDetails(String storeId, String userId, List<ImportRoomFee> importRoomFees, String batchId) {
 
         importRoomFees = roomInnerServiceSMOImpl.freshRoomIds(importRoomFees);
         String endTime = "";
         for (ImportRoomFee importRoomFee : importRoomFees) {
-
             endTime = importRoomFee.getEndTime();
             if (!endTime.contains(":")) {
                 endTime += " 23:59:59";
                 importRoomFee.setEndTime(endTime);
             }
-
-
             try {
                 if (StringUtil.isEmpty(importRoomFee.getRoomId())) {
-                    continue;
+                    throw new IllegalArgumentException("鎴垮眿鍙蜂笉瀛樺湪");
+                }
+                RoomDto roomDto = new RoomDto();
+//                roomDto.setDoorRoomNum(importRoomFee.getDoorRoomNum());
+                roomDto.setCommunityId(importRoomFee.getCommunityId());
+                if(importRoomFee.getDoorRoomNum()!=null){
+                    String[] split = importRoomFee.getDoorRoomNum().split("-");
+                    if(split.length < 2){
+                        throw new IllegalArgumentException("闂ㄥ鍙�"+importRoomFee.getDoorRoomNum()+"鏈伒寰獂-x-x");
+                    }else if(split.length > 2){
+                        roomDto.setFloorNum(split[0]);
+                        roomDto.setUnitNum(split[1]);
+                        roomDto.setRoomNum(split[2]);
+                    }
                 }
                 importFeeDetail(importRoomFee, storeId, userId, batchId);
+//                feeDiscountApi
                 updateImportLogDetailState(importRoomFee.getDetailId());
             } catch (Exception e) {
                 e.printStackTrace();
                 updateImportLogDetailState(importRoomFee.getDetailId(), e);
+                throw new IllegalArgumentException(e.getMessage());
             }
         }
     }
+
+
 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
@@ -149,76 +566,98 @@
      */
     private void importFeeDetail(ImportRoomFee importRoomFee, String storeId, String userId, String batchId) {
 
-        FeeConfigDto feeConfigDto = new FeeConfigDto();
-        feeConfigDto.setFeeNameEq(importRoomFee.getFeeName().trim());
-        feeConfigDto.setCommunityId(importRoomFee.getCommunityId());
-        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
-
-        if (ListUtil.isNull(feeConfigDtos)) {
-            return;
+        if (importRoomFee.getState() == null){
+            importRoomFee.setState("1400");
         }
 
-        FeeConfigDto tmpFeeConfigDto = feeConfigDtos.get(0);
-
-        FeeDto feeDto = new FeeDto();
-        feeDto.setConfigId(tmpFeeConfigDto.getConfigId());
-        feeDto.setCommunityId(importRoomFee.getCommunityId());
-        feeDto.setPayerObjId(importRoomFee.getRoomId());
-        feeDto.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
-        // 瑙f瀽鏃ユ湡瀛楃涓�
-        LocalDateTime startDate = LocalDateTime.parse(importRoomFee.getStartTime(), formatter);
-        LocalDateTime endDate = LocalDateTime.parse(importRoomFee.getEndTime(), formatter);
-        importRoomFee.setCycle(String.valueOf(ChronoUnit.MONTHS.between(startDate, endDate)));
-        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
-
-        List<PayFeePo> payFeePos = null;
-        if (ListUtil.isNull(feeDtos)) {
-            List<FeeAttrPo> feeAttrsPos = new ArrayList<>();
-            PayFeePo payFeePo = new PayFeePo();
-            payFeePo.setCommunityId(importRoomFee.getCommunityId());
-            payFeePo.setConfigId(feeDto.getConfigId());
-            payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
-            payFeePo.setStartTime(importRoomFee.getStartTime());
-            payFeePo.setEndTime(DateUtil.getNextSecTime(importRoomFee.getEndTime()));
-            payFeePo.setAmount(importRoomFee.getAmount());
-            payFeePo.setFeeFlag(tmpFeeConfigDto.getFeeFlag());
-            payFeePo.setFeeTypeCd(tmpFeeConfigDto.getFeeTypeCd());
-            payFeePo.setIncomeObjId(storeId);
-            payFeePo.setBatchId(batchId);
-            if (FeeDto.FEE_FLAG_ONCE.equals(tmpFeeConfigDto.getFeeFlag())) {
-                payFeePo.setState(FeeDto.STATE_FINISH);
-            } else {
-                payFeePo.setState(FeeDto.STATE_DOING);
-            }
-            payFeePo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
-            payFeePo.setPayerObjId(importRoomFee.getRoomId());
-            payFeePo.setUserId(userId);
-            payFeePo.setCreateTime(importRoomFee.getCreateTime());
-            payFeePos = new ArrayList<>();
-            payFeePos.add(payFeePo);
-            feeInnerServiceSMOImpl.saveFee(payFeePos);
-
-            //鏌ヨ涓氫富淇℃伅
-            OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto();
-            ownerRoomRelDto.setRoomId(importRoomFee.getRoomId());
-            List<OwnerRoomRelDto> ownerRoomRelDtos = ownerRoomRelV1InnerServiceSMOImpl.queryOwnerRoomRels(ownerRoomRelDto);
-            if (ownerRoomRelDtos != null && ownerRoomRelDtos.size() > 0) {
-                if (!FeeDto.FEE_FLAG_CYCLE.equals(tmpFeeConfigDto.getFeeFlag())) {
-                    feeAttrsPos.add(addFeeAttr(payFeePo, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
-                            importRoomFee.getEndTime()));
+        FeeDto feeDto2 = new FeeDto();
+        feeDto2.setUseFeeName(importRoomFee.getFeeName());
+        if (importRoomFee.getObjType() == null||importRoomFee.getObjType().equals("3333")){
+            RoomDto roomDto = new RoomDto();
+//        roomDto.setDoorRoomNum(importRoomFee.getDoorRoomNum());
+            roomDto.setCommunityId(importRoomFee.getCommunityId());
+            if(importRoomFee.getDoorRoomNum()!=null){
+                String[] split = importRoomFee.getDoorRoomNum().split("-");
+                if(split.length < 2){
+                    throw new IllegalArgumentException("闂ㄥ鍙�"+importRoomFee.getDoorRoomNum()+"鏈伒寰獂-x-x");
+                }else if(split.length > 2){
+                    roomDto.setFloorNum(split[0]);
+                    roomDto.setUnitNum(split[1]);
+                    roomDto.setRoomNum(split[2]);
                 }
-                feeAttrsPos.add(addFeeAttr(payFeePo, FeeAttrDto.SPEC_CD_OWNER_ID, ownerRoomRelDtos.get(0).getOwnerId()));
-                feeAttrsPos.add(addFeeAttr(payFeePo, FeeAttrDto.SPEC_CD_OWNER_LINK, ownerRoomRelDtos.get(0).getLink()));
-                feeAttrsPos.add(addFeeAttr(payFeePo, FeeAttrDto.SPEC_CD_OWNER_NAME, ownerRoomRelDtos.get(0).getOwnerName()));
-                feeAttrInnerServiceSMOImpl.saveFeeAttrs(feeAttrsPos);
             }
 
+            List<RoomDto> roomDtos = iRoomInnerServiceSMOImpl.queryRooms(roomDto);
+            try {
+                importRoomFee.setRoomId(roomDtos.get(0).getRoomId());
+            }catch (Exception e){
+                throw new IllegalArgumentException("闂ㄥ鍙�"+importRoomFee.getDoorRoomNum()+"鏈煡璇㈠埌鎴垮眿");
+            }
+            feeDto2.setPayerObjId(importRoomFee.getRoomId());
+            importRoomFee.setPayObjId(importRoomFee.getRoomId());
+        }else if (importRoomFee.getObjType().equals("6666")){
+            if (importRoomFee.getCarNum() == null){
+                throw new IllegalArgumentException("杞︾墝鍙蜂负绌�");
+            }
+            OwnerCarDto ownerCarDto = new OwnerCarDto();
+            ownerCarDto.setCommunityId(importRoomFee.getCommunityId());
+            ownerCarDto.setCarNum(importRoomFee.getCarNum());
+            List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
+            if (ownerCarDtos != null && ownerCarDtos.size() > 0) {
+                feeDto2.setPayerObjId(ownerCarDtos.get(0).getCarId());
+                importRoomFee.setCarId(ownerCarDtos.get(0).getCarId());
+                importRoomFee.setPayObjId(importRoomFee.getCarId());
+            }else{
+                throw new IllegalStateException("杞︾墝鍙蜂笉瀛樺湪鎴栧瓨鍦ㄥ杈嗛噸澶嶈溅鐗屽彿杞�");
+            }
+        }else {
+            ContractPartyaDto contractPartyaDto = new ContractPartyaDto();
+            contractPartyaDto.setCommunityId(importRoomFee.getCommunityId());
+            contractPartyaDto.setPartyA(importRoomFee.getDoorRoomNum());
+            List<ContractPartyaDto> contractPartyaDtos = contractPartyaInnerServiceSMOImpl.queryContractPartyas(contractPartyaDto);
+            if (contractPartyaDtos != null && contractPartyaDtos.size() > 0) {
+                ContractDto contractDto = new ContractDto();
+                contractDto.setCommunityId(importRoomFee.getCommunityId());
+                contractDto.setContractCode(importRoomFee.getContractId());
+                List<ContractDto> contractDtos = contractInnerServiceSMOImpl.queryContracts(contractDto);
+                if (contractDtos.size() == 1) {
+                    importRoomFee.setContractId(contractDtos.get(0).getContractId());
+                    feeDto2.setContractFee(contractDtos.get(0).getContractId());
+                }
+                feeDto2.setPayerObjId(contractPartyaDtos.get(0).getPartyaId());
+                importRoomFee.setRoomId(contractPartyaDtos.get(0).getPartyaId());
+                importRoomFee.setPayObjId(importRoomFee.getRoomId());
+            } else {
+                throw new IllegalArgumentException("瀵煎叆澶辫触,鏈煡璇㈠埌璇ヤ富浣�");
+            }
+        }
+        feeDto2.setCommunityId(importRoomFee.getCommunityId());
+        if (importRoomFee.getState().equals("1100") || importRoomFee.getState().equals("1300") || importRoomFee.getState().equals("1600") || importRoomFee.getState().equals("1900")) {
 
-            feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+        }
+        else {
+            feeDto2.setStatusCd("0");
+            feeDto2.setUseStart(DateUtil.getDateFromStringA(importRoomFee.getStartTime()));
+            feeDto2.setUseEnd(DateUtil.getDateFromStringA(importRoomFee.getEndTime()));
+        }
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto2);
+        if (!(importRoomFee.getFrequency().equals("閫�璐�"))) {
+            feeDtos.removeIf(feeDto -> "2009001".equals(feeDto.getState()));
+        }
+        if(feeDtos.size() == 0 && (importRoomFee.getState() == null || !importRoomFee.getState().equals("1600")|| importRoomFee.getState().equals("1900"))){
+            updateImportLogDetailState(importRoomFee.getDetailId(),new IllegalArgumentException("璐圭敤椤�"+importRoomFee.getFeeName()+"涓嶅瓨鍦�"));
+
+            throw new IllegalArgumentException("璐圭敤璁板綍"+importRoomFee.getFeeName()+"涓嶅瓨鍦�");
+        }else if(feeDtos.size() > 1){
+            throw new IllegalArgumentException("瀛樺湪澶氭潯璁板綍");
         }
 
         for (FeeDto tmpFeeDto : feeDtos) {
-            doImportFeeDetail(tmpFeeDto, importRoomFee);
+            if(DateUtil.getDateFromStringB(importRoomFee.getEndTime()).getTime() > tmpFeeDto.getMaxEndTime().getTime()){
+                throw new IllegalArgumentException("璇ヨ垂鐢ㄨ褰曠粨鏉熸椂闂村ぇ浜庤垂鐢ㄨ褰曟渶澶х即璐规椂闂�");
+            }else {
+                doImportFeeDetail(tmpFeeDto, importRoomFee);
+            }
         }
 
     }
@@ -239,45 +678,273 @@
 
 
         PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
+        if(importRoomFee.getInvoiceNo() != null){
+            payFeeDetailPo.setInvoiceNo(importRoomFee.getInvoiceNo());
+            payFeeDetailPo.setOpenInvoice("Y");
+        }else{
+            payFeeDetailPo.setOpenInvoice("N");
+        }
         payFeeDetailPo.setCommunityId(importRoomFee.getCommunityId());
         payFeeDetailPo.setReceivedAmount(importRoomFee.getAmount());
-        payFeeDetailPo.setReceivableAmount(importRoomFee.getAmount());
-        payFeeDetailPo.setCycles(importRoomFee.getCycle());
         payFeeDetailPo.setPrimeRate("1.0");
         payFeeDetailPo.setFeeId(tmpFeeDto.getFeeId());
         payFeeDetailPo.setStartTime(importRoomFee.getStartTime());
-        payFeeDetailPo.setEndTime(importRoomFee.getEndTime());
-        payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
         payFeeDetailPo.setRemark(importRoomFee.getRemark());
         payFeeDetailPo.setCreateTime(importRoomFee.getCreateTime());
         payFeeDetailPo.setState("1400");
         payFeeDetailPo.setCashierName(importRoomFee.getStaffName());
+        payFeeDetailPo.setPayOrderId(importRoomFee.getPayObjId());
+        payFeeDetailPo.setB("T");
+        double cycle = 0;
+        if (FeeDto.FEE_FLAG_ONCE.equals(tmpFeeDto.getFeeFlag())){
+            cycle = 1;
+        }
+        else{
+            cycle = (DateUtil.dayCompare(
+                    DateUtil.getDateFromStringA(payFeeDetailPo.getStartTime()),
+                    DateUtil.getDateFromStringA(importRoomFee.getEndTime())
+            ));
+        }
+
+        if (importRoomFee.getState() != null){
+            payFeeDetailPo.setState(importRoomFee.getState());
+        }
+        if (importRoomFee.getState().equals("1300")){
+            cycle = 0 - cycle;
+        }
+        int count = feeDetailInnerServiceSMOImpl.queryFeeDetailsCountByVo(payFeeDetailPo);
+
         payFeeDetailPo.setPayableAmount(importRoomFee.getAmount());
-        if(importRoomFee.getOpenInv() != null){
-            payFeeDetailPo.setOpenInvoice(importRoomFee.getOpenInv());
+
+
+        payFeeDetailPo.setCycles(importRoomFee.getCycle());
+        payFeeDetailPo.setCycles(cycle+"");
+        payFeeDetailPo.setEndTime(importRoomFee.getEndTime());
+        if (count > 0) {
+            throw new IllegalStateException("閲嶅鐨勭即璐硅褰�");
+        }
+
+//        if (importRoomFee.getFrequency().equals("閫�璐�")) {
+//            payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+//            double v = computeFeeByCycle(tmpFeeDto, importRoomFee);
+//            if (v > 0) {
+//                v = v - 2 * v;
+//            }
+//            payFeeDetailPo.setReceivableAmount(v+"");
+//            payFeeDetailPo.setDiscountAmount("0");
+//            payFeeDetailPo.setState("1300");
+//            int saved = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
+//
+//            PayFeePo payFeePo = new PayFeePo();
+//            payFeePo.setFeeId(payFeeDetailPo.getFeeId());
+//            payFeePo.setEndTime(importRoomFee.getStartTime());
+//            feeInnerServiceSMOImpl.updateFee(payFeePo);
+//            return;
+//        } else
+        if (importRoomFee.getState() != null && (importRoomFee.getState().equals("1600") || importRoomFee.getState().equals("1900"))){
+            payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+            payFeeDetailPo.setReceivableAmount(computeFeeByCycle(tmpFeeDto,importRoomFee)+"");
+            payFeeDetailPo.setDiscountAmount("0");
+            int saved = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
+            return;
+        }
+
+        PayFeeDetailDiscountPo payFeeDetailDiscount = new PayFeeDetailDiscountPo();
+        try {
+//            Map feePriceAll = computeFeeSMOImpl.getFeePrice(tmpFeeDto);
+            FeeDto feeDto = new FeeDto();
+            feeDto.setFeeId(tmpFeeDto.getFeeId());
+            feeDto.setCommunityId(tmpFeeDto.getCommunityId());
+//            List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+            payFeeDetailPo.setReceivableAmount(computeFeeByCycle(tmpFeeDto,importRoomFee)+"");
+            ResponseEntity<String> resultVo = feeDiscountApi.computeFeeDiscount(tmpFeeDto.getFeeId(), tmpFeeDto.getCommunityId(), 105, importRoomFee.getPayObjId(),
+                    tmpFeeDto.getPayerObjType(), importRoomFee.getEndTime(), importRoomFee.getEndTime(), importRoomFee.getStartTime(), 1, 20);
+
+// 2. 浠� ResultVo 涓幏鍙� data 骞跺己杞负鐩爣绫诲瀷
+            if (resultVo != null) {
+                // 鍋囪 data 瀛楁瀛樺偍鐨勬槸 List<ComputeDiscountDto>
+                JSONArray data = (JSONArray) JSONObject.parseObject(resultVo.getBody()).get("data");
+
+                if(data.size() > 0) {
+                    JSONObject o = (JSONObject) data.get(0);
+                    String discountPrice = o.get("discountPrice").toString();
+                    String discountId =  o.get("discountId").toString();
+                    payFeeDetailPo.setDiscountAmount(discountPrice);
+
+                    payFeeDetailDiscount.setDiscountId(discountId);
+                    payFeeDetailDiscount.setDiscountPrice(discountPrice);
+                }else{
+
+                }
+            }
+        } catch (ParseException e) {
+            throw new RuntimeException(e.getMessage());
+        }
+
+
+        payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
+
+        if (importRoomFee.getState() != null && importRoomFee.getState().equals("1300")){
+            payFeeDetailPo.setReceivableAmount("-"+payFeeDetailPo.getReceivableAmount());
         }
         int saved = feeDetailInnerServiceSMOImpl.saveFeeDetail(payFeeDetailPo);
+
+
+
+        FeeDetailDto feeDetailDto = new FeeDetailDto();
+        feeDetailDto.setDetailId(payFeeDetailPo.getDetailId());
+
+        List<FeeDetailDto> feeDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto);
+
+        if (payFeeDetailDiscount.getDiscountId() != null) {
+            payFeeDetailDiscount.setDetailId(payFeeDetailPo.getDetailId());
+            payFeeDetailDiscount.setStatusCd("0");
+            payFeeDetailDiscount.setCommunityId(feeDtos.get(0).getCommunityId());
+            payFeeDetailDiscount.setFeeId(feeDtos.get(0).getFeeId());
+            payFeeDetailDiscount.setDetailDiscountId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_discountId));
+
+            payFeeDetailDiscountNewV1InnerServiceSMOImpl.savePayFeeDetailDiscountNew(payFeeDetailDiscount);
+        }
 
         if (saved < 1) {
             return;
         }
 
-        if (tmpFeeDto.getEndTime().getTime() >= DateUtil.getDateFromStringB(importRoomFee.getEndTime()).getTime()) {
+        FeeDto fee = new FeeDto();
+        fee.setFeeId(tmpFeeDto.getFeeId());
+        FeeDto feeInfo = feeInnerServiceSMOImpl.queryFees(fee).get(0);
+
+
+//        int i = feeInnerServiceSMOImpl.updateFee(feeInfo);
+
+        if (tmpFeeDto.getEndTime().getTime() >= DateUtil.getDateFromStringA(importRoomFee.getEndTime()).getTime()  + 2000 || (importRoomFee.getState().equals("1100") || importRoomFee.getState().equals("1300"))) {
+
             return;
         }
+
 
         //濡傛灉缁撴潫鏃堕棿灏忎簬 缂磋垂缁撴潫鏃堕棿鍒欏欢鏈�
         PayFeePo payFeePo = new PayFeePo();
         payFeePo.setCommunityId(importRoomFee.getCommunityId());
         payFeePo.setStatusCd(StatusConstant.STATUS_CD_VALID);
         payFeePo.setFeeId(tmpFeeDto.getFeeId());
-        payFeePo.setEndTime(DateUtil.getNextSecTime(importRoomFee.getEndTime()));
+        String[] arr = importRoomFee.getEndTime().split(" ");
+
+        if (arr.length >= 2 && arr[1].equals("23:59:59")){
+            payFeePo.setEndTime(DateUtil.getNextSecTime(importRoomFee.getEndTime()));
+            if(!(FeeDto.FEE_FLAG_ONCE.equals(tmpFeeDto.getFeeFlag()))){
+                importRoomFee.setCycle((DateUtil.dayCompare(
+                        DateUtil.getDateFromStringA(importRoomFee.getStartTime()),
+                        DateUtil.getDateFromStringA(importRoomFee.getEndTime())
+                ))+"");
+                payFeeCmd.ifCustomStartEndTimePayFee(importRoomFee.getCycle(), DateUtil.getDateFromStringB(importRoomFee.getStartTime().split(" ")[0]), feeDtos.get(0) , feeInfo, importRoomFee.getStartTime());
+            }
+
+        }
         if (FeeDto.FEE_FLAG_ONCE.equals(tmpFeeDto.getFeeFlag())) {
             payFeePo.setState(FeeDto.STATE_FINISH);
         }
+//        if (FeeDto.FEE_FLAG_ONCE.equals(tmpFeeDto.getFeeFlag())) {
+//            payFeePo.setState(FeeDto.STATE_FINISH);
+//        }
+
+
+//        else{
+//            payFeePo.setEndTime(DateUtil.getFormatTimeStringA(feeInfo.getMaxEndTime()));
+//        }
+//        //鐘舵�佷慨鏀逛负璐圭敤缁撴潫
+//        if (computeFee <= 0 && computeFee > -1){// 10涓鸿宸�
+//            payFeePo.setState(FeeDto.STATE_FINISH);
+//        }else{
+//            throw new IllegalArgumentException("寮傚父鏁版嵁锛氬簲缂撮噾棰濆皬浜庡疄缂撮噾棰�");
+//        }
 
         feeInnerServiceSMOImpl.updateFee(payFeePo);
+        feeInfo = feeInnerServiceSMOImpl.queryFees(fee).get(0);
+        if (importRoomFee.getEndTime().split(" ")[0].equals(DateUtil.getFormatTimeStringB(feeInfo.getMaxEndTime()))) {
+//            Date deadlineTime = feeInfo.getDeadlineTime();
+//            feeInfo.setDeadlineTime(DateUtil.getDateFromStringA(importRoomFee.getEndTime()));
+//            calculateFeeSMOImpl.computeOweFee(feeInfo);
+//            feeInfo.setDeadlineTime(deadlineTime);
+//            double computeFee = Double.parseDouble(feeInfo.getAmountOwed());
+            double computeFee = computeFee(feeInfo,importRoomFee);
+            if(computeFee <= 1 && computeFee >= -1){
+                PayFeePo payFee = new PayFeePo();
+                payFee.setFeeId(feeInfo.getFeeId());
+                payFee.setState(FeeDto.STATE_FINISH);
+                payFee.setEndTime(payFee.getMaxTime());
+                int i = feeInnerServiceSMOImpl.updateFee(payFee);
+            }else{
+                PayFeePo payFee = new PayFeePo();
+                payFee.setFeeId(feeInfo.getFeeId());
+                payFee.setEndTime(DateUtil.getFormatTimeStringA(feeInfo.getMaxEndTime()));
+                int i = feeInnerServiceSMOImpl.updateFee(payFee);
+            }
+        }
     }
 
+    private double computeFee(FeeDto fee,ImportRoomFee importRoomFee) {
+        FeeDto feeDto = new FeeDto();
+        feeDto.setFeeId(fee.getFeeId());
+        feeDto.setCommunityId(fee.getCommunityId());
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+        if (feeDtos == null || feeDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "鏌ヨ璐圭敤淇℃伅澶辫触锛屾湭鏌ュ埌鏁版嵁鎴栨煡鍒板鏉℃暟鎹�");
+        }
+        feeDto = feeDtos.get(0);
+
+        double month = (DateUtil.dayCompare(
+                fee.getStartTime(),
+                DateUtil.getDateFromStringA(DateUtil.getFormatTimeStringB(fee.getMaxEndTime()).split(" ")[0]+" 23:59:59")
+        ));
+        if(feeDto.getFeeFlag().equals(FeeDto.FEE_FLAG_ONCE)){
+            month = 1;
+        }
+        Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto);
+        //todo 璁$畻搴旀敹
+        BigDecimal receivableAmount = new BigDecimal(feePriceAll.get("feePrice").toString());
+        BigDecimal cycles = new BigDecimal(month);
+        double tmpReceivableAmount = cycles.multiply(receivableAmount).setScale(4, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        tmpReceivableAmount = MoneyUtil.computePriceScale(tmpReceivableAmount, feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+
+
+
+        FeeDetailDto feeDetailDto1 = new FeeDetailDto();
+        feeDetailDto1.setFeeId(fee.getFeeId());
+        List<FeeDetailDto> feeDetailDtos = feeDetailInnerServiceSMOImpl.queryFeeDetails(feeDetailDto1);
+        double computedFee = 0;
+        for (FeeDetailDto feeDetail : feeDetailDtos) {
+            computedFee += Double.parseDouble(feeDetail.getReceivedAmount()) + Double.parseDouble(feeDetail.getDiscountAmount());
+        }
+        return tmpReceivableAmount - computedFee;
+    }
+
+    private double computeFeeByCycle(FeeDto fee,ImportRoomFee importRoomFee) {
+        FeeDto feeDto = new FeeDto();
+        feeDto.setFeeId(fee.getFeeId());
+        feeDto.setCommunityId(fee.getCommunityId());
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+        if (feeDtos == null || feeDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "鏌ヨ璐圭敤淇℃伅澶辫触锛屾湭鏌ュ埌鏁版嵁鎴栨煡鍒板鏉℃暟鎹�");
+        }
+        feeDto = feeDtos.get(0);
+
+        double month = (DateUtil.dayCompare(
+                DateUtil.getDateFromStringA(importRoomFee.getStartTime()),
+                DateUtil.getDateFromStringA(importRoomFee.getEndTime().split(" ")[0] + " 23:59:59")
+        ));
+        if(feeDto.getFeeFlag().equals(FeeDto.FEE_FLAG_ONCE)){
+            month = 1;
+        }
+        Map feePriceAll = computeFeeSMOImpl.getFeePrice(feeDto);
+//        if(feeDto.getFeeFlag().equals(FeeDto.FEE_FLAG_ONCE)){
+//            return Double.parseDouble(feePriceAll.get("feePrice").toString());
+//        }
+        //todo 璁$畻搴旀敹
+        BigDecimal receivableAmount = new BigDecimal(feePriceAll.get("feePrice").toString());
+        BigDecimal cycles = new BigDecimal(month);
+        double tmpReceivableAmount = cycles.multiply(receivableAmount).setScale(4, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        return MoneyUtil.computePriceScale(tmpReceivableAmount, feeDto.getScale(), Integer.parseInt(feeDto.getDecimalPlace()));
+    }
 
 }

--
Gitblit v1.8.0