Преглед на файлове

Merge branch 'dev-security' of http://10.1.235.20:3000/asiainfo/ebc into dev-security

xiayu3 преди 4 години
родител
ревизия
7a90e5d7ad

+ 7 - 0
security-protection-platform/src/api/access/index.js

@ -8,6 +8,13 @@ const api = {
8 8

9 9
  getaccesstype () {
10 10
    return $http.get('/access/getaccesstype')
11
  },
12
  getOneInAndOutRecord (params) {
13
    return $default.get('/sp/inAndOutRecord/queryOneInAndOutRecord', params)
14
  },
15
  // 获取公司
16
  getcompanyTypesList () {
17
    return $default.get('sp/employeeManagement/queryCompanyList')
11 18
  }
12 19

13 20
}

+ 3 - 0
security-protection-platform/src/api/videoSurveillance/index.js

@ -11,6 +11,9 @@ const api = {
11 11
  getVideoSurveillanceData (params) {
12 12
    return $default.get('/sp/monitorSceneTerminal/queryMonitorSceneTerminalRel', params)
13 13
  },
14
  getVideoSurveillanceDataForPage (params) {
15
    return $default.get('/sp/monitorSceneTerminal/queryMonitorSceneTerminalRelForPage', params)
16
  },
14 17
  // 获取监控场景列表
15 18
  getDepartments () {
16 19
    return $default.get('/sp/workEmployee/queryAllOrganize')

+ 98 - 35
security-protection-platform/src/modules/access/index.vue

@ -2,14 +2,15 @@
2 2
  <div class="access">
3 3

4 4
    <div class="access_header">
5

5 6
      <div>
6 7
        <span class="title">开始时间 : </span>
7
        <t-date-picker :confirm="false" v-model="searchdata.beginTime" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
8
        <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
8 9
      </div>
9 10

10 11
      <div>
11 12
        <span class="title">结束时间 : </span>
12
        <t-date-picker :confirm="false" v-model="searchdata.endTime" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
13
        <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:200px;height:32px"></t-date-picker>
13 14
      </div>
14 15

15 16
      <!-- <div>
@ -21,7 +22,7 @@
21 22
      </div> -->
22 23
      <div class="alarm_people">
23 24
        <span class="title">员工 : </span>
24
        <t-input v-model="searchdata.relateEmployeeNameAsLike" placeholder="员工姓名、编号关键字" style="width: 200px"></t-input>
25
        <t-input v-model="searchdata.nameAsLike" placeholder="员工姓名" style="width: 200px"></t-input>
25 26
      </div>
26 27

27 28
    </div>
@ -42,18 +43,17 @@
42 43

43 44
    <t-table :data="data" line @selection-change="handleSelectionChange">
44 45
      <t-table-column type="selection" width="34px"></t-table-column>
45

46
      <t-table-column label="姓名" prop="relateEmployeeRoleName" width="60px">
46
      <t-table-column label="姓名" prop="employeeName" width="60px">
47 47
      </t-table-column>
48
      <t-table-column label="员工编号" prop="code" width="80px">
48
      <t-table-column label="员工编号" prop="employeeCode" width="80px">
49 49
      </t-table-column>
50
      <t-table-column label="公司" prop="orgName" width="94px">
50
      <t-table-column label="公司" prop="companyname" width="94px">
51 51
      </t-table-column>
52
      <t-table-column label="部门" prop="orgName" width="94px">
52
      <t-table-column label="部门" prop="organizationName" width="94px">
53 53
      </t-table-column>
54
      <t-table-column label="职务" prop="mainJobPosition" width="80px">
54
      <t-table-column label="职务" prop="employeePositionZh" width="80px">
55 55
      </t-table-column>
56
      <t-table-column l="相似度" prop="similarity" width="75px">
56
      <t-table-column prop="simi" l="相似度" width="75px">
57 57
      </t-table-column>
58 58
      <t-table-column label="进出时间" prop="taskExecuteTime" width="160px">
59 59
      </t-table-column>
@ -61,7 +61,7 @@
61 61
      </t-table-column>
62 62
      <t-table-column label="终端名称" prop="resourceToolName" width="97px">
63 63
      </t-table-column>
64
      <t-table-column label="终端编号" prop="resourceToolCode" width="72px">
64
      <t-table-column label="终端编号" prop="resourceToolCode" width="90px">
65 65
      </t-table-column>
66 66
      <t-table-column label="操作" width="80px">
67 67
        <template slot-scope="scope">
@ -72,7 +72,7 @@
72 72
    </t-table>
73 73

74 74
    <!-- 分页 -->
75
    <t-pager :total="total" :current="page" show-elevator class="pager" @on-change="onChange"></t-pager>
75
    <t-pager :total="total" :current="page" :page-size="limit" show-elevator class="pager" @on-change="onChange"></t-pager>
76 76

77 77
    <!-- 模态框 -->
78 78
    <t-modal :visibled.sync="detail_modal" title="识别详情" width="840px" height="538px">
@ -82,36 +82,42 @@
82 82
          <div class="detail_item1">
83 83
            <div>抓拍图片</div>
84 84
            <div>
85
              <img :src="rowdata.idenVideoUrl" alt="" srcset="" style="width:100%;height:100%">
85
              <img :src="rowdata.pictureInfo.fileUrl" alt="" srcset="" style="width:100%;height:100%">
86 86
            </div>
87 87
          </div>
88 88
          <div class="detail_item2">
89 89
            <div>识别结果</div>
90 90
            <div>
91 91
              <div>
92
                <img :src="rowdata.idenPictureUrl" alt="" srcset="" style="width:120px;height:160px;border-radius: 5px; ">
92
                <!-- 修改-->
93
                <img src="" alt="" srcset="" style="width:120px;height:160px;border-radius: 5px; ">
93 94
                <div class="bottomimg">抓拍图片</div>
94 95
              </div>
95 96
              <div>
97
                <!-- 修改-->
96 98
                <img src="http://img95.699pic.com/photo/50028/0321.jpg_wh300.jpg" alt="" srcset="">
97 99
              </div>
98 100
              <div>
99
                <img :src="rowdata.headerUrl" alt="" srcset="" style="width:100%;height:160px; border-radius: 5px;">
101
                <img :src="rowdata.alarmInfo.headerImage" alt="" srcset="" style="width:100%;height:160px; border-radius: 5px;">
100 102
                <div class="bottomimg">人脸底库</div>
101 103
              </div>
102 104
            </div>
103 105
            <div class="describe">
104 106
              <div>
105
                <t-icon icon="user-outline"></t-icon> {{ rowdata.relateEmployeeRoleName }}({{ rowdata.code }})
107
                <t-icon icon="user-outline"></t-icon>
108
                {{ rowdata.alarmInfo.employeeName }}({{ rowdata.alarmInfo.employeeCode }})
106 109
              </div>
107 110
              <div>
108
                <t-icon icon="map-marker"></t-icon> {{ rowdata.terminalPosition }}
111
                <t-icon icon="map-marker"></t-icon>
112
                {{ rowdata.alarmInfo.terminalPosition || '--' }}
109 113
              </div>
110 114
              <div>
111
                <t-icon icon="clock-outline"></t-icon> {{ rowdata.taskExecuteTime }}
115
                <t-icon icon="clock-outline"></t-icon>
116
                {{ rowdata.alarmInfo.taskExecuteTime }}
112 117
              </div>
113 118
              <div>
114
                <t-icon icon="team-outline"></t-icon> 相似度:{{ rowdata.similarity }}
119
                <t-icon icon="team-outline"></t-icon> 相似度:
120
                {{ rowdata.alarmInfo.simi }}
115 121
              </div>
116 122
            </div>
117 123
          </div>
@ -127,9 +133,9 @@
127 133

128 134
<script>
129 135
import accessapi from '@/api/access'
130
import formatDateTime from '@/utils/formatDateTime.js'
131 136

132 137
export default {
138

133 139
  data () {
134 140
    return {
135 141
      // 进出类型
@ -141,14 +147,19 @@ export default {
141 147
      // 模态框显示
142 148
      detail_modal: false,
143 149
      // 当前行数据
144
      rowdata: {},
150
      rowdata: {
151
        alarmInfo: {},
152
        pictureInfo: {}
153
      },
154
      // 公司列表
155
      companyTypesList: [],
145 156

146 157
      // 查询的参数
147 158
      searchdata: {
148 159

149
        relateEmployeeNameAsLike: '',
150
        beginTime: '',
151
        endTime: ''
160
        nameAsLike: '',
161
        beginDay: '',
162
        endDay: ''
152 163
      },
153 164
      // 一页的数据
154 165
      data: [
@ -163,18 +174,42 @@ export default {
163 174

164 175
  mounted () {
165 176
    // this.gettype()
166
    this.search()
177
    this.getcompanyTypesList()
178
    // this.search()
167 179
  },
168 180
  methods: {
169 181
    // 表格中的选择数据
170 182
    handleSelectionChange (val) {
171 183
      this.selectdata = val
172 184
    },
185
    // 获取公司
186
    async getcompanyTypesList () {
187
      var res = await accessapi.getcompanyTypesList()
188
      // console.log('公司信息是', res)
189
      if (res.status === 200) {
190
        this.companyTypesList = res.data.data
191
        this.search()
192
      } else {
193
        this.$Message.danger('获取数据失败')
194
      }
195
    },
173 196
    // 点击详情
174
    handleClick (scope) {
175
      this.detail_modal = true
176
      this.rowdata = scope.row
177
      console.log(this.rowdata)
197
    async handleClick (scope) {
198
      // this.rowdata = scope.row
199
      // console.log(this.rowdata)
200
      // console.log('id是', scope.row.aiIdenLogId)
201
      var res = await accessapi.getOneInAndOutRecord({ params: { aiIdenLogId: scope.row.aiIdenLogId } })
202

203
      if (res.data.success) {
204
        this.detail_modal = true
205
        // this.rowdata = res.data.data
206
        this.rowdata.pictureInfo = res.data.data.pictureInfo
207
        this.rowdata.alarmInfo = res.data.data.alarmInfo
208
        // console.log(res.data.data)
209
        // console.log('详情数据是', this.rowdata)
210
      } else {
211
        this.$Message.danger('获取数据失败')
212
      }
178 213
    },
179 214
    // 分页
180 215
    onChange (val) {
@ -200,7 +235,7 @@ export default {
200 235
    // 查询数据
201 236
    async search () {
202 237
      // 检验数据
203
      var flag = this.startreend(this.searchdata.beginTime, this.searchdata.endTime)
238
      var flag = this.startreend(this.searchdata.beginDay, this.searchdata.endDay)
204 239
      if (flag) {
205 240
        // console.log(this.page)
206 241
        // console.log(this.searchdata)
@ -208,21 +243,49 @@ export default {
208 243
        var params = this.searchdata
209 244
        params.pageNumber = this.page
210 245
        params.pageSize = this.limit
211
        console.log(params)
246
        // console.log(params)
212 247
        var res = await accessapi.getaccesslist({ params: params })
213 248
        // console.log(res)
214 249
        if (res.status === 200) {
215
          console.log(res)
250
          // console.log(res)
216 251
          this.data = res.data.data.data
217
          this.data = this.data.map((item) => { item.taskExecuteTime = formatDateTime(item.taskExecuteTime); return item })
218
          console.log(this.data)
219
          this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
252
          this.data = this.data.map((item) => {
253
            // 处理进出时间
254
            // item.taskExecuteTime = formatDateTime(item.taskExecuteTime)
255
            // 处理相似度
256
            // item.simi = this.percentagedata(item.simi)
257
            // console.log('公司的数据是', this.companyTypesList)
258
            // console.log('公司id', item)
259
            // console.log('公司名字是', this.companyTypesList.filter((item1) => { return item1.id === 10000 }))
260
            item.companyinfo = this.companyTypesList.filter((item1) => { return item1.id === item.companyId })
261
            if (item.companyinfo.length > 0) {
262
              item.companyname = item.companyinfo[0].name
263
            } else {
264
              item.companyname = ''
265
            }
266

267
            return item
268
          })
269

270
          // this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
271
          // console.log(this.total)
272
          this.total = res.data.data.total
273
          // console.log('数据是', this.data)
220 274
        }
221 275
      } else {
222 276
        this.$Message.danger('开始时间不能在结束时间的后面')
223 277
      }
224 278
    },
225 279

280
    percentagedata (point) {
281
      if (point === 0) {
282
        return 0
283
      }
284
      var str = Number(point * 100).toFixed(1)
285
      str += '%'
286
      return str
287
    },
288

226 289
    // 重置数据
227 290
    reset () {
228 291
      for (var index in this.searchdata) {

+ 7 - 5
security-protection-platform/src/modules/aialarm/index.vue

@ -82,7 +82,7 @@
82 82
    </t-table>
83 83

84 84
    <!-- 分页 -->
85
    <t-pager :total="total" :current="page" show-elevator class="pager" @on-change="onChange"></t-pager>
85
    <t-pager :total="total" :current="page" :page-size="limit" show-elevator class="pager" @on-change="onChange"></t-pager>
86 86

87 87
    <!-- 模态框-->
88 88
    <t-modal :visibled.sync="details_modal" :title="clickdetail==0?'报警详情':'报警处理'" width="732px">
@ -123,12 +123,12 @@
123 123

124 124
          <div class="detail">
125 125
            <label class="detail_title">处理人:</label>
126
            <div class="detail_content">{{ alarmDetailData.workEmployeeRoleName }}</div>
126
            <div class="detail_content">{{ alarmDetailData.workEmployeeRoleName|| '--' }}</div>
127 127
          </div>
128 128

129 129
          <div class="detail">
130 130
            <label class="detail_title">处理时间:</label>
131
            <div>{{ alarmDetailData.disposeDate }}</div>
131
            <div>{{ alarmDetailData.disposeDate || '--' }}</div>
132 132
          </div>
133 133
        </div>
134 134

@ -317,6 +317,7 @@ export default {
317 317
        // console.log(this.status)
318 318
      } else {
319 319
        this.$Message.warning('请选择按钮')
320
        this.loading = false
320 321
      }
321 322
    },
322 323

@ -389,8 +390,9 @@ export default {
389 390
          this.data = res.data.data.data
390 391
          this.data = this.data.map((item) => { item.aiIdenTime = formatDateTime(item.aiIdenTime); return item })
391 392
          console.log(this.data)
392

393
          this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
393
          console.log('数据是', res)
394
          // this.total = Math.ceil(res.data.data.total / res.data.data.size) * 5
395
          this.total = res.data.data.total
394 396
        } else {
395 397
          this.$Message.danger('数据获取失败')
396 398
        }

+ 62 - 59
security-protection-platform/src/modules/attendance/components/AttendanceDialog/index.vue

@ -28,6 +28,9 @@
28 28
        </div>
29 29
      </div>
30 30
    </div>
31
    <div slot="footer" class="modal-foot">
32
      <t-button @click="_visibled=false">关闭</t-button>
33
    </div>
31 34
    <attrndance-calendar :range="data.range" :data="data.detail" />
32 35
  </t-modal>
33 36
</template>
@ -44,7 +47,7 @@ export default {
44 47
    },
45 48
    data: {
46 49
      type: Object,
47
      default() {
50
      default () {
48 51
        return {}
49 52
      }
50 53
    },
@ -53,21 +56,21 @@ export default {
53 56
      default: true
54 57
    }
55 58
  },
56
  data() {
59
  data () {
57 60
    return {
58 61
59 62
    }
60 63
  },
61 64
  computed: {
62 65
    _visibled: {
63
      get() {
66
      get () {
64 67
        return this.visibled
65 68
      },
66
      set(val) {
69
      set (val) {
67 70
        this.$emit('update:visibled', val)
68 71
      }
69 72
    },
70
    attendanceTime() {
73
    attendanceTime () {
71 74
      const dateStart = this.data.range ? this.data.range[0] : Date.now()
72 75
      const dateEnd = this.data.range ? this.data.range[1] : Date.now()
73 76
      return `${formatDateTime(new Date(dateStart), 'yyyy-MM-dd')} ~ ${formatDateTime(new Date(dateEnd), 'yyyy-MM-dd')}`
@ -77,138 +80,138 @@ export default {
77 80
</script>
78 81
79 82
<style lang="scss">
80
.modal-state{
83
.modal-state {
81 84
  margin-top: 22px;
82 85
  display: flex;
83 86
  margin-left: auto;
84 87
  align-items: center;
85
  .square-differ{
88
  .square-differ {
86 89
    margin-left: 20px;
87 90
    width: 12px;
88 91
    height: 12px;
89 92
    background-color: rgba(237, 163, 15, 0.1);
90 93
  }
91
  .square{
94
  .square {
92 95
    width: 12px;
93 96
    height: 12px;
94 97
    background-color: #ffffff;
95 98
    border: 1px solid rgba(232, 232, 232, 1);
96 99
  }
97 100
}
98
.modal-head{
101
.modal-head {
99 102
  display: flex;
100 103
  margin-bottom: 24px;
101
  .modal-head-left{
104
  .modal-head-left {
102 105
    width: 256px;
103 106
    margin-left: 4px;
104 107
    height: 114px;
105 108
    display: flex;
106 109
    align-items: center;
107
    .modal-img{
108
      width:72px;
109
      height:72px;
110
    .modal-img {
111
      width: 72px;
112
      height: 72px;
110 113
    }
111
    .modal-detail{
114
    .modal-detail {
112 115
      margin-left: 16px;
113 116
      display: flex;
114 117
      flex-direction: column;
115
      .modal-head-txt{
116
        .head-name-txt
117
        {
118
        margin-bottom: 12px;
119
        font-size: 14px;
118
      .modal-head-txt {
119
        .head-name-txt {
120
          margin-bottom: 12px;
121
          font-size: 14px;
120 122
        }
121 123
        width: 120px;
122 124
        font-size: 14px;
123 125
        color: rgba(0, 0, 0, 0.45);
124 126
      }
125
      .head-name-txt{
127
      .head-name-txt {
126 128
        font-weight: 600;
127 129
        margin-bottom: 12px;
128 130
        font-size: 14px;
129 131
        color: rgba(0, 0, 0, 0.65);
130 132
      }
131 133
    }
132
    .divice-line{
134
    .divice-line {
133 135
      width: 1px;
134 136
      margin-left: 24px;
135
      background-color: #E8E8E8;
137
      background-color: #e8e8e8;
136 138
      height: 114px;
137 139
    }
138 140
  }
139 141
}
140
141
.modal-head-right{
142
.modal-foot {
143
  padding-right: 10px;
144
}
145
.modal-head-right {
142 146
  display: flex;
143 147
  width: 100%;
144
  .leaveTime{
148
  .leaveTime {
145 149
    display: flex;
146 150
    flex-direction: column;
147 151
    margin-top: 46px;
148
    .modal-head-txt{
149
      .head-name-txt{
150
      margin-bottom: 12px;
151
      font-size: 14px;
152
      color: rgba(0, 0, 0, 0.65);
152
    .modal-head-txt {
153
      .head-name-txt {
154
        margin-bottom: 12px;
155
        font-size: 14px;
156
        color: rgba(0, 0, 0, 0.65);
153 157
      }
154 158
      font-size: 14px;
155 159
      color: rgba(0, 0, 0, 0.45);
156 160
      margin-top: 24px;
157 161
    }
158
    .modal-head-top{
159
      .head-name-txt
160
      {
161
      margin-bottom: 12px;
162
      font-size: 14px;
163
      color: rgba(0, 0, 0, 0.65);
162
    .modal-head-top {
163
      .head-name-txt {
164
        margin-bottom: 12px;
165
        font-size: 14px;
166
        color: rgba(0, 0, 0, 0.65);
164 167
      }
165 168
      font-size: 14px;
166 169
      color: rgba(0, 0, 0, 0.45);
167 170
    }
168 171
  }
169
  .absenteeism{
172
  .absenteeism {
170 173
    display: flex;
171 174
    flex-direction: column;
172 175
    margin-left: auto;
173
    .modal-head-txt{
174
      .head-name-txt{
175
      margin-bottom: 12px;
176
      font-size: 14px;
177
      color: rgba(0, 0, 0, 0.65);
176
    .modal-head-txt {
177
      .head-name-txt {
178
        margin-bottom: 12px;
179
        font-size: 14px;
180
        color: rgba(0, 0, 0, 0.65);
178 181
      }
179 182
      font-size: 14px;
180 183
      color: rgba(0, 0, 0, 0.45);
181 184
      margin-top: 24px;
182 185
    }
183
    .modal-head-top{
184
      .head-name-txt{
185
      margin-bottom: 12px;
186
      font-size: 14px;
187
      color: rgba(0, 0, 0, 0.65);
188
    }
186
    .modal-head-top {
187
      .head-name-txt {
188
        margin-bottom: 12px;
189
        font-size: 14px;
190
        color: rgba(0, 0, 0, 0.65);
191
      }
189 192
      font-size: 14px;
190 193
      color: rgba(0, 0, 0, 0.45);
191 194
    }
192 195
  }
193
  .keep-column{
196
  .keep-column {
194 197
    display: flex;
195 198
    flex-direction: column;
196 199
    margin-left: 24px;
197
    .modal-head-txt{
198
      .head-name-txt{
199
      margin-bottom: 12px;
200
      font-size: 14px;
201
      color: rgba(0, 0, 0, 0.65);
200
    .modal-head-txt {
201
      .head-name-txt {
202
        margin-bottom: 12px;
203
        font-size: 14px;
204
        color: rgba(0, 0, 0, 0.65);
202 205
      }
203 206
      font-size: 14px;
204 207
      color: rgba(0, 0, 0, 0.45);
205 208
      margin-top: 24px;
206 209
    }
207
    .modal-head-top{
208
      .head-name-txt{
209
      margin-bottom: 12px;
210
      font-size: 14px;
211
      color: rgba(0, 0, 0, 0.65);
210
    .modal-head-top {
211
      .head-name-txt {
212
        margin-bottom: 12px;
213
        font-size: 14px;
214
        color: rgba(0, 0, 0, 0.65);
212 215
      }
213 216
      font-size: 14px;
214 217
      color: rgba(0, 0, 0, 0.45);

+ 161 - 43
security-protection-platform/src/modules/dashboard/index.vue

@ -39,15 +39,28 @@
39 39
        <div :style="`background-image: url(${titleImgBg})`" class="title" style="width: 370px;">
40 40
          <span class="title-span">重点区域监控</span>
41 41
        </div>
42
        <video-player ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer"></video-player>
42
        <!--        <video-player ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer"></video-player>-->
43
        <videoPlayer
44
          ref="videoPlayer"
45
          :options="videoOptions"
46
          :playsinline="true"
47
          class="vjs-custom-skin videoPlayer"
48
        />
43 49
        <div class="videoPlayers">
44 50
          <div v-for="(item,index) in videoOptionsList" class="videoPlayer-sm" @click="videoSwitchover(item)">
45
            <video-player ref="videoPlayer"
46
                          :options="item.options"
47
                          :playsinline="true"
48
                          :style="`padding: 0 2.5% 2.5% 2%;border-radius: 5px;border: ${1-index}px solid #009bf3;`"
49
                          class="vjs-custom-skin videoPlayer">
50
            </video-player>
51
            <!--            <video-player ref="videoPlayer"-->
52
            <!--                          :options="item.options"-->
53
            <!--                          :playsinline="true"-->
54
            <!--                          :style="`padding: 0 2.5% 2.5% 2%;border-radius: 5px;border: ${1-index}px solid #009bf3;`"-->
55
            <!--                          class="vjs-custom-skin videoPlayer">-->
56
            <!--            </video-player>-->
57
            <videoPlayer
58
              ref="videoPlayer"
59
              :options="videoOptions"
60
              :playsinline="true"
61
              :style="`padding: 0 2.5% 2.5% 2%;border-radius: 5px;border: ${1-index}px solid #009bf3;`"
62
              class="vjs-custom-skin videoPlayer"
63
            />
51 64
            <div style="color: white;text-align: center;">{{ item.name }}</div>
52 65
          </div>
53 66
        </div>
@ -56,7 +69,22 @@
56 69
        <div :style="`background-image: url(${titleImgBg})`" class="title" style="width: 330px;">
57 70
          <span class="title-span">人员进出识别</span>
58 71
        </div>
59
        <img src="@/assets/images/indexT2.png" style="width: 95%;height: 95%;padding-left: 15px;padding-top: 10px;">
72
        <div v-for="(item,index) in distinguishData" :style="`background-image: url(${border})`" class="distinguish">
73
          <div class="distinguish-title"> {{ item.name }} </div>
74
          <div class="distinguish-row">
75
            <div class="similarity">
76
              <p style="opacity: 1;font-size: 12px">70%</p>
77
            </div>
78
            <img src="@/assets/images/indexT1.png" class="distinguish-col">
79
            <img src="@/assets/images/indexT1.png" class="distinguish-col">
80
            <div style="width: 40%;margin-top: 4%;height: 79%;">
81
              <div class="distinguish-col-row">王小明(00220)</div>
82
              <div class="distinguish-col-row">已佩戴口罩</div>
83
              <div class="distinguish-col-row">2021.01.05 12:11:00</div>
84
            </div>
85
          </div>
86
        </div>
87
        <!--        <img src="@/assets/images/indexT2.png" style="width: 95%;height: 95%;padding-left: 15px;padding-top: 10px;">-->
60 88
      </div>
61 89
    </div>
62 90
  </div>
@ -66,13 +94,15 @@
66 94
import imgBg from '@/assets/images/indexTop.png'
67 95
import titleImgBg from '@/assets/images/indexTitle.png'
68 96
import polygon from '@/assets/images/polygon.png'
97
import border from '@/assets/images/border.png'
69 98
import echarts from 'echarts'
70 99
import dasapi from '@/api/dashboard'
71 100
import sysapi from '@/api/system'
72 101
import 'video.js/dist/video-js.css'
73 102
import 'vue-video-player/src/custom-theme.css'
74
import { videoPlayer } from 'vue-video-player'
103
// import { videoPlayer } from 'vue-video-player'
75 104
import 'videojs-flash'
105
import VideoPlayer from '@/components/VideoPlayer'
76 106
77 107
export default {
78 108
  filters: {
@ -107,22 +137,55 @@ export default {
107 137
    }
108 138
  },
109 139
  components: {
110
    videoPlayer
140
    VideoPlayer
111 141
  },
112 142
  data() {
113 143
    return {
114 144
      nowDate: new Date(),
115
      videoOptions: {},
145
      videoOptions: {
146
        autoplay: true, // 如果true,浏览器准备好时开始回放。
147
        muted: true, // 默认情况下将会消除任何音频。
148
        loop: false, // 导致视频一结束就重新开始。
149
        preload: 'auto', // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
150
        language: 'zh-CN',
151
        aspectRatio: '16:10', // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
152
        // fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
153
        // 是否流体自适应容器宽高
154
        fluid: true,
155
        // // 设置视频播放器的显示宽度(以像素为单位)
156
        // width: '100px',
157
        // // 设置视频播放器的显示高度(以像素为单位)
158
        // height: '400px',
159
        sources: [{
160
          withCredentials: false,
161
          type: 'application/x-mpegURL', // 这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目
162
          src: 'http://10.19.90.34:1080/live/1.m3u8' // url地址
163
        }],
164
        flash: { hls: { withCredentials: false } },
165
        html5: { hls: { withCredentials: false } },
166
        notSupportedMessage: '此视频暂无法播放,请稍后再试', // 允许覆盖Video.js无法播放媒体源时显示的默认信息。
167
        controlBar: {
168
          timeDivider: false,
169
          durationDisplay: false,
170
          remainingTimeDisplay: false,
171
          fullscreenToggle: false // 全屏按钮
172
        }
173
      },
116 174
      videoOptionsList: [],
117 175
      imgBg: imgBg,
118 176
      titleImgBg: titleImgBg,
119 177
      polygon: polygon,
178
      border: border,
120 179
      attendanceData: [],
121 180
      population: 0,
122 181
      alarmDataX: [],
123 182
      alarmDataY: [],
124 183
      topData: [],
125
      topData1: []
184
      topData1: [],
185
      distinguishData: [{name: '1风场', url: '@/assets/images/indexT1.png', url2: '@/assets/images/indexT1.png'},
186
        {name: '2风场', url: '@/assets/images/indexT1.png', url2: '@/assets/images/indexT1.png'},
187
        {name: '3风场', url: '@/assets/images/indexT1.png', url2: '@/assets/images/indexT1.png'},
188
        {name: '2风场', url: '@/assets/images/indexT1.png', url2: '@/assets/images/indexT1.png'}]
126 189
    }
127 190
  },
128 191
  computed: {
@ -139,32 +202,32 @@ export default {
139 202
  methods: {
140 203
    initVideo() {
141 204
      sysapi.getTerminalRel(2).then(res => {
142
        this.videoOptions = {
143
          live: true,
144
          autoplay: true,
145
          fluid: false,
146
          height: document.documentElement.clientHeight * 0.60,
147
          notSupportedMessage: '暂时无法播放',
148
          controlBar: {
149
            timeDivider: false,
150
            durationDisplay: false,
151
            remainingTimeDisplay: false,
152
            fullscreenToggle: true // 全屏按钮
153
          },
154
          techOrder: ['flash'],
155
          flash: {
156
            hls: { withCredentials: false },
157
            swf: 'static/video-js.swf' // 引入静态文件swf
158
          },
159
          sources: [{ // 流配置,数组形式,会根据兼容顺序自动切换
160
            type: 'rtmp/mp4',
161
            src: res.data.data[0].videoUrl
162
          }]
163
        }
205
        // this.videoOptions = {
206
        //   live: true,
207
        //   autoplay: true,
208
        //   fluid: false,
209
        //   height: document.documentElement.clientHeight * 0.60,
210
        //   notSupportedMessage: '暂时无法播放',
211
        //   controlBar: {
212
        //     timeDivider: false,
213
        //     durationDisplay: false,
214
        //     remainingTimeDisplay: false,
215
        //     fullscreenToggle: true // 全屏按钮
216
        //   },
217
        //   techOrder: ['flash'],
218
        //   flash: {
219
        //     hls: { withCredentials: false },
220
        //     swf: 'static/video-js.swf' // 引入静态文件swf
221
        //   },
222
        //   sources: [{ // 流配置,数组形式,会根据兼容顺序自动切换
223
        //     type: 'rtmp/mp4',
224
        //     src: res.data.data[0].videoUrl
225
        //   }]
226
        // }
164 227
        this.videoOptionsList = []
165 228
        res.data.data.forEach(e => {
166 229
          this.videoOptionsList.push({
167
            options:{
230
            options: {
168 231
              live: true,
169 232
              autoplay: true,
170 233
              fluid: false,
@ -186,11 +249,11 @@ export default {
186 249
        })
187 250
      })
188 251
    },
189
    videoSwitchover(itme){
252
    videoSwitchover(itme) {
190 253
      this.videoOptions.sources = itme.options.sources
191 254
    },
192 255
    gotoSystem() {
193
      this.$router.push({name:'videoSurveillance'})
256
      this.$router.push({name: 'videoSurveillance'})
194 257
    },
195 258
    initAttendance() {
196 259
      this.attendanceData = dasapi.queryAttendanceChart().then(res => {
@ -222,7 +285,7 @@ export default {
222 285
    init24Top() {
223 286
      this.topData = dasapi.queryAlarmAnalysisTopList().then(res => {
224 287
        this.topData = []
225
        for (var i = 0; i < 4; i++) {
288
        for (var i = 0; i < 5; i++) {
226 289
          if (res.data[i]) {
227 290
            this.topData.push(res.data[i])
228 291
          }
@ -302,10 +365,10 @@ export default {
302 365
      var option = null
303 366
      var gridWidth = 320 // 可以根据canvas的宽度和grid的right,left,width进行计算
304 367
      var fontsize = 12 // 字体大小
305
      var wordNum = parseInt((gridWidth / this.alarmDataX.length) / fontsize);
368
      var wordNum = parseInt((gridWidth / this.alarmDataX.length) / fontsize)
306 369
      var flag = 0
307 370
      this.alarmDataX.forEach(value => {
308
        if (value){
371
        if (value) {
309 372
          var strs = value.split('')
310 373
          var str = ''
311 374
          for (var i = 0, s; s = strs[i++];) {
@ -352,6 +415,7 @@ export default {
352 415
        yAxis: [
353 416
          {
354 417
            type: 'value',
418
            minInterval: 1,
355 419
            axisLabel: {
356 420
              show: true,
357 421
              textStyle: {
@ -383,7 +447,7 @@ export default {
383 447
                  show: true, // 是否展示
384 448
                  position: 'top', // 在上方显示
385 449
                  formatter: function(name) {
386
                    return name.value + ''
450
                    return name.value + ''
387 451
                  },
388 452
                  textStyle: {
389 453
                    fontSize: 14,
@ -470,7 +534,7 @@ export default {
470 534
          .top4-row{
471 535
            border: 0 none;
472 536
            border-bottom: 2px dotted #00466b;
473
            height: 20%;
537
            height: 16%;
474 538
            .col-6{
475 539
              display: flex;
476 540
              .polygon{
@ -479,7 +543,7 @@ export default {
479 543
                align-items: center;
480 544
                text-align: center;
481 545
                height: 100%;
482
                width: 16%;
546
                width: 15%;
483 547
              }
484 548
            }
485 549
          }
@ -499,6 +563,60 @@ export default {
499 563
      border-radius: 5px;
500 564
      background-color: #011d40; /* 浏览器不支持的时候显示 */
501 565
      box-shadow: 0 0 30px -10px #009bf3 inset;
566
      .distinguish{
567
        -moz-background-size:100% 100%;
568
        background-size:100% 100%;
569
        width: 88%;
570
        height: 22%;
571
        margin-left: 6%;
572
        margin-top: 3%;
573
        padding-left: 1%;
574
        padding-right: 1%;
575
        padding-top: 1%;
576
        padding-bottom: 1%;
577
        .distinguish-title{
578
          align-items: center;
579
          text-align: center;
580
          height: 28px;
581
          width: 100%;
582
          margin: 0 auto;
583
          font-size: 16px;
584
          color: #00d8f3;
585
          //background-color: #003C74; 100%
586
          background: linear-gradient(to right, #011d40,#003C74,#011D40);
587
        }
588
        .distinguish-row{
589
          display: flex;
590
          color: #00d8f3;
591
          width: 100%;
592
          height: 100%;
593
          position: relative;
594
          .similarity{
595
            position: absolute;
596
            left:22%;
597
            top:27%;
598
            border: 2px solid  #00d8f3;
599
            width: 30px;
600
            height: 30px;
601
            background: #090404;
602
            opacity: 0.5;
603
            border-radius: 50%;
604
            padding-top: 1%;
605
          }
606
          .distinguish-col{
607
            width: 27%;
608
            margin-top: 2%;
609
            height: 70%;
610
          }
611
          .distinguish-col-row{
612
            padding-left: 5%;
613
            height: 30%;
614
            width: 130%;
615
            color: white;
616
            font-size: 14px;
617
          }
618
        }
619
      }
502 620
    }
503 621
  }
504 622
  .title{

+ 1 - 1
security-protection-platform/src/modules/system/attendance/components/SchedulePanel/ShiftDialog.vue

@ -31,7 +31,7 @@
31 31
32 32
    <div slot="footer">
33 33
      <t-button @click="visibled=false">取消</t-button>
34
      <t-button :loading="loadingSubmit" type="primary" @click="handleSubmit">保存</t-button>
34
      <t-button :loading="loadingSubmit" color="primary" @click="handleSubmit">保存</t-button>
35 35
    </div>
36 36
  </t-modal>
37 37
</template>

+ 3 - 1
security-protection-platform/src/modules/system/attendance/components/SchedulePanel/index.vue

@ -1,7 +1,9 @@
1 1
<template>
2 2
  <div>
3 3
    <t-loading v-model="loading" />
4
    <t-button color="primary" style="margin-bottom:30px;" @click="handleCreate">新增</t-button>
4
    <t-button color="primary" style="margin-bottom:30px;" @click="handleCreate">
5
      <t-icon icon="plus-circle-outline" size="16"></t-icon> 新增
6
    </t-button>
5 7
    <div class="schedule-card-block">
6 8
      <schedule-card v-for="item in schedules" :key="item.scheduleId" :data="item" @edit="handleEdit" @deleted="flushPage()" />
7 9
      <div v-if="!loading && schedules.length === 0" class="schedule-card-block__empty">点击 “新增” 按钮增加班次</div>

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

@ -56,7 +56,7 @@ export default {
56 56
      videoOptions: [],
57 57
      videoCurrent: 1, // 大门分页数据
58 58
      videoPageSize: 10, // 大门分页数据
59
      videoTotal: 100, // 大门分页总数
59
      videoTotal: 0, // 大门分页总数
60 60
      tabId: 1,
61 61
      paramsObj: { // 接口请求数据
62 62
        page: 0,
@ -173,7 +173,7 @@ export default {
173 173
      this.videoList = []
174 174
      this.tabId = id
175 175
      this.videoCurrent = 1
176
      this.getVideoSurveillanceData(id)
176
      this.getVideoSurveillanceData()
177 177
    },
178 178
    // 获取风场下拉框列表
179 179
    async getWindFiledList () {
@ -188,12 +188,12 @@ export default {
188 188
    },
189 189
    handlefullscreenchange(val) {
190 190
      // 因为我是又封装了一个组件,打印val会有相应所需的属性,全屏状态为:isFullscreen_
191
      console.log(val);
192 191
      val.isFullscreen_ = !val.isFullscreen_
193 192
      // this.$emit('fullscreenchange', val)
194 193
    },
195 194
    // 获得风场大门数据
196
    getVideoSurveillanceData (id) {
195
    getVideoSurveillanceData () {
196
      var id = this.tabId
197 197
      this.paramsObj.page = this.videoCurrent
198 198
      sysapi.getVideoSurveillanceData({ params: { monitorSceneId: id } }).then(res => {
199 199
        this.videoList = res.data.data
@ -239,8 +239,8 @@ export default {
239 239
    },
240 240
    // 风场大门分页
241 241
    onChangeGate (val) {
242
      this.videoList = []
243 242
      this.videoCurrent = val
243
      this.getVideoSurveillanceData()
244 244
    }
245 245
  }
246 246
}

+ 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>