Browse Source

租赁支付处理完成

java110 5 years ago
parent
commit
c1fa711176

+ 3 - 0
java110-bean/src/main/java/com/java110/dto/CommunityMemberDto.java

@@ -9,6 +9,9 @@ import java.io.Serializable;
  */
 public class CommunityMemberDto extends CommunityDto implements Serializable {
 
+
+    public static final String AUDIT_STATUS_NORMAL = "1100"; // 审核通过
+
     private String communityMemberId;
 
     private String communityId;

+ 4 - 0
java110-bean/src/main/java/com/java110/dto/fee/FeeConfigDto.java

@@ -25,6 +25,10 @@ public class FeeConfigDto extends PageDto implements Serializable {
 
     public static final String FEE_TYPE_CD_WATER = "888800010016";//电费
     public static final String FEE_TYPE_CD_METER = "888800010015";//水费
+    public static final String FEE_TYPE_CD_SYSTEM = "888800010000";//系统
+
+    public static final String CONFIG_ID_RENTING = "920000000000000000";//租赁费用项
+
 
 
     private String feeTypeCd;

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

@@ -22,6 +22,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_CAR = "6666";//是车位
+    public static final String PAYER_OBJ_TYPE_RENTING = "9999";//房源ID
 
     public static final String FEE_FLAG_ONCE = "2006012";
 

+ 2 - 0
java110-bean/src/main/java/com/java110/dto/rentingConfig/RentingConfigDto.java

@@ -15,6 +15,8 @@ import java.util.Date;
  **/
 public class RentingConfigDto extends PageDto implements Serializable {
 
+    public static final String RENTING_FORMULA_RATE = "2002";
+
     private String serviceTenantRate;
     private String propertySeparateRate;
     private String servicePrice;

+ 9 - 0
java110-bean/src/main/java/com/java110/dto/rentingPool/RentingPoolDto.java

@@ -59,6 +59,7 @@ public class RentingPoolDto extends PageDto implements Serializable {
     private String proxySeparateRate;
     private String propertySeparateRate;
     private String servicePrice;
+    private String rentingFormula;
 
 
     public String getLatitude() {
@@ -277,4 +278,12 @@ public class RentingPoolDto extends PageDto implements Serializable {
     public void setServicePrice(String servicePrice) {
         this.servicePrice = servicePrice;
     }
+
+    public String getRentingFormula() {
+        return rentingFormula;
+    }
+
+    public void setRentingFormula(String rentingFormula) {
+        this.rentingFormula = rentingFormula;
+    }
 }

+ 7 - 1
java110-core/src/main/java/com/java110/core/context/OrderDataFlow.java

@@ -130,7 +130,13 @@ public class OrderDataFlow extends AbstractOrderDataFlowContext {
 
         this.orders.setRequestTime(this.getReqHeaders().get(CommonConstant.HTTP_REQ_TIME));
 
-        this.orders.setoId("-1");
+        String oId = this.getReqHeaders().get(CommonConstant.O_ID);
+
+        if(StringUtil.isEmpty(oId)){
+            oId = "-1";
+        }
+
+        this.orders.setoId(oId);
 
         JSONObject tmpOrderJson = this.getReqJson().getJSONObject("orders");
 

File diff suppressed because it is too large
+ 271 - 243
java110-core/src/main/java/com/java110/core/factory/OrderDataFlowContextFactory.java


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

@@ -519,8 +519,6 @@ public class ServiceCodeConstant {
     public static final String REFRESH_APP_USER_BINDING_OWNER_OPEN_ID = "owner.refreshAppUserBindingOwnerOpenId";
 
 
-
-
     public static final String SERVICE_CODE_APPLICATION_KEY = "owner.applicationKey";
 
     // 编辑业主信息
@@ -582,6 +580,9 @@ public class ServiceCodeConstant {
     //交费通知
     public static final String SERVICE_CODE_PAY_CONFIRM_PRE = "fee.payFeeConfirm";
 
+    //租赁服务费
+    public static final String SERVICE_CODE_RENTING_PAY_CONFIRM_PRE = "fee.rentingPayFeeConfirm";
+
 
     //查询停车位
     public static final String SERVICE_CODE_QUERY_PARKING_SPACE = "parkingSpace.queryParkingSpaces";
@@ -605,7 +606,6 @@ public class ServiceCodeConstant {
     public static final String SERVICE_CODE_SELL_PARKING_SPACE = "parkingSpace.sellParkingSpace";
 
 
-
     // 保存停车位信息
     public static final String SERVICE_CODE_EXIT_PARKING_SPACE = "parkingSpace.exitParkingSpace";
 
@@ -651,7 +651,7 @@ public class ServiceCodeConstant {
      * 修改小区
      */
     public static final String SERVICE_CODE_UPDATE_COMMUNITY = "community.updateCommunity";
-/**
+    /**
      * 删除小区community.deleteCommunity
      */
     public static final String SERVICE_CODE_DELETE_COMMUNITY = "community.deleteCommunity";
@@ -686,7 +686,7 @@ public class ServiceCodeConstant {
     /**
      * 查询数据字典
      */
-    public static final String SERVICE_CODE_DICT_TYPE="dict.queryDict";
+    public static final String SERVICE_CODE_DICT_TYPE = "dict.queryDict";
 
     /**
      * 查询 地区

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

@@ -5,7 +5,8 @@ import com.java110.api.bmo.IApiBaseBMO;
 import com.java110.core.context.DataFlowContext;
 import com.java110.dto.RoomDto;
 import com.java110.dto.owner.OwnerCarDto;
-import com.java110.dto.parking.ParkingSpaceDto;
+import com.java110.po.fee.PayFeeDetailPo;
+import com.java110.po.fee.PayFeePo;
 
 /**
  * @ClassName IFeeBMO
@@ -25,6 +26,7 @@ public interface IFeeBMO extends IApiBaseBMO {
      * @return 订单服务能够接受的报文
      */
     public void deleteFeeConfig(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
     /**
      * 添加物业费用
      *
@@ -44,6 +46,7 @@ public interface IFeeBMO extends IApiBaseBMO {
      * @return 订单服务能够接受的报文
      */
     public JSONObject modifyFee(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
     /**
      * 添加费用明细信息
      *
@@ -52,6 +55,16 @@ public interface IFeeBMO extends IApiBaseBMO {
      * @return 订单服务能够接受的报文
      */
     public JSONObject addFeeDetail(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
+    /**
+     * 添加费用明细信息
+     *
+     * @param payFeeDetailPo  费用明细
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addSimpleFeeDetail(PayFeeDetailPo payFeeDetailPo, DataFlowContext dataFlowContext);
+
     /**
      * 添加费用明细信息
      *
@@ -60,6 +73,7 @@ public interface IFeeBMO extends IApiBaseBMO {
      * @return 订单服务能够接受的报文
      */
     public JSONObject addFeePreDetail(JSONObject paramInJson, DataFlowContext dataFlowContext);
+
     /**
      * 修改费用信息
      *
@@ -107,6 +121,15 @@ public interface IFeeBMO extends IApiBaseBMO {
      */
     public JSONObject addFee(OwnerCarDto ownerCarDto, JSONObject paramInJson, DataFlowContext dataFlowContext);
 
+    /**
+     * 添加费用
+     *
+     * @param payFeePo        接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addSimpleFee(PayFeePo payFeePo, DataFlowContext dataFlowContext);
+
     /**
      * 添加物业费用
      *

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

@@ -249,6 +249,26 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
     }
 
 
+    /**
+     * 添加费用明细信息
+     *
+     * @param payFeeDetailPo  费用明细
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addSimpleFeeDetail(PayFeeDetailPo payFeeDetailPo, DataFlowContext dataFlowContext) {
+
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_FEE_DETAIL);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessFeeDetail = JSONObject.parseObject(JSONObject.toJSONString(payFeeDetailPo));
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(PayFeeDetailPo.class.getSimpleName(), businessFeeDetail);
+
+        return business;
+    }
+
     /**
      * 修改费用信息
      *
@@ -611,6 +631,28 @@ public class FeeBMOImpl extends ApiBaseBMO implements IFeeBMO {
         return business;
     }
 
+    /**
+     * 添加费用
+     *
+     * @param payFeePo        接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    public JSONObject addSimpleFee(PayFeePo payFeePo, DataFlowContext dataFlowContext) {
+
+
+        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 = null;
+        businessUnit = JSONObject.parseObject(JSONObject.toJSONString(payFeePo));
+        businessUnit.put("userId", dataFlowContext.getRequestCurrentHeaders().get(CommonConstant.HTTP_USER_ID));
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put(PayFeePo.class.getSimpleName(), businessUnit);
+
+        return business;
+    }
+
     /**
      * 添加物业费用
      *

+ 267 - 0
service-api/src/main/java/com/java110/api/listener/fee/RentingPayFeeConfirmListener.java

@@ -0,0 +1,267 @@
+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.AbstractServiceApiDataFlowListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.event.service.api.ServiceDataFlowEvent;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.dto.CommunityMemberDto;
+import com.java110.dto.fee.FeeConfigDto;
+import com.java110.dto.fee.FeeDto;
+import com.java110.dto.rentingPool.RentingPoolDto;
+import com.java110.entity.center.AppService;
+import com.java110.intf.community.ICommunityInnerServiceSMO;
+import com.java110.intf.fee.IFeeAttrInnerServiceSMO;
+import com.java110.intf.fee.IFeeInnerServiceSMO;
+import com.java110.intf.order.IOrderInnerServiceSMO;
+import com.java110.intf.user.IRentingPoolInnerServiceSMO;
+import com.java110.po.fee.PayFeeDetailPo;
+import com.java110.po.fee.PayFeePo;
+import com.java110.po.rentingPool.RentingPoolPo;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @ClassName PayFeeListener
+ * @Description TODO 交费通知侦听
+ * @Author wuxw
+ * @Date 2019/6/3 13:46
+ * @Version 1.0
+ * add by wuxw 2019/6/3
+ **/
+@Java110Listener("rentingPayFeeConfirmListener")
+public class RentingPayFeeConfirmListener extends AbstractServiceApiDataFlowListener {
+
+    private static Logger logger = LoggerFactory.getLogger(RentingPayFeeConfirmListener.class);
+
+    @Autowired
+    private IFeeBMO feeBMOImpl;
+
+    @Autowired
+    private IFeeAttrInnerServiceSMO feeAttrInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IOrderInnerServiceSMO orderInnerServiceSMOImpl;
+
+    @Autowired
+    private ICommunityInnerServiceSMO communityInnerServiceSMOImpl;
+
+    @Autowired
+    private IRentingPoolInnerServiceSMO rentingPoolInnerServiceSMOImpl;
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_RENTING_PAY_CONFIRM_PRE;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+
+    @Override
+    public void soService(ServiceDataFlowEvent event) {
+
+        logger.debug("ServiceDataFlowEvent : {}", event);
+
+        DataFlowContext dataFlowContext = event.getDataFlowContext();
+        AppService service = event.getAppService();
+
+        String paramIn = dataFlowContext.getReqData();
+
+        //校验数据
+        validate(paramIn);
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+
+        String oId = paramObj.getString("oId");
+        String money = paramObj.getString("money");
+        String feeName = paramObj.getString("feeName");
+        dataFlowContext.getRequestCurrentHeaders().put(CommonConstant.O_ID, oId);
+        RentingPoolDto rentingPoolDto = BeanConvertUtil.covertBean(paramObj, RentingPoolDto.class);
+
+        JSONArray businesses = new JSONArray();
+
+        //物业 收取费用
+        double propertyRate = Double.parseDouble(rentingPoolDto.getPropertySeparateRate());
+        BigDecimal serviceDec = new BigDecimal(propertyRate);
+        BigDecimal payMoney = new BigDecimal(money);
+        double receivableAmount = serviceDec.multiply(payMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        PayFeeDetailPo payFeeDetailPo = new PayFeeDetailPo();
+        payFeeDetailPo.setDetailId("-1");
+        payFeeDetailPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        payFeeDetailPo.setPrimeRate("1.0");
+        payFeeDetailPo.setCycles("1");
+        payFeeDetailPo.setReceivableAmount(receivableAmount + "");
+        payFeeDetailPo.setReceivedAmount(receivableAmount + "");
+        payFeeDetailPo.setCommunityId(rentingPoolDto.getCommunityId());
+        //添加单元信息
+        businesses.add(feeBMOImpl.addSimpleFeeDetail(payFeeDetailPo, dataFlowContext));
+
+        CommunityMemberDto communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(rentingPoolDto.getCommunityId());
+        communityMemberDto.setMemberTypeCd("390001200002");//查询物业
+        communityMemberDto.setAuditStatusCd(CommunityMemberDto.AUDIT_STATUS_NORMAL);
+        List<CommunityMemberDto> communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+
+        Assert.listOnlyOne(communityMemberDtos, "物业信息查询有误");
+
+        String propertyId = communityMemberDtos.get(0).getMemberId();
+        PayFeePo payFeePo = new PayFeePo();
+        payFeePo.setFeeId(payFeeDetailPo.getFeeId());
+        payFeePo.setFeeFlag(FeeDto.FEE_FLAG_ONCE);
+        payFeePo.setIncomeObjId(propertyId);
+        payFeePo.setCommunityId(rentingPoolDto.getCommunityId());
+        payFeePo.setUserId("-1");
+        payFeePo.setPayerObjId(rentingPoolDto.getRentingId());
+        payFeePo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setFeeTypeCd(FeeConfigDto.FEE_TYPE_CD_SYSTEM);
+        payFeePo.setAmount(receivableAmount + "");
+        payFeePo.setState(FeeDto.STATE_FINISH);
+        payFeePo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_RENTING);
+        payFeePo.setConfigId(FeeConfigDto.CONFIG_ID_RENTING);
+        businesses.add(feeBMOImpl.addSimpleFee(payFeePo, dataFlowContext));
+
+
+        //代理商分成
+        //物业 收取费用
+        double proxyRate = Double.parseDouble(rentingPoolDto.getProxySeparateRate());
+        serviceDec = new BigDecimal(proxyRate);
+        payMoney = new BigDecimal(money);
+        receivableAmount = serviceDec.multiply(payMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        payFeeDetailPo = new PayFeeDetailPo();
+        payFeeDetailPo.setDetailId("-2");
+        payFeeDetailPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        payFeeDetailPo.setPrimeRate("1.0");
+        payFeeDetailPo.setCycles("1");
+        payFeeDetailPo.setReceivableAmount(receivableAmount + "");
+        payFeeDetailPo.setReceivedAmount(receivableAmount + "");
+        payFeeDetailPo.setCommunityId(rentingPoolDto.getCommunityId());
+        //添加单元信息
+        businesses.add(feeBMOImpl.addSimpleFeeDetail(payFeeDetailPo, dataFlowContext));
+
+        communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(rentingPoolDto.getCommunityId());
+        communityMemberDto.setMemberTypeCd("390001200003");//查询代理商
+        communityMemberDto.setAuditStatusCd(CommunityMemberDto.AUDIT_STATUS_NORMAL);
+        communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+
+        Assert.listOnlyOne(communityMemberDtos, "代理商信息查询有误");
+
+        String proxyId = communityMemberDtos.get(0).getMemberId();
+        payFeePo = new PayFeePo();
+        payFeePo.setFeeId(payFeeDetailPo.getFeeId());
+        payFeePo.setFeeFlag(FeeDto.FEE_FLAG_ONCE);
+        payFeePo.setIncomeObjId(proxyId);
+        payFeePo.setCommunityId(rentingPoolDto.getCommunityId());
+        payFeePo.setUserId("-1");
+        payFeePo.setPayerObjId(rentingPoolDto.getRentingId());
+        payFeePo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setFeeTypeCd(FeeConfigDto.FEE_TYPE_CD_SYSTEM);
+        payFeePo.setAmount(receivableAmount + "");
+        payFeePo.setState(FeeDto.STATE_FINISH);
+        payFeePo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_RENTING);
+        payFeePo.setConfigId(FeeConfigDto.CONFIG_ID_RENTING);
+        businesses.add(feeBMOImpl.addSimpleFee(payFeePo, dataFlowContext));
+
+        //运营分成
+        //物业 收取费用
+        double adminRate = Double.parseDouble(rentingPoolDto.getAdminSeparateRate());
+        serviceDec = new BigDecimal(adminRate);
+        payMoney = new BigDecimal(money);
+        receivableAmount = serviceDec.multiply(payMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        payFeeDetailPo = new PayFeeDetailPo();
+        payFeeDetailPo.setDetailId("-3");
+        payFeeDetailPo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeeDetailPo.setFeeId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId));
+        payFeeDetailPo.setPrimeRate("1.0");
+        payFeeDetailPo.setCycles("1");
+        payFeeDetailPo.setReceivableAmount(receivableAmount + "");
+        payFeeDetailPo.setReceivedAmount(receivableAmount + "");
+        payFeeDetailPo.setCommunityId(rentingPoolDto.getCommunityId());
+        //添加单元信息
+        businesses.add(feeBMOImpl.addSimpleFeeDetail(payFeeDetailPo, dataFlowContext));
+
+        communityMemberDto = new CommunityMemberDto();
+        communityMemberDto.setCommunityId(rentingPoolDto.getCommunityId());
+        communityMemberDto.setMemberTypeCd("390001200003");//查询代理商
+        communityMemberDto.setAuditStatusCd(CommunityMemberDto.AUDIT_STATUS_NORMAL);
+        communityMemberDtos = communityInnerServiceSMOImpl.getCommunityMembers(communityMemberDto);
+
+        Assert.listOnlyOne(communityMemberDtos, "代理商信息查询有误");
+
+        String adminId = communityMemberDtos.get(0).getMemberId();
+        payFeePo = new PayFeePo();
+        payFeePo.setFeeId(payFeeDetailPo.getFeeId());
+        payFeePo.setFeeFlag(FeeDto.FEE_FLAG_ONCE);
+        payFeePo.setIncomeObjId(adminId);
+        payFeePo.setCommunityId(rentingPoolDto.getCommunityId());
+        payFeePo.setUserId("-1");
+        payFeePo.setPayerObjId(rentingPoolDto.getRentingId());
+        payFeePo.setEndTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setFeeTypeCd(FeeConfigDto.FEE_TYPE_CD_SYSTEM);
+        payFeePo.setAmount(receivableAmount + "");
+        payFeePo.setState(FeeDto.STATE_FINISH);
+        payFeePo.setStartTime(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        payFeePo.setPayerObjType(FeeDto.PAYER_OBJ_TYPE_RENTING);
+        payFeePo.setConfigId(FeeConfigDto.CONFIG_ID_RENTING);
+        businesses.add(feeBMOImpl.addSimpleFee(payFeePo, dataFlowContext));
+
+        ResponseEntity<String> responseEntity = feeBMOImpl.callService(dataFlowContext, service.getServiceCode(), businesses);
+        dataFlowContext.setResponseEntity(responseEntity);
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return;
+        }
+
+        RentingPoolPo rentingPoolPo = new RentingPoolPo();
+        rentingPoolPo.setRentingId(rentingPoolDto.getRentingId());
+        rentingPoolPo.setCommunityId(rentingPoolDto.getCommunityId());
+        rentingPoolPo.setState(RentingPoolDto.STATE_TO_PAY.equals(rentingPoolDto.getState()) ? RentingPoolDto.STATE_OWNER_TO_PAY : RentingPoolDto.STATE_APPLY_AGREE);
+        rentingPoolInnerServiceSMOImpl.updateRentingPool(rentingPoolPo);
+    }
+
+
+    /**
+     * 数据校验
+     *
+     * @param paramIn "communityId": "7020181217000001",
+     *                "memberId": "3456789",
+     *                "memberTypeCd": "390001200001"
+     */
+    private void validate(String paramIn) {
+        Assert.jsonObjectHaveKey(paramIn, "oId", "请求报文中未包含订单信息");
+        JSONObject paramInObj = JSONObject.parseObject(paramIn);
+        Assert.hasLength(paramInObj.getString("oId"), "订单信息不能为空");
+
+    }
+
+    @Override
+    public int getOrder() {
+        return DEFAULT_ORDER;
+    }
+
+}

+ 22 - 4
service-front/src/main/java/com/java110/front/controller/PaymentController.java

@@ -3,10 +3,7 @@ package com.java110.front.controller;
 import com.java110.core.base.controller.BaseController;
 import com.java110.core.context.IPageData;
 import com.java110.core.context.PageData;
-import com.java110.front.smo.payment.IRentingToPaySMO;
-import com.java110.front.smo.payment.IToNotifySMO;
-import com.java110.front.smo.payment.IToPaySMO;
-import com.java110.front.smo.payment.IToPayTempCarInoutSMO;
+import com.java110.front.smo.payment.*;
 import com.java110.utils.constant.CommonConstant;
 import com.java110.utils.util.StringUtil;
 import org.slf4j.Logger;
@@ -40,6 +37,11 @@ public class PaymentController extends BaseController {
     @Autowired
     private IToNotifySMO toNotifySMOImpl;
 
+    @Autowired
+    private IRentingToNotifySMO rentingToNotifySMOImpl;
+
+
+
     /**
      * <p>统一下单入口</p>
      *
@@ -118,4 +120,20 @@ public class PaymentController extends BaseController {
         return rentingToPaySMOImpl.toPay(newPd);
     }
 
+    /**
+     * <p>支付回调Api</p>
+     *
+     * @param request
+     * @throws Exception
+     */
+    @RequestMapping(path = "/rentingNotify", method = RequestMethod.POST)
+    public ResponseEntity<String> rentingNotify(@RequestBody String postInfo, HttpServletRequest request) {
+
+        logger.debug("微信支付回调报文" + postInfo);
+
+        return rentingToNotifySMOImpl.toNotify(postInfo, request);
+
+
+    }
+
 }

+ 18 - 0
service-front/src/main/java/com/java110/front/smo/payment/IRentingToNotifySMO.java

@@ -0,0 +1,18 @@
+package com.java110.front.smo.payment;
+
+import org.springframework.http.ResponseEntity;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 房屋租赁微信通知 支付完成
+ */
+public interface IRentingToNotifySMO {
+
+    /**
+     * 支付完成
+     * @param request
+     * @return
+     */
+    public ResponseEntity<String> toNotify(String param,HttpServletRequest request);
+}

+ 153 - 0
service-front/src/main/java/com/java110/front/smo/payment/impl/RentingToNotifySMOImpl.java

@@ -0,0 +1,153 @@
+package com.java110.front.smo.payment.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.core.factory.WechatFactory;
+import com.java110.dto.rentingPool.RentingPoolDto;
+import com.java110.dto.smallWeChat.SmallWeChatDto;
+import com.java110.front.properties.WechatAuthProperties;
+import com.java110.front.smo.AppAbstractComponentSMO;
+import com.java110.front.smo.payment.IRentingToNotifySMO;
+import com.java110.utils.cache.CommonCache;
+import com.java110.utils.cache.MappingCache;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.constant.ServiceConstant;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import com.java110.utils.util.PayUtil;
+import com.java110.utils.util.StringUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.*;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.HttpStatusCodeException;
+import org.springframework.web.client.RestTemplate;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.*;
+
+@Service("rentingToNotifySMOImpl")
+public class RentingToNotifySMOImpl implements IRentingToNotifySMO {
+    private static final Logger logger = LoggerFactory.getLogger(AppAbstractComponentSMO.class);
+
+    private static final String APP_ID = "992020011134400001";
+
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    @Autowired
+    private WechatAuthProperties wechatAuthProperties;
+
+    @Override
+    public ResponseEntity<String> toNotify(String param, HttpServletRequest request) {
+        String resXml = "";
+        ResponseEntity responseEntity = null;
+        try {
+
+            Map<String, Object> map = PayUtil.getMapFromXML(param);
+            logger.info("【小程序支付回调】 回调数据: \n" + map);
+            String returnCode = (String) map.get("return_code");
+            if ("SUCCESS".equalsIgnoreCase(returnCode)) {
+                String returnmsg = (String) map.get("result_code");
+                if ("SUCCESS".equals(returnmsg)) {
+                    //更新数据
+                    int result = confirmPayFee(map);
+                    if (result > 0) {
+                        //支付成功
+                        resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+                                + "<return_msg><![CDATA[OK]]></return_msg>" + "</xml>";
+                    }
+                } else {
+                    resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+                            + "<return_msg><![CDATA[报文为空]></return_msg>" + "</xml>";
+                    logger.info("支付失败:" + resXml);
+                }
+            } else {
+                resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+                        + "<return_msg><![CDATA[报文为空]></return_msg>" + "</xml>";
+                logger.info("【订单支付失败】");
+            }
+        } catch (Exception e) {
+            logger.error("通知失败", e);
+            resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+                    + "<return_msg><![CDATA[鉴权失败]></return_msg>" + "</xml>";
+        }
+
+        logger.info("【小程序支付回调响应】 响应内容:\n" + resXml);
+        return new ResponseEntity<String>(resXml, HttpStatus.OK);
+    }
+
+    public int confirmPayFee(Map<String, Object> map) {
+        String wId = map.get("wId").toString();
+        wId = wId.replace(" ", "+");
+        SortedMap<String, String> paramMap = new TreeMap<String, String>();
+        ResponseEntity<String> responseEntity = null;
+        for (String key : map.keySet()) {
+            if ("wId".equals(key)) {
+                continue;
+            }
+            paramMap.put(key, map.get(key).toString());
+        }
+        //String appId = WechatFactory.getAppId(wId);
+        SmallWeChatDto smallWeChatDto = new SmallWeChatDto();
+        smallWeChatDto.setAppId(wechatAuthProperties.getAppId());
+        smallWeChatDto.setAppSecret(wechatAuthProperties.getSecret());
+        smallWeChatDto.setMchId(wechatAuthProperties.getMchId());
+        smallWeChatDto.setPayPassword(wechatAuthProperties.getKey());
+        String sign = PayUtil.createSign(paramMap, smallWeChatDto.getPayPassword());
+
+        if (!sign.equals(map.get("sign"))) {
+            throw new IllegalArgumentException("鉴权失败");
+        }
+
+        String orderId = map.get("out_trade_no").toString();
+
+        String order = CommonCache.getAndRemoveValue(RentingPoolDto.REDIS_PAY_RENTING + orderId);
+
+        //查询用户ID
+        JSONObject paramIn = JSONObject.parseObject(order);
+        paramIn.put("oId", orderId);
+        String url = ServiceConstant.SERVICE_API_URL + "/api/fee.rentingPayFeeConfirm";
+        responseEntity = this.callCenterService(restTemplate, "-1", paramIn.toJSONString(), url, HttpMethod.POST);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return 0;
+        }
+        return 1;
+    }
+
+
+
+    /**
+     * 调用中心服务
+     *
+     * @return
+     */
+    protected ResponseEntity<String> callCenterService(RestTemplate restTemplate, String userId, String param, String url, HttpMethod httpMethod) {
+
+        ResponseEntity<String> responseEntity = null;
+        HttpHeaders header = new HttpHeaders();
+        header.add(CommonConstant.HTTP_APP_ID.toLowerCase(), APP_ID);
+        header.add(CommonConstant.HTTP_USER_ID.toLowerCase(), userId);
+        header.add(CommonConstant.HTTP_TRANSACTION_ID.toLowerCase(), UUID.randomUUID().toString());
+        header.add(CommonConstant.HTTP_REQ_TIME.toLowerCase(), DateUtil.getDefaultFormateTimeString(new Date()));
+        header.add(CommonConstant.HTTP_SIGN.toLowerCase(), "");
+        HttpEntity<String> httpEntity = new HttpEntity<String>(param, header);
+        //logger.debug("请求中心服务信息,{}", httpEntity);
+        try {
+            responseEntity = restTemplate.exchange(url, httpMethod, httpEntity, String.class);
+        } catch (HttpStatusCodeException e) { //这里spring 框架 在4XX 或 5XX 时抛出 HttpServerErrorException 异常,需要重新封装一下
+            responseEntity = new ResponseEntity<String>(e.getResponseBodyAsString(), e.getStatusCode());
+        } catch (Exception e) {
+            responseEntity = new ResponseEntity<String>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
+        } finally {
+            logger.debug("请求地址为,{} 请求中心服务信息,{},中心服务返回信息,{}", url, httpEntity, responseEntity);
+            return responseEntity;
+        }
+
+    }
+
+}

+ 9 - 2
service-front/src/main/java/com/java110/front/smo/payment/impl/RentingToPaySMOImpl.java

@@ -6,6 +6,7 @@ import com.java110.core.context.IPageData;
 import com.java110.core.context.PageData;
 import com.java110.core.factory.GenerateCodeFactory;
 import com.java110.dto.owner.OwnerAppUserDto;
+import com.java110.dto.rentingConfig.RentingConfigDto;
 import com.java110.dto.rentingPool.RentingPoolDto;
 import com.java110.dto.smallWeChat.SmallWeChatDto;
 import com.java110.front.properties.WechatAuthProperties;
@@ -110,10 +111,16 @@ public class RentingToPaySMOImpl extends AppAbstractComponentSMO implements IRen
         } else {
             throw new IllegalAccessException("当前状态不是支付状态");
         }
-
+        String rentingFormula = rentingPoolDto.getRentingFormula();
         BigDecimal serviceDec = new BigDecimal(service);
         BigDecimal rateDec = new BigDecimal(rate);
-        double money = serviceDec.multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        double money = 0.0;
+        if (RentingConfigDto.RENTING_FORMULA_RATE.equals(rentingFormula)) {
+            BigDecimal monthMoney = new BigDecimal(rentingPoolDto.getPrice());
+            money = serviceDec.multiply(rateDec).multiply(monthMoney).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        } else {
+            money = serviceDec.multiply(rateDec).setScale(2, BigDecimal.ROUND_HALF_EVEN).doubleValue();
+        }
 
         Map result = super.java110Payment(outRestTemplate, feeName, WechatAuthProperties.TRADE_TYPE_NATIVE, orderId, money, "", smallWeChatDto);
         result.put("money", money);