chengf
2025-08-21 bde271fdbab51e654a293dba02a31eab8ff3ea8b
service-job/src/main/java/com/java110/job/importData/adapt/ImportHistoryFeeDetailQueueDataAdapt.java
@@ -1,8 +1,12 @@
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.dto.PropertyWhiteListFlowDto;
import com.java110.dto.fee.ComputeDiscountDto;
import com.java110.dto.fee.FeeAttrDto;
import com.java110.dto.fee.FeeConfigDto;
import com.java110.dto.fee.FeeDto;
@@ -11,6 +15,7 @@
import com.java110.dto.owner.OwnerRoomRelDto;
import com.java110.dto.room.RoomDto;
import com.java110.dto.system.ComponentValidateResult;
import com.java110.fee.api.FeeDiscountApi;
import com.java110.intf.IImportPropertyWhiteListfFlowServiceSMO;
import com.java110.intf.common.ICarInoutInnerServiceSMO;
import com.java110.intf.community.IRoomInnerServiceSMO;
@@ -25,19 +30,23 @@
import com.java110.po.fee.PayFeeDetailPo;
import com.java110.po.fee.PayFeePo;
import com.java110.utils.constant.StatusConstant;
import com.java110.utils.exception.DAOException;
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.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.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.Random;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 房屋缴费信息导入 适配器
@@ -47,6 +56,8 @@
@Service("importHistoryFeeDetailQueueData")
public class ImportHistoryFeeDetailQueueDataAdapt extends DefaultImportData implements IImportDataAdapt {
    @Autowired
    private FeeDiscountApi feeDiscountApi;
    @Autowired
    private IImportFeeDetailInnerServiceSMO importFeeDetailInnerServiceSMOImpl;
@@ -78,6 +89,10 @@
    @Autowired
    private ICarInoutInnerServiceSMO carInoutInnerServiceSMOImpl;
    @Autowired
    private ImportCarHistoryFeeDetailQueueDataAdapt importCarHistoryFeeDetailQueueDataAdapt;
    @Override
    public void importData(List<AssetImportLogDetailDto> assetImportLogDetailDtos) {
        importDatas(assetImportLogDetailDtos);
@@ -86,6 +101,7 @@
    private void importDatas(List<AssetImportLogDetailDto> infos) {
        List<ImportRoomFee> importRoomFees = new ArrayList<>();
        List<ImportRoomFee> importCarFees = new ArrayList<>();
        for (AssetImportLogDetailDto assetImportLogDetailDto : infos) {
            String communityId = assetImportLogDetailDto.getCommunityId();
            JSONObject data = JSONObject.parseObject(assetImportLogDetailDto.getContent());
@@ -93,9 +109,11 @@
            RoomDto roomDto = new RoomDto();
            roomDto.setDoorRoomNum(importRoomFee.getDoorRoomNum());
            roomDto.setCommunityId(communityId);
//            List<String> roomTypes = Arrays.asList("住宅物业费","商铺物业费","维修收入","维修基金收入","电费及管理费","代收水费","各类押金","租金收入");
            List<String> carTypes = Arrays.asList("临时停车费", "业主产权过道停车费", "小业主产权车辆管理费","地下停车费","地面停车费");
            List<String> contractTypes = Arrays.asList("垃圾清运费","其他收入","补贴费用","场地使用费","电梯广告(业委会)","快递柜","电梯广告(联讯)","房产中介","非机动车管理费","其他广告");
            if(importRoomFee.getSecondaryFeeTypeCd()!= null && importRoomFee.getSecondaryFeeTypeCd().equals("临时停车费-其他")){
                CarInoutPo carInout = new CarInoutPo();
                carInout.setbId(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("invoiceReceiptNo"));
                carInout.setCommunityId(communityId);
                carInout.setCarNum("A888888");
                carInout.setVehicleType("temp");
@@ -103,9 +121,9 @@
                carInout.setState("100300");
                carInout.setInTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("chargeStart"));
                carInout.setStatusCd("0");
                carInout.setCreateTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("inputTime"));
// 检查重复代码...
                carInout.setCreateTime(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("inputTime"));
                carInout.setbId(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("batchId"));
                List<CarInoutPo> carInoutPos = new ArrayList<>();
                carInout.setInoutId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_inoutId));
@@ -116,7 +134,7 @@
                    // 创建新的对象,而不是修改已添加的对象
                    CarInoutPo exitCarInout = new CarInoutPo();
                    // 复制基本属性
                    exitCarInout.setbId(carInout.getbId());
                    exitCarInout.setbId(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("batchId"));
                    exitCarInout.setCommunityId(carInout.getCommunityId());
                    exitCarInout.setCarNum(carInout.getCarNum());
                    exitCarInout.setVehicleType(carInout.getVehicleType());
@@ -139,10 +157,11 @@
                }catch (Exception e){
                    updateImportLogDetailState(importRoomFee.getDetailId(),e);
                    throw new IllegalArgumentException(e.getMessage());
                }
                updateImportLogDetailState(importRoomFee.getDetailId());
            }
            else if(JSONObject.parseObject(assetImportLogDetailDto.getContent().toString()).getString("secondaryFeeTypeCd").contains("广告")){
            else if(contractTypes.contains(importRoomFee.getSecondaryFeeTypeCd())){
                List<RoomDto> roomDtos = iRoomInnerServiceSMOImpl.queryRooms(roomDto);
                try {
                    importRoomFee.setRoomId(roomDtos.get(0).getRoomId());
@@ -168,8 +187,37 @@
                importRoomFee.setStaffName(data.getString("charger"));
                importRoomFee.setIsContractFee("O");
                importRoomFee.setOpenInv(data.containsKey("invoiceReceiptNo") && data.getString("invoiceReceiptNo") != null ? "Y" : "N");
                importRoomFee.setObjType("7777");
                LocalDateTime startDate = LocalDateTime.parse(importRoomFee.getStartTime(), formatter);
                LocalDateTime endDate = LocalDateTime.parse(importRoomFee.getEndTime(), formatter);
                importRoomFee.setCycle(String.valueOf(ChronoUnit.MONTHS.between(startDate, endDate)));
//            if(importRoomFee.getPayerObjName())
                importRoomFees.add(importRoomFee);
                importCarFees.add(importRoomFee);
            }
            else if(carTypes.contains(JSONObject.parseObject(infos.get(0).getContent()).get("category22"))){
                List<RoomDto> roomDtos = iRoomInnerServiceSMOImpl.queryRooms(roomDto);
                try {
                    importRoomFee.setRoomId(roomDtos.get(0).getRoomId());
                }catch (Exception e){
                    updateImportLogDetailState(importRoomFee.getDetailId(),new IllegalArgumentException("费用项"+importRoomFee.getFeeName()+"不存在"));
                    throw new IllegalArgumentException("门室号"+importRoomFee.getDoorRoomNum()+"未查询到房屋");
                }
                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("inputTime"));
                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");
                LocalDateTime startDate = LocalDateTime.parse(importRoomFee.getStartTime(), formatter);
                LocalDateTime endDate = LocalDateTime.parse(importRoomFee.getEndTime(), formatter);
                importRoomFee.setCycle(String.valueOf(ChronoUnit.MONTHS.between(startDate, endDate)));
                importCarFees.add(importRoomFee);
            }
            else{
                List<RoomDto> roomDtos = iRoomInnerServiceSMOImpl.queryRooms(roomDto);
@@ -180,14 +228,6 @@
                    throw new IllegalArgumentException("门室号"+importRoomFee.getDoorRoomNum()+"未查询到房屋");
                }
                importRoomFee.setFeeName(data.getString("secondaryFeeTypeCd"));
                FeeDto feeDto = new FeeDto();
                feeDto.setFeeName(importRoomFee.getFeeName());
                List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
                if(feeDtos.size() == 0){
                    updateImportLogDetailState(importRoomFee.getDetailId(),new IllegalArgumentException("费用项"+importRoomFee.getFeeName()+"不存在"));
                    throw new IllegalArgumentException("费用项"+importRoomFee.getFeeName()+"不存在");
                }
                importRoomFee.setDetailId(assetImportLogDetailDto.getDetailId());
                importRoomFee.setStartTime(data.getString("chargeStart"));
                importRoomFee.setEndTime(data.getString("chargeEnd").split(" ")[0]+" 23:59:59");
@@ -201,17 +241,21 @@
            }
        }
        if (ListUtil.isNull(importRoomFees)) {
        if (ListUtil.isNull(importRoomFees) && ListUtil.isNull(importCarFees)) {
            return;
        }
        importFeeDetails(importRoomFees.get(0).getStoreId(), importRoomFees.get(0).getUserId(), importRoomFees, importRoomFees.get(0).getBatchId());
//        ImportCarHistoryFeeDetailQueueDataAdapt importCarHistoryFeeDetailQueueDataAdapt = new ImportCarHistoryFeeDetailQueueDataAdapt();
//        importCarHistoryFeeDetailQueueDataAdapt.importCarFeeDetails(importRoomFees.get(0).getStoreId(), importRoomFees.get(0).getUserId(), importRoomFees, importRoomFees.get(0).getBatchId());
        if(!(ListUtil.isNull(importRoomFees))){
            importFeeDetails(importRoomFees.get(0).getStoreId(), importRoomFees.get(0).getUserId(), importRoomFees, importRoomFees.get(0).getBatchId());
        }
        if(!(ListUtil.isNull(importCarFees))){
            importCarHistoryFeeDetailQueueDataAdapt.importCarFeeDetails(importCarFees.get(0).getStoreId(), importCarFees.get(0).getUserId(), importCarFees, importCarFees.get(0).getBatchId());
        }
//
//
    }
    private void importFeeDetails(String storeId, String userId, List<ImportRoomFee> importRoomFees, String batchId) {
@@ -231,6 +275,7 @@
                    continue;
                }
                importFeeDetail(importRoomFee, storeId, userId, batchId);
//                feeDiscountApi
                updateImportLogDetailState(importRoomFee.getDetailId());
            } catch (Exception e) {
                e.printStackTrace();
@@ -238,6 +283,8 @@
            }
        }
    }
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -254,7 +301,7 @@
        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
        if (ListUtil.isNull(feeConfigDtos)) {
            return;
            throw new IllegalArgumentException("收费项不存在");
        }
        FeeConfigDto tmpFeeConfigDto = feeConfigDtos.get(0);
@@ -263,59 +310,63 @@
        feeDto.setConfigId(tmpFeeConfigDto.getConfigId());
        feeDto.setCommunityId(importRoomFee.getCommunityId());
        feeDto.setPayerObjId(importRoomFee.getRoomId());
        feeDto.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_ROOM);
        feeDto.setPayerObjType(importRoomFee.getObjType() ==null?FeeDto.PAYER_OBJ_TYPE_ROOM:importRoomFee.getObjType());
        feeDto.setFeeTypeCd(feeConfigDtos.get(0).getFeeTypeCd());
        feeDto.setConfigId(tmpFeeConfigDto.getConfigId());
        // 解析日期字符串
        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;
        importRoomFee.setPayObjId(importRoomFee.getRoomId());
        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()));
                }
                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);
            }
            feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
            throw new IllegalArgumentException("查询不到该记录的费用项:"+importRoomFee.getFeeName()+startDate+endDate);
//            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()));
//                }
//                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);
//            }
//
//
//            feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
        }
        if(feeDtos.size()>1){
            throw new IllegalArgumentException("该初始化缴费记录信息中包含多个费用记录"+importRoomFee.getFeeName()+startDate+endDate);
        }
        for (FeeDto tmpFeeDto : feeDtos) {
            doImportFeeDetail(tmpFeeDto, importRoomFee);
        }
@@ -351,13 +402,32 @@
        payFeeDetailPo.setState("1400");
        payFeeDetailPo.setCashierName(importRoomFee.getStaffName());
        payFeeDetailPo.setPayableAmount(importRoomFee.getAmount());
        payFeeDetailPo.setPayOrderId(importRoomFee.getPayObjId());
        int count = feeDetailInnerServiceSMOImpl.queryFeeDetailsCountByVo(payFeeDetailPo);
        if (count > 0) {
            throw new IllegalStateException("重复的缴费记录");
        }
        try {
            ResponseEntity<String> resultVo = feeDiscountApi.computeFeeDiscount(tmpFeeDto.getFeeId(), tmpFeeDto.getCommunityId(), Double.parseDouble(importRoomFee.getCycle()), 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");
                JSONObject o = (JSONObject) data.get(0);
                String discountPrice = o.get("discountPrice").toString();
                String discountId =  o.get("discountId").toString();
            }
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
        payFeeDetailPo.setDetailId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_detailId));
        if(importRoomFee.getOpenInv() != null){
            payFeeDetailPo.setOpenInvoice(importRoomFee.getOpenInv());