巴卫 2 years ago
commit 9efd4f0f4c

@ -14,6 +14,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -27,9 +28,7 @@ import java.util.concurrent.ConcurrentHashMap;
* @date 2021/3/15 17:12 * @date 2021/3/15 17:12
*/ */
@SpringBootApplication(scanBasePackages = "jnpf",exclude={DataSourceAutoConfiguration.class}) @SpringBootApplication(scanBasePackages = "jnpf",exclude={DataSourceAutoConfiguration.class})
@EnableScheduling
//@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class },scanBasePackages = {"org.jeecg.modules.jmreport","jnpf"})
public class LinkageAdminApplication extends SpringBootServletInitializer implements CommandLineRunner { public class LinkageAdminApplication extends SpringBootServletInitializer implements CommandLineRunner {
public static void main(String[] args) { public static void main(String[] args) {

@ -59,9 +59,19 @@ config:
#===================== 文件模板配置 ===================== #===================== 文件模板配置 =====================
fileType: local #文件存储类型(local-本地存储minio-网络存储) fileType: local #文件存储类型(local-本地存储minio-网络存储)
# win # win
Path: D:\project\jnpf-resources\ #Windows配置静态资源根目录和代码生成器临时目录 # Path: /usr/project/jnpf-resources/ #Windows配置静态资源根目录和代码生成器临时目录
# Windows环境配置静态资源根目录和代码生成器临时目录
Path: D:\demo\project\jnpf-resources\
ServiceDirectoryPath: TemporaryFile
# Linux、MacOS环境配置静态资源根目录和代码生成器临时目录
# Path: /www/wwwroot/JNPF.Admin.test/Resources/
# ServiceDirectoryPath: /www/wwwroot/JNPF.Admin.test/Resources/CodeTemp/
# Linux # Linux
#Path: /usr/project/jnpf-resources/ #Linux配置静态资源根目录和代码生成器临时目录 #Path: /data/jnpf-resources/ #Linux配置静态资源根目录和代码生成器临时目录
minio: minio:
endpoint: http://192.168.0.147:9000/ #服务端地址 endpoint: http://192.168.0.147:9000/ #服务端地址
accessKey: minioadmin #账号 accessKey: minioadmin #账号

@ -59,7 +59,8 @@ config:
#===================== 文件模板配置 ===================== #===================== 文件模板配置 =====================
fileType: local #文件存储类型(local-本地存储minio-网络存储) fileType: local #文件存储类型(local-本地存储minio-网络存储)
# win # win
Path: F:\project\jnpf-resources\ #Windows配置静态资源根目录和代码生成器临时目录 # Path: F:\project\jnpf-resources\ #Windows配置静态资源根目录和代码生成器临时目录
Path: D:\demo\jnpf-resources\ #Windows配置静态资源根目录和代码生成器临时目录
# Linux # Linux
#Path: /data/jnpf-resources/ #Linux配置静态资源根目录和代码生成器临时目录 #Path: /data/jnpf-resources/ #Linux配置静态资源根目录和代码生成器临时目录
minio: minio:

@ -58,4 +58,5 @@ config:
#===================== 接口鉴权 ===================== #===================== 接口鉴权 =====================
EnablePreAuth: false #是否开启 EnablePreAuth: false #是否开启
fixedRateString: 5000

@ -31,16 +31,37 @@
<scope>compile</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- <dependency>-->
<!-- <groupId>org.bytedeco</groupId>-->
<!-- <artifactId>javacv-platform</artifactId>-->
<!-- <version>1.3.2</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-lang3</artifactId>-->
<!-- <version>3.3.2</version>-->
<!-- </dependency>-->
<dependency> <dependency>
<groupId>io.swagger</groupId> <groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId> <artifactId>swagger-annotations</artifactId>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
</dependency>
<dependency>
<groupId>com.jnpf</groupId>
<artifactId>linkage-example</artifactId>
<version>3.4.1-RELEASE</version>
<scope>compile</scope>
</dependency> </dependency>
<!-- JimuReport -->
<!--<dependency>
<groupId>org.jeecgframework.jimureport</groupId>
<artifactId>spring-boot-starter-jimureport</artifactId>
<version>1.3.21-beta</version>
</dependency>-->
</dependencies> </dependencies>
</project> </project>

@ -0,0 +1 @@
{"flowEngine":{"appFormUrl":null,"category":"crm","creatorTime":1670572225000,"creatorUser":"admin","dbLinkId":"0","deleteMark":null,"deleteTime":null,"deleteUserId":null,"description":"获取摄像头的地址,定期更新","enCode":"002","enabledMark":1,"flowTemplateJson":"{\"type\":\"start\",\"content\":\"所有人\",\"properties\":{\"initiator\":[],\"initiatePos\":[],\"initiateRole\":[],\"title\":\"流程发起\",\"formOperates\":[{\"id\":\"mId\",\"name\":\"主表ID\",\"required\":false,\"requiredDisabled\":false,\"jnpfKey\":\"select\",\"dataType\":\"\",\"read\":true,\"write\":true},{\"id\":\"mName\",\"name\":\"设备名\",\"required\":true,\"requiredDisabled\":true,\"jnpfKey\":\"comInput\",\"dataType\":\"\",\"read\":true,\"write\":true},{\"id\":\"serialnumber\",\"name\":\"设备序列号\",\"required\":true,\"requiredDisabled\":true,\"jnpfKey\":\"comInput\",\"dataType\":\"\",\"read\":true,\"write\":true},{\"id\":\"flvaddress\",\"name\":\"标清flv直播地址\",\"required\":true,\"requiredDisabled\":true,\"jnpfKey\":\"comInput\",\"dataType\":\"\",\"read\":true,\"write\":true},{\"id\":\"flvhdaddress\",\"name\":\"高清flv直播地址\",\"required\":true,\"requiredDisabled\":true,\"jnpfKey\":\"comInput\",\"dataType\":\"\",\"read\":true,\"write\":true},{\"id\":\"mStatus\",\"name\":\"设备状态:不在线、在线\",\"required\":false,\"requiredDisabled\":false,\"jnpfKey\":\"switch\",\"dataType\":\"\",\"read\":true,\"write\":true}],\"initFuncConfig\":{\"on\":false,\"interfaceId\":\"\",\"interfaceName\":\"\",\"templateJson\":[]},\"endFuncConfig\":{\"on\":false,\"interfaceId\":\"\",\"interfaceName\":\"\",\"templateJson\":[]},\"flowRecallFuncConfig\":{\"on\":false,\"interfaceId\":\"\",\"interfaceName\":\"\",\"templateJson\":[]},\"waitMsgConfig\":{\"on\":0,\"msgId\":\"\",\"msgName\":\"\",\"templateJson\":[]},\"endMsgConfig\":{\"on\":0,\"msgId\":\"\",\"msgName\":\"\",\"templateJson\":[]},\"approveMsgConfig\":{\"on\":0,\"msgId\":\"\",\"msgName\":\"\",\"templateJson\":[]},\"rejectMsgConfig\":{\"on\":0,\"msgId\":\"\",\"msgName\":\"\",\"templateJson\":[]},\"copyMsgConfig\":{\"on\":0,\"msgId\":\"\",\"msgName\":\"\",\"templateJson\":[]},\"hasSubmitBtn\":true,\"submitBtnText\":\"提 交\",\"hasSaveBtn\":true,\"saveBtnText\":\"暂 存\",\"hasPressBtn\":false,\"pressBtnText\":\"催 办\",\"hasRevokeBtn\":false,\"revokeBtnText\":\"撤 回\",\"hasPrintBtn\":false,\"printBtnText\":\"打 印\",\"printId\":\"\",\"isComment\":false,\"isBatchApproval\":false,\"isSummary\":false,\"summaryType\":0},\"nodeId\":\"RbGc8G1\"}","formData":"[{\"filedId\":\"mId\",\"filedName\":\"主表ID\",\"required\":false},{\"filedId\":\"mName\",\"filedName\":\"设备名\",\"required\":true},{\"filedId\":\"serialnumber\",\"filedName\":\"设备序列号\",\"required\":true},{\"filedId\":\"flvaddress\",\"filedName\":\"标清flv直播地址\",\"required\":true},{\"filedId\":\"flvhdaddress\",\"filedName\":\"高清flv直播地址\",\"required\":true},{\"filedId\":\"mStatus\",\"filedName\":\"设备状态:不在线、在线\",\"required\":false}]","formType":1,"formUrl":"extend/monitoring_item/form.vue","fullName":"摄像头数据","icon":"fa fa-file-text-o","iconBackground":null,"id":"370926725908927749","lastModifyTime":1670574143000,"lastModifyUser":"admin","sortCode":0,"tables":"[]","type":1,"version":null,"visibleType":0},"visibleList":[]}

@ -0,0 +1,175 @@
<template>
<view class="jnpf-wrap jnpf-wrap-workflow" v-if="!loading">
<u-form :model="dataForm" :rules="rules" ref="dataForm" :errorType="['toast']"
label-position="left" label-align="left" :label-width="labelwidth" class="jnpf-form">
<u-form-item
label="主表ID" v-if="judgeShow('mId')" :required="requiredList.mId" prop="mId" >
<jnpf-select v-model="dataForm.mId" :disabled="judgeWrite('mId')"
placeholder="请选择" :props="mIdProps" :options="mIdOptions" :style='{"width":"100%"}'>
</jnpf-select>
</u-form-item>
<u-form-item
label="设备名" v-if="judgeShow('mName')" :required="requiredList.mName" prop="mName" >
<u-input v-model="dataForm.mName" :disabled="judgeWrite('mName')"
placeholder="请输入" :style='{"width":"100%"}'>
</u-input>
</u-form-item>
<u-form-item
label="设备序列号" v-if="judgeShow('serialnumber')" :required="requiredList.serialnumber" prop="serialnumber" >
<u-input v-model="dataForm.serialnumber" :disabled="judgeWrite('serialnumber')"
placeholder="请输入" :style='{"width":"100%"}'>
</u-input>
</u-form-item>
<u-form-item
label="标清flv直播地址" v-if="judgeShow('flvaddress')" :required="requiredList.flvaddress" prop="flvaddress" >
<u-input v-model="dataForm.flvaddress" :disabled="judgeWrite('flvaddress')"
placeholder="请输入" :style='{"width":"100%"}'>
</u-input>
</u-form-item>
<u-form-item
label="高清flv直播地址" v-if="judgeShow('flvhdaddress')" :required="requiredList.flvhdaddress" prop="flvhdaddress" >
<u-input v-model="dataForm.flvhdaddress" :disabled="judgeWrite('flvhdaddress')"
placeholder="请输入" :style='{"width":"100%"}'>
</u-input>
</u-form-item>
<u-form-item
label="设备状态:不在线、在线" v-if="judgeShow('mStatus')" :required="requiredList.mStatus" prop="mStatus" >
<jnpf-switch v-model="dataForm.mStatus" :disabled="judgeWrite('mStatus')"
>
</jnpf-switch>
</u-form-item>
</u-form>
</view>
</template>
<script>
import {
getDictionaryDataSelector,
getDataInterfaceRes
} from '@/api/common'
import comMixin from '../mixin'
import request from '@/utils/request'
export default {
mixins: [comMixin],
data(){
return{
loading: false,
dataForm:{
id:"",
flowId: '',
status: 1,
candidateList:{},
freeapproveruserid: '',
mId : "",
mName : '',
serialnumber : '',
flvaddress : '',
flvhdaddress : '',
mStatus : 0,
},
rules:{
},
mIdOptions:[],
mIdProps:{"label":"M_Name","value":"id"},
labelwidth: 100*1.5,
}
},
created(){
this.dataAll()
},
onReady() {
this.$refs.dataForm.setRules(this.rules);
},
watch:{
dataForm: {
handler(val, oldVal) {
},
deep: true
}
},
methods:{
dataAll(){
this.getmIdOptions()
},
getmIdOptions() {
getDataInterfaceRes('370933183241262469').then(res => {
let data = res.data.data
this.mIdOptions = data
})
},
selfGetInfo() {
this.loading = true
request({
url: '/api/example/Monitoring_item/'+this.dataForm.id,
method: 'get',
}).then(res => {
this.dataInfo(res.data)
this.loading = false
})
},
selfSubmit() {
this.dataForm.status = this.eventType === 'submit' ? 0 : 1
if (this.eventType === 'save') return this.selfHandleRequest()
uni.showModal({
title: '提示',
content: '您确定要提交当前流程吗?',
success: res => {
if (res.confirm) {
this.selfHandleRequest()
}
}
})
},
selfHandleRequest() {
var _data =this.dataList()
if (this.dataForm.id) {
request({
url: '/api/example/Monitoring_item/' + this.dataForm.id,
method: 'put',
data: _data,
}).then(res => {
uni.showToast({
title: res.msg,
complete: () => {
setTimeout(() => {
uni.$emit('refresh')
uni.navigateBack()
}, 1500)
}
})
})
}else{
delete (this.dataForm.id)
request({
url: '/api/example/Monitoring_item',
method: 'post',
data: _data,
}).then(res => {
uni.showToast({
title: res.msg,
complete: () => {
setTimeout(() => {
uni.$emit('refresh')
uni.navigateBack()
}, 1500)
}
})
})
}
},
selfInit() {
this.$store.commit('base/UPDATE_RELATION_DATA', {})
},
dataList(){
var _data = JSON.parse(JSON.stringify(this.dataForm));
return _data;
},
dataInfo(dataAll){
let _dataAll =dataAll
this.dataForm=_dataAll
},
},
}
</script>

@ -0,0 +1,389 @@
<template>
<view class="dynamicModel-list-v">
<view class="head-warp com-dropdown">
<u-dropdown class="u-dropdown" ref="uDropdown" @close="closeData">
<u-dropdown-item title="排序">
<view class="dropdown-slot-content">
<view class="dropdown-slot-content-main">
<u-cell-group>
<u-cell-item @click="cellClick(item)" :arrow="false" :title="item.label"
v-for="(item, index) in sortOptions" :key="index" :title-style="{color: sortValue == item.value ? '#2979ff' : '#606266' }">
<u-icon v-if="sortValue == item.value" name="checkbox-mark" color="#2979ff" size="32"></u-icon>
</u-cell-item>
</u-cell-group>
</view>
</view>
</u-dropdown-item>
<u-dropdown-item title="筛选" >
<view class="dropdown-slot-content">
<view class="dropdown-slot-content-main search-main">
<view class="u-p-l-32 u-p-r-32 search-form">
<u-form :model="searchForm" ref="searchForm" :errorType="['toast']" label-position="left" label-width="150">
<u-form-item label="设备名" prop="mName">
<u-input v-model="searchForm.mName" placeholder="请输入设备名" />
</u-form-item>
</u-form>
</view>
<view class="buttom-actions">
<u-button class="buttom-btn" @click="reset"></u-button>
<u-button class="buttom-btn" type="primary" @click="closeDropdown"></u-button>
</view>
<view class="dropdown-slot-bg" @click="$refs.uDropdown.close()"></view>
</view>
</view>
</u-dropdown-item>
</u-dropdown>
</view>
<view class="list-warp">
<mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" :fixed="false" :down="downOption" :up="upOption">
<view class="list">
<view class="list-box" v-for="(item, index) in list" :key="item.prop">
<u-swipe-action :index="index" @click="handleClick" @open="open" :options="options" @content-click="goDetail(item.id,item.flowState)">
<view class="item">
<view class="item-cell u-line-1" v-if="$setPermission.hasP('mId',menuId)">
<text>主表ID</text>
<text>{{item.mid}}</text>
</view>
<view class="item-cell u-line-1" v-if="$setPermission.hasP('mName',menuId)">
<text>设备名</text>
<text>{{item.mname}}</text>
</view>
<view class="item-cell u-line-1" v-if="$setPermission.hasP('serialnumber',menuId)">
<text>设备序列号</text>
<text>{{item.serialnumber}}</text>
</view>
<view class="item-cell u-line-1" v-if="$setPermission.hasP('flvaddress',menuId)">
<text>标清flv直播地址</text>
<text>{{item.flvaddress}}</text>
</view>
<view class="item-cell u-line-1" v-if="$setPermission.hasP('flvhdaddress',menuId)">
<text>高清flv直播地址</text>
<text>{{item.flvhdaddress}}</text>
</view>
<view class="item-cell u-line-1" v-if="$setPermission.hasP('mStatus',menuId)">
<text>设备状态不在线在线</text>
<text>{{item.mstatus}}</text>
</view>
<view class="item-cell">
<text>审批状态</text>
<text :class="getFlowStatus(item.flowState).statusCss">
{{getFlowStatus(item.flowState).text}}
</text>
</view>
</view>
</u-swipe-action>
</view>
</view>
</mescroll-uni>
</view>
<view class="com-addBtn" @click="addPage()" v-if="$setPermission.hasBtnP('btn_add',menuId)" >
<u-icon name="plus" size="60" color="#fff" />
</view>
</view>
</template>
<script>
import resources from '@/libs/resources.js'
import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
import {
getDictionaryDataSelector,
getDataInterfaceRes
} from '@/api/common'
import request from '@/utils/request'
export default {
mixins: [MescrollMixin],
data() {
return {
sortValue: '',
searchForm: {
mName:undefined,
},
downOption: {
use: true,
auto: false
},
upOption: {
page: {
num: 0,
size: 20,
time: null,
},
empty: {
use: true,
icon: resources.message.nodata,
tip: "暂无数据",
fixed: true,
top: "300rpx",
zIndex: 5,
},
textNoMore: '没有更多数据',
toTop: {
bottom: 250
}
},
mIdOptions:[],
mIdProps:{"label":"M_Name","value":"id"},
list: [],
listQuery: {
sort: 'asc',
sidx: '',
keyword: '',
json: ''
},
options: [
{
text: '删除',
style: {
backgroundColor: '#dd524d'
}
}
],
sortOptions:[
{
label: '主表ID降序',
sidx: 'mId',
value: 'mIddesc',
sort: 'desc'
},
{
label: '主表ID升序',
sidx: 'mId',
value: 'mIdasc',
sort: 'asc'
},
],
menuId:'',
}
},
onLoad(e){
this.menuId = e.menuId
uni.$on('refresh', () => {
this.list = [];
this.mescroll.resetUpScroll();
})
this.dataAll()
},
onUnload() {
uni.$off('refresh')
},
methods:{
dataAll(){
this.getmIdOptions()
},
getmIdOptions() {
getDataInterfaceRes('370933183241262469').then(res => {
let data = res.data.data
this.mIdOptions = data
})
},
closeData(e){
if(e==1){
// this.reset()
}
},
upCallback(page) {
// for(let i in this.searchForm){
// if(!this.searchForm[i]){
// delete this.searchForm[i]
// }
// }
const query = {
currentPage: page.num,
pageSize: page.size,
menuId : this.menuId,
...this.listQuery,
...this.searchForm
}
request({
url: '/api/example/Monitoring_item/getList',
method: 'post',
data: query,
}).then(res => {
let _list = this.dataList(res.data);
this.mescroll.endSuccess(res.data.list.length);
if (page.num == 1) this.list = [];
const list = _list.map(o => ({
show: false,
...o
}));
this.list = this.list.concat(_list);
}).catch(() => {
this.mescroll.endErr();
})
},
handleClick(index, index1) {
if (!this.$setPermission.hasBtnP("btn_remove",this.menuId)) return this.$u.toast("未开启删除权限")
const item = this.list[index]
if([1,3,5].includes(item.flowState)){
this.$u.toast("流程正在审核,请勿删除")
this.list[index].show = false
return
}
request({
url: '/api/example/Monitoring_item/' + item.id,
method: 'delete'
}).then(res => {
uni.showToast({
title: res.msg,
complete: () => {
this.$u.toast(res.msg)
this.list.splice(index, 1)
if (!this.list.length) this.mescroll.showEmpty()
}
})
})
},
open(index) {
this.list[index].show = true;
this.list.map((val, idx) => {
if (index != idx) this.list[idx].show = false;
})
},
search() {
if (this.isPreview == '1') return
this.searchTimer && clearTimeout(this.searchTimer)
this.searchTimer = setTimeout(() => {
this.list = [];
this.mescroll.resetUpScroll();
}, 300)
},
goDetail(id, status) {
let btnType = ''
let btnList = []
btnList.push('btn_edit')
if(btnList.includes('btn_detail')){
btnType = "btn_detail"
}
if(btnList.includes('btn_edit')){
btnType = "btn_edit"
}
if(!btnType) return
if(!this.$setPermission.hasBtnP('btn_edit',this.menuId) && !this.$setPermission.hasBtnP('',this.menuId)) return
if(this.$setPermission.hasBtnP('btn_edit',this.menuId)) btnType = 'btn_edit'
this.jumPage(id, status,btnType)
},
addPage() {
this.jumPage()
},
jumPage(id, status,btnType){
if (!id && !status) btnType = 'btn_add'
let _title=""
if(btnType=='btn_add'){
_title = "新增"
}
if(btnType=='btn_detail'){
_title = "详情"
}
if(btnType=='btn_edit'){
_title = "编辑"
}
let opType = '-1'
if ([1,2,4,5].includes(status)) opType = 0
const config = {
id: id || '',
enCode: '002',
flowId: '370926725908927749',
formType: 1,
type: 1,
opType,
status: status || '',
fullName: _title,
jurisdictionType: btnType || ''
}
uni.navigateTo({
url: '/pages/workFlow/flowBefore/index?config=' + encodeURIComponent(JSON.stringify(config))
})
},
getFlowStatus(val) {
let status
switch (val) {
case 0:
status = {
text: '等待提交',
statusCss: 'u-type-info'
}
break;
case 1:
status = {
text: '等待审核',
statusCss: 'u-type-primary'
}
break;
case 2:
status = {
text: '审核通过',
statusCss: 'u-type-success'
}
break;
case 3:
status = {
text: '审核驳回',
statusCss: 'u-type-error'
}
break;
case 4:
status = {
text: '审核撤回',
statusCss: 'u-type-error'
}
break;
case 5:
status = {
text: '审核终止',
statusCss: 'u-type-info'
}
break;
default:
status = {
text: '等待提交',
statusCss: 'u-type-info'
}
break;
}
return status
},
cellClick(item) {
if (this.sortValue === item.value) return
this.listQuery.sort = item.sort
this.listQuery.sidx = item.sidx
this.sortValue = item.value
this.$refs.uDropdown.close();
this.$nextTick(() => {
this.list = [];
this.mescroll.resetUpScroll();
})
},
reset() {
this.$refs.searchForm.resetFields()
},
closeDropdown() {
this.$refs.uDropdown.close();
this.$nextTick(() => {
this.list = [];
this.mescroll.resetUpScroll();
})
},
dataList(data){
let _list =[]
for(let i=0;i<data.list.length;i++){
let _data = data.list[i]
_list.push(_data)
}
return _list;
},
},
}
</script>
<style lang="scss">
page {
background-color: #f0f2f6;
height: 100%;
/* #ifdef MP-ALIPAY */
position: absolute;
top: 0;
left: 0;
width: 100%;
/* #endif */
}
</style>

@ -0,0 +1,68 @@
<template>
<el-dialog title="导出数据" :close-on-click-modal="false" :visible.sync="visible"
class="JNPF-dialog JNPF-dialog_center" lock-scroll width="600px">
<el-form label-position="top" label-width="80px">
<el-form-item label="数据选择">
<el-radio-group v-model="type">
<el-radio :label="0">当前页面数据</el-radio>
<el-radio :label="1">全部页面数据</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="导出字段">
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAll"
@change="handleCheckAllChange">全选</el-checkbox>
<el-checkbox-group v-model="columns" @change="handleCheckedChange">
<el-checkbox v-for="item in columnList" :label="item.prop" :key="item.prop">
{{item.label}}
</el-checkbox>
</el-checkbox-group>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="visible=false"> </el-button>
<el-button type="primary" @click="downLoad"> </el-button>
</span>
</el-dialog>
</template>
<script>
export default {
data() {
return {
visible: false,
btnLoading: false,
type: 0,
columns: [],
checkAll: true,
isIndeterminate: false,
columnList: []
}
},
methods: {
init(columnList) {
this.visible = true
this.checkAll = true
this.isIndeterminate = false
this.columnList = columnList
this.columns = columnList.map(o => o.prop)
},
handleCheckAllChange(val) {
this.columns = val ? this.columnList.map(o => o.prop) : [];
this.isIndeterminate = false;
},
handleCheckedChange(value) {
let checkedCount = value.length;
this.checkAll = checkedCount === this.columnList.length;
this.isIndeterminate = checkedCount > 0 && checkedCount < this.columnList.length;
},
downLoad() {
this.$emit('download', { dataType: this.type, selectKey: this.columns.join(',') })
}
}
}
</script>
<style lang="scss" scoped>
>>> .el-dialog__body {
padding: 20px !important;
}
</style>

@ -0,0 +1,341 @@
<template>
<div>
<el-row :gutter="15">
<el-form ref="elForm" :model="dataForm" :rules="dataRule" size="medium" label-width="100px" label-position="left" :disabled="setting.readonly" >
<template v-if="!loading && formOperates">
<el-col :span="24" v-if="judgeShow('mId')" >
<el-form-item label="主表ID"
prop="mId" >
<el-select :disabled="judgeWrite('mId')" v-model="dataForm.mId"
placeholder="请选择" clearable :style='{"width":"100%"}'>
<el-option v-for="(item, index) in mIdOptions" :key="index" :label="item.M_Name" :value="item.id" :disabled="item.disabled" ></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24" v-if="judgeShow('mName')" >
<el-form-item label="设备名"
prop="mName" >
<el-input :disabled="judgeWrite('mName')" v-model="dataForm.mName"
placeholder="请输入" clearable :style='{"width":"100%"}'>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="judgeShow('serialnumber')" >
<el-form-item label="设备序列号"
prop="serialnumber" >
<el-input :disabled="judgeWrite('serialnumber')" v-model="dataForm.serialnumber"
placeholder="请输入" clearable :style='{"width":"100%"}'>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="judgeShow('flvaddress')" >
<el-form-item label="标清flv直播地址"
prop="flvaddress" >
<el-input :disabled="judgeWrite('flvaddress')" v-model="dataForm.flvaddress"
placeholder="请输入" clearable :style='{"width":"100%"}'>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="judgeShow('flvhdaddress')" >
<el-form-item label="高清flv直播地址"
prop="flvhdaddress" >
<el-input :disabled="judgeWrite('flvhdaddress')" v-model="dataForm.flvhdaddress"
placeholder="请输入" clearable :style='{"width":"100%"}'>
</el-input>
</el-form-item>
</el-col>
<el-col :span="24" v-if="judgeShow('mStatus')" >
<el-form-item label="设备状态:不在线、在线"
prop="mStatus" >
<el-switch :disabled="judgeWrite('mStatus')" v-model="dataForm.mStatus"
:active-value="1" :inactive-value="0" >
</el-switch>
</el-form-item>
</el-col>
</template>
</el-form>
</el-row>
<UserBox v-if="userBoxVisible" ref="userBox" @submit="submit" />
</div>
</template>
<script>
import request from '@/utils/request'
import { getDataInterfaceRes } from '@/api/systemData/dataInterface'
import { getDictionaryDataSelector } from '@/api/systemData/dictionary'
export default {
components: {},
props: [],
data() {
return {
visible: false,
loading: false,
setting:{},
eventType: '',
userBoxVisible:false,
dataForm: {
id:'',
flowId: '',
status: 1,
freeapproveruserid: '',
mId : "",
mName : '',
serialnumber : '',
flvaddress : '',
flvhdaddress : '',
mStatus : 0,
},
tableRequiredData: {},
dataRule:
{
mName: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
],
serialnumber: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
],
flvaddress: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
],
flvhdaddress: [
{
required: true,
message: '请输入',
trigger: 'blur'
},
],
},
mIdOptions:[],
}
},
computed: {
formOperates() {
return this.setting.formOperates
}
},
watch: {},
created() {
this.getmIdOptions();
},
mounted() {},
methods: {
judgeShow(id) {
if (!this.setting.formOperates || !this.setting.formOperates.length) return true
let arr = this.setting.formOperates.filter(o => o.id === id) || []
if (!arr.length) return true
let item = arr[0]
return item.read
},
judgeWrite(id) {
if (!this.setting.formOperates || !this.setting.formOperates.length) return false
let arr = this.setting.formOperates.filter(o => o.id === id) || []
if (!arr.length) return true
let item = arr[0]
return !item.write
},
getmIdOptions() {
getDataInterfaceRes('370933183241262469').then(res => {
let data = res.data.data
this.mIdOptions = data
})
},
goBack() {
this.$emit('refresh')
},
init(data) {
this.dataForm.id = data.id || "";
this.setting = data;
this.visible = true;
this.updateDataRule()
this.$nextTick(() => {
this.$refs['elForm'].resetFields();
if(this.dataForm.id){
this.loading = true
request({
url: '/api/example/Monitoring_item/'+this.dataForm.id,
method: 'get'
}).then(res => {
this.dataInfo(res.data)
this.loading = false
})
}
this.$emit('setPageLoad')
})
this.$store.commit('generator/UPDATE_RELATION_DATA', {})
},
updateDataRule() {
let newRules = {}
for (let i = 0; i < this.setting.formOperates.length; i++) {
const item = this.setting.formOperates[i]
if (!item.id.includes('-')) {
const newRulesItem = {
required: item.required,
message: item.name + '不能为空',
trigger: item.trigger || 'blur'
}
if (!this.dataRule.hasOwnProperty(item.id)) {
if (item.required) this.$set(newRules, item.id, [newRulesItem])
} else {
let withoutRequiredItem = true
for (let i = 0; i < this.dataRule[item.id].length; i++) {
if (this.dataRule[item.id][i].hasOwnProperty('required')) {
this.dataRule[item.id][i].required = item.required
withoutRequiredItem = false
}
}
if (withoutRequiredItem && item.required) this.dataRule[item.id].push(newRulesItem)
}
} else {
let key = item.id.split('-')[0]
let newId = item.id.split('-')[1]
let newItem = {
...item,
id: newId
}
if (!this.tableRequiredData.hasOwnProperty(key)) {
this.$set(this.tableRequiredData, key, [newItem])
} else {
this.tableRequiredData[key].push(newItem)
}
}
}
this.dataRule = { ...this.dataRule, ...newRules }
},
exist() {
let isOk = true
for (let key in this.tableRequiredData) {
if (this.dataForm[key] && Array.isArray(this.dataForm[key])) {
for (let i = 0; i < this.dataForm[key].length; i++) {
let item = this.dataForm[key][i]
inner: for (let id in item) {
let arr = this.tableRequiredData[key].filter(o => o.id === id) || []
if (!arr.length) continue inner
if (arr[0].required) {
let msg = `${arr[0].name}不能为空`
let boo = true
if (arr[0].dataType === 'array') {
boo = !this.jnpf.isEmptyArray(item[id])
} else {
boo = !this.jnpf.isEmpty(item[id])
}
if (!boo) {
this.$message({
message: msg,
type: 'error',
duration: 1000
})
isOk = false
break
}
}
}
}
}
}
return isOk
},
judgeRequired(id) {
if (!this.formOperates || !this.formOperates.length) return false
let arr = this.formOperates.filter(o => o.id === id) || []
if (!arr.length) return false
let item = arr[0]
return item.required
},
//
dataFormSubmit(eventType) {
this.$refs['elForm'].validate((valid) => {
if (valid) {
if (this.exist && !this.exist()) return
if (eventType === 'audit' || eventType === 'reject') {
this.$emit('eventReceiver', this.dataForm, eventType)
return
}
this.dataForm.status = eventType === 'submit' ? 0 : 1
this.dataForm.flowId=this.setting.flowId
this.eventType = eventType
if (this.eventType === 'submit') {
this.$confirm('您确定要提交当前流程吗, 是否继续?', '提示', {
type: 'warning'
}).then(() => {
this.request()
}).catch(() => { });
} else {
this.request()
}
}
})
},
request() {
var _data =this.dataList()
if (!this.dataForm.id) {
request({
url: '/api/example/Monitoring_item',
method: 'post',
data: _data
}).then((res) => {
this.$message({
message: res.msg,
type: 'success',
duration: 1000,
onClose: () => {
this.visible = false
this.$emit('close', true)
}
})
})
}else{
request({
url: '/api/example/Monitoring_item/'+this.dataForm.id,
method: 'PUT',
data: _data
}).then((res) => {
this.$message({
message: res.msg,
type: 'success',
duration: 1000,
onClose: () => {
this.visible = false
this.$emit('close', true)
}
})
})
}
},
dataList(){
var _data = JSON.parse(JSON.stringify(this.dataForm));
_data.mStatus = parseInt(_data.mStatus)
return _data;
},
dataInfo(dataAll){
let _dataAll =dataAll
_dataAll.mStatus = parseInt( _dataAll.mStatus)
this.dataForm = _dataAll
},
},
}
</script>

@ -0,0 +1,307 @@
<template>
<div class="JNPF-common-layout">
<div class="JNPF-common-layout-left">
<div class="JNPF-common-title">
<h2>左侧标题</h2>
</div>
<el-tree :data="treeData" :props="treeProps" default-expand-all highlight-current
ref="treeBox" :expand-on-click-node="false" @node-click="handleNodeClick"
class="JNPF-common-el-tree" node-key="id">
<span class="custom-tree-node" slot-scope="{ node, data }">
<i :class="data.icon"></i>
<span class="text">{{node.label}}</span>
</span>
</el-tree>
</div>
<div class="JNPF-common-layout-center">
<el-row class="JNPF-common-search-box" :gutter="16">
<el-form @submit.native.prevent>
<el-col :span="6">
<el-form-item label="设备名">
<el-input v-model="query.mName" placeholder="请输入" clearable> </el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item>
<el-button type="primary" icon="el-icon-search" @click="search()"></el-button>
<el-button icon="el-icon-refresh-right" @click="reset()"></el-button>
</el-form-item>
</el-col>
</el-form>
</el-row>
<div class="JNPF-common-layout-main JNPF-flex-main">
<div class="JNPF-common-head">
<div>
<el-button type="primary" icon="el-icon-plus" v-has="'btn_add'" @click="addOrUpdateHandle()">
</el-button>
<el-button type="text" icon="el-icon-download" @click="exportData()" v-has="'btn_download'" >导出
</el-button>
<el-button type="text" icon="el-icon-delete" @click="handleBatchRemoveDel()" v-has="'btn_batchRemove'" >批量删除
</el-button>
</div>
<div class="JNPF-common-head-right">
<el-tooltip effect="dark" content="刷新" placement="top">
<el-link icon="icon-ym icon-ym-Refresh JNPF-common-head-icon" :underline="false"
@click="reset()"/>
</el-tooltip>
<screenfull isContainer />
</div>
</div>
<JNPF-table v-loading="listLoading" :data="list" @sort-change='sortChange' has-c @selection-change="handleSelectionChange">
<el-table-column prop="mId" label="主表ID" width="0" align="left"
v-if="jnpf.hasP('mId')" />
<el-table-column prop="mName" label="设备名" width="0" align="left"
v-if="jnpf.hasP('mName')" />
<el-table-column prop="serialnumber" label="设备序列号" width="0" align="left"
v-if="jnpf.hasP('serialnumber')" />
<el-table-column prop="flvaddress" label="标清flv直播地址" width="0" align="left"
v-if="jnpf.hasP('flvaddress')" />
<el-table-column prop="flvhdaddress" label="高清flv直播地址" width="0" align="left"
v-if="jnpf.hasP('flvhdaddress')" />
<el-table-column prop="mStatus" label="设备状态:不在线、在线" width="0" align="left"
v-if="jnpf.hasP('mStatus')" />
<el-table-column prop="flowState" label="状态" width="100">
<template slot-scope="scope">
<el-tag v-if="scope.row.flowState==1"></el-tag>
<el-tag type="success" v-else-if="scope.row.flowState==2">审核通过</el-tag>
<el-tag type="danger" v-else-if="scope.row.flowState==3">审核驳回</el-tag>
<el-tag type="info" v-else-if="scope.row.flowState==4">流程撤回</el-tag>
<el-tag type="info" v-else-if="scope.row.flowState==5">审核终止</el-tag>
<el-tag type="warning" v-else></el-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right"
width="150" >
<template slot-scope="scope">
<el-button type="text" :disabled="[1,2,4,5].indexOf(scope.row.flowState)>-1"
@click="addOrUpdateHandle(scope.row.id)" v-has="'btn_edit'" >编辑
</el-button>
<el-button type="text" class="JNPF-table-delBtn" :disabled="!!scope.row.flowState" v-has="'btn_remove'" @click="handleDel(scope.row.id)">
</el-button>
<el-button size="mini" type="text" :disabled="!scope.row.flowState"
@click="addOrUpdateHandle(scope.row.id,scope.row.flowState)"
>详情</el-button>
</template>
</el-table-column>
</JNPF-table>
<pagination :total="total" :page.sync="listQuery.currentPage" :limit.sync="listQuery.pageSize" @pagination="initData"/>
</div>
</div>
<FlowBox v-if="flowVisible" ref="FlowBox" @close="colseFlow" />
<ExportBox v-if="exportBoxVisible" ref="ExportBox" @download="download"/>
</div>
</template>
<script>
import request from '@/utils/request'
import {getDictionaryDataSelector} from '@/api/systemData/dictionary'
import FlowBox from '@/views/workFlow/components/FlowBox'
import ExportBox from './ExportBox'
import {getDataInterfaceRes} from '@/api/systemData/dataInterface'
export default {
components: {FlowBox, ExportBox},
data() {
return {
query: {
mName:undefined,
},
treeProps: {
children: 'M_Name',
label: 'M_Name',
value: 'id'
},
list: [],
listLoading: true,
multipleSelection: [], total: 0,
listQuery: {
currentPage: 1,
pageSize: 20,
sort: "asc",
sidx: "mId",
},
flowVisible: false,
exportBoxVisible: false,
columnList: [
{prop: 'mId', label: '主表ID'},
{prop: 'mName', label: '设备名'},
{prop: 'serialnumber', label: '设备序列号'},
{prop: 'flvaddress', label: '标清flv直播地址'},
{prop: 'flvhdaddress', label: '高清flv直播地址'},
{prop: 'mStatus', label: '设备状态:不在线、在线'},
],
treeData: [],
treeActiveId: '',
mIdOptions:[],
mIdProps:{"label":"M_Name","value":"id"},
}
},
computed: {
menuId() {
return this.$route.meta.modelId || ''
}
},
created() {
this.getTreeView();
},
methods: {
sortChange({ column, prop, order }) {
this.listQuery.sort = order == 'ascending' ? 'asc' : 'desc'
this.listQuery.sidx = !order ? '' : prop
this.initData()
},
getTreeView() {
getDataInterfaceRes('370933183241262469').then(res => {
let data = res.data.data
this.treeData = data
this.initData()
})
},
handleNodeClick(data) {
this.treeActiveId = data.id
for (let key in this.query) {
this.query[key] = undefined
}
this.query.mId = data.id
this.listQuery = {
currentPage: 1,
pageSize: 20,
sort: "asc",
sidx: "mId",
}
this.initData()
},
initData() {
this.listLoading = true;
let _query = {
...this.listQuery,
...this.query,
menuId:this.menuId
};
request({
url: `/api/example/Monitoring_item/getList`,
method: 'post',
data: _query
}).then(res => {
var _list =[];
for(let i=0;i<res.data.list.length;i++){
let _data = res.data.list[i];
_list.push(_data)
}
this.list = _list
this.total = res.data.pagination.total
this.listLoading = false
})
},
handleDel(id) {
this.$confirm('此操作将永久删除该数据, 是否继续?', '提示', {
type: 'warning'
}).then(() => {
request({
url: `/api/example/Monitoring_item/${id}`,
method: 'DELETE'
}).then(res => {
this.$message({
type: 'success',
message: res.msg,
onClose: () => {
this.initData()
}
});
})
}).catch(() => {
});
},
handleSelectionChange(val) {
const res = val.map(item => item.id)
this.multipleSelection = res
},
handleBatchRemoveDel() {
if (!this.multipleSelection.length) {
this.$message({
type: 'error',
message: '请选择一条数据',
duration: 1500,
})
return
}
const ids = this.multipleSelection.join()
this.$confirm('您确定要删除这些数据吗, 是否继续?', '提示', {
type: 'warning'
}).then(() => {
request({
url: `/api/example/Monitoring_item/batchRemove/${ids}`,
method: 'DELETE'
}).then(res => {
this.$message({
type: 'success',
message: res.msg,
onClose: () => {
this.initData()
}
});
})
}).catch(() => { })
},
addOrUpdateHandle(id,flowState) {
let data = {
id: id || '',
enCode: '002',
flowId:'370926725908927749',
formType: 1,
opType: flowState ? 0 : '-1',
status: flowState
}
this.flowVisible = true
this.$nextTick(() => {
this.$refs.FlowBox.init(data)
})
},
exportData() {
this.exportBoxVisible = true
this.$nextTick(() => {
this.$refs.ExportBox.init(this.columnList)
})
},
download(data) {
let query = {...data, ...this.listQuery, ...this.query,menuId:this.menuId}
request({
url: `/api/example/Monitoring_item/Actions/Export`,
method: 'GET',
data: query
}).then(res => {
if (!res.data.url) return
this.jnpf.downloadFile(res.data.url)
this.$refs.ExportBox.visible = false
this.exportBoxVisible = false
})
},
search() {
this.listQuery = {
currentPage: 1,
pageSize: 20,
sort: "asc",
sidx: "mId",
}
this.initData()
},
colseFlow(isrRefresh) {
this.flowVisible = false
if (isrRefresh) this.reset()
},
reset() {
for (let key in this.query) {
this.query[key] = undefined
}
this.listQuery = {
currentPage: 1,
pageSize: 20,
sort: "asc",
sidx: "mId",
}
this.initData()
}
}
}
</script>

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="jnpf.camera.java.mapper.Monitoring_itemMapper">
</mapper>

@ -0,0 +1,360 @@
package jnpf.controller;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.enmus.ExcelType;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import jnpf.base.ActionResult;
import jnpf.base.UserInfo;
import jnpf.base.entity.VisualdevEntity;
import jnpf.base.vo.DownloadVO;
import jnpf.base.vo.PageListVO;
import jnpf.base.vo.PaginationVO;
import jnpf.entity.Monitoring_itemEntity;
import jnpf.model.monitoring_item.*;
import jnpf.service.Monitoring_itemService;
import jnpf.config.ConfigValueUtil;
import jnpf.engine.entity.FlowTaskEntity;
import jnpf.engine.enums.FlowStatusEnum;
import jnpf.exception.DataException;
import jnpf.exception.WorkFlowException;
import jnpf.util.*;
import jnpf.util.enums.FileTypeEnum;
import jnpf.util.file.UploadUtil;
import lombok.Cleanup;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
*
* monitoring_item
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Slf4j
@RestController
@Api(tags = "monitoring_item" , value = "example")
@RequestMapping("/api/example/Monitoring_item")
public class Monitoring_itemController {
@Autowired
private GeneraterSwapUtil generaterSwapUtil;
@Autowired
private ConfigValueUtil configValueUtil;
@Autowired
private UserProvider userProvider;
@Autowired
private Monitoring_itemService monitoring_itemService;
/**
*
*
* @param monitoring_itemPagination
* @return
*/
@PostMapping("/getList")
public ActionResult list(@RequestBody Monitoring_itemPagination monitoring_itemPagination)throws IOException{
List<Monitoring_itemEntity> list= monitoring_itemService.getList(monitoring_itemPagination);
//处理id字段转名称若无需转或者为空可删除
for(Monitoring_itemEntity entity:list){
entity.setMId(generaterSwapUtil.getDynName("370933183241262469" ,"M_Name" ,"id","" ,entity.getMId()));
entity.setMStatus(generaterSwapUtil.switchSelectValue(entity.getMStatus() ,"开" ,"关"));
}
List<Monitoring_itemListVO> listVO=JsonUtil.getJsonToList(list,Monitoring_itemListVO.class);
for(Monitoring_itemListVO monitoring_itemVO:listVO){
}
for(Monitoring_itemListVO vo:listVO){
FlowTaskEntity flowTaskEntity = generaterSwapUtil.getInfoSubmit(vo.getId(), FlowTaskEntity::getStatus);
if (flowTaskEntity!=null){
vo.setFlowState(flowTaskEntity.getStatus());
}else{
vo.setFlowState(null);
}
}
PageListVO vo=new PageListVO();
vo.setList(listVO);
PaginationVO page=JsonUtil.getJsonToBean(monitoring_itemPagination,PaginationVO.class);
vo.setPagination(page);
return ActionResult.success(vo);
}
/**
*
*
* @param crData
* @return
*/
@PostMapping
@Transactional
public ActionResult create(@RequestBody @Valid Map<String,Object> crData) throws DataException {
Monitoring_itemCrForm monitoring_itemCrForm = JsonUtil.getJsonToBean(crData,Monitoring_itemCrForm.class);
String visualId ="370926725908927749";
VisualdevEntity visualdevEntity =generaterSwapUtil.getVisualEntity(visualId);
String mainId =RandomUtil.uuId();
UserInfo userInfo=userProvider.get();
Monitoring_itemEntity entity = JsonUtil.getJsonToBean(monitoring_itemCrForm, Monitoring_itemEntity.class);
entity.setId(mainId);
monitoring_itemService.save(entity);
if (FlowStatusEnum.submit.getMessage().equals(monitoring_itemCrForm.getStatus())){
try {
generaterSwapUtil.submitFlowTask(visualdevEntity,mainId,monitoring_itemCrForm,userInfo,monitoring_itemCrForm.getCandidateList());
} catch (WorkFlowException e) {
e.printStackTrace();
}
return ActionResult.success("提交成功,请耐心等待");
}
return ActionResult.success("保存成功");
}
/**
*
*
* @return
*/
@ApiOperation("模板下载")
@GetMapping("/templateDownload")
public ActionResult<DownloadVO> TemplateDownload(){
UserInfo userInfo=userProvider.get();
DownloadVO vo=DownloadVO.builder().build();
try{
vo.setName("职员信息.xlsx");
vo.setUrl(UploaderUtil.uploaderFile("/api/Common/DownloadModel?encryption=" ,userInfo.getId()+"#"+"职员信息.xlsx"+"#"+"Temporary"));
}catch(Exception e){
log.error("信息导出Excel错误:{}" ,e.getMessage());
}
return ActionResult.success(vo);
}
/**
* Excel
*
* @return
*/
@ApiOperation("导出Excel")
@GetMapping("/Actions/Export")
public ActionResult Export(Monitoring_itemPaginationExportModel monitoring_itemPaginationExportModel) throws IOException {
if (StringUtil.isEmpty(monitoring_itemPaginationExportModel.getSelectKey())){
return ActionResult.fail("请选择导出字段");
}
Monitoring_itemPagination monitoring_itemPagination=JsonUtil.getJsonToBean(monitoring_itemPaginationExportModel, Monitoring_itemPagination.class);
List<Monitoring_itemEntity> list= monitoring_itemService.getTypeList(monitoring_itemPagination,monitoring_itemPaginationExportModel.getDataType());
//处理id字段转名称若无需转或者为空可删除
for(Monitoring_itemEntity entity:list){
entity.setMId(generaterSwapUtil.getDynName("370933183241262469" ,"M_Name" ,"id","" ,entity.getMId()));
entity.setMStatus(generaterSwapUtil.switchSelectValue(entity.getMStatus() ,"开" ,"关"));
}
List<Monitoring_itemListVO> listVO=JsonUtil.getJsonToList(list,Monitoring_itemListVO.class);
for(Monitoring_itemListVO monitoring_itemVO:listVO){
}
//转换为map输出
List<Map<String, Object>>mapList=JsonUtil.getJsonToListMap(JsonUtil.getObjectToStringDateFormat(listVO,"yyyy-MM-dd HH:mm:ss"));
String[]keys=!StringUtil.isEmpty(monitoring_itemPaginationExportModel.getSelectKey())?monitoring_itemPaginationExportModel.getSelectKey().split(","):new String[0];
UserInfo userInfo=userProvider.get();
DownloadVO vo=this.creatModelExcel(configValueUtil.getTemporaryFilePath(),mapList,keys,userInfo);
return ActionResult.success(vo);
}
//导出表格
public DownloadVO creatModelExcel(String path,List<Map<String, Object>>list,String[]keys,UserInfo userInfo){
DownloadVO vo=DownloadVO.builder().build();
List<ExcelExportEntity> entitys=new ArrayList<>();
if(keys.length>0){
for(String key:keys){
switch(key){
case "mId" :
entitys.add(new ExcelExportEntity("主表ID" ,"mId"));
break;
case "mName" :
entitys.add(new ExcelExportEntity("设备名" ,"mName"));
break;
case "serialnumber" :
entitys.add(new ExcelExportEntity("设备序列号" ,"serialnumber"));
break;
case "flvaddress" :
entitys.add(new ExcelExportEntity("标清flv直播地址" ,"flvaddress"));
break;
case "flvhdaddress" :
entitys.add(new ExcelExportEntity("高清flv直播地址" ,"flvhdaddress"));
break;
case "mStatus" :
entitys.add(new ExcelExportEntity("设备状态:不在线、在线" ,"mStatus"));
break;
default:
break;
}
}
}
ExportParams exportParams = new ExportParams(null, "表单信息");
exportParams.setType(ExcelType.XSSF);
try{
@Cleanup Workbook workbook = new HSSFWorkbook();
if (entitys.size()>0){
workbook = ExcelExportUtil.exportExcel(exportParams, entitys, list);
}
String name = "表单信息" + DateUtil.dateNow("yyyyMMdd") + "_" + RandomUtil.uuId() + ".xlsx";
String fileName = configValueUtil.getTemporaryFilePath() + name;
@Cleanup FileOutputStream output = new FileOutputStream(XSSEscape.escapePath(fileName));
workbook.write(output);
//上传文件
UploadUtil.uploadFile(configValueUtil.getFileType(), fileName, FileTypeEnum.TEMPORARY, name);
vo.setName(name);
vo.setUrl(UploaderUtil.uploaderFile(userInfo.getId() + "#" + name + "#" + "Temporary"));
} catch (Exception e) {
log.error("信息导出Excel错误:{}", e.getMessage());
e.printStackTrace();
}
return vo;
}
/**
*
*
* @param ids
* @return
*/
@DeleteMapping("/batchRemove/{ids}")
@Transactional
public ActionResult batchRemove(@PathVariable("ids") String ids){
String[] idList = ids.split(",");
List<String> allIdList = Arrays.asList(idList);
List<String> columnIdList = new ArrayList<>(20);
int i =0;
for (String allId : allIdList){
FlowTaskEntity taskEntity = generaterSwapUtil.getInfoSubmit(allId, FlowTaskEntity::getId, FlowTaskEntity::getStatus);
if (taskEntity==null){
columnIdList.add(allId);
}else if (taskEntity.getStatus().equals(0)){
try {
generaterSwapUtil.deleteFlowTask(taskEntity);
columnIdList.add(allId);
i++;
} catch (WorkFlowException e) {
e.printStackTrace();
}
}
}
monitoring_itemService.removeByIds(columnIdList);
if (i == 0 && columnIdList.size()==0){
return ActionResult.fail("流程已发起,无法删除");
}
return ActionResult.success("删除成功");
}
/**
*
*
* @param id
* @return
*/
@GetMapping("/{id}")
public ActionResult<Monitoring_itemInfoVO> info(@PathVariable("id") String id){
Monitoring_itemEntity entity= monitoring_itemService.getInfo(id);
Monitoring_itemInfoVO vo=JsonUtil.getJsonToBean(entity, Monitoring_itemInfoVO.class);
//子表
//副表
return ActionResult.success(vo);
}
/**
*
*
* @param id
* @return
*/
@PutMapping("/{id}")
@Transactional
public ActionResult update(@PathVariable("id") String id,@RequestBody @Valid Map<String,Object> upData) throws DataException {
Monitoring_itemUpForm monitoring_itemUpForm = JsonUtil.getJsonToBean(upData,Monitoring_itemUpForm.class);
String visualId ="370926725908927749";
VisualdevEntity visualdevEntity =generaterSwapUtil.getVisualEntity(visualId);
UserInfo userInfo=userProvider.get();
Monitoring_itemEntity entity= monitoring_itemService.getInfo(id);
if(entity!=null){
Monitoring_itemEntity subentity=JsonUtil.getJsonToBean(monitoring_itemUpForm, Monitoring_itemEntity.class);
monitoring_itemService.update(id, subentity);
if (FlowStatusEnum.submit.getMessage().equals(monitoring_itemUpForm.getStatus())){
try {
generaterSwapUtil.submitFlowTask(visualdevEntity,id,subentity,userInfo,monitoring_itemUpForm.getCandidateList());
} catch (WorkFlowException e) {
e.printStackTrace();
}
return ActionResult.success("提交成功,请耐心等待");
}
return ActionResult.success("更新成功");
}else{
return ActionResult.fail("更新失败,数据不存在");
}
}
/**
*
*
* @param id
* @return
*/
@DeleteMapping("/{id}")
@Transactional
public ActionResult delete(@PathVariable("id") String id){
Monitoring_itemEntity entity= monitoring_itemService.getInfo(id);
if(entity!=null){
FlowTaskEntity taskEntity = generaterSwapUtil.getInfoSubmit(id, FlowTaskEntity::getId, FlowTaskEntity::getStatus);
if (taskEntity != null) {
try {
generaterSwapUtil.deleteFlowTask(taskEntity);
} catch (WorkFlowException e) {
e.printStackTrace();
}
}
monitoring_itemService.delete(entity);
}
return ActionResult.success("删除成功");
}
}

@ -0,0 +1,82 @@
package jnpf.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
@TableName("monitoring_item")
public class Monitoring_itemEntity {
@TableId(value = "F_ID",type = IdType.AUTO)
private String id;
@TableField("F_CREATORUSERID")
private Integer creatoruserid;
@TableField("F_CREATORUSERNAME")
private String creatorusername;
@TableField("F_CREATORTIME")
private Date creatortime;
@TableField("F_LASTMODIFYUSERID")
private Integer lastmodifyuserid;
@TableField("F_LASTMODIFYUSERNAME")
private String lastmodifyusername;
@TableField("F_LASTMODIFYTIME")
private Date lastmodifytime;
@TableField("F_DELETEUSERID")
private Integer deleteuserid;
@TableField("F_DELETEUSERNAME")
private String deleteusername;
@TableField("F_DELETETIME")
private Date deletetime;
@TableField("F_DELETEMARK")
private String deletemark;
@TableField("Z_ID")
private Integer zId;
@TableField("D_ID")
private Integer dId;
@TableField("M_ID")
private String mId;
@TableField("M_NAME")
private String mName;
@TableField("SERIALNUMBER")
private String serialnumber;
@TableField("M_STATUS")
private String mStatus;
@TableField("FLVADDRESS")
private String flvaddress;
@TableField("FLVHDADDRESS")
private String flvhdaddress;
@TableField("ChannelNumber")
private String channelNumber;
}

@ -0,0 +1,13 @@
package jnpf.imou.utils;
import java.util.UUID;
/**
* 32
*
*/
public class IDUtils {
public static String getId(){
return UUID.randomUUID().toString().replace("-", "");
}
}

@ -0,0 +1,360 @@
package jnpf.imou.utils;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jnpf.entity.Monitoring_itemEntity;
import jnpf.service.Monitoring_itemService;
import jnpf.util.Md5Util;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.junit.jupiter.api.Test;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.util.Calendar;
import java.util.Date;
@Slf4j
@Component
public class ImouConfig {
private String appSecret="189fec75174e487684a16c49dd1789";
// appId控制台-我的应用-应用信息中获取
private String appId="lc38c9c4e8d3ad437c";
// 随机数32位
private String nonce;
// 签名,平台用来做签名校验
private String sign;
// UTC时间戳单位为秒
private Long time;
// 协议版本信息当前为1.0
private String ver="1.0";
// id请求唯一标示ID每次请求调用时传入唯一非空字符串
private String id="98a7a257-c4e4-4db3-a2d3-d97a3836b87c";
@Resource
private Monitoring_itemService monitoring_itemService;
// 设备序列号
private String deviceId="5K0A36BPAZ73FA0";
@Test
// @Scheduled(initialDelay=1000, fixedRate=50000000 )
public void main() throws Exception {
// 查询rtmp协议直播地址
// String URL="https://openapi.lechange.cn/openapi/queryDeviceRtmpLive";
// 获取管理员token
ImouConfig config = new ImouConfig();
String accessToken = config.getAccessToken();
// 获取设备的列表信息
// config.getList(accessToken);
// 批量创建设备flv直播支持录像直播和实时直播
// for (int i = 0; i < 32; i++) {
// config.createFlvLive(accessToken,i+"");
// }
////获取开发者当前账号下创建的直播详情列表,包含直播地址、直播状态、直播计划等详细信息。
// config.getLiveList(accessToken);
for (int i = 0; i < 32; i++) {
// 1 根据通道号获取地址
JSONObject flvLive = config.getFlvLive(accessToken, i+"");
// flv标清直播
String flv = String.valueOf(flvLive.get("flv"));
// flv高清直播
String flvHD = String.valueOf(flvLive.get("flvHD"));
// 设备序列号
String deviceId = String.valueOf(flvLive.get("deviceId"));
// 设备通道号
String channelId = String.valueOf(flvLive.get("channelId"));
Monitoring_itemEntity monitor = new Monitoring_itemEntity();
// 设置区域为日照金属
monitor.setMId("1");
monitor.setMName("NVR-3FA0-"+i);
monitor.setSerialnumber(deviceId);
monitor.setMStatus("0");
monitor.setFlvaddress(flv);
monitor.setFlvhdaddress(flvHD);
monitor.setChannelNumber(channelId);
// boolean save = monitoring_itemService.save(monitor);
// 2 查询本地表中此通道是否存在
LambdaQueryWrapper<Monitoring_itemEntity> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(Monitoring_itemEntity::getChannelNumber,channelId);
Monitoring_itemEntity one = monitoring_itemService.getOne(wrapper);
if (one!=null){
// 3 存在根据返回的id进行更新
monitor.setMName(null);
monitor.setLastmodifyuserid(1);
monitor.setLastmodifyusername("wangchuang");
monitor.setLastmodifytime(new Date());
monitoring_itemService.update(monitor,wrapper);
}else{
// 4 不存在进行保存
monitor.setCreatoruserid(1);
monitor.setCreatorusername("wangchuang");
monitor.setCreatortime(new Date());
monitoring_itemService.save(monitor);
}
}
}
// 分页查询设备详细信息
public void getList(String accessToken) throws IOException {
// 获取管理员token
ImouConfig config = this;
config.time=Instant.now().getEpochSecond();
config.nonce=IDUtils.getId();
String str="time:"+config.time+","+"nonce:"+config.nonce+","+"appSecret:"+config.appSecret;
config.sign=Md5Util.getStringMd5(str);
String host="https://openapi.lechange.cn:443/openapi";
String path="/listDeviceDetailsByPage";
// 每页条目数范围1~50
int pageSize=10;
// 查询页码从1开始
int page=1;
// bind获取绑定的设备
//share获取共享的设备
//bindAndShare获取绑定及共享的设备
String source="bindAndShare";
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
String content="{\r\n \"system\": " +
"{\r\n " +
" \"ver\": \""+config.ver+"\", \r\n " +
" \"sign\":\""+config.sign+"\",\r\n " +
" \"appId\": \""+config.appId+"\",\r\n " +
" \"time\": "+config.time+" , \r\n " +
" \"nonce\": \""+config.nonce+"\"\r\n " +
" },\r\n " +
" \"params\": " +
"{\r\n\"" +
"pageSize\":\""+pageSize+"\", \r\n " +
"\"page\":\""+page+"\", \r\n " +
"\"token\":\""+accessToken+"\", \r\n " +
"\"source\":\""+source+"\" \r\n " +
"},\r\n " +
" \"id\": \""+config.id+"\"\r\n}";
System.out.println(content);
RequestBody bodyy = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(host+path)
.method("POST", bodyy)
.build();
Response response = client.newCall(request).execute();
String resText=response.body().string();
System.out.println(resText);
}
/**
*
1token3TK1002token3
2token23accessTokentokentokentoken使
* @return accessToken
*/
public String getAccessToken() throws IOException {
// 获取管理员token
ImouConfig config = this;
config.time=Instant.now().getEpochSecond();
config.nonce=IDUtils.getId();
String str="time:"+config.time+","+"nonce:"+config.nonce+","+"appSecret:"+config.appSecret;
config.sign=Md5Util.getStringMd5(str);
String host="https://openapi.lechange.cn:443/openapi";
String path="/accessToken";
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
String content="{\r\n \"system\": " +
"{\r\n " +
" \"ver\": \""+config.ver+"\", \r\n " +
" \"sign\":\""+config.sign+"\",\r\n " +
" \"appId\": \""+config.appId+"\",\r\n " +
" \"time\": "+config.time+" , \r\n " +
" \"nonce\": \""+config.nonce+"\"\r\n " +
" },\r\n " +
" \"params\": " +
"{\r\n },\r\n " +
" \"id\": \""+config.id+"\"\r\n}";
RequestBody bodyy = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(host+path)
.method("POST", bodyy)
.build();
Response response = client.newCall(request).execute();
String resText=response.body().string();
if (resText.length()>0){
JSONObject a=new JSONObject(resText);
JSONObject a2=new JSONObject(a.get("result"));
if (a2.get("msg").toString().equals("操作成功。")){
JSONObject a3=new JSONObject(a2.get("data"));
String accessToken=a3.get("accessToken").toString();
return accessToken;
}else{
log.error(a2.get("msg").toString());
return "获取失败!失败原因:"+a2.get("msg").toString();
}
}else{
return "获取失败!";
}
}
//获取到的字符串进行处理
public String getText(String subStr,String str){
String subStr1=str.substring(str.lastIndexOf(subStr)+subStr.length());
return subStr1.substring(0,subStr1.indexOf("\""));
}
public void createFlvLive(String accessToken,String channeId) throws IOException {
// 获取管理员token
ImouConfig config = this;
config.time=Instant.now().getEpochSecond();
config.nonce=IDUtils.getId();
String str="time:"+config.time+","+"nonce:"+config.nonce+","+"appSecret:"+config.appSecret;
config.sign=Md5Util.getStringMd5(str);
String host="https://openapi.lechange.cn:443/openapi";
String path="/createDeviceFlvLive";
// 设备序列号
String deviceId="5K0A36BPAZ73FA0";
// 直播类型不传或为空则默认是realTime实时直播playback回放视频直播
String type="realTime";
// 通道号
// String channeId="0";
// localRecord设备本地录像,cloudRecord设备云录像
String recordType="localRecord";
// 回放起始时间录像类型是回放时字段必填格式yyyy-MM-dd HH:mm:ss不支持跨天时间
// 获取当前日期前一天的日期
// String beginTime=LocalDate.now().minusDays(1).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
//创建Calendar实例
Calendar cal = Calendar.getInstance();
//设置当前时间
cal.setTime(new Date());
cal.add(Calendar.DATE, -1);
String beginTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime());
// 回放截止时间录像类型是回放时字段必填格式yyyy-MM-dd HH:mm:ss不支持跨天时间
String endTime=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
String content="{\r\n \"system\": " +
"{\r\n " +
" \"ver\": \""+config.ver+"\", \r\n " +
" \"sign\":\""+config.sign+"\",\r\n " +
" \"appId\": \""+config.appId+"\",\r\n " +
" \"time\": "+config.time+" , \r\n " +
" \"nonce\": \""+config.nonce+"\"\r\n " +
" },\r\n " +
" \"params\": " +
"{\r\n\"" +
"deviceId\":\""+deviceId+"\", \r\n " +
"\"channelId\":\""+channeId+"\", \r\n " +
"\"token\":\""+accessToken+"\", \r\n " +
"\"type\":\""+type+"\", \r\n " +
"\"recordType\":\""+recordType+"\", \r\n " +
"\"beginTime\":\""+beginTime+"\", \r\n " +
"\"endTime\":\""+endTime+"\" \r\n " +
"},\r\n " +
" \"id\": \""+config.id+"\"\r\n}";
System.out.println(content);
RequestBody bodyy = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(host+path)
.method("POST", bodyy)
.build();
Response response = client.newCall(request).execute();
String resText=response.body().string();
System.out.println(resText);
}
//获取开发者当前账号下创建的直播详情列表,包含直播地址、直播状态、直播计划等详细信息。
public void getLiveList(String accessToken) throws IOException {
// 获取管理员token
ImouConfig config = this;
config.time=Instant.now().getEpochSecond();
config.nonce=IDUtils.getId();
String str="time:"+config.time+","+"nonce:"+config.nonce+","+"appSecret:"+config.appSecret;
config.sign=Md5Util.getStringMd5(str);
String host="https://openapi.lechange.cn:443/openapi";
String path="/liveList";
//查询范围 数字取值范围为:[1N] N为正整数且N>1;差值范围为:[0,99]
String queryRange="1-32";
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
String content="{\r\n \"system\": " +
"{\r\n " +
" \"ver\": \""+config.ver+"\", \r\n " +
" \"sign\":\""+config.sign+"\",\r\n " +
" \"appId\": \""+config.appId+"\",\r\n " +
" \"time\": "+config.time+" , \r\n " +
" \"nonce\": \""+config.nonce+"\"\r\n " +
" },\r\n " +
" \"params\": " +
"{\r\n\"" +
"queryRange\":\""+queryRange+"\", \r\n " +
"\"token\":\""+accessToken+"\" \r\n " +
"},\r\n " +
" \"id\": \""+config.id+"\"\r\n}";
System.out.println(content);
RequestBody bodyy = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(host+path)
.method("POST", bodyy)
.build();
Response response = client.newCall(request).execute();
String resText=response.body().string();
System.out.println(resText);
}
//根据设备号、通道号查询flv协议的直播地址只支持查询实时直播
public JSONObject getFlvLive(String accessToken, String channelId) throws IOException {
// 获取管理员token
ImouConfig config = this;
config.time=Instant.now().getEpochSecond();
config.nonce=IDUtils.getId();
String str="time:"+config.time+","+"nonce:"+config.nonce+","+"appSecret:"+config.appSecret;
config.sign=Md5Util.getStringMd5(str);
String host="https://openapi.lechange.cn:443/openapi";
String path="/queryDeviceFlvLive";
OkHttpClient client = new OkHttpClient().newBuilder()
.build();
MediaType mediaType = MediaType.parse("application/json");
String content="{\r\n \"system\": " +
"{\r\n " +
" \"ver\": \""+config.ver+"\", \r\n " +
" \"sign\":\""+config.sign+"\",\r\n " +
" \"appId\": \""+config.appId+"\",\r\n " +
" \"time\": "+config.time+" , \r\n " +
" \"nonce\": \""+config.nonce+"\"\r\n " +
" },\r\n " +
" \"params\": " +
"{\r\n\"" +
"deviceId\":\""+config.deviceId+"\", \r\n " +
"\"channelId\":\""+channelId+"\", \r\n " +
"\"token\":\""+accessToken+"\" \r\n " +
"},\r\n " +
" \"id\": \""+config.id+"\"\r\n}";
System.out.println(content);
RequestBody bodyy = RequestBody.create(mediaType, content);
Request request = new Request.Builder()
.url(host+path)
.method("POST", bodyy)
.build();
Response response = client.newCall(request).execute();
String resText=response.body().string();
JSONObject object1 = new JSONObject(resText);
JSONObject object2 = new JSONObject(object1.get("result"));
JSONObject object3 = new JSONObject(object2.get("data"));
System.out.println(resText);
return object3;
}
}

@ -0,0 +1,21 @@
package jnpf.imou.utils;
import cn.hutool.json.JSONObject;
public class Testaa {
public static void main(String[] args) {
// {"result":{"msg":"操作成功。","code":"0","data":{"expireTime":252417,"accessToken":"At_0000062668d71c5b455386dcb052b4af"}},"id":"98a7a257-c4e4-4db3-a2d3-d97a3836b87c"}
String a="{\"result\":{\"msg\":\"操作成功。\",\"code\":\"0\",\"data\":{\"expireTime\":252417,\"accessToken\":\"At_0000062668d71c5b455386dcb052b4af\"}},\"id\":\"98a7a257-c4e4-4db3-a2d3-d97a3836b87c\"}";
String resText=a;
if (resText.length()>0){
JSONObject a1=new JSONObject(resText);
JSONObject a2=new JSONObject(a1.get("result"));
JSONObject a3=new JSONObject(a2.get("data"));
// JSONObject a4=new JSONObject(a3.get("accessToken"));
System.out.println(a1);
System.out.println(a2);
System.out.println(a3.get("accessToken"));
// System.out.println(a4);
}
}
}

@ -0,0 +1,20 @@
package jnpf.mapper;
//import jnpf.entity.Monitoring_itemEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import jnpf.entity.Monitoring_itemEntity;
/**
*
* monitoring_item
* V3.2.0
* https://www.jnpfsoft.com
* Allen Pan
* 2022-12-09
*/
public interface Monitoring_itemMapper extends BaseMapper<Monitoring_itemEntity> {
}

@ -0,0 +1,59 @@
package jnpf.model.monitoring_item;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemCrForm {
/** 流程状态 **/
@JsonProperty("status")
private String status;
private Map<String, List<String>> candidateList;
/** 主表ID **/
@JsonProperty("mId")
private String mId;
/** 设备名 **/
@JsonProperty("mName")
private String mName;
/** 设备序列号 **/
@JsonProperty("serialnumber")
private String serialnumber;
/** 标清flv直播地址 **/
@JsonProperty("flvaddress")
private String flvaddress;
/** 高清flv直播地址 **/
@JsonProperty("flvhdaddress")
private String flvhdaddress;
/** 设备状态:不在线、在线 **/
@JsonProperty("mStatus")
private String mStatus;
}

@ -0,0 +1,45 @@
package jnpf.model.monitoring_item;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemInfoVO{
/** 主键 **/
@JsonProperty("id")
private String id;
/** 主表ID **/
@JsonProperty("mId")
private String mId;
/** 设备名 **/
@JsonProperty("mName")
private String mName;
/** 设备序列号 **/
@JsonProperty("serialnumber")
private String serialnumber;
/** 标清flv直播地址 **/
@JsonProperty("flvaddress")
private String flvaddress;
/** 高清flv直播地址 **/
@JsonProperty("flvhdaddress")
private String flvhdaddress;
/** 设备状态:不在线、在线 **/
@JsonProperty("mStatus")
private String mStatus;
}

@ -0,0 +1,22 @@
package jnpf.model.monitoring_item;
import jnpf.base.Pagination;
import lombok.Data;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemListQuery extends Pagination {
/** 设备名 */
private String mName;
/**
* id
*/
private String menuId;
}

@ -0,0 +1,59 @@
package jnpf.model.monitoring_item;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemListVO{
/** 主键 */
private String id;
/** 主表ID **/
@JsonProperty("mId")
private String mId;
/** 设备名 **/
@JsonProperty("mName")
private String mName;
/** 设备序列号 **/
@JsonProperty("serialnumber")
private String serialnumber;
/** 标清flv直播地址 **/
@JsonProperty("flvaddress")
private String flvaddress;
/** 高清flv直播地址 **/
@JsonProperty("flvhdaddress")
private String flvhdaddress;
/** 设备状态:不在线、在线 **/
@JsonProperty("mStatus")
private String mStatus;
@JsonProperty("flowState")
private Integer flowState;
}

@ -0,0 +1,24 @@
package jnpf.model.monitoring_item;
import jnpf.base.Pagination;
import lombok.Data;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemPagination extends Pagination {
/** 设备名 */
private String mName;
/**
* id
*/
private String menuId;
}

@ -0,0 +1,25 @@
package jnpf.model.monitoring_item;
import jnpf.base.Pagination;
import lombok.Data;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemPaginationExportModel extends Pagination {
private String selectKey;
private String json;
private String dataType;
/** 设备名 */
private String mName;
}

@ -0,0 +1,55 @@
package jnpf.model.monitoring_item;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
/**
*
*
* @ V3.2.0
* @ https://www.jnpfsoft.com
* @ Allen Pan
* @ 2022-12-09
*/
@Data
public class Monitoring_itemUpForm{
/** 主键 */
private String id;
/** 流程状态 **/
@JsonProperty("status")
private String status;
private Map<String, List<String>> candidateList;
/** 主表ID **/
@JsonProperty("mId")
private String mId;
/** 设备名 **/
@JsonProperty("mName")
private String mName;
/** 设备序列号 **/
@JsonProperty("serialnumber")
private String serialnumber;
/** 标清flv直播地址 **/
@JsonProperty("flvaddress")
private String flvaddress;
/** 高清flv直播地址 **/
@JsonProperty("flvhdaddress")
private String flvhdaddress;
/** 设备状态:不在线、在线 **/
@JsonProperty("mStatus")
private String mStatus;
}

@ -0,0 +1,35 @@
package jnpf.service;
import com.baomidou.mybatisplus.extension.service.IService;
import jnpf.entity.Monitoring_itemEntity;
import jnpf.model.monitoring_item.Monitoring_itemPagination;
import java.util.List;
/**
*
* monitoring_item
* V3.2.0
* https://www.jnpfsoft.com
* Allen Pan
* 2022-12-09
*/
public interface Monitoring_itemService extends IService<Monitoring_itemEntity> {
List<Monitoring_itemEntity> getList(Monitoring_itemPagination monitoring_itemPagination);
List<Monitoring_itemEntity> getTypeList(Monitoring_itemPagination monitoring_itemPagination,String dataType);
Monitoring_itemEntity getInfo(String id);
void delete(Monitoring_itemEntity entity);
void create(Monitoring_itemEntity entity);
boolean update( String id, Monitoring_itemEntity entity);
// 子表方法
//列表子表数据方法
}

@ -0,0 +1,208 @@
package jnpf.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import jnpf.entity.Monitoring_itemEntity;
import jnpf.mapper.Monitoring_itemMapper;
import jnpf.model.monitoring_item.Monitoring_itemPagination;
import jnpf.permission.model.authorize.AuthorizeConditionModel;
import jnpf.permission.service.AuthorizeService;
import jnpf.service.Monitoring_itemService;
import jnpf.util.ServletUtil;
import jnpf.util.StringUtil;
import jnpf.util.UserProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
*
* monitoring_item
* V3.2.0
* https://www.jnpfsoft.com
* Allen Pan
* 2022-12-09
*/
@Service
public class Monitoring_itemServiceImpl extends ServiceImpl<Monitoring_itemMapper, Monitoring_itemEntity> implements Monitoring_itemService {
@Autowired
private UserProvider userProvider;
@Autowired
private AuthorizeService authorizeService;
@Override
public List<Monitoring_itemEntity> getList(Monitoring_itemPagination monitoring_itemPagination){
String userId=userProvider.get().getUserId();
List<String> AllIdList =new ArrayList();
int total=0;
int monitoring_itemNum =0;
QueryWrapper<Monitoring_itemEntity> monitoring_itemQueryWrapper=new QueryWrapper<>();
boolean pcPermission = true;
boolean appPermission = true;
boolean isPc = ServletUtil.getHeader("jnpf-origin").equals("pc");
if(isPc && pcPermission){
if (!userProvider.get().getIsAdministrator()){
Object monitoring_itemObj=authorizeService.getCondition(new AuthorizeConditionModel(monitoring_itemQueryWrapper,monitoring_itemPagination.getMenuId(),"monitoring_item"));
if (ObjectUtil.isEmpty(monitoring_itemObj)){
return new ArrayList<>();
} else {
monitoring_itemQueryWrapper = (QueryWrapper<Monitoring_itemEntity>)monitoring_itemObj;
monitoring_itemNum++;
}
}
}
if(!isPc && appPermission){
if (!userProvider.get().getIsAdministrator()){
Object monitoring_itemObj=authorizeService.getCondition(new AuthorizeConditionModel(monitoring_itemQueryWrapper,monitoring_itemPagination.getMenuId(),"monitoring_item"));
if (ObjectUtil.isEmpty(monitoring_itemObj)){
return new ArrayList<>();
} else {
monitoring_itemQueryWrapper = (QueryWrapper<Monitoring_itemEntity>)monitoring_itemObj;
monitoring_itemNum++;
}
}
}
if(StringUtil.isNotEmpty(monitoring_itemPagination.getMName())){
monitoring_itemNum++;
monitoring_itemQueryWrapper.lambda().like(Monitoring_itemEntity::getMName,monitoring_itemPagination.getMName());
}
if(AllIdList.size()>0){
monitoring_itemQueryWrapper.lambda().in(Monitoring_itemEntity::getId, AllIdList);
}
//排序
if(StringUtil.isEmpty(monitoring_itemPagination.getSidx())){
monitoring_itemQueryWrapper.lambda().orderByAsc(Monitoring_itemEntity::getMId);
}else{
try {
String sidx = monitoring_itemPagination.getSidx();
Monitoring_itemEntity monitoring_itemEntity = new Monitoring_itemEntity();
Field declaredField = monitoring_itemEntity.getClass().getDeclaredField(sidx);
declaredField.setAccessible(true);
String value = declaredField.getAnnotation(TableField.class).value();
monitoring_itemQueryWrapper="asc".equals(monitoring_itemPagination.getSort().toLowerCase())?monitoring_itemQueryWrapper.orderByAsc(value):monitoring_itemQueryWrapper.orderByDesc(value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
if((total>0 && AllIdList.size()>0) || total==0){
Page<Monitoring_itemEntity> page=new Page<>(monitoring_itemPagination.getCurrentPage(), monitoring_itemPagination.getPageSize());
IPage<Monitoring_itemEntity> userIPage=this.page(page, monitoring_itemQueryWrapper);
return monitoring_itemPagination.setData(userIPage.getRecords(),userIPage.getTotal());
}else{
List<Monitoring_itemEntity> list = new ArrayList();
return monitoring_itemPagination.setData(list, list.size());
}
}
@Override
public List<Monitoring_itemEntity> getTypeList(Monitoring_itemPagination monitoring_itemPagination,String dataType){
String userId=userProvider.get().getUserId();
List<String> AllIdList =new ArrayList();
int total=0;
int monitoring_itemNum =0;
QueryWrapper<Monitoring_itemEntity> monitoring_itemQueryWrapper=new QueryWrapper<>();
boolean pcPermission = true;
boolean appPermission = true;
boolean isPc = ServletUtil.getHeader("jnpf-origin").equals("pc");
if(isPc && pcPermission){
if (!userProvider.get().getIsAdministrator()){
Object monitoring_itemObj=authorizeService.getCondition(new AuthorizeConditionModel(monitoring_itemQueryWrapper,monitoring_itemPagination.getMenuId(),"monitoring_item"));
if (ObjectUtil.isEmpty(monitoring_itemObj)){
return new ArrayList<>();
} else {
monitoring_itemQueryWrapper = (QueryWrapper<Monitoring_itemEntity>)monitoring_itemObj;
monitoring_itemNum++;
}
}
}
if(!isPc && appPermission){
if (!userProvider.get().getIsAdministrator()){
Object monitoring_itemObj=authorizeService.getCondition(new AuthorizeConditionModel(monitoring_itemQueryWrapper,monitoring_itemPagination.getMenuId(),"monitoring_item"));
if (ObjectUtil.isEmpty(monitoring_itemObj)){
return new ArrayList<>();
} else {
monitoring_itemQueryWrapper = (QueryWrapper<Monitoring_itemEntity>)monitoring_itemObj;
monitoring_itemNum++;
}
}
}
if(StringUtil.isNotEmpty(monitoring_itemPagination.getMName())){
monitoring_itemNum++;
monitoring_itemQueryWrapper.lambda().like(Monitoring_itemEntity::getMName,monitoring_itemPagination.getMName());
}
if(AllIdList.size()>0){
monitoring_itemQueryWrapper.lambda().in(Monitoring_itemEntity::getId, AllIdList);
}
//排序
if(StringUtil.isEmpty(monitoring_itemPagination.getSidx())){
monitoring_itemQueryWrapper.lambda().orderByAsc(Monitoring_itemEntity::getMId);
}else{
try {
String sidx = monitoring_itemPagination.getSidx();
Monitoring_itemEntity monitoring_itemEntity = new Monitoring_itemEntity();
Field declaredField = monitoring_itemEntity.getClass().getDeclaredField(sidx);
declaredField.setAccessible(true);
String value = declaredField.getAnnotation(TableField.class).value();
monitoring_itemQueryWrapper="asc".equals(monitoring_itemPagination.getSort().toLowerCase())?monitoring_itemQueryWrapper.orderByAsc(value):monitoring_itemQueryWrapper.orderByDesc(value);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
}
if("0".equals(dataType)){
if((total>0 && AllIdList.size()>0) || total==0){
Page<Monitoring_itemEntity> page=new Page<>(monitoring_itemPagination.getCurrentPage(), monitoring_itemPagination.getPageSize());
IPage<Monitoring_itemEntity> userIPage=this.page(page, monitoring_itemQueryWrapper);
return monitoring_itemPagination.setData(userIPage.getRecords(),userIPage.getTotal());
}else{
List<Monitoring_itemEntity> list = new ArrayList();
return monitoring_itemPagination.setData(list, list.size());
}
}else{
return this.list(monitoring_itemQueryWrapper);
}
}
@Override
public Monitoring_itemEntity getInfo(String id){
QueryWrapper<Monitoring_itemEntity> queryWrapper=new QueryWrapper<>();
queryWrapper.lambda().eq(Monitoring_itemEntity::getId,id);
return this.getOne(queryWrapper);
}
@Override
public void create(Monitoring_itemEntity entity){
this.save(entity);
}
@Override
public boolean update(String id, Monitoring_itemEntity entity){
entity.setId(id);
return this.updateById(entity);
}
@Override
public void delete(Monitoring_itemEntity entity){
if(entity!=null){
this.removeById(entity.getId());
}
}
//子表方法
//列表子表数据方法
}

@ -22463,8 +22463,7 @@
"@fullcalendar/bootstrap": { "@fullcalendar/bootstrap": {
"version": "4.4.2", "version": "4.4.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/bootstrap/-/bootstrap-4.4.2.tgz", "resolved": "https://registry.npmjs.org/@fullcalendar/bootstrap/-/bootstrap-4.4.2.tgz",
"integrity": "sha512-zxtQvpZqr7zeBCfszo/i1e4zCvGwLh2zOp8J6Wxw5s73HsB1zuftWop7sPO+qhRrhX5MdM9i/wr8/nNY8BZSmw==", "integrity": "sha512-zxtQvpZqr7zeBCfszo/i1e4zCvGwLh2zOp8J6Wxw5s73HsB1zuftWop7sPO+qhRrhX5MdM9i/wr8/nNY8BZSmw=="
"requires": {}
}, },
"@fullcalendar/core": { "@fullcalendar/core": {
"version": "4.4.2", "version": "4.4.2",
@ -22474,14 +22473,12 @@
"@fullcalendar/daygrid": { "@fullcalendar/daygrid": {
"version": "4.4.2", "version": "4.4.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-4.4.2.tgz", "resolved": "https://registry.npmjs.org/@fullcalendar/daygrid/-/daygrid-4.4.2.tgz",
"integrity": "sha512-axjfMhxEXHShV3r2TZjf+2niJ1C6LdAxkHKmg7mVq4jXtUQHOldU5XsjV0v2lUAt1urJBFi2zajfK8798ukL3Q==", "integrity": "sha512-axjfMhxEXHShV3r2TZjf+2niJ1C6LdAxkHKmg7mVq4jXtUQHOldU5XsjV0v2lUAt1urJBFi2zajfK8798ukL3Q=="
"requires": {}
}, },
"@fullcalendar/interaction": { "@fullcalendar/interaction": {
"version": "4.4.2", "version": "4.4.2",
"resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-4.4.2.tgz", "resolved": "https://registry.npmjs.org/@fullcalendar/interaction/-/interaction-4.4.2.tgz",
"integrity": "sha512-3ItpGFnxcYQT4NClqhq93QTQwOI8x3mlMf5M4DgK5avVaSzpv9g8p+opqeotK2yzpFeINps06cuQyB1h7vcv1Q==", "integrity": "sha512-3ItpGFnxcYQT4NClqhq93QTQwOI8x3mlMf5M4DgK5avVaSzpv9g8p+opqeotK2yzpFeINps06cuQyB1h7vcv1Q=="
"requires": {}
}, },
"@fullcalendar/timegrid": { "@fullcalendar/timegrid": {
"version": "4.4.2", "version": "4.4.2",
@ -22641,8 +22638,7 @@
"@tinymce/tinymce-vue": { "@tinymce/tinymce-vue": {
"version": "3.2.8", "version": "3.2.8",
"resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-3.2.8.tgz", "resolved": "https://registry.npmjs.org/@tinymce/tinymce-vue/-/tinymce-vue-3.2.8.tgz",
"integrity": "sha512-jEz+NZ0g+FZFz273OEUWz9QkwPMyjc5AJYyxOgu51O1Y5UaJ/6IUddXTX6A20mwCleEv5ebwNYdalviafx4fnA==", "integrity": "sha512-jEz+NZ0g+FZFz273OEUWz9QkwPMyjc5AJYyxOgu51O1Y5UaJ/6IUddXTX6A20mwCleEv5ebwNYdalviafx4fnA=="
"requires": {}
}, },
"@types/glob": { "@types/glob": {
"version": "7.1.3", "version": "7.1.3",
@ -23280,8 +23276,7 @@
"version": "1.1.2", "version": "1.1.2",
"resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz",
"integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==", "integrity": "sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==",
"dev": true, "dev": true
"requires": {}
}, },
"@vue/test-utils": { "@vue/test-utils": {
"version": "1.0.0-beta.29", "version": "1.0.0-beta.29",
@ -23593,15 +23588,13 @@
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
"integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
"dev": true, "dev": true
"requires": {}
}, },
"ajv-keywords": { "ajv-keywords": {
"version": "3.5.2", "version": "3.5.2",
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
"integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
"dev": true, "dev": true
"requires": {}
}, },
"alphanum-sort": { "alphanum-sort": {
"version": "1.0.2", "version": "1.0.2",
@ -23967,8 +23960,7 @@
"version": "7.0.0-bridge.0", "version": "7.0.0-bridge.0",
"resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz",
"integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==", "integrity": "sha512-poPX9mZH/5CSanm50Q+1toVci6pv5KSRv/5TWCwtzQS5XEwn40BcCrgIeMFWP9CKKIniKXNxoIOnOq4VVlGXhg==",
"dev": true, "dev": true
"requires": {}
}, },
"babel-eslint": { "babel-eslint": {
"version": "10.0.1", "version": "10.0.1",
@ -27202,8 +27194,7 @@
"version": "5.3.1", "version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true, "dev": true
"requires": {}
}, },
"ansi-regex": { "ansi-regex": {
"version": "3.0.0", "version": "3.0.0",
@ -27480,8 +27471,7 @@
"version": "5.3.1", "version": "5.3.1",
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
"dev": true, "dev": true
"requires": {}
}, },
"debug": { "debug": {
"version": "4.3.1", "version": "4.3.1",
@ -28893,8 +28883,7 @@
"highcharts-vue": { "highcharts-vue": {
"version": "1.3.5", "version": "1.3.5",
"resolved": "https://registry.npmjs.org/highcharts-vue/-/highcharts-vue-1.3.5.tgz", "resolved": "https://registry.npmjs.org/highcharts-vue/-/highcharts-vue-1.3.5.tgz",
"integrity": "sha512-By1kc3m8XoI20pMshs/ue69j4rH6eQioDPoIrtC20RTti4QyvNAx8DisGSO3GAWe9sn50hPk8NsyxcwZIGaz3Q==", "integrity": "sha512-By1kc3m8XoI20pMshs/ue69j4rH6eQioDPoIrtC20RTti4QyvNAx8DisGSO3GAWe9sn50hPk8NsyxcwZIGaz3Q=="
"requires": {}
}, },
"hmac-drbg": { "hmac-drbg": {
"version": "1.0.1", "version": "1.0.1",
@ -37299,8 +37288,7 @@
"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz",
"integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=",
"dev": true, "dev": true,
"optional": true, "optional": true
"requires": {}
}, },
"ansi-regex": { "ansi-regex": {
"version": "3.0.0", "version": "3.0.0",

Loading…
Cancel
Save