Browse Source

缴费功能开发完成

wuxw 7 years ago
parent
commit
eb325e8fec

+ 243 - 0
Api/src/main/java/com/java110/api/listener/fee/PayFeeListener.java

@@ -0,0 +1,243 @@
+package com.java110.api.listener.fee;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.listener.AbstractServiceApiDataFlowListener;
+import com.java110.common.constant.BusinessTypeConstant;
+import com.java110.common.constant.CommonConstant;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.ServiceCodeConstant;
+import com.java110.common.exception.ListenerExecuteException;
+import com.java110.common.util.Assert;
+import com.java110.common.util.BeanConvertUtil;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.smo.fee.IFeeConfigInnerServiceSMO;
+import com.java110.core.smo.fee.IFeeInnerServiceSMO;
+import com.java110.core.smo.room.IRoomInnerServiceSMO;
+import com.java110.dto.FeeConfigDto;
+import com.java110.dto.FeeDto;
+import com.java110.dto.RoomDto;
+import com.java110.entity.center.AppService;
+import com.java110.event.service.api.ServiceDataFlowEvent;
+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.ResponseEntity;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName PayFeeListener
+ * @Description TODO 缴费侦听
+ * @Author wuxw
+ * @Date 2019/6/3 13:46
+ * @Version 1.0
+ * add by wuxw 2019/6/3
+ **/
+@Java110Listener("payFeeListener")
+public class PayFeeListener extends AbstractServiceApiDataFlowListener {
+
+    private static Logger logger = LoggerFactory.getLogger(PayFeeListener.class);
+
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_PAY_FEE;
+    }
+
+    @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);
+
+        HttpHeaders header = new HttpHeaders();
+        dataFlowContext.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
+        JSONArray businesses = new JSONArray();
+
+        //添加单元信息
+        businesses.add(addFeeDetail(paramObj, dataFlowContext));
+        businesses.add(modifyFee(paramObj, dataFlowContext));
+
+        JSONObject paramInObj = super.restToCenterProtocol(businesses, dataFlowContext.getRequestCurrentHeaders());
+
+        //将 rest header 信息传递到下层服务中去
+        super.freshHttpHeader(header, dataFlowContext.getRequestCurrentHeaders());
+
+        ResponseEntity<String> responseEntity = this.callService(dataFlowContext, service.getServiceCode(), paramInObj);
+
+        dataFlowContext.setResponseEntity(responseEntity);
+
+    }
+
+    /**
+     * 添加费用明细信息
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject addFeeDetail(JSONObject paramInJson, 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 = new JSONObject();
+        businessFeeDetail.putAll(paramInJson);
+        businessFeeDetail.put("detailId", "-1");
+        businessFeeDetail.put("primeRate", "1.00");
+        //计算 应收金额
+        FeeDto feeDto = new FeeDto();
+        feeDto.setFeeId(paramInJson.getString("feeId"));
+        feeDto.setCommunityId(paramInJson.getString("communityId"));
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+
+        if (feeDtos == null || feeDtos.size() != 1){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
+        }
+
+        feeDto = feeDtos.get(0);
+        paramInJson.put("feeInfo",feeDto);
+        RoomDto roomDto = new RoomDto();
+        roomDto.setRoomId(feeDto.getPayerObjId());
+        roomDto.setCommunityId(feeDto.getCommunityId());
+        List<RoomDto> roomDtos = roomInnerServiceSMOImpl.queryRooms(roomDto);
+        if (roomDtos == null || roomDtos.size() != 1){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到房屋信息,查询多条数据");
+        }
+
+        roomDto = roomDtos.get(0);
+        String builtUpArea = roomDto.getBuiltUpArea();
+
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setFeeTypeCd(feeDto.getFeeTypeCd());
+        feeConfigDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+        if (feeConfigDtos == null || feeConfigDtos.size() != 1){
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到费用配置信息,查询多条数据");
+        }
+
+        feeConfigDto = feeConfigDtos.get(0);
+
+        double receivableAmount = Double.parseDouble(feeConfigDto.getSquarePrice())
+                                    * Double.parseDouble(builtUpArea)
+                                    + Double.parseDouble(feeConfigDto.getAdditionalAmount());
+        receivableAmount = Double.parseDouble(paramInJson.getString("cycles")) * receivableAmount;
+
+        businessFeeDetail.put("receivableAmount", receivableAmount);
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFeeDetail", businessFeeDetail);
+
+        return business;
+    }
+
+
+    /**
+     * 修改费用信息
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject modifyFee(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_FEE_INFO);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ+1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessFee = new JSONObject();
+        FeeDto feeInfo = (FeeDto)paramInJson.get("feeInfo");
+        Date endTime = feeInfo.getEndTime();
+        Calendar endCalender = Calendar.getInstance();
+        endCalender.setTime(endTime);
+        endCalender.add(Calendar.MONTH, Integer.parseInt(paramInJson.getString("cycles")));
+        feeInfo.setEndTime(endCalender.getTime());
+        BeanConvertUtil.beanCovertMap(feeInfo);
+        businessFee.putAll(BeanConvertUtil.beanCovertMap(feeInfo));
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFee", businessFee);
+
+        return business;
+    }
+
+    /**
+     * 数据校验
+     *
+     * @param paramIn "communityId": "7020181217000001",
+     *                "memberId": "3456789",
+     *                "memberTypeCd": "390001200001"
+     */
+    private void validate(String paramIn) {
+        Assert.jsonObjectHaveKey(paramIn, "communityId", "请求报文中未包含communityId节点");
+        Assert.jsonObjectHaveKey(paramIn, "cycles", "请求报文中未包含cycles节点");
+        Assert.jsonObjectHaveKey(paramIn, "receivedAmount", "请求报文中未包含receivedAmount节点");
+        Assert.jsonObjectHaveKey(paramIn, "feeId", "请求报文中未包含feeId节点");
+
+        JSONObject paramInObj = JSONObject.parseObject(paramIn);
+        Assert.hasLength(paramInObj.getString("communityId"), "小区ID不能为空");
+        Assert.hasLength(paramInObj.getString("cycles"), "周期不能为空");
+        Assert.hasLength(paramInObj.getString("receivedAmount"), "实收金额不能为空");
+        Assert.hasLength(paramInObj.getString("feeId"), "费用ID不能为空");
+
+    }
+
+    @Override
+    public int getOrder() {
+        return DEFAULT_ORDER;
+    }
+
+
+    public IFeeInnerServiceSMO getFeeInnerServiceSMOImpl() {
+        return feeInnerServiceSMOImpl;
+    }
+
+    public void setFeeInnerServiceSMOImpl(IFeeInnerServiceSMO feeInnerServiceSMOImpl) {
+        this.feeInnerServiceSMOImpl = feeInnerServiceSMOImpl;
+    }
+
+    public IFeeConfigInnerServiceSMO getFeeConfigInnerServiceSMOImpl() {
+        return feeConfigInnerServiceSMOImpl;
+    }
+
+    public void setFeeConfigInnerServiceSMOImpl(IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl) {
+        this.feeConfigInnerServiceSMOImpl = feeConfigInnerServiceSMOImpl;
+    }
+
+    public IRoomInnerServiceSMO getRoomInnerServiceSMOImpl() {
+        return roomInnerServiceSMOImpl;
+    }
+
+    public void setRoomInnerServiceSMOImpl(IRoomInnerServiceSMO roomInnerServiceSMOImpl) {
+        this.roomInnerServiceSMOImpl = roomInnerServiceSMOImpl;
+    }
+}

+ 10 - 0
WebService/src/main/java/com/java110/web/components/fee/PropertyPayComponent.java

@@ -25,6 +25,16 @@ public class PropertyPayComponent {
     }
 
 
+    /**
+     * 缴费
+     * @param pd 页面数据封装
+     * @return 缴费接口
+     */
+    public ResponseEntity<String> payFee(IPageData pd) {
+        return feeServiceSMOImpl.payFee(pd);
+    }
+
+
     public IFeeServiceSMO getFeeServiceSMOImpl() {
         return feeServiceSMOImpl;
     }

+ 8 - 0
WebService/src/main/java/com/java110/web/smo/IFeeServiceSMO.java

@@ -16,6 +16,14 @@ public interface IFeeServiceSMO {
      */
     ResponseEntity<String> loadPropertyConfigFee(IPageData pd);
 
+    /**
+     * 缴费
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    ResponseEntity<String> payFee(IPageData pd);
+
     /**
      * 查询主费用
      *

+ 45 - 0
WebService/src/main/java/com/java110/web/smo/impl/FeeServiceSMOImpl.java

@@ -76,6 +76,34 @@ public class FeeServiceSMOImpl extends BaseComponentSMO implements IFeeServiceSM
         return responseEntity;
     }
 
+    @Override
+    public ResponseEntity<String> payFee(IPageData pd) {
+        validatePayFee(pd);
+
+        //校验员工是否有权限操作
+        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_PROPERTY_FEE);
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        String communityId = paramIn.getString("communityId");
+        ResponseEntity responseEntity = super.getStoreInfo(pd, restTemplate);
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return responseEntity;
+        }
+        Assert.jsonObjectHaveKey(responseEntity.getBody().toString(), "storeId", "根据用户ID查询商户ID失败,未包含storeId节点");
+        Assert.jsonObjectHaveKey(responseEntity.getBody().toString(), "storeTypeCd", "根据用户ID查询商户类型失败,未包含storeTypeCd节点");
+
+        String storeId = JSONObject.parseObject(responseEntity.getBody().toString()).getString("storeId");
+        String storeTypeCd = JSONObject.parseObject(responseEntity.getBody().toString()).getString("storeTypeCd");
+        //数据校验是否 商户是否入驻该小区
+        super.checkStoreEnterCommunity(pd, storeId, storeTypeCd, communityId, restTemplate);
+        responseEntity = this.callCenterService(restTemplate, pd, paramIn.toJSONString(),
+                ServiceConstant.SERVICE_API_URL + "/api/fee.payFee",
+                HttpMethod.POST);
+
+
+        return responseEntity;
+    }
+
     /**
      * 查询主费用
      * @param pd 页面数据封装对象
@@ -183,6 +211,23 @@ public class FeeServiceSMOImpl extends BaseComponentSMO implements IFeeServiceSM
         Assert.hasLength(paramIn.getString("feeTypeCd"), "费用类型不能为空");
     }
 
+    /**
+     * 校验缴费参数
+     * @param pd
+     */
+    private void validatePayFee(IPageData pd) {
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "请求报文中未包含communityId节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "cycles", "请求报文中未包含cycles节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "receivedAmount", "请求报文中未包含receivedAmount节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "feeId", "请求报文中未包含feeId节点");
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        Assert.hasLength(paramIn.getString("communityId"), "小区ID不能为空");
+        Assert.hasLength(paramIn.getString("cycles"), "周期不能为空");
+        Assert.hasLength(paramIn.getString("receivedAmount"), "实收金额不能为空");
+        Assert.hasLength(paramIn.getString("feeId"), "费用ID不能为空");
+    }
+
 
     private void validateLoadFeeDetail(IPageData pd) {
         Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "请求报文中未包含communityId节点");

+ 1 - 0
java110-common/src/main/java/com/java110/common/constant/BusinessTypeConstant.java

@@ -299,6 +299,7 @@ public class BusinessTypeConstant {
      */
     public static final String BUSINESS_TYPE_DELETE_FEE_CONFIG = "620100050001";
 
+
     /**
      * 删除住户
      */

+ 3 - 0
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java

@@ -439,4 +439,7 @@ public class ServiceCodeConstant {
 
     //修改费用配置
     public static final String SERVICE_CODE_UPDATE_FEE_CONFIG = "fee.updateFeeConfig";
+
+    //缴费
+    public static final String SERVICE_CODE_PAY_FEE = "fee.payFee";
 }