</t-tabs>
20
      </div>
21
22
      <div class="replayer-video">
23
        <t-loading v-model="loadVideo">
24
          <span class="text-md text-info">获取视频资源...</span>
25
        </t-loading>
26
        <video-player :sources="videoList" :autoadvance="0" :style="{'width':'100%',opacity: loadVideo ? 0: 1}" @player-inited="handlePlayerInited" @playlistitem="handlePlayerCurrentChange" />
27
      </div>
28
    </div>
29
  </t-modal>
30
</template>
31
32
<script>
33
import VideoPlayer from '@/components/VideoPlayer'
34
import formatDateTime from '@/utils/formatDateTime.js'
35
import sysapi from '@/api/videoSurveillance'
36
37
export default {
38
  filters: {
39
    formatDateTime
40
  },
41
  components: { VideoPlayer },
42
  props: {
43
    // 视频列表
44
    list: {
45
      type: Array,
46
      default: () => []
47
    },
48
    // 是否显示对话框
49
    visibled: {
50
      type: Boolean,
51
      default: false
52
    }
53
  },
54
  data () {
55
    return {
56
      // 当前的tab标签
57
      currentTab: null,
58
      loadVideo: false,
59
      // 视频列表
60
      videoList: [],
61
      // 视频播放器对象
62
      $player: null,
63
      // 开始时间
64
      beginDay: '2020-12-19 20:14:00',
65
      // 结束时间
66
      endDay: '2020-12-19 20:14:59',
67
      isShow: true
68
    }
69
  },
70
  computed: {
71
    visible: {
72
      get () { return this.visibled },
73
      set (val) {
74
        if (!val) this.$player.pause()
75
        this.$emit('update:visibled', val)
76
      }
77
    }
78
  },
79
  watch: {
80
    list: {
81
      handler (val) {
82
        this.list = val
83
        // 利用v-if刷新tab组件
84
        this.reload()
85
        console.warn(`list Change`)
86
        this.resetVideoList()
87
        if (val.length > 0) {
88
          this.currentTab = val[0].fileId
89
          // 手动触发第一个tab点击事件
90
          this.handleTabChange(null, 0)
91
        }
92
      },
93
      immediate: true
94
    }
95
  },
96
  methods: {
97
    // 初始化视频
98
    handlePlayerInited (player) {
99
      this.$player = player
100
      window.player = this
101
    },
102
    async handleTabChange (name, index) {
103
      this.$player.pause()
104
      await this.preloadOriVideoUrl(index)
105
      this.play(index)
106
    },
107
    handlePlayerCurrentChange (e, item) {
108
      const { index, fileId } = item
109
      this.currentTab = fileId
110
      this.preloadOriVideoUrl(index)
111
    },
112
    resetVideoList () {
113
      const videoList = this.list.map((item, index) => {
114
        const { fileId } = item
115
        const fileType = 'video/' + item.fileType
116
        return {
117
          index,
118
          fileId,
119
          fileType,
120
          loaded: false
121
        }
122
      })
123
124
      this.videoList = videoList
125
    },
126
    play (index) {
127
      console.log(`播放:index=${index}`)
128
      // 调用额外的currentItem方法以避免currentItem在首次不生效
129
      // https://github.com/brightcove/videojs-playlist/blob/master/docs/api.md
130
      this.$player.playlist.currentItem()
131
      this.$player.playlist.currentItem(index)
132
      this.$player.play()
133
    },
134
    /**
135
   *  从index开始预载videoList的视频地址
136
   *  此方法将在获取index对应的地址后就立即返回
137
   */
138
    preloadOriVideoUrl (index = 0, maxLength = 5) {
139
      return new Promise((resolve, reject) => {
140
        for (let i = index; i in this.videoList && i - index < maxLength; i++) {
141
          console.log(`预载地址:index=${i}`)
142
          const item = this.videoList[i]
143
          const task = item.loaded
144
            ? Promise.resolve()
145
            : this.getOriVideoUrl(item.fileId).then(resp => {
146
              console.log(`预载完成,更新播放源:index=${i}`)
147
              item.loaded = true
148
              item.sources = [{
149
                src: resp.url,
150
                type: item.fileType
151
              }]
152
            })
153
          if (i === index) {
154
            this.loadVideo = !item.loaded
155
            task.then(() => {
156
              resolve()
157
            }).finally(() => {
158
              this.loadVideo = false
159
            })
160
          }
161
        }
162
      })
163
    },
164
    /*
165
   * 获取真实视频地址
166
   */
167
    async getOriVideoUrl (fileId) {
168
      const res = await sysapi.getFileUrl(fileId)
169
      // fake
170
      return new Promise((resolve, reject) => {
171
        setTimeout(() => {
172
          const url = res.data.data.fileUrl
173
          resolve({
174
            url
175
          })
176
        }, 1000)
177
      })
178
    },
179
    getData () {
180
      this.$emit('get-list', { beginDay: this.beginDay, endDay: this.endDay })
181
    },
182
    resetData () {
183
      this.beginDay = formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss')
184
      this.endDay = formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
185
      // this.getData()
186
    },
187
    // 刷新组件
188
    reload () {
189
      this.isShow = false
190
      this.$nextTick(() => {
191
        this.isShow = true
192
      })
193
    }
194
  }
195
}
196
</script>
197
198
<style lang="scss">
199
.replayer {
200
  display: flex;
201
202
  &-list {
203
    margin-right: 20px;
204
    // width: 200px;
205
    .date-select-box {
206
      margin-top: 15px;
207
      > div {
208
        margin-bottom: 15px;
209
      }
210
    }
211
  }
212
213
  &-video {
214
    position: relative;
215
    flex: auto;
216
  }
217
}
218
</style>

+ 162 - 0
security-protection-platform/src/modules/videoSurveillance/components/rtmpVideoPlay/index.vue

@ -0,0 +1,162 @@
1
<template>
2
  <div class="replayer">
3
    <div class="replayer-video">
4
      <t-loading v-model="loadVideo">
5
        <span class="text-md text-info">获取视频资源...</span>
6
      </t-loading>
7
      <video-player :sources="videoList" :autoadvance="0" :style="{opacity: loadVideo ? 0: 1}" @player-inited="handlePlayerInited" @playlistitem="handlePlayerCurrentChange" />
8
    </div>
9
  </div>
10
</template>
11
12
<script>
13
import VideoPlayer from '@/components/VideoPlayer'
14
15
export default {
16
  components: { VideoPlayer },
17
  props: {
18
    list: {
19
      type: Array,
20
      default: () => []
21
    },
22
    visibled: {
23
      type: Boolean,
24
      default: false
25
    }
26
  },
27
  data () {
28
    return {
29
      currentTab: null,
30
      loadVideo: false,
31
      videoList: [],
32
      $player: null
33
    }
34
  },
35
  computed: {
36
    visible: {
37
      get () { return this.visibled },
38
      set (val) {
39
        if (!val) this.$player.pause()
40
        this.$emit('update:visibled', val)
41
      }
42
    }
43
  },
44
  watch: {
45
    list: {
46
      handler (val) {
47
        console.warn(`list Change`)
48
        this.resetVideoList()
49
        if (val.length > 0) {
50
          this.currentTab = val[0].fileId
51
          // 手动触发第一个tab点击事件
52
          this.handleTabChange(null, 0)
53
        }
54
      },
55
      immediate: true
56
    }
57
  },
58
  methods: {
59
    // 初始化
60
    handlePlayerInited (player) {
61
      this.$player = player
62
      window.player = this
63
      var myButton = player.controlBar.addChild('button')
64
      myButton.addClass('vjs-play-control')
65
      myButton.on('click', () => {
66
        this.$emit('videoReplay', this.list[0].id)
67
      })
68
    },
69
    async handleTabChange (name, index) {
70
      this.$player.pause()
71
      await this.preloadOriVideoUrl(index)
72
      this.play(index)
73
    },
74
    handlePlayerCurrentChange (e, item) {
75
      const { index, fileId } = item
76
      this.currentTab = fileId
77
      this.preloadOriVideoUrl(index)
78
    },
79
    resetVideoList () {
80
      const videoList = this.list.map((item, index) => {
81
        const { fileId, fileType } = item
82
        return {
83
          index,
84
          fileId,
85
          fileType,
86
          loaded: false
87
        }
88
      })
89
90
      this.videoList = videoList
91
    },
92
    play (index) {
93
      console.log(`播放:index=${index}`)
94
      // 调用额外的currentItem方法以避免currentItem在首次不生效
95
      // https://github.com/brightcove/videojs-playlist/blob/master/docs/api.md
96
      this.$player.playlist.currentItem()
97
      this.$player.playlist.currentItem(index)
98
      this.$player.play()
99
    },
100
    /**
101
     *  从index开始预载videoList的视频地址
102
     *  此方法将在获取index对应的地址后就立即返回
103
     */
104
    preloadOriVideoUrl (index = 0, maxLength = 5) {
105
      return new Promise((resolve, reject) => {
106
        for (let i = index; i in this.videoList && i - index < maxLength; i++) {
107
          console.log(`预载地址:index=${i}`)
108
          const item = this.videoList[i]
109
          const task = item.loaded
110
            ? Promise.resolve()
111
            : this.getOriVideoUrl(item.fileId).then(resp => {
112
              console.log(`预载完成,更新播放源:index=${i}`)
113
              item.loaded = true
114
              item.sources = [{
115
                src: resp.url,
116
                type: item.fileType
117
              }]
118
            })
119
          if (i === index) {
120
            this.loadVideo = !item.loaded
121
            task.then(() => {
122
              resolve()
123
            }).finally(() => {
124
              this.loadVideo = false
125
            })
126
          }
127
        }
128
      })
129
    },
130
    /*
131
     * 获取真实视频地址
132
     */
133
    getOriVideoUrl (fileId) {
134
      console.log(`请求地址:${fileId}`)
135
      // fake
136
      return new Promise((resolve, reject) => {
137
        setTimeout(() => {
138
          const url = fileId || 'rtmp://10.19.90.34:2935/live?token=039b6232ce6548210722a4c0de19c62e/1'
139
          resolve({
140
            url
141
          })
142
        }, 1000)
143
      })
144
    }
145
  }
146
}
147
</script>
148
149
<style lang="scss">
150
.replayer {
151
  display: flex;
152
  &-list {
153
    margin-right: 20px;
154
    // width: 200px;
155
  }
156
157
  &-video {
158
    position: relative;
159
    flex: auto;
160
  }
161
}
162
</style>

+ 172 - 173
security-protection-platform/src/modules/videoSurveillance/index.vue

@ -1,55 +1,46 @@
1 1
<template>
2 2
  <div class="page-main">
3 3
    <t-button-group class="top-btn">
4
      <t-button :color="tabType === 'gate' ? 'primary' : 'secondary'" @click="tabClick('gate')">风场大门</t-button>
5
      <t-button :color="tabType === 'room' ? 'primary' : 'secondary'" @click="tabClick('room')">集控室</t-button>
4
      <t-button v-for="(item,index) in sceneList" :key="index"
5
                :value="item.monitorSceneId"
6
                :color="item.monitorSceneId === selectedMonitorScene ? 'primary' : 'secondary'"
7
                @click="tabClick(item.monitorSceneId)">
8
        {{ item.monitorSceneName }}
9
      </t-button>
6 10
    </t-button-group>
7 11
    <div class="page-top">
8 12
      <span>风场:</span>
9
      <t-select v-model="gateFieldData" @change="getWindFieldData">
10
        <t-option v-for="(item,index) in organizationList" :key="index" :value="item.id">{{ item.org }}</t-option>
13
      <t-select v-model="gateFieldData" clearable @change="getSceneList()">
14
        <t-option v-for="(item,index) in organizationList" :key="index" :value="item.id">{{ item.name }}</t-option>
11 15
      </t-select>
12 16
    </div>
13
    <div v-if="tabType==='gate'" >
14
      <div class="page-bottom">
15
        <t-card v-for="(item,index) in gateList" :key="index" :class="index%3===0?'card-video-first':'card-video'">
16
          <img :src="item.url" class="card-image">
17
          <div slot="foot" class="bottom">
18
            <span v-tooltip="item.videoDetail">{{ item.videoDetail.content | handleText }}</span>
19
            <div style="margin-left:auto">
20
              <t-button v-tooltip="item.options1" class="bottom-btn" @click="goDistinguishRecord(item.videoId)"><t-icon size="16" icon="image-outline"></t-icon></t-button>
21
              <t-button v-tooltip="item.options2" class="bottom-btn"><t-icon size="16" icon="piechart-outline"></t-icon></t-button>
22
              <t-button v-tooltip="item.options3" class="bottom-btn"><t-icon size="16" icon="arrow-expand-all-outline"></t-icon></t-button>
23
            </div>
24
          </div>
25
        </t-card>
17
    <div class="page-bottom">
18
      <div v-for="(item,index) in videoList" :key="index" :value="item.id" style="width:400px;margin:24px 0px 0 24px;">
19
        <rtmp-video :list="getVideoPlayList(item)" @videoReplay="handleReview"></rtmp-video>
26 20
      </div>
27
      <t-pager :page-size="gatePageSize" :current="gateCurrent" :total="gateTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
28
    </div>
29
    <div v-if="tabType==='room'" >
30
      <div class="page-bottom">
31
        <t-card v-for="(item,index) in roomList" :key="index" :class="index%3===0?'card-video-first':'card-video'">
32
          <img :src="item.url" class="card-image">
33
          <div slot="foot" class="bottom">
34
            <span v-tooltip="item.videoDetail">{{ item.videoDetail.content | handleText }}</span>
35
            <div style="margin-left:auto">
36
              <t-button v-tooltip="item.options1" class="bottom-btn" @click="goDistinguishRecord(item.videoId)"><t-icon size="16" icon="image-outline"></t-icon></t-button>
37
              <t-button v-tooltip="item.options2" class="bottom-btn"><t-icon size="16" icon="piechart-outline"></t-icon></t-button>
38
              <t-button v-tooltip="item.options3" class="bottom-btn"><t-icon size="16" icon="arrow-expand-all-outline"></t-icon></t-button>
39
            </div>
40
          </div>
41
        </t-card>
42
      </div>
43
      <t-pager :page-size="roomPageSize" :current="roomCurrent" :total="roomTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeRoom"></t-pager>
44 21
    </div>
22
    <t-pager :page-size="videoPageSize" :current="videoCurrent" :total="videoTotal" :sizer-range="[ 5, 10, 20, 30 ]" class="pager" show-elevator @on-change="onChangeGate"></t-pager>
23
    <replay-dialog :list="replayList" :visibled.sync="showReplayDialog" @get-list="queryMonitorVideoLog" />
45 24
  </div>
46 25
</template>
47 26
<script>
48 27
import sysapi from '@/api/videoSurveillance'
49
import commonapi from '@/api/common'
28
import RtmpVideo from './components/rtmpVideoPlay'
29
import ReplayDialog from './components/ReplayDialog'
30
import VideoPlayer from '@/components/VideoPlayer'
31
import formatDateTime from '@/utils/formatDateTime.js'
32
import videojs from 'video.js'
33
window.videojs = videojs
34
35
require('videojs-flash')
36
require('videojs-playlist')
37
require('video.js/dist/lang/zh-CN.js')
38
require('video.js/dist/video-js.min.css')
39
50 40
export default {
41
  components: { ReplayDialog, VideoPlayer, RtmpVideo },
51 42
  filters: {
52
    handleText(value) {
43
    handleText (value) {
53 44
      if (!value) return ''
54 45
      if (value.length > 13) {
55 46
        return value.slice(0, 13) + '...'
@ -57,179 +48,187 @@ export default {
57 48
      return value
58 49
    }
59 50
  },
60
  data() {
51
  data () {
61 52
    return {
62
      gateCurrent: 1, // 大门分页数据
63
      gatePageSize: 10, // 大门分页数据
64
      gateTotal: 100, // 大门分页总数
65
      roomCurrent: 1, // 集控室分页数据
66
      roomPageSize: 10, // 集控室分页数据
67
      roomTotal: 100, // 集控室分页总数
68
      tabType: 'gate',
53
      videoCurrent: 1, // 大门分页数据
54
      videoPageSize: 10, // 大门分页数据
55
      videoTotal: 100, // 大门分页总数
56
      tabId: 1,
57
      paramsObj: { // 接口请求数据
58
        page: 0,
59
        limit: 10
60
      },
69 61
      organizationList: [], // 风场数据
70
      gateFieldData: 101101,
71
      gateList: [],
72
      roomList: []
62
      gateFieldData: '',
63
      videoList: [], // 场景数据列表
64
      sceneList: [], // 场景列表
65
      selectedMonitorScene: '', // 当前选择场景
66
      videoPlayList: [],
67
      showReplayDialog: false,
68
      replayList: [],
69
      beginDay: formatDateTime(new Date(+new Date() - 10 * 60 * 1000), 'yyyy-MM-dd hh:mm:ss'),
70
      endDay: formatDateTime(new Date(), 'yyyy-MM-dd hh:mm:ss')
71
      // beginDay: '2020-12-19 20:14:00',
72
      // endDay: '2020-12-19 20:14:00'
73 73
    }
74 74
  },
75
  mounted() {
75
  mounted () {
76 76
    this.getWindFiledList() // 获取风场列表
77
    this.getWindFieldData()
78
    this.getCenterRoomData()
79 77
  },
80 78
  methods: {
81
    tabClick(name) {
82
      this.gateFieldData = ''
83
      this.gateCurrent = 1
84
      this.roomCurrent = 1
85
      if (name === 'gate') {
86
        this.tabType = 'gate'
79
    getVideoPlayList (item) {
80
      return [{
81
        fileId: item.videoUrl,
82
        fileType: 'rtmp/flv',
83
        id: item.resourceToolId
84
      }]
85
    },
86
    // 获取场景列表
87
    getSceneList () {
88
      this.sceneList = []
89
      this.videoList = []
90
      console.log(this.organizationList)
91
      this.organizationList.forEach((element, index) => {
92
        if (element.id === this.gateFieldData) {
93
          sysapi.getMonitorScene(this.organizationList[index].id).then((resp) => {
94
            this.sceneList = resp.data.data || []
95
            this.tabClick(this.sceneList[0].monitorSceneId)
96
          })
97
        }
98
      })
99
    },
100
    // 向服务器发送请求获取视频回放数据
101
    async queryMonitorVideoLog (data) {
102
      let res = []
103
      // console.log(this.beginDay, this.endDay)
104
      if (data) {
105
        res = await sysapi.queryMonitorVideoLog({ params: { id: this.replayId, ...data } })
106
      } else {
107
        res = await sysapi.queryMonitorVideoLog({ params: { id: this.replayId, beginDay: this.beginDay, endDay: this.endDay } })
108
      }
109
      if (res.status === 200) {
110
        this.replayList = res.data.data
87 111
      } else {
88
        this.tabType = 'room'
112
        this.$Message.danger('视频列表数据获取失败!')
89 113
      }
90 114
    },
91
    getWindFiledList() {
92
      commonapi.getDepartments().then(resp => {
93
        this.organizationList = []
94
        console.log(resp)
95
        this.organizationList = resp.data.map(item => {
96
          return {
97
            org: item.name,
98
            id: item.id
99
          }
100
        })
115
    // 显示视频回放对话框
116
    handleReview (id) {
117
      this.replayId = id
118
      this.queryMonitorVideoLog()
119
      this.showReplayDialog = true
120
    },
121
    // 切换场景
122
    async tabClick (id) {
123
      this.selectedMonitorScene = id
124
      this.paramsObj.page = 0
125
      this.videoList = []
126
      this.tabId = id
127
      this.videoCurrent = 1
128
      this.getVideoSurveillanceData(id)
129
    },
130
    // 获取风场下拉框列表
131
    async getWindFiledList () {
132
      sysapi.getDepartments().then(resp => {
133
        this.organizationList = resp.data.data
134
        this.gateFieldData = this.organizationList[0].id
135
        this.getSceneList()
101 136
      }, err => {
102 137
        this.$Message.danger('获取风场列表失败!')
103 138
        console.log(err)
104 139
      })
105 140
    },
106 141
    // 获得风场大门数据
107
    getWindFieldData() {
108
      let obj = {
109
        page: this.gateCurrent,
110
        limit: this.gatePageSize
111
      }
112
      sysapi.getGateFieldData({params: obj}).then(res => {
113
        this.gateList = res.data.data
114
        this.gateTotal = res.data.total
115
        this.gateList.forEach(element => {
116
          const txt = element.videoDetail
117
          element.videoDetail = {}
118
          element.videoDetail.content = txt
119
          element.videoDetail.placement = 'top'
120
        })
142
    getVideoSurveillanceData (id) {
143
      this.paramsObj.page = this.videoCurrent
144
      sysapi.getVideoSurveillanceData({ params: { monitorSceneId: id } }).then(res => {
145
        this.videoList = res.data.data
121 146
      })
122 147
    },
123
    // 获得集控室数据
124
    getCenterRoomData() {
125
      let obj = {
126
        page: this.roomCurrent,
127
        limit: this.roomPageSize
128
      }
129
      sysapi.getCenterRoomData({params: obj}).then(res => {
130
        this.roomList = res.data.data
131
        this.roomTotal = res.data.total
132
        this.roomList.forEach(element => {
133
          const txt = element.videoDetail
134
          element.videoDetail = {}
135
          element.videoDetail.content = txt
136
          element.videoDetail.placement = 'top'
137
        })
138
      })
139
    },
140
    // 集控室分页
141
    onChangeRoom (val) {
142
      this.roomCurrent = val
143
      this.getCenterRoomData()
144
    },
145 148
    // 进入识别记录界面
146
    goDistinguishRecord(id) {
147
      this.$router.push({path: '/videoSurveillance/distinguishRecord', query: {videoId: id}})
149
    goDistinguishRecord (id) {
150
      this.$router.push({ path: '/videoSurveillance/distinguishRecord', query: { videoId: id } })
148 151
    },
149 152
    // 风场大门分页
150
    onChangeGate(val) {
151
      this.gateCurrent = val
152
      this.getWindFieldData()
153
    onChangeGate (val) {
154
      this.videoList = []
155
      this.videoCurrent = val
153 156
    }
154 157
  }
155 158
}
156 159
</script>
157 160
<style lang="scss" scoped>
158
.page-main{
159
    padding:30px 24px 24px 24px;
160
    .top-btn{
161
        float: right;
162
    }
163
    .page-bottom{
164
        display: flex;
161
.page-main {
162
  padding: 30px 24px 24px 24px;
163
  .top-btn {
164
    float: right;
165
  }
166
  .page-bottom {
167
    display: flex;
168
    width: 100%;
169
    flex-wrap: wrap;
170
    margin-left: -24px;
171
    .card-video-first,
172
    .card-video {
173
      width: 354px;
174
      height: 240px;
175
      margin-top: 20px;
176
      .card-image {
165 177
        width: 100%;
166
        flex-wrap: wrap;
167
        .card-video-first, .card-video{
168
          width:397px;
169
          margin-top: 20px;
170
          height:245px;
171
            .card-image{
172
                width: 100%;
173
                height: 100%;
174
            }
175
            .bottom{
176
                padding: 0 12px;
177
                display: flex;
178
                align-items: center;
179
                background-color: rgba(0, 0, 0, 0.5);
180
                height: 40px;
181
                color: #fff;
182
                font-size: 14px;
183
                .bottom-btn{
184
                    color: #fff;
185
                    border: none;
186
                    padding:0 !important;
187
                    &:hover{
188
                        color: #0089d4;
189
                    }
190
                }
191
            }
192
        }
193
        .card-video-first{
194
          .card-footer{
195
             padding: 0px !important;
196
             background: none;
197
             width: 100%;
198
             position: absolute;
199
             border-top: none;
200
             bottom: 0px;
201
             }
202
            .card-block{
203
              padding:0 !important;
204
            }
205
        }
206
        .card-video{
207
          .card-footer{
208
             padding: 0px 0 0 24px !important;
209
             background: none;
210
             width: 100%;
211
             position: absolute;
212
             border-top: none;
213
             bottom: 0px;
214
             }
215
            .card-block, .card-video-block{
216
              margin-left: 24px;
217
              padding:0 !important;
218
            }
178
        height: 100%;
179
      }
180
      .bottom {
181
        padding: 0 12px;
182
        display: flex;
183
        align-items: center;
184
        background-color: rgba(0, 0, 0, 0.5);
185
        height: 40px;
186
        color: #fff;
187
        font-size: 14px;
188
        .bottom-btn {
189
          color: #fff;
190
          border: none;
191
          padding: 0 !important;
192
          &:hover {
193
            color: #0089d4;
194
          }
219 195
        }
196
      }
220 197
    }
221
    .pager{
198
    .card-video {
199
      .card-footer {
200
        padding: 0px 0 0 24px !important;
201
        background: none;
202
        width: 100%;
203
        position: absolute;
204
        border-top: none;
205
        bottom: 0px;
206
      }
207
      .card-block,
208
      .card-video-block {
209
        margin-left: 24px;
210
        padding: 0 !important;
211
      }
212
    }
213
  }
214
  .pager {
222 215
    margin-right: auto;
223 216
    margin: 21px 0px 24px 0;
224 217
    float: right;
225 218
  }
226
.btn-primary, .radio-group-button .form-radio:checked, .radio-group-button .form-radio[checked]{
219
  .btn-primary,
220
  .radio-group-button .form-radio:checked,
221
  .radio-group-button .form-radio[checked] {
227 222
    color: #0089d4;
228 223
    background-color: #fff;
229 224
    border: 1px solid #0089d4;
230
}
231
.btn-secondary, .radio-group-button .form-radio, .checkbox-group--button .form-checkbox .form-checkbox__inner, .btn-dashed-secondary, .btn-outline-secondary{
225
  }
226
  .btn-secondary,
227
  .radio-group-button .form-radio,
228
  .checkbox-group--button .form-checkbox .form-checkbox__inner,
229
  .btn-dashed-secondary,
230
  .btn-outline-secondary {
232 231
    background: none;
233
}
232
  }
234 233
}
235 234
</style>

+ 4 - 4
security-protection-platform/src/modules/workorder/components/modal/approvalmodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="approval-modal-title">工单审批</div>
5 5
    </template>
@ -20,8 +20,8 @@
20 20
    <t-form ref="approvalModalForm" :model="approvalModalForm" :rules="approvalModalFormRules" :label-span="2" label-position="right">
21 21
      <t-form-item label="审批结果:" prop="result">
22 22
        <t-radio-group v-model="approvalModalForm.result">
23
          <t-radio label="0">同意</t-radio>
24
          <t-radio label="1">拒绝</t-radio>
23
          <t-radio label="1">同意</t-radio>
24
          <t-radio label="0">拒绝</t-radio>
25 25
        </t-radio-group>
26 26
      </t-form-item>
27 27
      <t-form-item label="审批意见:" prop="comments">
@ -98,7 +98,6 @@ export default {
98 98
      this.$refs['approvalModalForm'].validate((valid) => {
99 99
        if (valid) {
100 100
          this.addApprovalData()
101
          this.$emit('refresh-all-data')
102 101
        } else {
103 102
          this.loadingSubmit = false
104 103
          console.log('error--------->请输入完整的表单信息!')
@ -111,6 +110,7 @@ export default {
111 110
      const res = await workOrderApi.addApprovalData(this.approvalModalForm)
112 111
      if (res.status === 200) {
113 112
        this.resetModalData()
113
        this.$emit('refresh-all-data')
114 114
        this.$Message.success('操作成功!')
115 115
      } else {
116 116
        this.$Message.danger('操作失败!')

+ 2 - 2
security-protection-platform/src/modules/workorder/components/modal/cardreplacementmodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="cardReplacementModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="cardReplacementModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="card-modal-title">新增补卡</div>
5 5
    </template>
@ -92,7 +92,6 @@ export default {
92 92
      this.$refs['cardReplacementModalForm'].validate((valid) => {
93 93
        if (valid) {
94 94
          this.addCardReplacementData()
95
          this.$emit('refresh-data')
96 95
        } else {
97 96
          console.log('error--------->请输入完整的表单信息!')
98 97
          this.loadingSubmit = false
@ -112,6 +111,7 @@ export default {
112 111
        if (res.data.fail) {
113 112
          this.$Message.warning(res.data.fail)
114 113
        } else {
114
          this.$emit('refresh-data')
115 115
          this.$Message.success('提交成功!')
116 116
        }
117 117
      } else {

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/fieldservicemodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="fieldServiceModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="fieldServiceModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="field-modal-title">新增外勤</div>
5 5
    </template>
@ -115,7 +115,6 @@ export default {
115 115
      this.$refs['fieldServiceModalForm'].validate((valid) => {
116 116
        if (valid) {
117 117
          this.addFieldServiceData()
118
          this.$emit('refresh-data')
119 118
        } else {
120 119
          console.log('error--------->请输入完整的表单信息!')
121 120
          this.loadingSubmit = false
@ -143,6 +142,7 @@ export default {
143 142
        if (res.data.fail) {
144 143
          this.$Message.warning(res.data.fail)
145 144
        } else {
145
          this.$emit('refresh-data')
146 146
          this.$Message.success('提交成功!')
147 147
        }
148 148
      } else {
@ -155,7 +155,7 @@ export default {
155 155
      if (startDate && endDate) {
156 156
        const start = +new Date(startDate)
157 157
        const end = +new Date(endDate)
158
        return (end - start) / (24 * 60 * 60 * 1000)
158
        return (end - start) / (24 * 60 * 60 * 1000) + 1
159 159
      } else {
160 160
        return 0
161 161
      }
@ -163,6 +163,7 @@ export default {
163 163
    // 计算结束时间
164 164
    calEndTime (startDate, duration) {
165 165
      if (startDate && duration) {
166
        duration = duration - 1
166 167
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
167 168
        return endDate
168 169
      } else {

+ 1 - 1
security-protection-platform/src/modules/workorder/components/modal/importworkordermodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="leave-modal-title">导入工单</div>
5 5
    </template>

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/leavemodal.vue

@ -1,6 +1,6 @@
1 1
<template>
2 2
  <!-- 请假对话框 -->
3
  <t-modal :visibled.sync="visibled" :mask-closable="false" width="600px" height="500px">
3
  <t-modal :visibled.sync="visibled" :mask-closable="false" :closable="false" width="600px" height="500px">
4 4
    <template slot="header">
5 5
      <div class="leave-modal-title">新增请假</div>
6 6
    </template>
@ -113,7 +113,6 @@ export default {
113 113
      this.$refs['leaveModalForm'].validate((valid) => {
114 114
        if (valid) {
115 115
          this.addLeaveData()
116
          this.$emit('refresh-data')
117 116
        } else {
118 117
          console.log('error--------->请输入完整的表单信息!')
119 118
          this.loadingSubmit = false
@ -141,6 +140,7 @@ export default {
141 140
        if (res.data.fail) {
142 141
          this.$Message.warning(res.data.fail)
143 142
        } else {
143
          this.$emit('refresh-data')
144 144
          this.$Message.success('提交成功!')
145 145
        }
146 146
      } else {
@ -153,7 +153,7 @@ export default {
153 153
      if (startDate && endDate) {
154 154
        const start = +new Date(startDate)
155 155
        const end = +new Date(endDate)
156
        return (end - start) / (24 * 60 * 60 * 1000)
156
        return (end - start) / (24 * 60 * 60 * 1000) + 1
157 157
      } else {
158 158
        return 0
159 159
      }
@ -161,6 +161,7 @@ export default {
161 161
    // 计算结束时间
162 162
    calEndTime (startDate, duration) {
163 163
      if (startDate && duration) {
164
        duration = duration - 1
164 165
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
165 166
        return endDate
166 167
      } else {

+ 4 - 3
security-protection-platform/src/modules/workorder/components/modal/overtimemodal.vue

@ -1,5 +1,5 @@
1 1
<template>
2
  <t-modal :visibled.sync="overtimeModal" :mask-closable="false" width="600px" height="500px">
2
  <t-modal :closable="false" :visibled.sync="overtimeModal" :mask-closable="false" width="600px" height="500px">
3 3
    <template slot="header">
4 4
      <div class="work-modal-title">新增加班</div>
5 5
    </template>
@ -102,7 +102,6 @@ export default {
102 102
      this.$refs['overtimeModalForm'].validate((valid) => {
103 103
        if (valid) {
104 104
          this.addWorkOverTimeData()
105
          this.$emit('refresh-data')
106 105
        } else {
107 106
          console.log('error--------->请输入完整的表单信息!')
108 107
          this.loadingSubmit = false
@ -130,6 +129,7 @@ export default {
130 129
        if (res.data.fail) {
131 130
          this.$Message.warning(res.data.fail)
132 131
        } else {
132
          this.$emit('refresh-data')
133 133
          this.$Message.success('提交成功!')
134 134
        }
135 135
      } else {
@ -142,7 +142,7 @@ export default {
142 142
      if (startDate && endDate) {
143 143
        const start = +new Date(startDate)
144 144
        const end = +new Date(endDate)
145
        return (end - start) / (24 * 60 * 60 * 1000)
145
        return (end - start) / (24 * 60 * 60 * 1000) + 1
146 146
      } else {
147 147
        return 0
148 148
      }
@ -150,6 +150,7 @@ export default {
150 150
    // 计算结束时间
151 151
    calEndTime (startDate, duration) {
152 152
      if (startDate && duration) {
153
        duration = duration - 1
153 154
        const endDate = formatDateTime(new Date(+new Date(startDate) + (duration * 24 * 60 * 60 * 1000)))
154 155
        return endDate
155 156
      } else {

+ 1 - 1
security-protection-platform/src/modules/workorder/components/modal/workorderinfomodal.vue

@ -15,7 +15,7 @@
15 15
    </div>
16 16
    <div v-if="status" class="approval-info row">
17 17
      <div class="col-6">审批人:<span>{{ data.approver }}</span></div>
18
      <div class="col-6">审批结果:<span>{{ data.result===0?'同意':'驳回' }}</span></div>
18
      <div class="col-6">审批结果:<span>{{ data.result==='0'?'失败':'成功' }}</span></div>
19 19
      <div class="col-12">审批时间:<span>{{ data.approveTime }}</span></div>
20 20
      <div class="col-12">审批意见:<span>{{ data.comments }}</span></div>
21 21
    </div>

+ 68 - 14
security-protection-platform/src/routes.js

@ -18,21 +18,41 @@ export const constantRoutes = [
18 18
    hidden: true
19 19
  },
20 20
  {
21
    name: 'dashboard',
22
    path: '/dashboard',
23
    component: () => import(/* webpackChunkName: "dashboard" */ './modules/dashboard'),
24
    meta: { title: '首页', icon: 'home' },
25
    children: [
26
      {
27
        name: 'dashboardch',
28
        path: '',
29
        meta: { title: '首页', icon: 'home' }
30
      }
31
    ]
32
  },
33
  {
21 34
    path: '/videoSurveillance',
22 35
    component: Layout,
23
    meta: { icon: 'home' },
36
    meta: { icon: 'video' },
24 37
    children: [
25 38
      {
26 39
        name: 'videoSurveillance',
27 40
        path: '',
28 41
        component: () => import(/* webpackChunkName: "videoSurveillance" */ './modules/videoSurveillance'),
29
        meta: { title: '视频监控', icon: 'home' }
30
      },
42
        meta: { title: '视频监控', icon: 'video' }
43
      }
44
    ]
45
  },
46
  {
47
    path: '/access',
48
    component: Layout,
49
    meta: { icon: 'file-solution-outline' },
50
    children: [
31 51
      {
32
        name: 'videoSurveillance/distinguishRecord',
33
        path: '/videoSurveillance/distinguishRecord',
34
        component: () => import(/* webpackChunkName: "distinguishRecord" */ './modules/videoSurveillance/distinguishRecord'),
35
        hidden: true
52
        name: 'access',
53
        path: '',
54
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/access/index.vue'),
55
        meta: { title: '进出记录', icon: 'file-solution-outline' }
36 56
      }
37 57
    ]
38 58
  },
@ -57,13 +77,26 @@ export const constantRoutes = [
57 77
  }, {
58 78
    path: '/workorder',
59 79
    component: Layout,
60
    meta: { icon: 'home' },
80
    meta: { icon: 'calendar-outline' },
61 81
    children: [
62 82
      {
63 83
        name: 'workorder',
64 84
        path: '',
65 85
        component: () => import(/* webpackChunkName: "workorder" */ './modules/workorder'),
66
        meta: { title: '假勤管理', icon: 'home' }
86
        meta: { title: '假勤管理', icon: 'calendar-outline' }
87
      }
88
    ]
89
  },
90
  {
91
    path: '/alarm',
92
    component: Layout,
93
    meta: { icon: 'bell' },
94
    children: [
95
      {
96
        name: 'ai_alarm',
97
        path: '',
98
        component: () => import(/* webpackChunkName: "alarm" */ './modules/aialarm/index.vue'),
99
        meta: { title: 'AI报警', icon: 'bell' }
67 100
      }
68 101
    ]
69 102
  }, {
@ -80,19 +113,40 @@ export const constantRoutes = [
80 113
        meta: { title: '设备管理' }
81 114
      },
82 115
      {
83
        name: 'sys_attendance',
84
        path: 'attendance',
85
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/system/attendance'),
86
        meta: { title: '考勤配置' }
116
        name: 'sys_task',
117
        path: 'assignment',
118
        component: () => import(/* webpackChunkName: "sys__task" */ './modules/system/assignment'),
119
        meta: { title: 'AI任务' }
87 120
      },
88 121
      {
89 122
        name: 'sys_monitor',
90 123
        path: 'monitor',
91 124
        component: () => import(/* webpackChunkName: "sys_monitor" */ './modules/system/monitor'),
92 125
        meta: { title: '监控布局' }
126
      },
127
      {
128
        name: 'sys_attendance',
129
        path: 'attendance',
130
        component: () => import(/* webpackChunkName: "sys_attendance" */ './modules/system/attendance'),
131
        meta: { title: '考勤配置' }
93 132
      }
94 133
    ]
95
  }, {
134
  },
135
  {
136
    path: '/usermana',
137
    component: Layout,
138
    meta: { icon: 'lock' },
139
    children: [
140
      {
141
        name: 'usermana',
142
        path: '',
143
        component: () => import(/* webpackChunkName: "user_rights" */ './modules/usermana'),
144
        meta: { title: '用户管理', icon: 'lock' }
145
      }
146
147
    ]
148
  },
149
  {
96 150
    path: '*',
97 151
    hidden: true,
98 152
    component: {

+ 1 - 0
security-protection-platform/src/styles/index.scss

@ -25,6 +25,7 @@ html {
25 25
*,
26 26
*:before,
27 27
*:after {
28
  font-family: inherit;
28 29
  box-sizing: inherit;
29 30
}
30 31

BIN
security-protection-platform/static/video-js.swf


+ 20 - 1
security-protection-service/src/main/java/com/ai/bss/security/protection/controller/MonitorVideoLogManageController.java

@ -49,9 +49,28 @@ public class MonitorVideoLogManageController {
49 49
		return monitorVideoLogManageService.queryMonitorVideoLogByTime(monitorVideoLogCondition);
50 50
	}
51 51
52
53
	/**
54
	 * 查询监控视频日志(按时间段)
55
	 * @param attendanceReport
56
	 * @return
57
	 * @throws Exception
58
	 */
59
	@ResponseBody
60
	@RequestMapping("/queryMonitorVideoLogForM3u8")
61
	public CommonResponse<String> queryMonitorVideoLogByTimeForM3u8(@ModelAttribute AttendanceReport attendanceReport)
62
			throws Exception {
63
		MonitorVideoLog monitorVideoLogCondition = new MonitorVideoLog();
64
		monitorVideoLogCondition.setResourceToolId(attendanceReport.getId());
65
		monitorVideoLogCondition.setBeginTime(DateUtil.convertDate(attendanceReport.getBeginDay()));
66
		monitorVideoLogCondition.setEndTime(DateUtil.convertDate(attendanceReport.getEndDay()));
67
68
		return monitorVideoLogManageService.queryMonitorVideoLogByTimeForM3u8(monitorVideoLogCondition);
69
	}
70
52 71
	/**
53 72
	 * 查询单个监控视频日志
54
	 * @param resourceToolId
73
	 * @param monitorVideoLogId
55 74
	 * @return
56 75
	 * @throws Exception
57 76
	 */

+ 2 - 0
security-protection-service/src/main/java/com/ai/bss/security/protection/model/SecurityProtectionMinioConfig.java

@ -23,4 +23,6 @@ public class SecurityProtectionMinioConfig {
23 23
	
24 24
	private String bucketAiImage;
25 25
26
	private String bucketM3U8;
27
26 28
}

+ 248 - 171
security-protection-service/src/main/java/com/ai/bss/security/protection/service/impl/AttendanceReportServiceImpl.java

@ -12,6 +12,8 @@ import org.springframework.beans.factory.annotation.Autowired;
12 12
import org.springframework.stereotype.Service;
13 13
import org.springframework.util.CollectionUtils;
14 14
15
import java.math.BigDecimal;
16
import java.text.NumberFormat;
15 17
import java.text.ParseException;
16 18
import java.text.SimpleDateFormat;
17 19
import java.util.ArrayList;
@ -57,18 +59,17 @@ public class AttendanceReportServiceImpl implements AttendanceReportService {
57 59
                paramap.put("beginDay",formatter.format((Date) dailyAttendanceMap.get("beginDay")));
58 60
                paramap.put("endDay",formatter.format((Date) dailyAttendanceMap.get("endDay")));
59 61
60
           /* for(Map<String, Object> dailyAttendance:dailyAttendanceList ){
61
                dailyAttendance.put("beginDay",paramap.get("beginDay"));
62
                dailyAttendance.put("endDay",paramap.get("endDay"));
63
                mainjobpositionList.forEach((mainjobposition) -> {
64
                    if (mainjobposition.getCode().equals(dailyAttendance.get("mainJobPositionId"))) {
65
                        dailyAttendance.put("mainJobPositionId", mainjobposition.getValue());
66
                    }
67
                });
68
            }*/
69
70 62
                dailyAttendanceList.forEach((dailyAttendance)-> {
71
                    //转换迟到和早退的分钟为小时
63
                    //转换迟到和早退的分钟为小时 lateMinutes
64
                    long lateMinutes1 = (long) dailyAttendance.get("lateMinutes");
65
                    int lateMinute = (int)lateMinutes1;
66
                    double lateMinutes = new BigDecimal((float)lateMinute/60).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
67
                    dailyAttendance.put("lateMinutes", lateMinutes);
68
69
                    long earlyExitMinutes1 = (long) dailyAttendance.get("earlyExitMinutes");
70
                    int earlyExitMinute = (int)earlyExitMinutes1;
71
                    double earlyExitMinutes = new BigDecimal((float)earlyExitMinute/60).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
72
                    dailyAttendance.put("earlyExitMinutes", earlyExitMinutes);
72 73
73 74
                    //将每一条都加上开始和结束时间
74 75
                    dailyAttendance.put("beginDay",paramap.get("beginDay"));
@ -173,46 +174,85 @@ public class AttendanceReportServiceImpl implements AttendanceReportService {
173 174
                }
174 175
                //如果上午正常,下午非正常 则显示下午的
175 176
                if("正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
176
                    if("迟到".equals(dailyAttendance.get("goOffWorkStatus"))){
177
                        attendanceStatusList.add("迟到"+dailyAttendance.get("goOffWorkTime") +"分");
178
                        dailyAttendance.put("isAbnormal",true);
179
                    }else if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
180
                        attendanceStatusList.add("早退"+dailyAttendance.get("goOffWorkTime") +"分");
181
                        dailyAttendance.put("isAbnormal",true);
182
                    }else if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
183
                        attendanceStatusList.add("旷工0.5天");
184
                        dailyAttendance.put("isAbnormal",true);
185
                    }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
186
                        attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
187
                        dailyAttendance.put("isAbnormal",false);
177
                    //如果包含下午外勤,则除了放假之类的和旷工都不显示
178
                    if(!attendanceStatusList.isEmpty()&&!attendanceStatusList.contains("下午外勤")){
179
                        if("迟到".equals(dailyAttendance.get("goOffWorkStatus"))){
180
                            attendanceStatusList.add("迟到"+dailyAttendance.get("goOffWorkTime") +"分");
181
                            dailyAttendance.put("isAbnormal",true);
182
                        }else if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
183
                            attendanceStatusList.add("早退"+dailyAttendance.get("goOffWorkTime") +"分");
184
                            dailyAttendance.put("isAbnormal",true);
185
                        }else if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
186
                            attendanceStatusList.add("旷工0.5天");
187
                            dailyAttendance.put("isAbnormal",true);
188
                        }else if("未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
189
                            attendanceStatusList.add("下午未打卡");
190
                            dailyAttendance.put("isAbnormal",true);
191
                        }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
192
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
193
                            dailyAttendance.put("isAbnormal",false);
194
                        }else{
195
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
196
                            dailyAttendance.put("isAbnormal",true);
197
                        }
188 198
                    }else{
189
                        attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
190
                        dailyAttendance.put("isAbnormal",true);
199
                        if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
200
                            attendanceStatusList.add("旷工0.5天");
201
                            dailyAttendance.put("isAbnormal",true);
202
                        }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
203
                            attendanceStatusList.clear();
204
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
205
                            dailyAttendance.put("isAbnormal",false);
206
                        }else{
207
                            dailyAttendance.put("isAbnormal",false);
208
                        }
209
191 210
                    }
211
212
192 213
                }
193 214
                //如果上午非正常,下午正常 则显示上午的
194 215
                if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
195
                    if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
196
                        attendanceStatusList.add("迟到"+dailyAttendance.get("lateMinutes") +"分");
197
                        dailyAttendance.put("isAbnormal",true);
198
                    }else if("早退".equals(dailyAttendance.get("goToWorkStatus"))){
199
                        attendanceStatusList.add("早退"+dailyAttendance.get("earlyExitMinutes") +"分");
200
                        dailyAttendance.put("isAbnormal",true);
201
                    }else if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
202
                        attendanceStatusList.add("旷工0.5天");
203
                        dailyAttendance.put("isAbnormal",true);
204
                    }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
205
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
206
                        dailyAttendance.put("isAbnormal",false);
216
                    //如果包含上午外勤,则除了放假之类的和旷工都不显示
217
                    if(!attendanceStatusList.isEmpty()&&!attendanceStatusList.contains("上午外勤")){
218
                        if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
219
                            attendanceStatusList.add("迟到"+dailyAttendance.get("lateMinutes") +"分");
220
                            dailyAttendance.put("isAbnormal",true);
221
                        }else if("早退".equals(dailyAttendance.get("goToWorkStatus"))){
222
                            attendanceStatusList.add("早退"+dailyAttendance.get("earlyExitMinutes") +"分");
223
                            dailyAttendance.put("isAbnormal",true);
224
                        }else if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
225
                            attendanceStatusList.add("旷工0.5天");
226
                            dailyAttendance.put("isAbnormal",true);
227
                        }else if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))){
228
                            attendanceStatusList.add("上午未打卡");
229
                            dailyAttendance.put("isAbnormal",true);
230
                        }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
231
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
232
                            dailyAttendance.put("isAbnormal",false);
233
                        }else{
234
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
235
                            dailyAttendance.put("isAbnormal",true);
236
                        }
207 237
                    }else{
208
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
209
                        dailyAttendance.put("isAbnormal",true);
238
                        if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
239
                            attendanceStatusList.add("旷工0.5天");
240
                            dailyAttendance.put("isAbnormal",true);
241
                        }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
242
                            attendanceStatusList.clear();
243
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
244
                            dailyAttendance.put("isAbnormal",false);
245
                        }else{
246
                            dailyAttendance.put("isAbnormal",false);
247
                        }
210 248
                    }
249
211 250
                }
212 251
                //如果上午非正常,下午非正常
213 252
                if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
214 253
                    //如果上下午状态相等且是放假 倒休 事假 年假 病假 放假 显示一种状态 非异常考勤
215 254
                    if(dailyAttendance.get("goToWorkStatus").equals(dailyAttendance.get("goOffWorkStatus"))&&("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus")))){
255
                        attendanceStatusList.clear();
216 256
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
217 257
                        dailyAttendance.put("isAbnormal",false);
218 258
                    }
@ -240,68 +280,69 @@ public class AttendanceReportServiceImpl implements AttendanceReportService {
240 280
                            dailyAttendance.put("isAbnormal",true);
241 281
                        }
242 282
                        if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
243
                            attendanceStatusArray[0]="旷工0.5天";
283
                            attendanceStatusArray[1]="旷工0.5天";
244 284
                            dailyAttendance.put("isAbnormal",true);
245 285
                        }
246
                        if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))||"未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
286
                        if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))){
287
                            attendanceStatusArray[0]="上午未打卡";
247 288
                            dailyAttendance.put("isAbnormal",true);
248 289
                        }
290
                        if("未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
291
                            attendanceStatusArray[1]="下午未打卡";
292
                            dailyAttendance.put("isAbnormal",true);
293
                        }
294
                        if(!attendanceStatusList.isEmpty()&&attendanceStatusList.contains("上午外勤")){
295
                            //如果上午外勤,上午放假等假期显示假期,上午旷工显示外勤与假期,否则都显示外勤
296
                            if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
297
                                //不动
298
                            }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
299
                                //将上午外勤移除
300
                                Iterator<Object> iterator = attendanceStatusList.iterator();
301
                                while (iterator.hasNext()){
302
                                    String next =(String) iterator.next();
303
                                    if("上午外勤".equals(next)){
304
                                        iterator.remove();
305
                                    }
306
                                }
307
                            }else{
308
                                //将attendanceStatusArray[0]移除
309
                                attendanceStatusArray[0]=null;
310
                            }
311
                        }
312
                        if(!attendanceStatusList.isEmpty()&&attendanceStatusList.contains("下午外勤")){
313
                            //如果下午外勤,下午放假等假期显示假期,下午旷工显示外勤与假期,否则都显示外勤
314
                            if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
315
                                //不动
316
                            }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
317
                                //将下午外勤移除
318
                                Iterator<Object> iterator = attendanceStatusList.iterator();
319
                                while (iterator.hasNext()){
320
                                    String next =(String) iterator.next();
321
                                    if("下午外勤".equals(next)){
322
                                        iterator.remove();
323
                                    }
324
                                }
325
                            }else{
326
                                //将attendanceStatusArray[1]移除
327
                                attendanceStatusArray[1]=null;
328
                            }
329
                        }
249 330
                        attendanceStatusList.add(attendanceStatusArray[0]);
250 331
                        attendanceStatusList.add(attendanceStatusArray[1]);
251 332
                    }
252
                   // dailyAttendance.put("descr",attendanceStatusList);
253 333
                }
254
                dailyAttendance.put("descr",attendanceStatusList);
255
              /*  String[] attendanceStatusArray = new String[2];
256
                dailyAttendance.put("date",dailyAttendance.get("workDay"));
257
                dailyAttendance.put("isAbnormal",true);
258
                if("正常".equals(dailyAttendance.get("goToWorkStatus"))&&"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
259
                    //上下班都正常
260
                    dailyAttendance.put("isAbnormal",false);
261
                    attendanceStatusArray[0]="正常";
262
                    dailyAttendance.put("descr",attendanceStatusArray);
263
                }else if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
264
                    attendanceStatusArray[0]= (String) dailyAttendance.get("goToWorkStatus");
265
                    attendanceStatusArray[1]= (String) dailyAttendance.get("goOffWorkStatus");
266
                    //上下班都不正常
267
                    if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
268
                        attendanceStatusArray[0]="迟到"+dailyAttendance.get("goToWorkTime") +"分";
269
                    }
270
                    if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
271
                        attendanceStatusArray[1]="早退"+dailyAttendance.get("goOffWorkTime") +"分";
272
                    }
273
                    if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
274
                        //attendanceStatusArray[1]=null;
275
                        attendanceStatusArray[1]="旷工"+dailyAttendance.get("goOffWorkTime") +"天";
276
                        attendanceStatusArray[0]="旷工"+dailyAttendance.get("goToWorkTime") +"天";
277
                    }
278
                    if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
279
                        //attendanceStatusArray[1]=null;
280
                        attendanceStatusArray[1]=(String) dailyAttendance.get("goOffWorkStatus");
281
                        attendanceStatusArray[0]=(String) dailyAttendance.get("goToWorkStatus");
282
                    }
283
                    dailyAttendance.put("descr",attendanceStatusArray);
284
                }else{
285
                    //上下班一个正常一个不正常
286
                    if("正常".equals(dailyAttendance.get("goToWorkStatus"))){
287
                        attendanceStatusArray[0]= (String) dailyAttendance.get("goOffWorkStatus");
288
                    }else{
289
                        attendanceStatusArray[0]= (String) dailyAttendance.get("goToWorkStatus");
290
                    }
291
                    dailyAttendance.put("descr",attendanceStatusArray);
292
                }*/
293
            });
294
          /*  List<Map<String, Object>> dataList = attendanceReportResponse.getData();
295
            dataList.forEach((data)->{
296
                String[] attendanceStatus = (String[]) data.get("descr");
297
                if(null!=attendanceStatus&&attendanceStatus.length>0){
298
                    String[] attendanceStatusArray = new String[1];
299
                    if(null==attendanceStatus[1]){
300
                        attendanceStatusArray[0]=attendanceStatus[0];
301
                        data.put("descr",attendanceStatusArray);
334
                //遍历集合,将为null的值去掉
335
                Iterator<Object> iterator = attendanceStatusList.iterator();
336
                while (iterator.hasNext()){
337
                    String next =(String) iterator.next();
338
                    if(null==next){
339
                        iterator.remove();
302 340
                    }
303 341
                }
304
            });*/
342
                dailyAttendance.put("descr",attendanceStatusList);
343
344
            });
345
305 346
306 347
            HashMap<String, Object> attendanceReportMap = new HashMap<>();
307 348
            attendanceReportMap.put("userId",params.get("id"));
@ -383,46 +424,83 @@ public class AttendanceReportServiceImpl implements AttendanceReportService {
383 424
                }
384 425
                //如果上午正常,下午非正常 则显示下午的
385 426
                if("正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
386
                    if("迟到".equals(dailyAttendance.get("goOffWorkStatus"))){
387
                        attendanceStatusList.add("迟到"+dailyAttendance.get("goOffWorkTime") +"分");
388
                        dailyAttendance.put("isAbnormal",true);
389
                    }else if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
390
                        attendanceStatusList.add("早退"+dailyAttendance.get("goOffWorkTime") +"分");
391
                        dailyAttendance.put("isAbnormal",true);
392
                    }else if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
393
                        attendanceStatusList.add("旷工0.5天");
394
                        dailyAttendance.put("isAbnormal",true);
395
                    }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
396
                        attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
397
                        dailyAttendance.put("isAbnormal",false);
427
                    //如果包含下午外勤,则除了放假之类的和旷工都不显示
428
                    if(!attendanceStatusList.isEmpty()&&!attendanceStatusList.contains("下午外勤")){
429
                        if("迟到".equals(dailyAttendance.get("goOffWorkStatus"))){
430
                            attendanceStatusList.add("迟到"+dailyAttendance.get("goOffWorkTime") +"分");
431
                            dailyAttendance.put("isAbnormal",true);
432
                        }else if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
433
                            attendanceStatusList.add("早退"+dailyAttendance.get("goOffWorkTime") +"分");
434
                            dailyAttendance.put("isAbnormal",true);
435
                        }else if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
436
                            attendanceStatusList.add("旷工0.5天");
437
                            dailyAttendance.put("isAbnormal",true);
438
                        }else if("未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
439
                            attendanceStatusList.add("下午未打卡");
440
                            dailyAttendance.put("isAbnormal",true);
441
                        }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
442
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
443
                            dailyAttendance.put("isAbnormal",false);
444
                        }else{
445
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
446
                            dailyAttendance.put("isAbnormal",true);
447
                        }
398 448
                    }else{
399
                        attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
400
                        dailyAttendance.put("isAbnormal",true);
449
                        if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
450
                            attendanceStatusList.add("旷工0.5天");
451
                            dailyAttendance.put("isAbnormal",true);
452
                        }else if("倒休".equals(dailyAttendance.get("goOffWorkStatus"))||"事假".equals(dailyAttendance.get("goOffWorkStatus"))||"年假".equals(dailyAttendance.get("goOffWorkStatus"))||"放假".equals(dailyAttendance.get("goOffWorkStatus"))||"病假".equals(dailyAttendance.get("goOffWorkStatus"))){
453
                            attendanceStatusList.clear();
454
                            attendanceStatusList.add(dailyAttendance.get("goOffWorkStatus"));
455
                            dailyAttendance.put("isAbnormal",false);
456
                        }else{
457
                            dailyAttendance.put("isAbnormal",false);
458
                        }
459
401 460
                    }
402 461
                }
403 462
                //如果上午非正常,下午正常 则显示上午的
404 463
                if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
405
                    if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
406
                        attendanceStatusList.add("迟到"+dailyAttendance.get("lateMinutes") +"分");
407
                        dailyAttendance.put("isAbnormal",true);
408
                    }else if("早退".equals(dailyAttendance.get("goToWorkStatus"))){
409
                        attendanceStatusList.add("早退"+dailyAttendance.get("earlyExitMinutes") +"分");
410
                        dailyAttendance.put("isAbnormal",true);
411
                    }else if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
412
                        attendanceStatusList.add("旷工0.5天");
413
                        dailyAttendance.put("isAbnormal",true);
414
                    }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
415
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
416
                        dailyAttendance.put("isAbnormal",false);
464
                    //如果包含上午外勤,则除了放假之类的和旷工都不显示
465
                    if(!attendanceStatusList.isEmpty()&&!attendanceStatusList.contains("上午外勤")){
466
                        if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
467
                            attendanceStatusList.add("迟到"+dailyAttendance.get("lateMinutes") +"分");
468
                            dailyAttendance.put("isAbnormal",true);
469
                        }else if("早退".equals(dailyAttendance.get("goToWorkStatus"))){
470
                            attendanceStatusList.add("早退"+dailyAttendance.get("earlyExitMinutes") +"分");
471
                            dailyAttendance.put("isAbnormal",true);
472
                        }else if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
473
                            attendanceStatusList.add("旷工0.5天");
474
                            dailyAttendance.put("isAbnormal",true);
475
                        }else if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))){
476
                            attendanceStatusList.add("上午未打卡");
477
                            dailyAttendance.put("isAbnormal",true);
478
                        }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
479
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
480
                            dailyAttendance.put("isAbnormal",false);
481
                        }else{
482
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
483
                            dailyAttendance.put("isAbnormal",true);
484
                        }
417 485
                    }else{
418
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
419
                        dailyAttendance.put("isAbnormal",true);
486
                        if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
487
                            attendanceStatusList.add("旷工0.5天");
488
                            dailyAttendance.put("isAbnormal",true);
489
                        }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
490
                            attendanceStatusList.clear();
491
                            attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
492
                            dailyAttendance.put("isAbnormal",false);
493
                        }else{
494
                            dailyAttendance.put("isAbnormal",false);
495
                        }
420 496
                    }
497
421 498
                }
422 499
                //如果上午非正常,下午非正常
423 500
                if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
424 501
                    //如果上下午状态相等且是放假 倒休 事假 年假 病假 放假 显示一种状态 非异常考勤
425 502
                    if(dailyAttendance.get("goToWorkStatus").equals(dailyAttendance.get("goOffWorkStatus"))&&("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus")))){
503
                        attendanceStatusList.clear();
426 504
                        attendanceStatusList.add(dailyAttendance.get("goToWorkStatus"));
427 505
                        dailyAttendance.put("isAbnormal",false);
428 506
                    }
@ -450,73 +528,72 @@ public class AttendanceReportServiceImpl implements AttendanceReportService {
450 528
                            dailyAttendance.put("isAbnormal",true);
451 529
                        }
452 530
                        if("旷工".equals(dailyAttendance.get("goOffWorkStatus"))){
453
                            attendanceStatusArray[0]="旷工0.5天";
531
                            attendanceStatusArray[1]="旷工0.5天";
532
                            dailyAttendance.put("isAbnormal",true);
533
                        }
534
                        if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))){
535
                            attendanceStatusArray[0]="上午未打卡";
454 536
                            dailyAttendance.put("isAbnormal",true);
455 537
                        }
456
                        if("未打卡".equals(dailyAttendance.get("goToWorkStatus"))||"未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
538
                        if("未打卡".equals(dailyAttendance.get("goOffWorkStatus"))){
539
                            attendanceStatusArray[1]="下午未打卡";
457 540
                            dailyAttendance.put("isAbnormal",true);
458 541
                        }
542
                        if(!attendanceStatusList.isEmpty()&&attendanceStatusList.contains("上午外勤")){
543
                            //如果上午外勤,上午放假等假期显示假期,上午旷工显示外勤与假期,否则都显示外勤
544
                            if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
545
                                //不动
546
                            }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
547
                                //将上午外勤移除
548
                                Iterator<Object> iterator = attendanceStatusList.iterator();
549
                                while (iterator.hasNext()){
550
                                    String next =(String) iterator.next();
551
                                    if("上午外勤".equals(next)){
552
                                        iterator.remove();
553
                                    }
554
                                }
555
                            }else{
556
                                //将attendanceStatusArray[0]移除
557
                                attendanceStatusArray[0]=null;
558
                            }
559
                        }
560
                        if(!attendanceStatusList.isEmpty()&&attendanceStatusList.contains("下午外勤")){
561
                            //如果下午外勤,下午放假等假期显示假期,下午旷工显示外勤与假期,否则都显示外勤
562
                            if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
563
                                //不动
564
                            }else if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
565
                                //将下午外勤移除
566
                                Iterator<Object> iterator = attendanceStatusList.iterator();
567
                                while (iterator.hasNext()){
568
                                    String next =(String) iterator.next();
569
                                    if("下午外勤".equals(next)){
570
                                        iterator.remove();
571
                                    }
572
                                }
573
                            }else{
574
                                //将attendanceStatusArray[1]移除
575
                                attendanceStatusArray[1]=null;
576
                            }
577
                        }
459 578
                        attendanceStatusList.add(attendanceStatusArray[0]);
460 579
                        attendanceStatusList.add(attendanceStatusArray[1]);
461 580
                    }
462
                    // dailyAttendance.put("descr",attendanceStatusList);
581
                }
582
                //遍历集合,将为null的值去掉
583
                Iterator<Object> iterator = attendanceStatusList.iterator();
584
                while (iterator.hasNext()){
585
                    String next =(String) iterator.next();
586
                    if(null==next){
587
                        iterator.remove();
588
                    }
463 589
                }
464 590
                dailyAttendance.put("descr",attendanceStatusList);
465 591
466 592
467
               /* String[] attendanceStatusArray = new String[2];
468
469
                if("正常".equals(dailyAttendance.get("goToWorkStatus"))&&"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
470
                    //上下班都正常
471
                    dailyAttendance.put("isAbnormal",false);
472
                    attendanceStatusArray[0]="正常";
473
                    dailyAttendance.put("descr",attendanceStatusArray);
474
                }else if(!"正常".equals(dailyAttendance.get("goToWorkStatus"))&&!"正常".equals(dailyAttendance.get("goOffWorkStatus"))){
475
                    attendanceStatusArray[0]= (String) dailyAttendance.get("goToWorkStatus");
476
                    attendanceStatusArray[1]= (String) dailyAttendance.get("goOffWorkStatus");
477
                    //上下班都不正常
478
                    if("迟到".equals(dailyAttendance.get("goToWorkStatus"))){
479
                        attendanceStatusArray[0]="迟到"+dailyAttendance.get("goToWorkTime") +"分";
480
                    }
481
                    if("早退".equals(dailyAttendance.get("goOffWorkStatus"))){
482
                        attendanceStatusArray[1]="早退"+dailyAttendance.get("goOffWorkTime") +"分";
483
                    }
484
                    if("旷工".equals(dailyAttendance.get("goToWorkStatus"))){
485
                        //attendanceStatusArray[1]=null;
486
                        attendanceStatusArray[1]="旷工"+dailyAttendance.get("goOffWorkTime") +"天";
487
                        attendanceStatusArray[0]="旷工"+dailyAttendance.get("goToWorkTime") +"天";
488
                    }
489
                    if("倒休".equals(dailyAttendance.get("goToWorkStatus"))||"事假".equals(dailyAttendance.get("goToWorkStatus"))||"年假".equals(dailyAttendance.get("goToWorkStatus"))||"放假".equals(dailyAttendance.get("goToWorkStatus"))||"病假".equals(dailyAttendance.get("goToWorkStatus"))){
490
                        //attendanceStatusArray[1]=null;
491
                        attendanceStatusArray[1]=(String) dailyAttendance.get("goOffWorkStatus");
492
                        attendanceStatusArray[0]=(String) dailyAttendance.get("goToWorkStatus");
493
                    }
494
495
                    dailyAttendance.put("descr",attendanceStatusArray);
496
                }else{
497
                    //上下班一个正常一个不正常
498
                    if("正常".equals(dailyAttendance.get("goToWorkStatus"))){
499
                        attendanceStatusArray[0]= (String) dailyAttendance.get("goOffWorkStatus");
500
                    }else{
501
                        attendanceStatusArray[0]= (String) dailyAttendance.get("goToWorkStatus");
502
                    }
503
                    dailyAttendance.put("descr",attendanceStatusArray);
504
                }*/
505 593
            });
506 594
        } catch (ParseException e) {
507 595
            e.printStackTrace();
508 596
        }
509
       /* List<Map<String, Object>> dataList = attendanceReport.getData().getData();
510
        dataList.forEach((data)->{
511
            String[] attendanceStatus = (String[]) data.get("attendanceStatus");
512
            if(null!=attendanceStatus&&attendanceStatus.length>0){
513
                String[] attendanceStatusArray = new String[1];
514
                if(null==attendanceStatus[1]){
515
                    attendanceStatusArray[0]=attendanceStatus[0];
516
                    data.put("attendanceStatus",attendanceStatusArray);
517
                }
518
            }
519
        });*/
520 597
        return attendanceReport;
521 598
    }
522 599
}

+ 55 - 0
security-protection-service/src/main/java/com/ai/bss/security/protection/service/impl/MonitorVideoLogManageServiceImpl.java

@ -1,11 +1,17 @@
1 1
package com.ai.bss.security.protection.service.impl;
2 2
3
import java.io.ByteArrayInputStream;
4
import java.io.InputStream;
3 5
import java.util.ArrayList;
4 6
import java.util.Date;
5 7
import java.util.HashMap;
6 8
import java.util.List;
7 9
import java.util.Map;
8 10
11
import cn.hutool.core.lang.UUID;
12
import com.ai.bss.components.minio.service.MinioService;
13
import com.ai.bss.security.protection.model.SecurityProtectionMinioConfig;
14
import com.ai.bss.security.protection.service.interfaces.UploadFileService;
9 15
import org.apache.commons.lang.StringUtils;
10 16
import org.springframework.beans.factory.annotation.Autowired;
11 17
import org.springframework.stereotype.Service;
@ -25,11 +31,20 @@ import com.ai.bss.work.safety.service.api.MonitorSceneQuery;
25 31
@Service
26 32
public class MonitorVideoLogManageServiceImpl implements MonitorVideoLogManageService {
27 33
34
	public String SPLIT_CHAR  = "_";
28 35
	@Autowired
29 36
	private MonitorSceneQuery monitorSceneQuery;
30 37
31 38
	@Autowired
32 39
	private MonitorSceneCommand monitorSceneCommand;
40
	@Autowired
41
	private MinioService minioService;
42
	@Autowired
43
	private UploadFileService uploadFileService;
44
45
46
	@Autowired
47
	private SecurityProtectionMinioConfig minioConfig;
33 48
34 49
	@Override
35 50
	public CommonResponse<List<EbcMonitorVideoLog>> queryMonitorVideoLogByTime(MonitorVideoLog monitorVideoLogCondition)
@ -50,6 +65,46 @@ public class MonitorVideoLogManageServiceImpl implements MonitorVideoLogManageSe
50 65
		return CommonResponse.ok(list);
51 66
	}
52 67
68
69
70
	@Override
71
	public CommonResponse<String> queryMonitorVideoLogByTimeForM3u8(MonitorVideoLog monitorVideoLogCondition) throws Exception {
72
		CommonRequest<MonitorVideoLog> request = new CommonRequest<MonitorVideoLog>(monitorVideoLogCondition);
73
		CommonResponse<List<MonitorVideoLog>> response = monitorSceneQuery.queryMonitorVideoLogByTime(request);
74
75
		List<EbcMonitorVideoLog> list = new ArrayList<EbcMonitorVideoLog>();
76
		if (response == null || CollectionUtils.isEmpty(response.getData())) {
77
			return CommonResponse.ok(null);
78
		}
79
80
81
		StringBuffer m3u8Str = new StringBuffer();
82
		m3u8Str.append("#EXTM3U").append("\n");
83
		m3u8Str.append("#EXT-X-VERSION:3").append("\n");
84
		m3u8Str.append("#EXT-X-TARGETDURATION:65").append("\n");
85
		m3u8Str.append("#EXT-X-MEDIA-SEQUENCE:0").append("\n");
86
		String bucketName = minioConfig.getBucketM3U8();//"m3u8-index";
87
		String fileType = ".m3u8";
88
		String m3u8FileName = bucketName + SPLIT_CHAR + UUID.fastUUID().toString().replace("-", "") + fileType;
89
90
		String videoUrl = "";
91
		for (MonitorVideoLog monitorVideoLog : response.getData()) {
92
			EbcMonitorVideoLog ebcMonitorVideoLog = getEbcMonitorVideoLog(monitorVideoLog);
93
			list.add(ebcMonitorVideoLog);
94
			videoUrl = uploadFileService.getFileUrl(monitorVideoLog.getVideoUrl());// minioService.getObjectUrl(videoFileIdArr[0],ebcMonitorVideoLog.getVideoFileUrl());
95
96
			m3u8Str.append("#EXTINF:65,").append("\n");
97
			m3u8Str.append(videoUrl).append("\n");
98
		}
99
		m3u8Str.append("#EXT-X-ENDLIST").append("\n");
100
		InputStream is = new ByteArrayInputStream(m3u8Str.toString().getBytes());
101
		minioService.putObject(bucketName,m3u8FileName,is,fileType);
102
103
		String m3u8IndexFileUrl = uploadFileService.getFileUrl(m3u8FileName);
104
105
		return CommonResponse.ok(m3u8IndexFileUrl);
106
	}
107
53 108
	@Override
54 109
	public CommonResponse<EbcMonitorVideoLog> queryMonitorVideoLogById(Long monitorVideoLogId) throws Exception {
55 110
		CommonRequest<Long> request = new CommonRequest<Long>(monitorVideoLogId);

+ 8 - 1
security-protection-service/src/main/java/com/ai/bss/security/protection/service/impl/WorkOrderManagementServiceImpl.java

@ -7,6 +7,7 @@ import java.util.HashMap;
7 7
import java.util.List;
8 8
import java.util.Map;
9 9
10
import com.ai.abc.exception.BaseException;
10 11
import com.ai.bss.components.common.util.JsonUtils;
11 12
import com.ai.bss.user.dto.UserDto;
12 13
import com.ai.bss.work.attendance.dto.LeaveApprovalDto;
@ -266,7 +267,13 @@ public class WorkOrderManagementServiceImpl implements WorkOrderManagementServic
266 267
		userDto.setId(employId);
267 268
		CommonRequest<UserDto> request = CommonRequest.<UserDto>builder().data(userDto).pageNumber(1).pageSize(1).build();
268 269
		CommonResponse<PageBean<UserDto>>  result = userDtoQuery.queryWorkEmployee(request);
269
		String  employOrgId = result.getData().getData().get(0).getOrgId();
270
		String employOrgId = "";
271
		try {
272
			employOrgId = result.getData().getData().get(0).getOrgId();
273
		}catch (Exception e){
274
			log.error("员工不存在");
275
			new BaseException("员工不存在");
276
		}
270 277
		log.info("输出参数:{}",JSON.toJSONString(result , SerializerFeature.PrettyFormat));
271 278
272 279

+ 3 - 0
security-protection-service/src/main/java/com/ai/bss/security/protection/service/interfaces/MonitorVideoLogManageService.java

@ -22,6 +22,9 @@ public interface MonitorVideoLogManageService {
22 22
	CommonResponse<List<EbcMonitorVideoLog>> queryMonitorVideoLogByTime(MonitorVideoLog monitorVideoLogCondition)
23 23
			throws Exception;
24 24
25
26
	CommonResponse<String> queryMonitorVideoLogByTimeForM3u8(MonitorVideoLog monitorVideoLogCondition) throws Exception;
27
25 28
	/**
26 29
	 * 根据视频日志ID查询监控视频日志
27 30
	 * @param monitorVideoLogId

+ 11 - 1
security-protection-service/src/main/java/com/ai/bss/security/protection/utils/DateUtil.java

@ -540,7 +540,7 @@ public class DateUtil {
540 540
	/**
541 541
	 * 取得date中的纯日期部分
542 542
	 *
543
	 * @param date需要变动的日期
543
	 * @param date
544 544
	 * @return 变动后的日期
545 545
	 */
546 546
	public static Date getDateWithoutTime(Date date) {
@ -652,4 +652,14 @@ public class DateUtil {
652 652
		return Integer.parseInt(lastDay);
653 653
	}
654 654
655
656
	public static String getDateTimeString(Date date){
657
		if (date == null){
658
			return null;
659
		}
660
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat( NORM_DATETIME_PATTERN);
661
		String dateString = simpleDateFormat.format(date);
662
		return dateString;
663
	}
664
655 665
}

+ 2 - 0
security-protection-service/src/main/resources/application.properties

@ -65,6 +65,8 @@ spminio.bucketToolImage=tool-image
65 65
spminio.bucketAiVideo=ai-video
66 66
# \u76d1\u63a7\u89c6\u9891\u622a\u56fe
67 67
spminio.bucketAiImage=ai-image
68
# \u76d1\u63a7\u89c6\u9891\u622a\u56fe
69
spminio.bucketM3U8=m3u8-index
68 70
69 71
70 72
# CACHE

android-share - Nuosi Git Service

ipu的trunk版的android工程和服务端工程。

commons-io-2.4.jar 181KB

code-example - Nuosi Git Service

团队对封装组件的代码范例

liutong3 7069791936 msgframe的rabbitmq测试代码 %!s(int64=6) %!d(string=hace) años
..
src a6eb637e07 msgframe的rabbitmq测试代码 %!s(int64=6) %!d(string=hace) años
pom.xml 7069791936 msgframe的rabbitmq测试代码 %!s(int64=6) %!d(string=hace) años
android-share - Nuosi Git Service

ipu的trunk版的android工程和服务端工程。

leijie c2152d0bec pathmenu时间变更0.3s&& 图标变更 8 anos atrás
..
drawable c2152d0bec pathmenu时间变更0.3s&& 图标变更 8 anos atrás
drawable-hdpi df1aaa934e 1 9 anos atrás
drawable-ldpi b4200357dc 【提交内容】:删除wade-mobile-common下的关于ipu-map地图资源文件!!!!!!!!!!!! 9 anos atrás
drawable-mdpi df1aaa934e 1 9 anos atrás
drawable-xhdpi df1aaa934e 1 9 anos atrás
menu 22bd19543c 初始化 10 anos atrás
raw 22bd19543c 初始化 10 anos atrás
values 97124557f0 add push adapter 9 anos atrás
values-sw600dp 22bd19543c 初始化 10 anos atrás
values-sw720dp-land 22bd19543c 初始化 10 anos atrás
values-v11 22bd19543c 初始化 10 anos atrás
values-v14 22bd19543c 初始化 10 anos atrás
xml c89111fe17 [提交内容]:nfc配置 9 anos atrás