wuxw
2019-06-12 7be4c554d5cc00adfa0daae7c243de4da9c817eb
停车费缴费 开发完成待测试
11个文件已修改
9个文件已添加
893 ■■■■■ 已修改文件
Api/src/main/java/com/java110/api/listener/fee/QueryFeeByParkingSpaceListener.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Api/src/main/java/com/java110/api/listener/fee/QueryFeeListener.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Api/src/main/java/com/java110/api/listener/parkingSpace/QueryParkingSpacesListener.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/java/com/java110/web/components/fee/ViewMainParkingSpaceFeeComponent.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/java/com/java110/web/smo/IFeeServiceSMO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/java/com/java110/web/smo/impl/FeeServiceSMOImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/parkingSpace-fee/parkingSpaceFee.html 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/parkingSpace-fee/parkingSpaceFee.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/property-fee/propertyFee.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/search-parkingSpace/searchParkingSpace.html 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/search-parkingSpace/searchParkingSpace.js 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/view-main-parkingSpace-fee/viewMainParkingSpaceFee.html 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/components/view-main-parkingSpace-fee/viewMainParkingSpaceFee.js 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
WebService/src/main/resources/views/parkingSpaceFeeFlow.html 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/vo/api/ApiFeeVo.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/vo/api/ApiMainFeeVo.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-bean/src/main/java/com/java110/vo/api/ApiParkingSpaceFeeVo.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-common/src/main/java/com/java110/common/util/Assert.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
java110-db/src/main/resources/mapper/parkingSpace/ParkingSpaceServiceDaoImplMapper.xml 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Api/src/main/java/com/java110/api/listener/fee/QueryFeeByParkingSpaceListener.java
New file
@@ -0,0 +1,160 @@
package com.java110.api.listener.fee;
import com.alibaba.fastjson.JSONObject;
import com.java110.api.listener.AbstractServiceApiDataFlowListener;
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.IFeeInnerServiceSMO;
import com.java110.core.smo.floor.IFloorInnerServiceSMO;
import com.java110.core.smo.owner.IOwnerCarInnerServiceSMO;
import com.java110.core.smo.owner.IOwnerInnerServiceSMO;
import com.java110.core.smo.owner.IOwnerRoomRelInnerServiceSMO;
import com.java110.core.smo.parkingSpace.IParkingSpaceInnerServiceSMO;
import com.java110.core.smo.room.IRoomInnerServiceSMO;
import com.java110.core.smo.unit.IUnitInnerServiceSMO;
import com.java110.dto.FeeDto;
import com.java110.dto.OwnerCarDto;
import com.java110.dto.OwnerDto;
import com.java110.dto.OwnerRoomRelDto;
import com.java110.dto.ParkingSpaceDto;
import com.java110.dto.RoomDto;
import com.java110.event.service.api.ServiceDataFlowEvent;
import com.java110.vo.api.ApiFeeVo;
import com.java110.vo.api.ApiParkingSpaceFeeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import java.util.List;
/**
 * @ClassName FloorDto
 * @Description 小区楼数据层侦听类
 * @Author wuxw
 * @Date 2019/4/24 8:52
 * @Version 1.0
 * add by wuxw 2019/4/24
 **/
@Java110Listener("queryFeeByParkingSpace")
public class QueryFeeByParkingSpaceListener extends AbstractServiceApiDataFlowListener {
    @Autowired
    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
    @Autowired
    private IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl;
    @Autowired
    private IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl;
    @Override
    public String getServiceCode() {
        return ServiceCodeConstant.SERVICE_CODE_QUERY_FEE_BY_PARKING_SPACE;
    }
    @Override
    public HttpMethod getHttpMethod() {
        return HttpMethod.GET;
    }
    /**
     * 业务层数据处理
     *
     * @param event 时间对象
     */
    @Override
    public void soService(ServiceDataFlowEvent event) {
        DataFlowContext dataFlowContext = event.getDataFlowContext();
        //获取请求数据
        JSONObject reqJson = dataFlowContext.getReqJson();
        validateFeeData(reqJson);
        FeeDto feeDtoParamIn = BeanConvertUtil.covertBean(reqJson, FeeDto.class);
        feeDtoParamIn.setPayerObjId(reqJson.getString("psId"));
        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDtoParamIn);
        ResponseEntity<String> responseEntity = null;
        if (feeDtos == null || feeDtos.size() == 0) {
            responseEntity = new ResponseEntity<String>("{}", HttpStatus.OK);
        }
        FeeDto feeDto = feeDtos.get(0);
        ApiParkingSpaceFeeVo apiFeeVo = BeanConvertUtil.covertBean(feeDto, ApiParkingSpaceFeeVo.class);
        //停车位信息
        ParkingSpaceDto parkingSpaceDto = BeanConvertUtil.covertBean(reqJson, ParkingSpaceDto.class);
        List<ParkingSpaceDto> parkingSpaceDtos = parkingSpaceInnerServiceSMOImpl.queryParkingSpaces(parkingSpaceDto);
        Assert.listOnlyOne(parkingSpaceDtos, "未查询到或查询多条 车位信息");
        parkingSpaceDto = parkingSpaceDtos.get(0);
        BeanConvertUtil.covertBean(parkingSpaceDto, apiFeeVo);
        //查询车辆信息
        OwnerCarDto  ownerCarDto = BeanConvertUtil.covertBean(feeDto, OwnerCarDto.class);
        List<OwnerCarDto> ownerCarDtos = ownerCarInnerServiceSMOImpl.queryOwnerCars(ownerCarDto);
        Assert.listOnlyOne(ownerCarDtos, "未查询到或查询多条 车辆信息");
        ownerCarDto = ownerCarDtos.get(0);
        BeanConvertUtil.covertBean(ownerCarDto, apiFeeVo);
        responseEntity = new ResponseEntity<String>(JSONObject.toJSONString(apiFeeVo), HttpStatus.OK);
        dataFlowContext.setResponseEntity(responseEntity);
    }
    /**
     * 校验查询条件是否满足条件
     *
     * @param reqJson 包含查询条件
     */
    private void validateFeeData(JSONObject reqJson) {
        Assert.jsonObjectHaveKey(reqJson, "communityId", "请求中未包含communityId信息");
        Assert.jsonObjectHaveKey(reqJson, "psId", "请求中未包含psId信息");
    }
    @Override
    public int getOrder() {
        return super.DEFAULT_ORDER;
    }
    public IFeeInnerServiceSMO getFeeInnerServiceSMOImpl() {
        return feeInnerServiceSMOImpl;
    }
    public void setFeeInnerServiceSMOImpl(IFeeInnerServiceSMO feeInnerServiceSMOImpl) {
        this.feeInnerServiceSMOImpl = feeInnerServiceSMOImpl;
    }
    public IParkingSpaceInnerServiceSMO getParkingSpaceInnerServiceSMOImpl() {
        return parkingSpaceInnerServiceSMOImpl;
    }
    public void setParkingSpaceInnerServiceSMOImpl(IParkingSpaceInnerServiceSMO parkingSpaceInnerServiceSMOImpl) {
        this.parkingSpaceInnerServiceSMOImpl = parkingSpaceInnerServiceSMOImpl;
    }
    public IOwnerCarInnerServiceSMO getOwnerCarInnerServiceSMOImpl() {
        return ownerCarInnerServiceSMOImpl;
    }
    public void setOwnerCarInnerServiceSMOImpl(IOwnerCarInnerServiceSMO ownerCarInnerServiceSMOImpl) {
        this.ownerCarInnerServiceSMOImpl = ownerCarInnerServiceSMOImpl;
    }
}
Api/src/main/java/com/java110/api/listener/fee/QueryFeeListener.java
@@ -115,33 +115,6 @@
        apiFeeVo.setRoomNum(roomDto.getRoomNum());*/
        apiFeeVo = BeanConvertUtil.covertBean(roomDto,apiFeeVo);
        //查询单元信息
        /*UnitDto unitDto = new UnitDto();
        unitDto.setUnitId(roomDto.getUnitId());
        List<UnitDto> unitDtos = unitInnerServiceSMOImpl.queryUnits(unitDto);
        if (unitDtos == null || unitDtos.size() != 1) {
            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "数据错误,未找到单元信息 unitId" + roomDto.getUnitId());
        }
        unitDto = unitDtos.get(0);
        apiFeeVo.setUnitId(unitDto.getUnitId());
        apiFeeVo.setUnitNum(unitDto.getUnitNum());*/
       /* //查询 小区楼信息
        FloorDto floorDto = new FloorDto();
        floorDto.setFloorId(unitDto.getFloorId());
        List<FloorDto> floorDtos = floorInnerServiceSMOImpl.queryFloors(floorDto);
        if (floorDtos == null || floorDtos.size() != 1) {
            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "数据错误,未找到小区楼信息 floorId" + unitDto.getFloorId());
        }
        floorDto = floorDtos.get(0);
        apiFeeVo.setFloorNum(floorDto.getFloorNum());
        apiFeeVo.setFloorId(floorDto.getFloorId());*/
        // 业主信息
        OwnerRoomRelDto ownerRoomRelDto = new OwnerRoomRelDto();
        ownerRoomRelDto.setRoomId(roomDto.getRoomId());
Api/src/main/java/com/java110/api/listener/parkingSpace/QueryParkingSpacesListener.java
@@ -56,6 +56,8 @@
        JSONObject reqJson = dataFlowContext.getReqJson();
        validateParkingSpaceData(reqJson);
        refreshReqJson(reqJson);
        int row = reqJson.getInteger("row");
@@ -75,6 +77,23 @@
        dataFlowContext.setResponseEntity(responseEntity);
    }
    /**
     * 请求数据处理
     *
     * @param reqJson 请求数据对象
     */
    private void refreshReqJson(JSONObject reqJson) {
        if (!reqJson.containsKey("state")) {
            return;
        }
        if("SH".equals(reqJson.getString("state"))){
            reqJson.put("states", new String[] {"S","H"});
            reqJson.remove("state");
        }
    }
    /**
     * 校验查询条件是否满足条件
WebService/src/main/java/com/java110/web/components/fee/ViewMainParkingSpaceFeeComponent.java
New file
@@ -0,0 +1,35 @@
package com.java110.web.components.fee;
import com.java110.core.context.IPageData;
import com.java110.web.smo.IFeeServiceSMO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
/**
 * @ClassName ViewPropertyFeeConfigComponent
 * @Description 查询主费用信息
 * @Author wuxw
 * @Date 2019/6/1 14:33
 * @Version 1.0
 * add by wuxw 2019/6/1
 **/
@Component("viewMainParkingSpaceFee")
public class ViewMainParkingSpaceFeeComponent {
    @Autowired
    private IFeeServiceSMO feeServiceSMOImpl;
    public ResponseEntity<String> getFee(IPageData pd) {
        return feeServiceSMOImpl.loadFeeByPsId(pd);
    }
    public IFeeServiceSMO getFeeServiceSMOImpl() {
        return feeServiceSMOImpl;
    }
    public void setFeeServiceSMOImpl(IFeeServiceSMO feeServiceSMOImpl) {
        this.feeServiceSMOImpl = feeServiceSMOImpl;
    }
}
WebService/src/main/java/com/java110/web/smo/IFeeServiceSMO.java
@@ -42,6 +42,15 @@
     */
    ResponseEntity<String> loadFeeByRoomId(IPageData pd);
    /**
     * 查询主费用
     *
     * @param pd 页面数据封装对象
     * @return 返回 ResponseEntity对象包含 http状态 信息 body信息
     */
    ResponseEntity<String> loadFeeByPsId(IPageData pd);
    /**
     * 查询费用明细
     *
WebService/src/main/java/com/java110/web/smo/impl/FeeServiceSMOImpl.java
@@ -181,6 +181,39 @@
        return responseEntity;
    }
    /**
     * 查询主费用
     *
     * @param pd 页面数据封装对象
     * @return
     */
    @Override
    public ResponseEntity<String> loadFeeByPsId(IPageData pd) {
        validateLoadParkingSpaceFee(pd);
        //校验员工是否有权限操作
        super.checkUserHasPrivilege(pd, restTemplate, PrivilegeCodeConstant.PRIVILEGE_PARKING_SPACE);
        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, "",
                ServiceConstant.SERVICE_API_URL + "/api/fee.queryFeeByParkingSpace" + mapToUrlParam(paramIn),
                HttpMethod.GET);
        return responseEntity;
    }
    @Override
    public ResponseEntity<String> loadFeeDetail(IPageData pd) {
        validateLoadFeeDetail(pd);
@@ -296,6 +329,18 @@
        Assert.hasLength(paramIn.getString("feeTypeCd"), "费用类型不能为空");
    }
    private void validateLoadParkingSpaceFee(IPageData pd) {
        Assert.jsonObjectHaveKey(pd.getReqData(), "communityId", "请求报文中未包含communityId节点");
        Assert.jsonObjectHaveKey(pd.getReqData(), "psId", "请求报文中未包含psId节点");
        JSONObject paramIn = JSONObject.parseObject(pd.getReqData());
        Assert.hasLength(paramIn.getString("communityId"), "小区ID不能为空");
        Assert.hasLength(paramIn.getString("psId"), "停车位ID不能为空");
    }
    /**
     * 校验缴费参数
     *
WebService/src/main/resources/components/parkingSpace-fee/parkingSpaceFee.html
New file
@@ -0,0 +1,88 @@
<div id="component" class="wrapper wrapper-content animated fadeInRight ecommerce">
    <vc:create name="viewMainParkingSpaceFee"
               feeName="停车费"
               payName="propertyPay"
    ></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 class="row">
                        <div class="col-sm-3 input-group">
                            <input size="16" type="text" placeholder="请选择开始时间"   readonly class="form-control form-control-sm start_time">
                        </div>
                        <div class="col-sm-2">
                        </div>
                        <div class="col-sm-3 input-group">
                            <input size="16" type="text" placeholder="请选择结束时间"  readonly class="form-control form-control-sm end_time">
                        </div>
                        <div class="col-sm-2">
                        </div>
                        <div class="col-sm-2">
                            <button type="button" class="btn btn-primary btn-sm" v-on:click="queryFeeDetailMethod()">
                                <i class="glyphicon glyphicon-search"></i> 马上查询</button>
                        </div>
                        </div>
                    <table class="footable table table-stripped toggle-arrow-tiny" style="margin-top:10px" data-page-size="10">
                        <thead>
                        <tr>
                            <th>缴费ID</th>
                            <th data-hide="phone">周期</th>
                            <th data-hide="phone">应收金额</th>
                            <th data-hide="phone">实收金额</th>
                            <th data-hide="phone">打折率</th>
                            <th data-hide="phone" >备注</th>
                            <th data-hide="phone">缴费时间</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr v-for="feeDetail in feeDetailInfo.feeDetails">
                            <td>
                                {{feeDetail.detailId}}
                            </td>
                            <td>
                                {{feeDetail.cycles}} 月
                            </td>
                            <td>
                                {{feeDetail.receivableAmount}} 元
                            </td>
                            <td>
                                {{feeDetail.receivedAmount}} 元
                            </td>
                            <td>
                                {{feeDetail.primeRate}}
                            </td>
                            <td>
                                {{feeDetail.remark}}
                            </td>
                            <td>
                                {{feeDetail.createTime}}
                            </td>
                        </tr>
                        </tbody>
                        <tfoot>
                        <tr>
                            <td colspan="7">
                                <ul class="pagination float-right"></ul>
                            </td>
                        </tr>
                        </tfoot>
                    </table>
                    <!-- 分页 -->
                    <vc:create name="pagination"></vc:create>
                </div>
            </div>
        </div>
    </div>
</div>
WebService/src/main/resources/components/parkingSpace-fee/parkingSpaceFee.js
New file
@@ -0,0 +1,82 @@
/**
    入驻小区
**/
(function(vc){
    var DEFAULT_PAGE = 1;
    var DEFAULT_ROW = 10;
    vc.extends({
        data:{
            feeDetailInfo:{
                feeDetails:[],
                total:0,
                records:1,
                feeId:'',
                startTime:'',
                endTime:''
            }
        },
        _initMethod:function(){
            vc.component.initDate();
        },
        _initEvent:function(){
            vc.on('propertyFee','listFeeDetail',function(_param){
                  vc.component.feeDetailInfo.feeId = _param.feeId;
                  vc.component.listFeeDetail(DEFAULT_PAGE,DEFAULT_ROW);
            });
            vc.on('pagination','page_event',function(_currentPage){
                vc.component.listRoom(_currentPage,DEFAULT_ROW);
            });
        },
        methods:{
            initDate:function(){
                $(".start_time").datetimepicker({format: 'yyyy-mm-dd', language: 'zh-CN',minView: "day"});
                $(".end_time").datetimepicker({format: 'yyyy-mm-dd', language: 'zh-CN',minView: "hour"});
                $('.start_time').datetimepicker()
                          .on('changeDate', function (ev) {
                            var value = $(".start_time").val();
                            vc.component.feeDetailInfo.startTime = value ;
                          });
                $('.end_time').datetimepicker()
                              .on('changeDate', function (ev) {
                                var value = $(".end_time").val();
                                vc.component.feeDetailInfo.endTime = value ;
                              });
            },
            listFeeDetail:function(_page,_row){
                var param = {
                    params:{
                        page:_page,
                        row:_row,
                        communityId:vc.getCurrentCommunity().communityId,
                        feeId:vc.component.feeDetailInfo.feeId,
                        startTime:vc.component.feeDetailInfo.startTime,
                        endTime:vc.component.feeDetailInfo.endTime
                    }
                }
               //发送get请求
               vc.http.get('propertyFee',
                            'listFeeDetail',
                             param,
                             function(json,res){
                                var listFeeDetailData =JSON.parse(json);
                                vc.component.feeDetailInfo.total = listFeeDetailData.total;
                                vc.component.feeDetailInfo.records = listFeeDetailData.records;
                                vc.component.feeDetailInfo.feeDetails = listFeeDetailData.feeDetails;
                                vc.emit('pagination','init',{
                                    total:vc.component.feeDetailInfo.records,
                                    currentPage:_page
                                });
                             },function(errInfo,error){
                                console.log('请求失败处理');
                             }
                           );
            },
            queryFeeDetailMethod:function(){
                vc.component.listFeeDetail(DEFAULT_PAGE,DEFAULT_ROW);
            }
        }
    });
})(window.vc);
WebService/src/main/resources/components/property-fee/propertyFee.js
@@ -24,6 +24,11 @@
                  vc.component.listFeeDetail(DEFAULT_PAGE,DEFAULT_ROW);
            });
            vc.on('propertyFee','listParkingSpaceData',function(_param){
                  vc.component.feeDetailInfo.feeId = _param.feeId;
                  vc.component.listFeeDetail(DEFAULT_PAGE,DEFAULT_ROW);
            });
            vc.on('pagination','page_event',function(_currentPage){
                vc.component.listRoom(_currentPage,DEFAULT_ROW);
            });
WebService/src/main/resources/components/search-parkingSpace/searchParkingSpace.html
@@ -14,7 +14,9 @@
                            <div class="row">
                                <div class="col-sm-6 m-b-xs">
                                    <div class="input-group" v-if="searchParkingSpaceInfo.psFlag == 'SH'">
                                        <input placeholder="输入车牌号" type="text" v-model="searchParkingSpaceInfo.carNum" class="form-control form-control-sm">
                                    </div>
                                </div>
                                <div class="col-sm-6">
                                    <div class="input-group">
WebService/src/main/resources/components/search-parkingSpace/searchParkingSpace.js
@@ -3,14 +3,16 @@
        propTypes: {
           emitChooseParkingSpace:vc.propTypes.string,
           emitLoadData:vc.propTypes.string,
           parkingSpaceFlag:vc.propTypes.string // 如果 S 表示查询售卖停车位 H 出租停车位 F 表示查询未售卖未出租停车位
           parkingSpaceFlag:vc.propTypes.string // 如果 S 表示查询售卖停车位 H 出租停车位 SH 查询出租和出售车位 F 表示查询未售卖未出租停车位
        },
        data:{
            searchParkingSpaceInfo:{
                parkingSpaces:[],
                total:0,
                records:1,
                num:''
                num:'',
                carNum:'',
                psFlag:$props.parkingSpaceFlag
            }
        },
        _initMethod:function(){
@@ -33,6 +35,7 @@
                        row:_row,
                        communityId:vc.getCurrentCommunity().communityId,
                        num:vc.component.searchParkingSpaceInfo.num,
                        carNum:vc.component.searchParkingSpaceInfo.carNum,
                        state:$props.parkingSpaceFlag
                    }
                };
WebService/src/main/resources/components/view-main-parkingSpace-fee/viewMainParkingSpaceFee.html
New file
@@ -0,0 +1,87 @@
<div class="row">
    <div class="col-lg-12">
        <div class="ibox ">
            <div class="ibox-title">
                <h5>{{mainParkingSpaceFeeInfo.feeName}}信息</h5>
                <div class="ibox-tools" style="top:10px;">
                    <button type="button" class="btn btn-primary btn-sm" v-on:click="openSearchRoomModel()">
                        <i class="glyphicon glyphicon-search"></i> 选择停车位</button>
                    <button type="button" class="btn btn-primary btn-sm"
                            v-if="mainParkingSpaceFeeInfo.feeId != null && mainParkingSpaceFeeInfo.feeId != ''"
                            style="margin-left:10px" v-on:click="openPayModel()">
                        <i class="glyphicon glyphicon-plus" ></i> 缴费</button>
                </div>
            </div>
            <div class="ibox-content">
                <div class="row">
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >费用ID:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.feeId}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label">停车位编号:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.num}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >车位类型:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.typeCd}}</label>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >车牌号:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.carNum}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >车品牌:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.carBrand}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label">车类型:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.carType}}</label>
                        </div>
                    </div>
                </div>
                <div class="row">
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >费用开始时间:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.startTime}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group">
                            <label class="col-form-label" >费用到期时间:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.endTime}}</label>
                        </div>
                    </div>
                    <div class="col-sm-4">
                        <div class="form-group" v-if="mainParkingSpaceFeeInfo.amount != '-1.00'">
                            <label class="col-form-label">费用金额:</label>
                            <label class="">{{mainParkingSpaceFeeInfo.amount}}</label>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <vc:create name="searchParkingSpace"
               emitChooseRoom="viewMainParkingSpaceFee"
               emitLoadData="propertyFee"
               parkingSpaceFlag="SH"
    ></vc:create>
    <vc:create name="propertyPay"></vc:create>
</div>
WebService/src/main/resources/components/view-main-parkingSpace-fee/viewMainParkingSpaceFee.js
New file
@@ -0,0 +1,81 @@
/**
    权限组
**/
(function(vc){
    vc.extends({
        propTypes: {
            feeName:vc.propTypes.string,
            payName:vc.propTypes.string
        },
        data:{
            mainParkingSpaceFeeInfo:{
                feeName:$props.feeName,
                feeId:"",
                psId:"",
                num:"",
                typeCd:"",
                carNum:"",
                carBrand:"",
                carType:"",
                startTime:"",
                endTime:"",
                amount:"-1.00"
            }
        },
        _initMethod:function(){
        },
        _initEvent:function(){
            vc.on('viewMainParkingSpaceFee','chooseParkingSpace',function(_parkingSPace){
                  vc.component.loadMainParkingSpaceFeeInfo(_parkingSPace);
            });
            vc.on('viewMainFee','reloadFee',function(_room){
                if(vc.component.mainParkingSpaceFeeInfo.roomId != ''){
                      vc.component.loadMainFeeInfo({
                            roomId:vc.component.mainParkingSpaceFeeInfo.roomId
                      });
                }
            });
        },
        methods:{
            openSearchRoomModel:function(){
                vc.emit('searchRoom','openSearchRoomModel',{});
            },
            openPayModel:function(){
                vc.emit($props.payName,'openPayModel',{
                    feeId:vc.component.mainParkingSpaceFeeInfo.feeId
                });
            },
            loadMainParkingSpaceFeeInfo:function(_parkingSPace){
                //vc.copyObject(_fee,vc.component.mainParkingSpaceFeeInfo);
                var param = {
                    params:{
                        communityId:vc.getCurrentCommunity().communityId,
                        psId:_parkingSPace.psId,
                    }
                };
                //发送get请求
               vc.http.get('viewMainParkingSpaceFee',
                            'getFee',
                             param,
                             function(json,res){
                               var _fee =JSON.parse(json);
                               vc.copyObject(_fee,vc.component.mainParkingSpaceFeeInfo);
                               vc.emit('propertyFee','listFeeDetail',{
                                    feeId:_fee.feeId
                               });
                             },function(errInfo,error){
                                console.log('请求失败处理');
                             }
                           );
            }
        }
    });
})(window.vc);
WebService/src/main/resources/views/parkingSpaceFeeFlow.html
New file
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html lang="en"
      xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org"
      xmlns:vc="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <title>物业费 |java110</title>
    <vc:create name="commonTop"></vc:create>
    <link rel="stylesheet" href="/css/bootstrap/bootstrap-datetimepicker.min.css"/>
</head>
<body>
<vc:create name="bodyTop"></vc:create>
<div id="wrapper">
    <vc:create name="menu"></vc:create>
    <div id="page-wrapper" class="gray-bg dashbard-1">
        <div class="row border-bottom">
            <vc:create name="nav"></vc:create>
        </div>
        <!-- id="component" -->
        <div class="wrapper wrapper-content animated fadeInRight">
            <vc:create name="parkingSpaceFee"></vc:create>
        </div>
        <vc:create name="copyright"></vc:create>
    </div>
</div>
<script src="/js/bootstrap/bootstrap-datetimepicker.min.js"></script>
<vc:create name="commonBottom"></vc:create>
</body>
</html>
java110-bean/src/main/java/com/java110/vo/api/ApiFeeVo.java
@@ -10,10 +10,10 @@
 * @Version 1.0
 * add by wuxw 2019/6/2
 **/
public class ApiFeeVo extends Vo {
public class ApiFeeVo extends ApiMainFeeVo {
   private String feeId;
   private String floorNum;
   private String floorId;
   private String unitId;
@@ -23,19 +23,7 @@
   private String ownerId;
   private String ownerName;
   private String link;
   private String startTime;
   private String endTime;
   private String amount;
   private String builtUpArea;
    public String getFeeId() {
        return feeId;
    }
    public void setFeeId(String feeId) {
        this.feeId = feeId;
    }
    public String getFloorNum() {
        return floorNum;
@@ -85,29 +73,7 @@
        this.link = link;
    }
    public String getStartTime() {
        return startTime;
    }
    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }
    public String getEndTime() {
        return endTime;
    }
    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
    public String getAmount() {
        return amount;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
    public String getUnitId() {
        return unitId;
@@ -140,4 +106,7 @@
    public void setBuiltUpArea(String builtUpArea) {
        this.builtUpArea = builtUpArea;
    }
}
java110-bean/src/main/java/com/java110/vo/api/ApiMainFeeVo.java
New file
@@ -0,0 +1,55 @@
package com.java110.vo.api;
import com.java110.vo.Vo;
/**
 * @ClassName ApiMainFeeVo
 * @Description TODO
 * @Author wuxw
 * @Date 2019/6/12 21:59
 * @Version 1.0
 * add by wuxw 2019/6/12
 **/
public class ApiMainFeeVo extends Vo {
    private String feeId;
    private String startTime;
    private String endTime;
    private String amount;
    public String getFeeId() {
        return feeId;
    }
    public void setFeeId(String feeId) {
        this.feeId = feeId;
    }
    public String getStartTime() {
        return startTime;
    }
    public void setStartTime(String startTime) {
        this.startTime = startTime;
    }
    public String getEndTime() {
        return endTime;
    }
    public void setEndTime(String endTime) {
        this.endTime = endTime;
    }
    public String getAmount() {
        return amount;
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
}
java110-bean/src/main/java/com/java110/vo/api/ApiParkingSpaceFeeVo.java
New file
@@ -0,0 +1,71 @@
package com.java110.vo.api;
/**
 * @ClassName ApiFeeVo
 * @Description TODO
 * @Author wuxw
 * @Date 2019/6/2 18:05
 * @Version 1.0
 * add by wuxw 2019/6/2
 **/
public class ApiParkingSpaceFeeVo extends ApiMainFeeVo {
   private String psId;
   private String num;
   private String typeCd;
   private String carNum;
   private String carBrand;
   private String carType;
    public String getPsId() {
        return psId;
    }
    public void setPsId(String psId) {
        this.psId = psId;
    }
    public String getNum() {
        return num;
    }
    public void setNum(String num) {
        this.num = num;
    }
    public String getTypeCd() {
        return typeCd;
    }
    public void setTypeCd(String typeCd) {
        this.typeCd = typeCd;
    }
    public String getCarNum() {
        return carNum;
    }
    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }
    public String getCarBrand() {
        return carBrand;
    }
    public void setCarBrand(String carBrand) {
        this.carBrand = carBrand;
    }
    public String getCarType() {
        return carType;
    }
    public void setCarType(String carType) {
        this.carType = carType;
    }
}
java110-common/src/main/java/com/java110/common/constant/ServiceCodeConstant.java
@@ -429,11 +429,12 @@
    public static final String SERVICE_CODE_QUERY_FEE_CONFIG = "fee.queryFeeConfig";
    public static final String SERVICE_CODE_QUERY_FEE_DETAIL = "fee.queryFeeDetail";
    //查询费用配置
    public static final String SERVICE_CODE_QUERY_FEE = "fee.queryFee";
    //查询费用配置 根据停车位
    public static final String SERVICE_CODE_QUERY_FEE_BY_PARKING_SPACE = "fee.queryFeeByParkingSpace";
    //保存费用配置
    public static final String SERVICE_CODE_SAVE_FEE_CONFIG = "fee.saveFeeConfig";
java110-common/src/main/java/com/java110/common/util/Assert.java
@@ -111,6 +111,22 @@
        }
    }
    /**
     * 数组只有一条数据
     *
     * @param jsonArray
     * @param message
     */
    public static void listOnlyOne(List jsonArray, String message) {
        Assert.notNull(jsonArray, message);
        if (jsonArray.size() != 1) {
            throw new IllegalArgumentException(message);
        }
    }
    /**
     * 判断list 是否为空
     *
java110-db/src/main/resources/mapper/parkingSpace/ParkingSpaceServiceDaoImplMapper.xml
@@ -39,7 +39,8 @@
</if> 
<if test="state !=null and state != ''">
   and t.state= #{state}
</if>
</if>
<if test="communityId !=null and communityId != ''">
   and t.community_id= #{communityId}
</if> 
@@ -119,7 +120,13 @@
</if> 
<if test="state !=null and state != ''">
   and t.state= #{state}
</if>
</if>
<if test="states != null and states != null">
    and t.state in
    <foreach collection="states" item="item" open="(" close=")" separator=",">
        #{item}
    </foreach>
</if>
<if test="communityId !=null and communityId != ''">
   and t.community_id= #{communityId}
</if> 
@@ -128,7 +135,8 @@
</if> 
<if test="userId !=null and userId != ''">
   and t.user_id= #{userId}
</if>
</if>
<if test="page != -1 and page != null ">
   limit #{page}, #{row}
</if> 
@@ -199,7 +207,13 @@
</if> 
<if test="state !=null and state != ''">
   and t.state= #{state}
</if>
</if>
 <if test="states != null and states != null">
     and t.state in
     <foreach collection="states" item="item" open="(" close=")" separator=",">
         #{item}
     </foreach>
 </if>
<if test="communityId !=null and communityId != ''">
   and t.community_id= #{communityId}
</if>