jiangping
2024-02-29 1b5578be64dbd09144a1d102096cf04f85f728a9
整理
已添加3个文件
已修改14个文件
486 ■■■■■ 文件已修改
admin/src/api/business/carEvent.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarEventHkWindow.vue 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/carEvent.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarEventController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkCrossRecordListRequest.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeListRequest.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmvisit_service/src/main/resources/application-testYL.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/carEvent.js
@@ -14,3 +14,7 @@
    download: true
  })
}
export function syncByDate (data) {
  return request.post('/business/carEvent/syncByDate', data)
}
admin/src/components/business/OperaCarEventHkWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,173 @@
<template>
  <GlobalWindow
      :title="title"
      width="500px"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <el-form :model="form" ref="form" :rules="rules" >
      <el-form-item label="同步日期" prop="createDate">
        <el-date-picker
            v-model="form.createDate"
            format="yyyy-MM-dd"
            value-format="yyyy-MM-dd HH:ss:mm"
            type="date">
        </el-date-picker>
      </el-form-item>
    </el-form>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { syncByDate } from '@/api/business/carEvent'
export default {
  name: 'OperaVisitsHkWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  data () {
    return {
      form:{createDate: null},
      rules: {
        createDate: [
          { required: true, message: '请选择日期', trigger: 'blur' }
        ]
      }
    }
  },
  methods: {
    open(title){
      this.visible=true
      this.title=title
    },
    // åŒæ­¥ä¿¡æ¯
    confirm () {
      this.$refs.form.validate((valid) => {
        if (!valid) {
          return
        }
        // è°ƒç”¨æ–°å»ºæŽ¥å£
        this.isWorking = true
        syncByDate({
          createDate: this.form.createDate
        })
          .then(() => {
            this.visible = false
            this.$tip.apiSuccess('同步成功')
            this.$emit('success')
          })
          .catch(e => {
            this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking = false
          })
      })
    }
  }
}
</script>
<style>
    .el-image-viewer__wrapper {
        z-index: 3000 !important;
    }
</style>
<style lang="scss" scoped>
    .list {
        width: 100%;
        display: flex;
        flex-direction: column;
        .list_item {
            width: 100%;
            margin-bottom: 30px;
            &:last-child {
                margin-bottom: 0 !important;
            }
            .list_item_label {
                font-size: 18px;
                font-weight: 600;
                color: #000000;
                margin-bottom: 15px;
            }
            .list_item_info {
                font-size: 14px;
                color: #222222;
                margin-bottom: 10px;
            }
            .list_item_status {
                width: 100%;
                display: flex;
                flex-direction: column;
                .list_item_status_item {
                    width: 100%;
                    max-height: 100px;
                    position: relative;
                    margin-bottom: 30px;
                    .dian {
                        width: 15px;
                        height: 15px;
                        border-radius: 50%;
                        background: #ffb447;
                        position: absolute;
                        left: 0;
                        top: 50%;
                        transform: translate(0, -50%);
                    }
                    .xian {
                        width: 1px;
                        height: calc(100% + 30px);
                        background: #ffb447;
                        position: absolute;
                        top: 50%;
                        left: 7px;
                        transform: translate(-50%, 0);
                    }
                    .status_info {
                        /*width: 100%;*/
                        height: 100%;
                        display: flex;
                        flex-direction: column;
                        margin-left: 30px;
                        box-sizing: border-box;
                        .status_info_a {
                            font-size: 16px;
                            color: black;
                            margin-bottom: 10px;
                        }
                        .status_info_b {
                            font-size: 13px;
                            color: #666666;
                            margin-bottom: 10px;
                        }
                        .status_info_c {
                            padding: 5px 10px;
                            background: #ececec;
                            font-size: 13px;
                            color: black;
                            border-radius: 5px;
                            box-sizing: border-box;
                        }
                    }
                }
            }
            .list_item_val {
                width: 100%;
                margin-bottom: 15px;
                &:last-child {
                    margin-bottom: 0 !important;
                }
                .list_item_val_item {
                    font-size: 14px;
                    color: #222222;
                    margin-bottom: 5px;
                    &:last-child {
                        margin-bottom: 0 !important;
                    }
                }
            }
        }
    }
</style>
admin/src/views/business/carEvent.vue
@@ -51,7 +51,8 @@
        <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
        <template v-slot:table-wrap>
            <ul class="toolbar" v-permissions="['business:carevent:exportExcel']">
                <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:carevent:exportExcel']" @click="exportExcel">导出</el-button></li>
              <li><el-button type="primary"   v-permissions="['business:carevent:sync']" @click="$refs.OperaCarEventHkWindow.open('同步过车记录')">同步</el-button></li>
              <li><el-button type="primary" :loading="isWorking.export" v-permissions="['business:carevent:exportExcel']" @click="exportExcel">导出</el-button></li>
            </ul>
            <el-table
                v-loading="isWorking.search"
@@ -108,6 +109,8 @@
                :pagination="tableData.pagination"
            >
            </pagination>
          <OperaCarEventHkWindow ref="OperaCarEventHkWindow" @success="search()" />
        </template>
    </TableLayout>
</template>
@@ -116,11 +119,12 @@
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaCarEventHkWindow from '@/components/business/OperaCarEventHkWindow'
import { timeForMat } from '@/utils/util'
export default {
  name: 'CarEvent',
  extends: BaseTable,
  components: { TableLayout, Pagination },
  components: { TableLayout, Pagination ,OperaCarEventHkWindow},
  data () {
    return {
      // æœç´¢
server/dmvisit_admin/src/main/java/com/doumee/api/business/CarEventController.java
@@ -10,12 +10,14 @@
import com.doumee.dao.business.model.CarEvent;
import com.doumee.dao.system.vo.CarEventVo;
import com.doumee.service.business.CarEventService;
import com.doumee.service.business.impl.hksync.HkSyncParkServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.swing.event.CaretEvent;
import java.util.ArrayList;
import java.util.List;
@@ -28,6 +30,9 @@
@RestController
@RequestMapping("/business/carEvent")
public class CarEventController extends BaseController {
    @Autowired
    private HkSyncParkServiceImpl hkSyncParkService;
    @Autowired
    private CarEventService carEventService;
@@ -83,7 +88,13 @@
//        ExcelExporter.build(CarEventVo.class).exportWithFirstAndEnd (carEventService.findPageExcel(pageWrap),"停车场事件推送记录表", null, "停车场事件推送记录导出报表",null , response);
        ExcelExporter.build(CarEventDTO.class).export(carEventService.findVisitCarPage(pageWrap).getRecords(), "停车场事件推送记录表", response);
    }
    @ApiOperation("根据日期(starttime)同步过车数据")
    @PostMapping("/syncByDate")
    @RequiresPermissions("business:carevent:sync")
    public ApiResponse syncByDate(@RequestBody CarEvent param) {
        hkSyncParkService.syncParkRecords(param.getCreateDate());
        return ApiResponse.success(null);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:carevent:query")
server/dmvisit_admin/src/main/resources/application.yml
@@ -10,7 +10,7 @@
  #  application:
  #    name: doumeemes
  profiles:
    active: testHS
    active: devYL
  # JSON返回配置
  jackson:
server/dmvisit_screen/src/main/java/com/doumee/service/impl/ScreenServiceImpl.java
@@ -38,13 +38,13 @@
    public   CountDataResponse countData(BaseRequest param){
        MPJLambdaWrapper<Visits> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.select("count(1) as applyTotalNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status not in(5,6,8)) as applyPassNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status in (5)) as visitInNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(create_date)=TO_DAYS(now()) and status in (6,8)) as visitOutNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status not in(5,6,8)) as applyPassNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (5)) as visitInNum");
        queryWrapper.select("(select count(1) from visits where TO_DAYS(starttime)=TO_DAYS(now()) and status in (6,8)) as visitOutNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and inout_type=0 and event_type="+ HKConstants.EventTypes.PARK_PASS_IN.getKey() +") as carInNum");
        queryWrapper.select("(select count(1) from car_event where TO_DAYS(create_date)=TO_DAYS(now()) and (inout_type !=0 ) and event_type="+ HKConstants.EventTypes.PARK_PASS_OUT.getKey() +") as carOutNum");
        queryWrapper.eq(Visits::getIsdeleted, Constants.ZERO );
        queryWrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        queryWrapper.apply("TO_DAYS(starttime)=TO_DAYS(now())" );
        queryWrapper.last("limit 1");
        CountDataResponse vModel =visitsMapper.selectJoinOne(CountDataResponse.class,queryWrapper);
        vModel.setVisitorNum(vModel.getVisitInNum()+vModel.getVisitOutNum());//今日访客总数
@@ -56,7 +56,7 @@
        wrapper.last("limit 1");
        CountDataResponse cModel =carEventMapper.selectJoinOne(CountDataResponse.class,wrapper);
        vModel.setMemberCarNum(vModel.getMemberCarNum());//今日员工车辆进场数
        vModel.setMemberCarNum(vModel.getCarInNum() - vModel.getMemberCarNum());//今日预约车辆进场数
        vModel.setVisitCarNum(vModel.getCarInNum() - vModel.getMemberCarNum());//今日预约车辆进场数
        return vModel;
    }
@@ -99,7 +99,7 @@
        wrapper.selectAll(VisitEvent.class) ;
        wrapper.apply("TO_DAYS(create_date)=TO_DAYS(now())" );
        wrapper.last("limit 50");
        wrapper.orderByDesc(VisitEvent::getCreateDate);
        wrapper.orderByDesc(VisitEvent::getStartTime);
        List<VisitEvent> result =visitEventMapper.selectList( wrapper);
        if(result!=null){
            for(VisitEvent event :result){
@@ -202,7 +202,7 @@
        MPJLambdaWrapper<CarEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, create_date");
        wrapper.apply("TO_DAYS(create_date)+"+days+" >= TO_DAYS(now()) " );
        wrapper.eq(CarEvent::getEventType,  HKConstants.EventTypes.PARK_LINE_IN.getKey());
        wrapper.in(CarEvent::getEventType,  HKConstants.EventTypes.PARK_PASS_IN.getKey(), HKConstants.EventTypes.PARK_PASS_OUT.getKey());
        wrapper.groupBy("TO_DAYS(create_date)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<CarEvent> result =carEventMapper.selectJoinList(CarEvent.class,wrapper);
@@ -210,12 +210,22 @@
    }
    private List<VisitEvent> getVisitEventListByDays(int days) {
        MPJLambdaWrapper<VisitEvent> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, create_date");
        wrapper.apply("TO_DAYS(create_date)+"+days+" >= TO_DAYS(now()) " );
        wrapper.select("count(id) as num, starttime");
        wrapper.apply("TO_DAYS(starttime)+"+days+" >= TO_DAYS(now()) " );
        wrapper.eq(VisitEvent::getEventType,  HKConstants.EventTypes.VISIT_SIGN_IN.getKey());
        wrapper.groupBy("TO_DAYS(create_date)");
        wrapper.groupBy("TO_DAYS(starttime)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<VisitEvent> result =visitEventMapper.selectJoinList(VisitEvent.class,wrapper);
        return  result;
    }
    private List<Visits> getVisitListByDays(int days) {
        MPJLambdaWrapper<Visits> wrapper = new MPJLambdaWrapper<>();
        wrapper.select("count(id) as num, starttime");
        wrapper.apply("TO_DAYS(starttime)+"+days+" >= TO_DAYS(now()) " );
        wrapper.in(Visits::getStatus,  5,6,7);
        wrapper.groupBy("TO_DAYS(starttime)");
        wrapper.orderByDesc(CarEvent::getCreateDate);
        List<Visits> result =visitsMapper.selectJoinList(Visits.class,wrapper);
        return  result;
    }
    @Override
@@ -254,9 +264,17 @@
        }
        return 0;
    }
    private Integer getVisistNumByDate(String s, List<VisitEvent> result) {
    private Integer getVisistEventNumByDate(String s, List<VisitEvent> result) {
        for(VisitEvent event:result){
            if(StringUtils.equals(s,DateUtil.formatDate(event.getCreateDate(),"MM.dd"))){
                return event.getNum();
            }
        }
        return 0;
    }
    private Integer getVisistNumByDate(String s, List<Visits> result) {
        for(Visits event:result){
            if(StringUtils.equals(s,DateUtil.formatDate(event.getStarttime(),"MM.dd"))){
                return event.getNum();
            }
        }
@@ -287,7 +305,7 @@
            times.add(DateUtil.formatDate(DateUtil.dateDayAdd(new Date(), -(days-i)+1),"MM.dd"));
            numList.add(0);
        }
        List<VisitEvent> result = getVisitEventListByDays(days);
        List<Visits> result = getVisitListByDays(days);
        if(result!=null&& result.size()>0){
            for (int i = 0; i < days; i++) {
                numList.set(i,getVisistNumByDate(times.get(i),result));
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKConstants.java
@@ -28,7 +28,7 @@
    public interface InterfacePath{
//        String doorEvents = "/api/acs/v2/door/events";//门禁事件查询
//        String visitEvents = "/api/visitor/v1/event/turnover/search";//访客事件查询
//        String parkEvents = "/api/pms/v1/crossRecords/page";//停车场事件查询
        String parkCrossRecords = "/api/pms/v1/crossRecords/page";//停车场过程记录
        String rootOrg = "/api/resource/v1/org/rootOrg";//获取跟组织
        String orgAllList = "/api/resource/v1/org/orgList";//获取全量组织信息
        String userAllList = "/api/resource/v2/person/personList";//获取全量用户列表
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/HKTools.java
@@ -684,5 +684,16 @@
        saveInterfaceLog(body,result,path);
        return  result;
    }
    /**
     *    åœè½¦åœºè¿‡è½¦è®°å½•查询
     * @param body
     * @return
     */
    public static String parkCrossRecords(String body) {
        Map<String, String> path = getPath(HKConstants.InterfacePath.parkCrossRecords);
        String result = ArtemisHttpUtil.doPostStringArtemis(path, body, null, null, "application/json", null);// post请求application/json类型参数
        saveInterfaceLog(body,result,path);
        return  result;
    }
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/ParkCrossRecordListRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.doumee.core.haikang.model.param.request;
import lombok.Data;
@Data
public class ParkCrossRecordListRequest {
    private String startTime    ;//string    True    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢å¼€å§‹æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private String  endTime;//    string    False    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢æˆªæ­¢æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private Integer  pageNo    ;//integer    True    é¡µç ,pageNo≥1
    private Integer  pageSize;//    integer    True    åˆ†é¡µå¤§å°
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/request/TimeRangeListRequest.java
@@ -4,7 +4,16 @@
@Data
public class TimeRangeListRequest {
  private String  parkSyscode;//    string    False    åœè½¦åº“唯一标识(最大长度64)  ä¸å¡«ä¸å°†å…¶ä½œä¸ºè¿‡æ»¤æ¡ä»¶ï¼Œ   å¯é€šè¿‡èŽ·å–åœè½¦åº“åˆ—è¡¨æŽ¥å£èŽ·å–
    private String   entranceSyscode;//    string    False    å‡ºå…¥å£å”¯ä¸€æ ‡è¯†ï¼ˆæœ€å¤§é•¿åº¦64)  ä¸å¡«ä¸å°†å…¶ä½œä¸ºè¿‡æ»¤æ¡ä»¶
    private String plateNo    ;//string    False    è½¦ç‰Œå·ï¼ˆæœ€å¤§é•¿åº¦16)
    private String  cardNo    ;//string    False    å¡å·
    private Integer  vehicleOut;//    number    False    è¿›å‡ºåœºæ ‡è¯†0-进场1-出场
    private Integer vehicleType;//    number    False    è½¦è¾†ç±»åž‹0:其他车1:小型车2:大型车3:摩托车
    private Integer  releaseResult;//    number    False    æ”¾è¡Œç»“æžœ0-未放行1-正常放行2-离线放行
    private Integer    releaseWay;//    number    False    æ”¾è¡Œæ–¹å¼10-未开闸11-自动开闸12-人工/人工开闸13-遥控器开闸
    private Integer releaseReason;//    number    False    æ”¾è¡ŒåŽŸå› 100-固定车自动放行101-临时车自动放行102-预约车自动放行103-一户多车自动放行
    private String  carCategory    ;//string    False    è½¦è¾†åˆ†ç±»9-黑名单10-固定车11-临时车12-预约车14-特殊车
    private String startTime    ;//string    True    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢å¼€å§‹æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private String  endTime;//    string    False    é’ˆå¯¹æ›´æ–°æ—¶é—´çš„æŸ¥è¯¢æˆªæ­¢æ—¥æœŸï¼ŒIOS8601格式,参考附录B ISO8601时间格式说明
    private Integer  pageNo    ;//integer    True    é¡µç ,pageNo≥1
server/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/ParkCrossRecordInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package com.doumee.core.haikang.model.param.respose;
import lombok.Data;
@Data
public class ParkCrossRecordInfoResponse {
     private String vehicleId    ;//    string    False    è½¦è¾†ID(最大长度64)
         private String crossRecordSyscode;//    string    False    è¿‡è½¦è®°å½•唯一标识(最大长度64)
                  private String parkSyscode;//    string    False    åœè½¦åº“唯一标识(最大长度64)
                  private String parkName    ;//string    False    åœè½¦åº“名称(最大长度64)
                  private String entranceSyscode    ;//string    False    å‡ºå…¥å£å”¯ä¸€æ ‡è¯†ï¼ˆæœ€å¤§é•¿åº¦64)
                  private String entranceName;//    string    False    å‡ºå…¥å£åç§°ï¼ˆæœ€å¤§é•¿åº¦64)
                  private String roadwaySyscode    ;//string    False    è½¦é“唯一标识
     private String roadwayName;//    string    False    è½¦é“名称
     private Integer vehicleOut    ;//number    False    æ˜¯å¦å‡ºåœº0-进场,1-出场
     private Integer releaseMode    ;//number    False    æ”¾è¡Œæ¨¡å¼0-禁止放行,1-固定车包期,2-临时车入场,3-预约车入场,10-离线出场,11-缴费出场,12-预付费出场,13-免费出场,30- éžæ³•卡不放行,31-手动放行,32-特殊车辆放行,33-节假日放行,35-群组放行,36-遥控器开闸
     private Integer releaseResult    ;//number    False    æ”¾è¡Œç»“æžœ0-未放行1-正常放行2-离线放行
     private Integer releaseWay;//    number    False    æ”¾è¡Œæ–¹å¼10-未开闸11-自动开闸12-人工/人工开闸13-遥控器开闸
     private Integer releaseReason;//    number    False    æ”¾è¡ŒåŽŸå› ï¼Œ100-固定车自动放行101-临时车自动放行102-预约车自动放行103-一户多车自动放行
     private String plateNo    ;//string    False    è½¦ç‰Œå·ç ï¼ˆæœ€å¤§é•¿åº¦16)
     private String cardNo    ;//string    False    å¡ç‰‡å·ç ï¼ˆæœ€å¤§é•¿åº¦32)
     private Integer vehicleColor;//    number    False    è½¦è¾†é¢œè‰²0:其他颜色;1:白色;2:银色;3:灰色;4:黑色; 5:红色;  6:深蓝色; 7:蓝色;8:黄色;9:绿色;10:棕色; 11:粉色; 12:紫色’
    private Integer vehicleType    ;//number    False    è½¦è¾†ç±»åž‹0:其他车;1:小型车;2:大型车;  3:摩托车
     private Integer plateColor    ;//    number    False    è½¦ç‰Œé¢œè‰²0:蓝色,1:黄色,2:白色,3:黑色,4:绿色,5:民航黑色, 255:其他颜色
     private Integer plateType    ;//    number    False    è½¦ç‰Œç±»åž‹0:标准民用车,1:02式民用车,3:警车,4:民用车双行尾牌车,5:使馆车,6:农用车,7:摩托车,8:新能源车
     private String carCategory;//    string    False    è½¦è¾†åˆ†ç±»
     private String carCategoryName;//    string    False    è½¦è¾†åˆ†ç±»åç§°
     private String vehiclePicUri;//    string    False    è½¦è¾†å›¾ç‰‡uri(最大长度256)
     private String plateNoPicUri;//    string    False    è½¦ç‰Œå›¾ç‰‡uri(最大长度256)
     private String facePicUri;//    string    False    äººè„¸å›¾ç‰‡uri(最大长度256)
      private String aswSyscode    ;//string    False    å›¾ç‰‡æœåŠ¡å”¯ä¸€æ ‡è¯†ï¼ˆæœ€å¤§é•¿åº¦64)
      private String crossTime    ;//string    False    é€šè¿‡æ—¶é—´ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,例如北京时间: 2018-07-26T15:00:00+08:00 è¯¦è§ISO8601协议解释
     private String createTime;//    string    False    åˆ›å»ºæ—¶é—´  ISO8601格式: yyyy-MM-ddTHH:mm:ss+当前时区,例如北京时间:  2018-07-26T15:00:00+08:00详见ISO8601协议解释
}
server/dmvisit_service/src/main/java/com/doumee/core/haikang/service/HKService.java
@@ -910,6 +910,24 @@
        return  null;
    }
    /**
     *过车记录查询(分页)
     * @return
     */
    public  static  BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>>   parkCrossRecords(ParkCrossRecordListRequest param){
        log.info("【海康过车记录查询查询】================开始===="+JSONObject.toJSONString(param));
        try {
            String res = HKTools.parkCrossRecords(JSONObject.toJSONString(param));
            TypeReference typeReference =
                    new TypeReference< BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>> >(){};
            BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>>   result = JSONObject.parseObject(res, typeReference.getType());
            logResult(result,"海康过车记录查询查询");
            return  result;
        }catch (Exception e){
            log.error("【海康过车记录查询查询】================失败====:\n"+ e.getMessage());
        }
        return  null;
    }
    /**
     *增量车辆查询(分页)
     * @return
     */
server/dmvisit_service/src/main/java/com/doumee/dao/business/model/Visits.java
@@ -228,6 +228,10 @@
    private String erpId;
    @ApiModelProperty(value = "统计数量 ")
    @TableField(exist = false)
    private int num  ;
    @ApiModelProperty(value = "创建人编码(关联member表)", example = "1")
    @ExcelColumn(name="创建人编码(关联member表)")
    private Integer createMemberId;
server/dmvisit_service/src/main/java/com/doumee/service/business/ext/HkSyncService.java
@@ -74,4 +74,5 @@
    void syncParkBookBySingleModel(ParkBook c);
    void syncEmpowerResultData();
    void syncEmpowerDetailData();
    void syncParkRecords(Date date);
}
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncBaseServiceImpl.java
@@ -42,6 +42,10 @@
    }
    @Override
//    @Async
    public  void syncParkRecords(Date date){
    }
    @Override
//    @Async
    public String syncDoors(DoorsListRequest param){
        return null;
    }
server/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncParkServiceImpl.java
@@ -1,16 +1,23 @@
package com.doumee.service.business.impl.hksync;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.config.DataSyncConfig;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.haikang.model.HKConstants;
import com.doumee.core.haikang.model.param.BaseListPageResponse;
import com.doumee.core.haikang.model.param.BaseResponse;
import com.doumee.core.haikang.model.param.request.CarChargeAddRequest;
import com.doumee.core.haikang.model.param.request.CarChargeDelRequest;
import com.doumee.core.haikang.model.param.request.ParkListRequest;
import com.doumee.core.haikang.model.param.request.*;
import com.doumee.core.haikang.model.param.respose.AppointmentInfoResponse;
import com.doumee.core.haikang.model.param.respose.ParkCrossRecordInfoResponse;
import com.doumee.core.haikang.model.param.respose.ParkListResponse;
import com.doumee.core.haikang.service.HKService;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DESUtil;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CarEventMapper;
import com.doumee.dao.business.ParksMapper;
import com.doumee.dao.business.join.ParkBookJoinMapper;
import com.doumee.dao.business.model.*;
@@ -18,6 +25,8 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -31,9 +40,13 @@
public class HkSyncParkServiceImpl extends HkSyncBaseServiceImpl {
    @Autowired
    private DataSyncConfig dataSyncConfig;
    @Autowired
    private ParksMapper parksMapper;
    @Autowired
    private ParkBookJoinMapper parkBookMapper;
    @Autowired
    private CarEventMapper carEventMapper;
    @Override
    public  void syncParkBookData() {
        if(Constants.DEALING_HK_PARKBOOK){
@@ -282,5 +295,124 @@
        return  true;
    }
    @Override
    @Transactional
    public   void syncParkRecords(Date date){
        try {
            if( Constants.formatIntegerNum(dataSyncConfig.getVisitorDataOrigin()) != DataSyncConfig.origin.hk){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "对不起,当前不支持海康数据同步操作~");
            }
            ParkCrossRecordListRequest param =  new ParkCrossRecordListRequest();
            //(全量同步)
            boolean hasNext = true;
            int curTotal = 0;
            int curPage = 1;
            //查询今天的
            Date start = Utils.Date.getStart(date);
            Date end = new Date();
            if(DateUtil.daysBetweenDates(end,start) >1){
                end =  Utils.Date.getEnd(date);
            }
            param.setStartTime(DateUtil.getISO8601Timestamp2( start));
            param.setEndTime(DateUtil.getISO8601Timestamp2( end));
            List<CarEvent>  allHkList = new ArrayList<>();
            while (hasNext){
                //分页遍历循环查询所有门禁设备数据
                param.setPageNo(curPage);
                param.setPageSize(100);
                BaseResponse<BaseListPageResponse<ParkCrossRecordInfoResponse>> response = HKService.parkCrossRecords(param);
                if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)  ){
                    throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对不起,海康同步数据失败~");
                }
                if(response.getData() == null || response.getData().getTotal() ==0){
                    throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
                }
                BaseListPageResponse<ParkCrossRecordInfoResponse> r = response.getData();
                curTotal += 100;
                if(curTotal >= r.getTotal()){
                    hasNext = false;
                }
                if(r.getList() == null || r.getList().size()==0){
                    hasNext =false;
                }else{
                    allHkList.addAll(getNewCarEventModelBYList(r.getList()));
                }
                curPage++;
            }
            if(allHkList .size() == 0){
                throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未同步到任何信息!");
            }
            //清空原有当天的数据
            carEventMapper.delete(new UpdateWrapper<CarEvent>().lambda()
                    .ge(CarEvent::getCreateDate,start)
                    .le(CarEvent::getCreateDate,end));
            if(allHkList.size()>0){
                int sublistSize = 500;
                int startIndex = 0;
                int endIndex = sublistSize;
                while (startIndex < allHkList.size()) {
                    if (endIndex > allHkList.size()) {
                        endIndex = allHkList.size();
                    }
                    List<CarEvent> sublist = allHkList.subList(startIndex, endIndex);
                    if(sublist.size()>0){
                        carEventMapper.insertBatchSomeColumn(sublist);//插入新数据
                    }
                    startIndex = endIndex;
                    endIndex += sublistSize;
                }
            }
        }catch (BusinessException e){
            throw  e;
        }
    }
    private List<CarEvent> getNewCarEventModelBYList(List<ParkCrossRecordInfoResponse> list ) {
        List<CarEvent> newList = new ArrayList<>();
        if(list == null || list.size()==0){
            return  newList;
        }
        for(ParkCrossRecordInfoResponse model :list){
            if( model.getReleaseResult() ==null || !( model.getReleaseResult() ==   1||  model.getReleaseResult() ==   2  )){
                continue;
            }
            CarEvent c = new CarEvent();
            c.setHappenTime(model.getCrossTime());
            c.setCreateDate(DateUtil.getISO8601DateByStr2(model.getCrossTime()));
            c.setSvrIndex(model.getAswSyscode());
            c.setVehiclePicUrl(model.getVehiclePicUri());
            c.setPlatePicUrl(model.getPlateNoPicUri());
            c.setVehicleType(model.getVehicleType());
            c.setPlateColor(model.getPlateColor());
            c.setPlateType(model.getPlateType());
            c.setCardNo(model.getCardNo());
            c.setReleaseReason(model.getReleaseReason());
            c.setPlateNos(model.getPlateNo());
            c.setReleaseResult(model.getReleaseResult());
            c.setInoutType(model.getVehicleOut());
            c.setParkIndex(model.getParkSyscode());
            c.setParkName(model.getParkName());
            c.setEventId(model.getCrossRecordSyscode());
            c.setGateIndex(model.getEntranceSyscode());
            c.setGateName(model.getEntranceName());
            c.setIsdeleted(Constants.ZERO);
            if(model.getVehicleOut() !=null &&model.getVehicleOut() ==   0 ){
                c.setEventType(HKConstants.EventTypes.PARK_PASS_IN.getKey());
            }else {
                c.setEventType(HKConstants.EventTypes.PARK_PASS_OUT.getKey());
            }
            newList.add(c);
        }
        return newList;
    }
}
server/dmvisit_service/src/main/resources/application-testYL.yml
@@ -43,7 +43,7 @@
  title: ${project.name}接口文档
  description: ${project.name}接口文档
  enabled: true
  context-path: /erp_api
  context-path:
  # ç¦ç”¨swagger时的重定向地址
  redirect-uri: /
@@ -61,7 +61,6 @@
  map:
    remoteHost: https://apis.map.qq.com
    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
des_pwd: 123456SDFKDJF