wuxw лет назад: 5
Родитель
Сommit
a73c48dca7

+ 19 - 0
java110-bean/src/main/java/com/java110/dto/contract/ContractDto.java

@@ -45,6 +45,7 @@ public class ContractDto extends PageDto implements Serializable {
     private String startTime;
     private String endTime;
     private String state;
+    private String[] states;
     private String[] noStates;
     private String stateDesc;
     private String contractCode;
@@ -79,6 +80,8 @@ public class ContractDto extends PageDto implements Serializable {
     private String staffTel;
     private String startUserId;
 
+    private String communityId;
+
     private List<ContractAttrDto> attrs;
 
     public String getaLink() {
@@ -424,4 +427,20 @@ public class ContractDto extends PageDto implements Serializable {
     public void setObjPersonId(String objPersonId) {
         this.objPersonId = objPersonId;
     }
+
+    public String[] getStates() {
+        return states;
+    }
+
+    public void setStates(String[] states) {
+        this.states = states;
+    }
+
+    public String getCommunityId() {
+        return communityId;
+    }
+
+    public void setCommunityId(String communityId) {
+        this.communityId = communityId;
+    }
 }

+ 1 - 0
java110-bean/src/main/java/com/java110/dto/fee/FeeDto.java

@@ -21,6 +21,7 @@ public class FeeDto extends PageDto implements Serializable {
 
     public static final String PAYER_OBJ_TYPE_ROOM = "3333"; //房屋 6666 是车位
     public static final String PAYER_OBJ_TYPE_PARKING_SPACE = "6666";//是车位
+    public static final String PAYER_OBJ_TYPE_CONTRACT = "7777";//是合同
     public static final String PAYER_OBJ_TYPE_CAR = "6666";//是车位
     public static final String PAYER_OBJ_TYPE_RENTING = "9999";//房源ID
 

+ 1 - 0
java110-utils/src/main/java/com/java110/utils/constant/ServiceCodeConstant.java

@@ -578,6 +578,7 @@ public class ServiceCodeConstant {
 
     //设置费用
     public static final String SERVICE_CODE_SAVE_ROOM_CREATE_FEE = "fee.saveRoomCreateFee";
+    public static final String SERVICE_CODE_SAVE_CONTRACT_CREATE_FEE = "fee.saveContractCreateFee";
     //设置费用
     public static final String SERVICE_CODE_SAVE_PARKING_SPEC_CREATE_FEE = "fee.saveParkingSpaceCreateFee";
 

+ 9 - 1
service-api/src/main/java/com/java110/api/bmo/fee/IFeeBMO.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.java110.api.bmo.IApiBaseBMO;
 import com.java110.core.context.DataFlowContext;
 import com.java110.dto.RoomDto;
+import com.java110.dto.contract.ContractDto;
 import com.java110.dto.owner.OwnerCarDto;
 import com.java110.po.fee.PayFeeDetailPo;
 import com.java110.po.fee.PayFeePo;
@@ -172,7 +173,14 @@ public interface IFeeBMO extends IApiBaseBMO {
      * @param dataFlowContext 数据上下文
      * @return 订单服务能够接受的报文
      */
-    public JSONObject addRoomFee(RoomDto roomDto, JSONObject paramInJson, DataFlowContext dataFlowContext);
+    public JSONObject addRoomFee(RoomDto roomDto, JSONObject paramInJson, DataFlowContext dataFlowContext);   /**
+     * 添加物业费用
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addContractFee(ContractDto contractDto, JSONObject paramInJson, DataFlowContext dataFlowContext);
 
     /**
      * 添加费用项信息

+ 38 - 0
service-api/src/main/java/com/java110/api/bmo/fee/impl/FeeBMOImpl.java

@@ -7,6 +7,7 @@ import com.java110.core.context.DataFlowContext;
 import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.core.smo.IComputeFeeSMO;
 import com.java110.dto.RoomDto;
+import com.java110.dto.contract.ContractDto;
 import com.java110.dto.fee.FeeConfigDto;
 import com.java110.dto.fee.FeeDto;
 import com.java110.dto.machine.CarInoutDto;
@@ -681,6 +682,43 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
         return business;
     }
 
+    /**
+     * 添加物业费用
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addContractFee(ContractDto contractDto, JSONObject paramInJson, DataFlowContext dataFlowContext) {
+        String time = DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A);
+        if (paramInJson.containsKey("feeEndDate")) {
+            time = paramInJson.getString("feeEndDate");
+        } else if (paramInJson.containsKey("startTime")) {
+            time = paramInJson.getString("startTime");
+        }
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_FEE_INFO);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessUnit = new JSONObject();
+        businessUnit.put("feeId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        businessUnit.put("configId", paramInJson.getString("configId"));
+        businessUnit.put("feeTypeCd", paramInJson.getString("feeTypeCd"));
+        businessUnit.put("incomeObjId", paramInJson.getString("storeId"));
+        businessUnit.put("amount", "-1.00");
+        businessUnit.put("startTime", time);
+        businessUnit.put("endTime", time);
+        businessUnit.put("communityId", paramInJson.getString("communityId"));
+        businessUnit.put("payerObjId", contractDto.getContractId());
+        businessUnit.put("payerObjType", FeeDto.PAYER_OBJ_TYPE_CONTRACT);
+        businessUnit.put("feeFlag", paramInJson.getString("feeFlag"));
+        businessUnit.put("state", "2008001");
+        businessUnit.put("userId", dataFlowContext.getRequestCurrentHeaders().get(CommonConstant.HTTP_USER_ID));
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(PayFeePo.class.getSimpleName(), businessUnit);
+        paramInJson.put("feeId", businessUnit.getString("feeId"));
+        return business;
+    }
+
     /**
      * 添加费用项信息
      *

+ 186 - 0
service-api/src/main/java/com/java110/api/listener/fee/SaveContractCreateFeeListener.java

@@ -0,0 +1,186 @@
+package com.java110.api.listener.fee;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.bmo.fee.IFeeBMO;
+import com.java110.api.listener.AbstractServiceApiListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.dto.RoomDto;
+import com.java110.dto.contract.ContractDto;
+import com.java110.dto.fee.FeeAttrDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.owner.OwnerDto;
+import com.java110.entity.center.AppService;
+import com.java110.intf.community.IRoomInnerServiceSMO;
+import com.java110.intf.fee.IFeeConfigInnerServiceSMO;
+import com.java110.intf.store.IContractInnerServiceSMO;
+import com.java110.intf.user.IOwnerInnerServiceSMO;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.StringUtil;
+import org.apache.http.annotation.Contract;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @ClassName SaveContractCreateFeeListener
+ * @Description TODO
+ * @Author wuxw
+ * @Date 2020/1/31 15:57
+ * @Version 1.0
+ * add by wuxw 2020/1/31
+ **/
+@Java110Listener("saveContractCreateFeeListener")
+public class SaveContractCreateFeeListener extends AbstractServiceApiListener {
+
+    private static Logger logger = LoggerFactory.getLogger(SaveContractCreateFeeListener.class);
+
+    @Autowired
+    private IFeeBMO feeBMOImpl;
+
+    private static final int DEFAULT_ADD_FEE_COUNT = 200;
+
+    @Autowired
+    private IContractInnerServiceSMO contractInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private IOwnerInnerServiceSMO ownerInnerServiceSMOImpl;
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_SAVE_CONTRACT_CREATE_FEE;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+
+    @Override
+    protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) {
+        // super.validatePageInfo(pd);
+        Assert.hasKeyAndValue(reqJson, "communityId", "未包含小区ID");
+        Assert.hasKeyAndValue(reqJson, "configId", "未包含收费项目");
+        //Assert.hasKeyAndValue(reqJson, "startTime", "未包含收费其实时间");
+        //Assert.hasKeyAndValue(reqJson, "billType", "未包含出账类型");
+        Assert.hasKeyAndValue(reqJson, "storeId", "未包含商户ID");
+    }
+
+    @Override
+    protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) {
+        logger.debug("ServiceDataFlowEvent : {}", event);
+        List<ContractDto> contractDtos = null;
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setCommunityId(reqJson.getString("communityId"));
+        feeConfigDto.setConfigId(reqJson.getString("configId"));
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+        Assert.listOnlyOne(feeConfigDtos, "当前费用项ID不存在或存在多条" + reqJson.getString("configId"));
+        reqJson.put("feeTypeCd", feeConfigDtos.get(0).getFeeTypeCd());
+        reqJson.put("feeFlag", feeConfigDtos.get(0).getFeeFlag());
+        reqJson.put("configEndTime", feeConfigDtos.get(0).getEndTime());
+
+        if (FeeDto.FEE_FLAG_ONCE.equals(feeConfigDtos.get(0).getFeeFlag()) && reqJson.containsKey("endTime")) {
+            Date endTime = null;
+            Date configEndTime = null;
+            try {
+                endTime = DateUtil.getDateFromString(reqJson.getString("endTime"), DateUtil.DATE_FORMATE_STRING_B);
+                configEndTime = DateUtil.getDateFromString(feeConfigDtos.get(0).getEndTime(), DateUtil.DATE_FORMATE_STRING_A);
+                if (endTime.getTime() > configEndTime.getTime()) {
+                    throw new IllegalArgumentException("结束时间不能超过费用项时间");
+                }
+            } catch (ParseException e) {
+                throw new IllegalArgumentException("结束时间错误" + reqJson.getString("endTime"));
+            }
+        }
+        //判断收费范围
+        ContractDto contractDto = new ContractDto();
+        /*if (reqJson.containsKey("roomState") && RoomDto.STATE_SELL.equals(reqJson.getString("roomState"))) {
+            roomDto.setState(RoomDto.STATE_SELL);
+        }*/
+        if (reqJson.containsKey("contractState") && reqJson.getString("contractState").contains(",")) {
+            String states = reqJson.getString("contractState");
+            contractDto.setStates(states.split(","));
+        }
+
+        contractDto.setContractId(reqJson.getString("contractId"));
+
+            contractDto.setCommunityId(reqJson.getString("communityId"));
+        contractDtos = contractInnerServiceSMOImpl.queryContracts(contractDto);
+
+        if (contractDtos == null || contractDtos.size() < 1) {
+            throw new IllegalArgumentException("未查到需要付费的房屋");
+        }
+        dealContractFee(contractDtos, context, reqJson, event);
+    }
+
+    private void dealContractFee(List<ContractDto> contractDtos, DataFlowContext context, JSONObject reqJson, ServiceDataFlowEvent event) {
+        AppService service = event.getAppService();
+        List<String> roomIds = new ArrayList<>();
+
+        HttpHeaders header = new HttpHeaders();
+        context.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
+        JSONArray businesses = new JSONArray();
+        JSONObject paramInObj = null;
+        ResponseEntity<String> responseEntity = null;
+        int failRooms = 0;
+        //添加单元信息
+        int curFailRoomCount = 0;
+        for (int roomIndex = 0; roomIndex < contractDtos.size(); roomIndex++) {
+            curFailRoomCount++;
+            businesses.add(feeBMOImpl.addContractFee(contractDtos.get(roomIndex), reqJson, context));
+//            if (!StringUtil.isEmpty(contractDtos.get(roomIndex).getOwnerId())) {
+//                if (FeeDto.FEE_FLAG_ONCE.equals(reqJson.getString("feeFlag"))) {
+//                    businesses.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_ONCE_FEE_DEADLINE_TIME,
+//                            reqJson.containsKey("endTime") ? reqJson.getString("endTime") : reqJson.getString("configEndTime")));
+//                }
+//                businesses.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_OWNER_ID, roomDtos.get(roomIndex).getOwnerId()));
+//                businesses.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_OWNER_LINK, roomDtos.get(roomIndex).getLink()));
+//                businesses.add(feeBMOImpl.addFeeAttr(reqJson, context, FeeAttrDto.SPEC_CD_OWNER_NAME, roomDtos.get(roomIndex).getOwnerName()));
+//            }
+            if (roomIndex % DEFAULT_ADD_FEE_COUNT == 0 && roomIndex != 0) {
+                responseEntity = feeBMOImpl.callService(context, service.getServiceCode(), businesses);
+                if (responseEntity.getStatusCode() != HttpStatus.OK) {
+                    failRooms += curFailRoomCount;
+                } else {
+                    curFailRoomCount = 0;
+                }
+                businesses = new JSONArray();
+            }
+        }
+        if (businesses != null && businesses.size() > 0) {
+            responseEntity = feeBMOImpl.callService(context, service.getServiceCode(), businesses);
+            if (responseEntity.getStatusCode() != HttpStatus.OK) {
+                failRooms += businesses.size();
+            }
+        }
+        JSONObject paramOut = new JSONObject();
+        paramOut.put("totalRoom", contractDtos.size());
+        paramOut.put("successRoom", contractDtos.size() - failRooms);
+        paramOut.put("errorRoom", failRooms);
+        responseEntity = new ResponseEntity<>(paramOut.toJSONString(), HttpStatus.OK);
+        context.setResponseEntity(responseEntity);
+    }
+
+    @Override
+    public int getOrder() {
+        return DEFAULT_ORDER;
+    }
+}