瀏覽代碼

停车位售卖 开发完成待测试

吴学文 7 年之前
父節點
當前提交
60b9676255

+ 301 - 0
Api/src/main/java/com/java110/api/listener/parkingSpace/SellParkingSpaceListener.java

@@ -0,0 +1,301 @@
+package com.java110.api.listener.parkingSpace;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.listener.AbstractServiceApiDataFlowListener;
+import com.java110.common.constant.*;
+import com.java110.common.exception.ListenerExecuteException;
+import com.java110.common.util.Assert;
+import com.java110.common.util.DateUtil;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.factory.GenerateCodeFactory;
+import com.java110.core.smo.fee.IFeeConfigInnerServiceSMO;
+import com.java110.core.smo.parkingSpace.IParkingSpaceInnerServiceSMO;
+import com.java110.dto.FeeConfigDto;
+import com.java110.dto.ParkingSpaceDto;
+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.List;
+
+/**
+ * @ClassName SaveParkingSpaceListener
+ * @Description 保存小区楼信息
+ * @Author wuxw
+ * @Date 2019/4/26 14:51
+ * @Version 1.0
+ * add by wuxw 2019/4/26
+ **/
+
+@Java110Listener("sellParkingSpaceListener")
+public class SellParkingSpaceListener extends AbstractServiceApiDataFlowListener {
+
+
+    private static Logger logger = LoggerFactory.getLogger(SellParkingSpaceListener.class);
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+    @Autowired
+    private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_SELL_PARKING_SPACE;
+    }
+
+    @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();
+
+        String feeId = GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_feeId);
+        paramObj.put("feeId", feeId);
+
+        //添加小区楼
+        businesses.add(sellParkingSpace(paramObj));
+
+        businesses.add(modifyParkingSpaceState(paramObj));
+
+        //添加物业费用信息
+        businesses.add(addParkingSpaceFee(paramObj, dataFlowContext));
+
+        businesses.add(addFeeDetail(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);
+
+    }
+
+
+    /**
+     * 添加小区楼信息
+     * <p>
+     * * name:'',
+     * *                 age:'',
+     * *                 link:'',
+     * *                 sex:'',
+     * *                 remark:''
+     *
+     * @param paramInJson 接口调用放传入入参
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject sellParkingSpace(JSONObject paramInJson) {
+
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_OWNER_CAR);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessOwnerCar = new JSONObject();
+        businessOwnerCar.putAll(paramInJson);
+        businessOwnerCar.put("carId", "-1");
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessOwnerCar", businessOwnerCar);
+
+        return business;
+    }
+
+    /**
+     * 修改停车位状态信息
+     *
+     * @param paramInJson 接口调用放传入入参
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject modifyParkingSpaceState(JSONObject paramInJson) {
+
+        ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
+        parkingSpaceDto.setCommunityId(paramInJson.getString("communityId"));
+        parkingSpaceDto.setPsId(paramInJson.getString("psId"));
+        List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
+
+        if (parkingSpaceDtos == null || parkingSpaceDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查询到停车位信息" + JSONObject.toJSONString(parkingSpaceDto));
+        }
+
+        parkingSpaceDto = parkingSpaceDtos.get(0);
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_PARKING_SPACE);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessParkingSpace = new JSONObject();
+
+        businessParkingSpace.putAll(paramInJson);
+        businessParkingSpace.put("state", "S");
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessParkingSpace", businessParkingSpace);
+
+        return business;
+    }
+
+
+    /**
+     * 添加物业费用
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject addParkingSpaceFee(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+        //根据停车位ID查询是地上还是地下停车位
+        ParkingSpaceDto parkingSpaceDto = new ParkingSpaceDto();
+        parkingSpaceDto.setPsId(paramInJson.getString("psId"));
+        parkingSpaceDto.setCommunityId(paramInJson.getString("communityId"));
+        List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
+
+        if (parkingSpaceDtos == null || parkingSpaceDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未找到或找到多条车位信息");
+        }
+
+        parkingSpaceDto = parkingSpaceDtos.get(0);
+        paramInJson.put("parkingSpaceDto", parkingSpaceDto);
+
+        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 + 2);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessUnit = new JSONObject();
+        businessUnit.put("feeId", paramInJson.getString("feeId"));
+        businessUnit.put("feeTypeCd", "1001".equals(parkingSpaceDto.getTypeCd())
+                ? FeeTypeConstant.FEE_TYPE_SELL_UP_PARKING_SPACE : FeeTypeConstant.FEE_TYPE_SELL_DOWN_PARKING_SPACE);
+        businessUnit.put("incomeObjId", paramInJson.getString("storeId"));
+        businessUnit.put("amount", "-1.00");
+        businessUnit.put("startTime", DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_A));
+        businessUnit.put("endTime", "3000-01-01 00:00:00");
+        businessUnit.put("communityId", paramInJson.getString("communityId"));
+        businessUnit.put("payerObjId", paramInJson.getString("psId"));
+        businessUnit.put("userId", dataFlowContext.getRequestCurrentHeaders().get(CommonConstant.HTTP_USER_ID));
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFee", businessUnit);
+
+        return business;
+    }
+
+    /**
+     * 添加费用明细信息
+     *
+     * @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 + 3);
+        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");
+        businessFeeDetail.put("cycles", "1");
+
+        ParkingSpaceDto parkingSpaceDto = (ParkingSpaceDto) paramInJson.get("parkingSpaceDto");
+        String feeTypeCd = "1001".equals(parkingSpaceDto.getTypeCd()) ? FeeTypeConstant.FEE_TYPE_SELL_UP_PARKING_SPACE
+                : FeeTypeConstant.FEE_TYPE_SELL_DOWN_PARKING_SPACE;
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setFeeTypeCd(feeTypeCd);
+        feeConfigDto.setCommunityId(paramInJson.getString("communityId"));
+        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.getAdditionalAmount());
+        receivableAmount = Double.parseDouble(paramInJson.getString("cycles")) * receivableAmount;
+
+        businessFeeDetail.put("receivableAmount", receivableAmount);
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFeeDetail", businessFeeDetail);
+
+        return business;
+    }
+
+    /**
+     * 数据校验
+     * <p>
+     * name:'',
+     * age:'',
+     * link:'',
+     * sex:'',
+     * remark:''
+     *
+     * @param paramIn "communityId": "7020181217000001",
+     *                "memberId": "3456789",
+     *                "memberTypeCd": "390001200001"
+     */
+    private void validate(String paramIn) {
+
+        Assert.jsonObjectHaveKey(paramIn, "communityId", "未包含小区ID");
+        Assert.jsonObjectHaveKey(paramIn, "ownerId", "请求报文中未包含ownerId");
+        Assert.jsonObjectHaveKey(paramIn, "carNum", "请求报文中未包含carNum");
+        Assert.jsonObjectHaveKey(paramIn, "carBrand", "请求报文中未包含carBrand");
+        Assert.jsonObjectHaveKey(paramIn, "carType", "请求报文中未包含carType");
+        Assert.jsonObjectHaveKey(paramIn, "carColor", "未包含carColor");
+        Assert.jsonObjectHaveKey(paramIn, "psId", "未包含psId");
+        Assert.jsonObjectHaveKey(paramIn, "storeId", "未包含storeId");
+        Assert.jsonObjectHaveKey(paramIn, "storeId", "未包含storeId");
+        Assert.jsonObjectHaveKey(paramIn, "receivedAmount", "未包含receivedAmount");
+
+        JSONObject paramInObj = JSONObject.parseObject(paramIn);
+        Assert.hasLength(paramInObj.getString("communityId"), "小区ID不能为空");
+        Assert.hasLength(paramInObj.getString("ownerId"), "ownerId不能为空");
+        Assert.hasLength(paramInObj.getString("psId"), "psId不能为空");
+        Assert.isMoney(paramInObj.getString("receivedAmount"), "不是有效的实收金额");
+    }
+
+
+    @Override
+    public int getOrder() {
+        return 0;
+    }
+
+    public IFeeConfigInnerServiceSMO getFeeConfigInnerServiceSMOImpl() {
+        return feeConfigInnerServiceSMOImpl;
+    }
+
+    public void setFeeConfigInnerServiceSMOImpl(IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl) {
+        this.feeConfigInnerServiceSMOImpl = feeConfigInnerServiceSMOImpl;
+    }
+
+    public IParkingSpaceInnerServiceSMO getParkingSpaceInnerServiceSMOImpl() {
+        return parkingSpaceInnerServiceSMOImpl;
+    }
+
+    public void setParkingSpaceInnerServiceSMOImpl(IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl) {
+        this.parkingSpaceInnerServiceSMOImpl = parkingSpaceInnerServiceSMOImpl;
+    }
+}

+ 65 - 0
WebService/src/main/java/com/java110/web/components/car/SellCarComponent.java

@@ -0,0 +1,65 @@
+package com.java110.web.components.car;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.constant.FeeTypeConstant;
+import com.java110.core.context.IPageData;
+import com.java110.web.smo.ICarServiceSMO;
+import com.java110.web.smo.IFeeServiceSMO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+/**
+ * 车辆管理
+ */
+@Component("sellCar")
+public class SellCarComponent {
+
+    @Autowired
+    private ICarServiceSMO carServiceSMOImpl;
+
+
+    @Autowired
+    private IFeeServiceSMO feeServiceSMOImpl;
+
+    /**
+     * 查询小区楼信息
+     *
+     * @param pd 页面封装对象 包含页面请求数据
+     * @return ResponseEntity对象返回给页面
+     */
+    public ResponseEntity<String> sell(IPageData pd) {
+
+        return carServiceSMOImpl.saveCar(pd);
+    }
+
+    /**
+     * 查询出售费用配置
+     *
+     * @param pd 页面封装对象 包含页面请求数据
+     * @return ResponseEntity对象返回给页面
+     */
+    public ResponseEntity<String> loadSellParkingSpaceConfigData(IPageData pd) {
+        String paramIn = pd.getReqData();
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+        return feeServiceSMOImpl.loadPropertyConfigFee(pd, "1001".equals(paramObj.getString("typeCd"))
+                ? FeeTypeConstant.FEE_TYPE_SELL_UP_PARKING_SPACE : FeeTypeConstant.FEE_TYPE_SELL_DOWN_PARKING_SPACE);
+    }
+
+
+    public ICarServiceSMO getCarServiceSMOImpl() {
+        return carServiceSMOImpl;
+    }
+
+    public void setCarServiceSMOImpl(ICarServiceSMO carServiceSMOImpl) {
+        this.carServiceSMOImpl = carServiceSMOImpl;
+    }
+
+    public IFeeServiceSMO getFeeServiceSMOImpl() {
+        return feeServiceSMOImpl;
+    }
+
+    public void setFeeServiceSMOImpl(IFeeServiceSMO feeServiceSMOImpl) {
+        this.feeServiceSMOImpl = feeServiceSMOImpl;
+    }
+}

+ 2 - 1
WebService/src/main/java/com/java110/web/components/fee/PropertyPayComponent.java

@@ -1,5 +1,6 @@
 package com.java110.web.components.fee;
 
+import com.java110.common.constant.FeeTypeConstant;
 import com.java110.core.context.IPageData;
 import com.java110.web.smo.IFeeServiceSMO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +22,7 @@ public class PropertyPayComponent {
     private IFeeServiceSMO feeServiceSMOImpl;
 
     public ResponseEntity<String> loadPropertyConfigData(IPageData pd) {
-        return feeServiceSMOImpl.loadPropertyConfigFee(pd);
+        return feeServiceSMOImpl.loadPropertyConfigFee(pd, FeeTypeConstant.FEE_TYPE_PROPERTY);
     }
 
 

+ 2 - 1
WebService/src/main/java/com/java110/web/components/fee/ViewPropertyFeeConfigComponent.java

@@ -1,5 +1,6 @@
 package com.java110.web.components.fee;
 
+import com.java110.common.constant.FeeTypeConstant;
 import com.java110.core.context.IPageData;
 import com.java110.web.smo.IFeeServiceSMO;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -21,7 +22,7 @@ public class ViewPropertyFeeConfigComponent {
     private IFeeServiceSMO feeServiceSMOImpl;
 
     public ResponseEntity<String> loadData(IPageData pd) {
-        return feeServiceSMOImpl.loadPropertyConfigFee(pd);
+        return feeServiceSMOImpl.loadPropertyConfigFee(pd, FeeTypeConstant.FEE_TYPE_PROPERTY);
     }
 
 

+ 43 - 0
WebService/src/main/java/com/java110/web/smo/ICarServiceSMO.java

@@ -0,0 +1,43 @@
+package com.java110.web.smo;
+
+import com.java110.core.context.IPageData;
+import org.springframework.http.ResponseEntity;
+
+/**
+ * 小区楼接口类
+ */
+public interface ICarServiceSMO {
+
+    /**
+     * 查询小区楼信息
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    ResponseEntity<String> listCar(IPageData pd);
+
+
+    /**
+     * 添加小区楼信息
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    ResponseEntity<String> saveCar(IPageData pd);
+
+    /**
+     * 编辑小区楼信息
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    ResponseEntity<String> editCar(IPageData pd);
+
+    /**
+     * 删除小区楼
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    ResponseEntity<String> deleteCar(IPageData pd);
+}

+ 2 - 1
WebService/src/main/java/com/java110/web/smo/IFeeServiceSMO.java

@@ -12,9 +12,10 @@ public interface IFeeServiceSMO {
      * 物业配置费
      *
      * @param pd 页面数据封装对象
+     * @param feeTypeCd 费用类型
      * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
      */
-    ResponseEntity<String> loadPropertyConfigFee(IPageData pd);
+    ResponseEntity<String> loadPropertyConfigFee(IPageData pd, String feeTypeCd);
 
     /**
      * 缴费

+ 282 - 0
WebService/src/main/java/com/java110/web/smo/impl/CarServiceSMOImpl.java

@@ -0,0 +1,282 @@
+package com.java110.web.smo.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.common.constant.PrivilegeCodeConstant;
+import com.java110.common.constant.ResponseConstant;
+import com.java110.common.constant.ServiceConstant;
+import com.java110.common.exception.SMOException;
+import com.java110.common.util.Assert;
+import com.java110.core.context.IPageData;
+import com.java110.web.core.BaseComponentSMO;
+import com.java110.web.smo.ICarServiceSMO;
+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 org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+/**
+ * 小区楼实现类
+ * <p>
+ * add by wuxw 2019-04-22
+ */
+
+@Service("carServiceSMOImpl")
+public class CarServiceSMOImpl extends BaseComponentSMO implements ICarServiceSMO {
+
+    private static Logger logger = LoggerFactory.getLogger(CarServiceSMOImpl.class);
+
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+    /**
+     * 查询小区楼
+     *
+     * @param pd 页面数据封装对象
+     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
+     */
+    @Override
+    public ResponseEntity<String> listCar(IPageData pd) {
+
+        validateListCar(pd);
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        int page = Integer.parseInt(paramIn.getString("page"));
+        int row = Integer.parseInt(paramIn.getString("row"));
+        String communityId = paramIn.getString("communityId");
+
+
+        //校验用户是否有权限
+        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_FLOOR);
+
+        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);
+        String apiUrl = ServiceConstant.SERVICE_API_URL + "/api/car.queryCars" + mapToUrlParam(paramIn);
+
+
+        responseEntity = this.callCenterService(restTemplate, pd, "",
+                apiUrl,
+                HttpMethod.GET);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return responseEntity;
+        }
+
+        JSONObject resultObjs = JSONObject.parseObject(responseEntity.getBody().toString());
+        resultObjs.put("row", row);
+        resultObjs.put("page", page);
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> saveCar(IPageData pd) {
+
+        validateSaveCar(pd);
+
+        //校验员工是否有权限操作
+        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_CAR);
+
+        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);
+        paramIn.put("userId", pd.getUserId());
+        paramIn.put("storeId", storeId);
+        responseEntity = this.callCenterService(restTemplate, pd, paramIn.toJSONString(),
+                ServiceConstant.SERVICE_API_URL + "/api/parkingSpace.sellParkingSpace",
+                HttpMethod.POST);
+
+        return responseEntity;
+    }
+
+    /**
+     * 编辑小区楼信息
+     *
+     * @param pd 页面数据封装对象
+     * @return
+     */
+    @Override
+    public ResponseEntity<String> editCar(IPageData pd) {
+
+        validateEditCar(pd);
+
+        //校验员工是否有权限操作
+        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_FLOOR);
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        if (paramIn.getString("carId").equals(paramIn.getString("memberId"))) {
+            paramIn.put("carTypeCd", "1001");
+        } else {
+            paramIn.put("carTypeCd", "1002");
+        }
+        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);
+        paramIn.put("userId", pd.getUserId());
+        responseEntity = this.callCenterService(restTemplate, pd, paramIn.toJSONString(),
+                ServiceConstant.SERVICE_API_URL + "/api/car.editCar",
+                HttpMethod.POST);
+
+        return responseEntity;
+    }
+
+    @Override
+    public ResponseEntity<String> deleteCar(IPageData pd) {
+        validateDeleteCar(pd);
+        //校验员工是否有权限操作
+        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_FLOOR);
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        if (paramIn.getString("carId").equals(paramIn.getString("memberId"))) {
+            paramIn.put("carTypeCd", "1001");
+        } else {
+            paramIn.put("carTypeCd", "1002");
+        }
+        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/car.deleteCar",
+                HttpMethod.POST);
+
+        return responseEntity;
+    }
+
+    /**
+     * 删除小区楼 校验
+     *
+     * @param pd 页面数据封装
+     */
+    private void validateDeleteCar(IPageData pd) {
+
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "未包含小区ID");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "memberId", "未包含业主ID");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carId", "未包含业主ID");
+        //Assert.jsonObjectHaveKey(pd.getReqData(), "carTypeCd", "请求报文中未包含carTypeCd节点");
+
+    }
+
+    /**
+     * 校验保存小区楼 信息
+     *
+     * @param pd 页面数据封装
+     */
+    private void validateEditCar(IPageData pd) {
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "未包含小区ID");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "memberId", "未包含memberId");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carId", "未包含carId");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "name", "请求报文中未包含name");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "age", "请求报文中未包含age");
+        //Assert.jsonObjectHaveKey(pd.getReqData(), "carTypeCd", "请求报文中未包含carTypeCd节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "link", "请求报文中未包含link");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "sex", "请求报文中未包含sex");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "remark", "未包含小区楼备注");
+    }
+
+    /**
+     * 校验保存小区楼 信息
+     *
+     * @param pd 页面数据封装
+     */
+    private void validateSaveCar(IPageData pd) {
+
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "未包含小区ID");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "ownerId", "请求报文中未包含ownerId");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carNum", "请求报文中未包含carNum");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carBrand", "请求报文中未包含carBrand");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carType", "请求报文中未包含carType");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carColor", "未包含carColor");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "psId", "未包含psId");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "receivedAmount", "未包含receivedAmount");
+
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        Assert.hasLength(paramIn.getString("communityId"), "小区ID不能为空");
+        Assert.hasLength(paramIn.getString("ownerId"), "ownerId不能为空");
+        Assert.hasLength(paramIn.getString("psId"), "psId不能为空");
+        Assert.hasLength(paramIn.getString("receivedAmount"), "receivedAmount不能为空");
+    }
+
+    /**
+     * 校验查询小区楼信息
+     *
+     * @param pd 页面封装对象
+     */
+    private void validateListCar(IPageData pd) {
+        Assert.jsonObjectHaveKey(pd.getReqData(), "page", "请求报文中未包含page节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "row", "请求报文中未包含row节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carTypeCd", "请求报文中未包含carTypeCd节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "请求报文中未包含communityId节点");
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        Assert.isInteger(paramIn.getString("page"), "page不是数字");
+        Assert.isInteger(paramIn.getString("row"), "rows不是数字");
+        Assert.hasLength(paramIn.getString("communityId"), "小区ID不能为空");
+        int row = Integer.parseInt(paramIn.getString("row"));
+
+
+        if (row > MAX_ROW) {
+            throw new SMOException(ResponseConstant.RESULT_CODE_ERROR, "row 数量不能大于50");
+        }
+
+    }
+    /**
+     * 校验查询小区楼信息
+     *
+     * @param pd 页面封装对象
+     */
+    private void validateListCarMember(IPageData pd) {
+        Assert.jsonObjectHaveKey(pd.getReqData(), "carId", "请求报文中未包含carId节点");
+        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "请求报文中未包含communityId节点");
+        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
+        Assert.hasLength(paramIn.getString("communityId"), "小区ID不能为空");
+
+    }
+
+
+    public RestTemplate getRestTemplate() {
+        return restTemplate;
+    }
+
+    public void setRestTemplate(RestTemplate restTemplate) {
+        this.restTemplate = restTemplate;
+    }
+}

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

@@ -32,7 +32,7 @@ public class FeeServiceSMOImpl extends BaseComponentSMO implements IFeeServiceSM
     private RestTemplate restTemplate;
 
     @Override
-    public ResponseEntity<String> loadPropertyConfigFee(IPageData pd) {
+    public ResponseEntity<String> loadPropertyConfigFee(IPageData pd, String feeTypeCd) {
         validateLoadPropertyConfigFee(pd);
 
         //校验员工是否有权限操作
@@ -51,7 +51,7 @@ public class FeeServiceSMOImpl extends BaseComponentSMO implements IFeeServiceSM
         String storeTypeCd = JSONObject.parseObject(responseEntity.getBody().toString()).getString("storeTypeCd");
         //数据校验是否 商户是否入驻该小区
         super.checkStoreEnterCommunity(pd, storeId, storeTypeCd, communityId, restTemplate);
-        paramIn.put("feeTypeCd", FeeTypeConstant.FEE_TYPE_PROPERTY);
+        paramIn.put("feeTypeCd", feeTypeCd);
         responseEntity = this.callCenterService(restTemplate, pd, "",
                 ServiceConstant.SERVICE_API_URL + "/api/fee.queryFeeConfig" + mapToUrlParam(paramIn),
                 HttpMethod.GET);

+ 1 - 1
WebService/src/main/resources/components/add-car/addCar.html

@@ -40,7 +40,7 @@
                         <div class="form-group row">
                             <label class="col-sm-2 col-form-label">备注</label>
                             <div class="col-sm-10">
-                                <textarea v-model="addCarInfo.remark" type="text" placeholder="请填写备注信息" rows="3" class="form-control"></textarea>
+                                <textarea v-model="addCarInfo.carRemark" type="text" placeholder="请填写备注信息" rows="3" class="form-control"></textarea>
                             </div>
                         </div>
                     </div>

+ 2 - 2
WebService/src/main/resources/components/add-car/addCar.js

@@ -10,11 +10,11 @@
                 carBrand:'',
                 carType:'',
                 carColor:'',
-                remark:""
+                carRemark:""
             }
         },
         watch:{
-            otherInfo:{
+            addCarInfo:{
                 deep: true,
                 handler:function(){
                     vc.emit('sellCar','notify',vc.component.addCarInfo);

+ 28 - 0
WebService/src/main/resources/components/sell-car/sellCar.html

@@ -12,6 +12,34 @@
                callBackComponent="sellCar"
     ></vc:create>
 
+    <div class="row">
+        <div class="col-lg-12">
+            <div class="ibox ">
+                <div class="ibox-title">
+                    <h5>收费信息</h5>
+                </div>
+                <div class="ibox-content">
+                    <div>
+                        <div>
+                            <div class="form-group row">
+                                <label class="col-sm-2 col-form-label">应收费用</label>
+                                <div class="col-sm-10">
+                                    <input v-model="sellCarInfo.receivableAmount" type="text" disabled class="form-control">
+                                </div>
+                            </div>
+                            <div class="form-group row">
+                                <label class="col-sm-2 col-form-label">实收费用</label>
+                                <div class="col-sm-10">
+                                    <input v-model="sellCarInfo.receivedAmount" type="text" placeholder="必填,请填写实际收取费用" class="form-control">
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </div>
+    </div>
+
     <div class="">
         <button class="btn btn-primary float-right" type="button" v-on:click="doSellCar()" ><i class="fa fa-check"></i>&nbsp;我要售卖</button>
     </div>

+ 96 - 9
WebService/src/main/resources/components/sell-car/sellCar.js

@@ -10,8 +10,11 @@
                 carBrand:'',
                 carType:'',
                 carColor:'',
-                remark:"",
-                psId:''
+                carRemark:"",
+                psId:'',
+                typeCd:'',
+                receivableAmount: "0.00",
+                receivedAmount:"0.00"
             }
         },
         _initMethod:function(){
@@ -19,7 +22,12 @@
         },
         _initEvent:function(){
             vc.on('sellCar','notify',function(_param){
-                  vc.copyObject(_param,vc.component.sellCarInfo.ownerInfo);
+                  vc.copyObject(_param,vc.component.sellCarInfo);
+
+                  if(_param.hasOwnProperty("typeCd")){
+                        vc.component.computeReceivableAmount();
+                  }
+
             });
         },
         methods:{
@@ -34,22 +42,68 @@
                                     errInfo:"未选择业主"
                                 }
                             ],
-                            'sellCarInfo.roomId':[
+                            'sellCarInfo.psId':[
                                 {
                                     limit:"required",
                                     param:"",
-                                    errInfo:"未选择房屋"
+                                    errInfo:"未选择停车位"
                                 }
                             ],
-                            'sellCarInfo.state':[
+                            'sellCarInfo.carNum':[
                                 {
                                     limit:"required",
                                     param:"",
-                                    errInfo:"未选择出售状态"
+                                    errInfo:"车牌号不能为空"
+                                },
+                                {
+                                    limit:"maxin",
+                                    param:"2,12",
+                                    errInfo:"车牌号不正确"
                                 }
                             ],
-
-
+                            'sellCarInfo.carBrand':[
+                                {
+                                    limit:"required",
+                                    param:"",
+                                    errInfo:"车品牌不能为空"
+                                },
+                                {
+                                    limit:"maxLength",
+                                    param:"50",
+                                    errInfo:"车品牌超出限制"
+                                }
+                            ],
+                            'sellCarInfo.carType':[
+                                {
+                                    limit:"required",
+                                    param:"",
+                                    errInfo:"车类型不能为空"
+                                }
+                            ],
+                            'sellCarInfo.carColor':[
+                                {
+                                    limit:"required",
+                                    param:"",
+                                    errInfo:"车颜色不能为空"
+                                },
+                                {
+                                    limit:"maxLength",
+                                    param:"12",
+                                    errInfo:"车颜色超出限制"
+                                }
+                            ],
+                            'sellCarInfo.receivedAmount':[
+                                {
+                                    limit:"required",
+                                    param:"",
+                                    errInfo:"实收金额不能为空"
+                                },
+                                {
+                                    limit:"money",
+                                    param:"",
+                                    errInfo:"实收金额格式错误,如3.00"
+                                }
+                            ]
                         });
              },
 
@@ -59,6 +113,8 @@
                     vc.message(vc.validate.errInfo);
                     return ;
                 }
+                //改remark
+                vc.component.sellCarInfo.remark = vc.component.sellCarInfo.carRemark;
 
                 vc.component.sellCarInfo.communityId=vc.getCurrentCommunity().communityId;
             vc.http.post(
@@ -83,6 +139,37 @@
                         vc.message(errInfo);
                      });
 
+            },
+            computeReceivableAmount:function(){
+                //
+                var param = {
+                        params:{
+                            communityId:vc.getCurrentCommunity().communityId,
+                            typeCd:vc.component.sellCarInfo.typeCd
+                        }
+                    };
+                    vc.http.get(
+                        'sellCar',
+                        'loadSellParkingSpaceConfigData',
+                         param,
+                         function(json,res){
+                            //vm.menus = vm.refreshMenuActive(JSON.parse(json),0);
+                            if(res.status == 200){
+                                //关闭model
+                                var configFee = JSON.parse(json);
+
+                                vc.component.sellCarInfo.receivableAmount = configFee.additionalAmount;
+                                vc.component.sellCarInfo.receivedAmount = configFee.additionalAmount;
+                                return ;
+                            }
+                            vc.message(json);
+                         },
+                         function(errInfo,error){
+                            console.log('请求失败处理');
+
+                            vc.message(errInfo);
+                         });
+
             }
         }
     });

+ 23 - 1
java110-common/src/main/java/com/java110/common/constant/FeeTypeConstant.java

@@ -20,7 +20,29 @@ public class FeeTypeConstant {
     /**
      * 物业费
      */
-    public final static String FEE_TYPE_PROPERTY = "888800010001";
+    public static final String FEE_TYPE_PROPERTY = "888800010001";
+
+
+
+    /**
+     * 停车费 地上 出售费用类型
+     */
+    public static final String FEE_TYPE_SELL_UP_PARKING_SPACE = "888800010002";
+
+    /**
+     * 停车费 地下 出售费用类型
+     */
+    public static final String FEE_TYPE_SELL_DOWN_PARKING_SPACE = "888800010003";
+
+    /**
+     * 停车费 地上 出租费用类型
+     */
+    public static final String FEE_TYPE_HIRE_UP_PARKING_SPACE = "888800010004";
+
+    /**
+     * 停车费 地下 出租费用类型
+     */
+    public static final String FEE_TYPE_HIRE_DOWN_PARKING_SPACE = "888800010005";
 
 
 

+ 2 - 0
java110-common/src/main/java/com/java110/common/constant/PrivilegeCodeConstant.java

@@ -42,4 +42,6 @@ public final class PrivilegeCodeConstant {
 
     //物业停车位权限
     public static final String PRIVILEGE_PARKING_SPACE = "500201906017";
+    //车位出售
+    public static final String PRIVILEGE_CAR = "500201906019";
 }

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

@@ -457,4 +457,8 @@ public class ServiceCodeConstant {
     //删除停车位信息
     public static final String SERVICE_CODE_DELETE_PARKING_SPACE = "parkingSpace.deleteParkingSpace";
 
+
+    // 保存停车位信息
+    public static final String SERVICE_CODE_SELL_PARKING_SPACE = "parkingSpace.sellParkingSpace";
+
 }