diff --git a/api/app/lib/controllers/firmwareUpgrade/index.js b/api/app/lib/controllers/firmwareUpgrade/index.js index 1148272..0d7a39b 100644 --- a/api/app/lib/controllers/firmwareUpgrade/index.js +++ b/api/app/lib/controllers/firmwareUpgrade/index.js @@ -295,7 +295,7 @@ async function getThingMessages(ctx){ firmwareNo:child.updateVersion||'', status:child.updateState||'', updatePercentage:child.updatePercentage||'', - switchStatus:JSON.parse(child.properties).switch||false, + switchStatus:JSON.parse(child.properties).update||false, deviceId:child.id }) // console.log('xxxx2',child.properties) diff --git a/web/client/src/app.jsx b/web/client/src/app.jsx index 6d3cfa1..1ac944f 100644 --- a/web/client/src/app.jsx +++ b/web/client/src/app.jsx @@ -15,7 +15,7 @@ import WorkOrder from './sections/workOrder'; import Means from './sections/means'; import Data from './sections/data'; import ProjectGroup from './sections/projectGroup'; - +import FirmwareUpgrade from './sections/firmwareUpgrade' const App = props => { const { projectName } = props @@ -40,9 +40,9 @@ const App = props => { ) diff --git a/web/client/src/layout/components/header/index.jsx b/web/client/src/layout/components/header/index.jsx index 8849134..b1cede8 100644 --- a/web/client/src/layout/components/header/index.jsx +++ b/web/client/src/layout/components/header/index.jsx @@ -27,6 +27,7 @@ const Header = (props) => { const [count,setCount]=useState(0)//待办工单数量 // console.log('actions1',actions) let userRole = user?.pomsUserInfo?.role + console.log('xxx1',userRole) let modalRole = [] if (userRole) { let modal = [] @@ -38,6 +39,9 @@ const Header = (props) => { }) modal.push('control') modal = [...new Set(modal)] + console.log('headerItems',headerItems) + console.log('modal',modal) + modalRole = headerItems?.filter(v => modal.includes(v.itemKey)) if (userRole?.includes('SuperAdmin') || userRole?.includes('admin')) modalRole = headerItems } @@ -291,7 +295,7 @@ const Header = (props) => { footer={ <> {modalRole.length > 0 ? modalRole.map((item, index) => { - // console.log('item1',item) + console.log('item1',modalRole.find(k=>k.text==='工单')) if (item.hasOwnProperty('items')) { return ( { } setAllItems(nextItems) setHeaderItems(topItems) + console.log('topItems',topItems) if (lastSelectedKeys) {//如果有缓存 for (let i = 0; i < nextItems.length; i++) { if (JSON.parse(lastSelectedKeys)[0] == nextItems[i].itemKey) { diff --git a/web/client/src/sections/firmwareUpgrade/actions/firmwareUpgrade.js b/web/client/src/sections/firmwareUpgrade/actions/firmwareUpgrade.js new file mode 100644 index 0000000..0910b66 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/actions/firmwareUpgrade.js @@ -0,0 +1,103 @@ +'use strict'; + +import { ApiTable, basicAction } from '$utils' + +export function getDeviceType(query) { //获取设备型号 + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + query, + actionType: 'GET_DEVICE_TYPE', + url: `${ApiTable.getDeviceType}`, + msg: { option: '获取设备型号' }, + reducer: { + name: "deviceType", + params: { noClear: true } + } + }); +} + +export function getStruc(query) { //获取结构物以及设备类型 + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + query, + actionType: 'GET_STRUC', + url: `${ApiTable.getStruc}`, + msg: { option: '获取结构物以及设备类型' }, + reducer: { + name: "structAndDeviceType", + params: { noClear: true } + } + }); +} + +export function getFirmware(query) { //获取固件包 + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + query, + actionType: 'GET_FIRMWARE', + url: `${ApiTable.getFirmware}`, + msg: { option: '获取固件包' }, + reducer: { + name: "firmware", + params: { noClear: true } + } + }); +} + + +export function upgradeFirmware(query,data) { //增加/覆盖固件包 + return dispatch => basicAction({ + type: 'post', + dispatch: dispatch, + query, + data, + actionType: 'UPGRADE_FIRMWARE', + url: `${ApiTable.upgradeFirmware}`, + msg: { option: '增加/覆盖固件包' }, + + }); +} + + +export function deleteFirmware(query) { //删除固件包 + return dispatch => basicAction({ + type: 'delete', + dispatch: dispatch, + query, + actionType: 'DELETE_FIRMWARE', + url: `${ApiTable.deleteFirmware}`, + msg: { option: '删除固件包' }, + + }); +} + + +export function getThingMessages(query) { //获取固件包信息 + return dispatch => basicAction({ + type: 'get', + dispatch: dispatch, + query, + actionType: 'GET_THING_MESSAGES', + url: `${ApiTable.getThingMessages}`, + msg: { option: '获取设备信息' }, + + }); +} + +export function distributeConfiguration(query,data) { //下发配置 + return dispatch => basicAction({ + type: 'post', + dispatch: dispatch, + query, + data, + actionType: 'DISTRIBUTE_CONNFIGURATION', + url: `${ApiTable.distributeConfiguration}`, + msg: { option: '下发配置'}, + + }); +} + + diff --git a/web/client/src/sections/firmwareUpgrade/actions/index.js b/web/client/src/sections/firmwareUpgrade/actions/index.js new file mode 100644 index 0000000..227c849 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/actions/index.js @@ -0,0 +1,7 @@ +'use strict'; + + +import * as firmwareUpgrade from './firmwareUpgrade' +export default { + ...firmwareUpgrade +} \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/components/addFirmwareModal.jsx b/web/client/src/sections/firmwareUpgrade/components/addFirmwareModal.jsx new file mode 100644 index 0000000..2a6c450 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/components/addFirmwareModal.jsx @@ -0,0 +1,159 @@ +import React, { useState, useEffect, useRef } from 'react' +import { connect } from 'react-redux'; +import moment from 'moment' +import { Button, Table, Modal, Form,Notification,Upload,Toast } from '@douyinfe/semi-ui'; +import { IconUpload,IconVigoLogo } from '@douyinfe/semi-icons'; +import request from 'superagent'; + +const AddFirmwareModal = (props) => { + const {modalVis,onCancel,crawapi,recordRow,actions,dispatch,qiniu} =props + const api = useRef(); + const {domain}=qiniu //七牛服务器地址 + const {firmwareUpgrade}=actions + const [uploadData, setUploadData] = useState({}) + const [options,setOptions]=useState([])//设备类型的下拉选项 + const [fileObj,setFileObj]=useState({})//文件对象 + const [fileUrl,setFileUrl]=useState()//文件地址 + const userId = JSON.parse(sessionStorage.getItem('pomsUser'))?.id + const [removeFlag,setRemoveFlag]=useState(false)//文件是否清除过 + useEffect(()=>{ + //获取设备类型 + dispatch(firmwareUpgrade.getDeviceType()).then((res) => { + setOptions( res.payload.data?.map(item=> { + return { + label:item.model, + value:item.id + } + })) + }) + },[]) + // console.log('xxxx1111',recordRow) + // console.log('xxxx11112',fileUrl) + + const okHandler= ()=>{ + // console.log('fileObj',fileObj) + api.current.validate().then(async (res)=>{ + // console.log('ressss',res) + // const query = { + // version:res?.versionNo, + // qiniu:domain, + // device_meta_id: res?.deviceName, + // tokenup: '22767e1f-db8d-4a1d-87d4-56347cf21247', + // wholeFile:fileUrl, + // } + // const body={ + // filePath:fileUrl, + // userId:userId, + // comment:res?.remark, + // deviceMetaName:options?.find(item=>item.value===res?.deviceName)?.label, + // fileObj:fileObj + // } + // dispatch(firmwareUpgrade.upgradeFirmware(query,body)).then(res=>{ + // }) + const responseData=await request.get(qiniu+'/'+fileUrl).responseType('blob') + const blobData = responseData.body; + request.post(crawapi+'/firmwareupgrade') + // .set('Content-Type','application/octet-stream') + .attach('file',blobData,removeFlag?fileObj.name:recordRow?recordRow.firmwareName:fileObj.name) + .field('filePath',removeFlag?fileUrl:recordRow?recordRow.filepath:fileUrl) + .field('userId', userId||'') + .field('comment',res?.remark||'') + .field('device_meta_name', options?.find(item=>item.value===res?.deviceName)?.label||'') + .query({ version:res?.versionNo,device_meta_id: res?.deviceName,token:'22767e1f-db8d-4a1d-87d4-56347cf21247'}) + .end((err, response) => { + if(response?.ok){ + Notification.success({ title: recordRow?'编辑固件包':'新增固件包', + content: recordRow?'编辑成功':'新增成功', + duration: 3, + }) + setRemoveFlag(false) + onCancel() + }else{ + console.error('Superagent request failed:'); + Notification.error({ title: recordRow?'编辑固件包':'新增固件包', + content: recordRow?'编辑失败':'新增失败', + duration: 3, + }) + } + }) + + + + }) + } + + // function readFileAsBlob(file) { + // return new Promise((resolve, reject) => { + // const reader = new FileReader(); + // reader.onload = () => { + // const blob = new Blob([reader.result], { type: file.type }); + // resolve(blob); + // }; + + // reader.onerror = (error) => { + // reject(error); + // }; + + // reader.readAsArrayBuffer(file); + // }); + // } + + return <> + + +
api.current = formApi} labelCol={{ span: 7,offset:1}} wrapperCol={{span: 15,offset:1}} labelPosition='left' > + + + + { + setUploadData({}) + setRemoveFlag(true) + }} + onSuccess={ async(responseBody, file,all) => { + // console.log('file111',file) + setFileObj(file) + setFileUrl(responseBody?.uploaded) + setUploadData({ + name: file.name, + size: file.size, + url: responseBody?.uploaded, + uploadTime: moment().format("YYYY-MM-DD HH:mm:ss") + }) + }} + > + + + + +
+ + +
+ +} + + +function mapStateToProps (state) { + const { auth, global } = state; + return { + user: auth.user, + actions: global.actions, + crawapi: global.crawapi, + qiniu:global.qiniu, + + }; + } + +export default connect(mapStateToProps)(AddFirmwareModal) \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/components/firmwareListModal.jsx b/web/client/src/sections/firmwareUpgrade/components/firmwareListModal.jsx new file mode 100644 index 0000000..200bb49 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/components/firmwareListModal.jsx @@ -0,0 +1,86 @@ +import React, { useState, useEffect, useRef } from 'react' +import { connect } from 'react-redux'; +import moment from 'moment' +import { Button, Table, Modal, Form } from '@douyinfe/semi-ui'; +import { IconUpload } from '@douyinfe/semi-icons'; + + +const firmwareListModal = (props) => { + const {modalVis,onCancel,apiRoot,recordRow,versionData,vData,actions,dispatch} =props + const api = useRef(); + const [uploadData, setUploadData] = useState({}) + const [data,setData]=useState() + const {firmwareUpgrade}=actions + const okHandler=()=>{ + api.current.validate().then((res)=>{ + const query = { + version:res?.type, + device_meta_id:data[0]?.device_meta_id, + tokenup: '22767e1f-db8d-4a1d-87d4-56347cf21247', + } + const body=[{thing_id:data[0]?.thing_id,device_ids:data?.map(item=>item.deviceId)}] + dispatch(firmwareUpgrade.distributeConfiguration(query,body)).then((res)=>{ + if(res.success) onCancel() + + }) + + // console.log('rexxxx',res) + }) + } + +useEffect(()=>{ + // console.log('versionData',vData,versionData) +if(recordRow&&recordRow.length&&versionData&&versionData.length&&vData&&vData.length){ + + //匹配设备id + const res= versionData?.filter(item=>recordRow?.some(p=>p.deviceId===item.deviceId))?.map(child=>{ + return { + device_meta_id:child.devicemetaId, + deviceId:child.deviceId, + thing_id:child.thingId, + firmwareNo:child.firmwareNo, + firmwareName:child.firmwareName, + versionList:vData.filter(n=>n.device_meta_id==child.devicemetaId) + } + }) + + setData(res) +} + +},[recordRow,versionData,vData]) +// console.log('recordRow1',recordRow,data) + + return <> + +
api.current = formApi} + labelCol={{ span: 7}} + wrapperCol={{span: 15}} + labelPosition='left' > + + {data&&data.length&&data[0].versionList&&data[0].versionList.length? + data[0].versionList.map((item,index)=>{`版本名称:${item.firmwareName}-版本号:${item.versionNo}`}) + :''} + + +
+ + +
+ +} + + +function mapStateToProps (state) { + const { auth, global } = state; + return { + user: auth.user, + actions: global.actions, + apiRoot: global.apiRoot + + }; + } + +export default connect(mapStateToProps)(firmwareListModal) \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/containers/deviceManagement.jsx b/web/client/src/sections/firmwareUpgrade/containers/deviceManagement.jsx new file mode 100644 index 0000000..e163fb1 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/containers/deviceManagement.jsx @@ -0,0 +1,246 @@ +import React, { useEffect, useState } from 'react'; +import { connect } from 'react-redux'; +import { Button, Table, Popconfirm, Pagination,Select,Input,Switch,Notification,Progress } from '@douyinfe/semi-ui'; +import moment from 'moment' +import FirmwareListModal from '../components/firmwareListModal'; + + +const DeviceManagement = (props) => { + const {actions,dispatch,pepProjectId,user}=props + const {firmwareUpgrade}=actions + const [updataButtonDisabled,setUpdataButtonDisabled]=useState(true)//批量升级的按钮的显示与隐藏 + const [firmwareModalVis,setFirmwareModalVis]=useState(false) + const [strucAndDeviceType,setStrucAndDeviceType]=useState([])// + const [struc,setStruc]=useState([])// + const [deviceType,setDeviceType]=useState([])//设备类型的optionList + const [data,setData]=useState([])//列表数据 + const [thingIds,setThingIds]=useState([])//结构物id数组 + const [defaultVal,setDefaultVal]=useState('')//设备类型id + const [thingId,setThingId]=useState()//单个结构物id + const [searchVal,setSearchVal]=useState()//搜索框值 + const [recordRow,setRecordRow]=useState() + const [selectedRows,setSelectedRows]=useState([])//选择的key + const [selectdR,setSelectedR]=useState([])//选择行 + const [vData,setVData]=useState([])//版本信息 + const getData=(query)=>{ + dispatch(firmwareUpgrade.getThingMessages(query)).then((res)=>{ + if(res.success) { + setData(res.payload.data) + } + + }) + dispatch(firmwareUpgrade.getFirmware(query)).then(res=>{ + if(res.success) setVData(res.payload.data) + }) + } + useEffect(()=>{ + //结构物和设备类型 + dispatch(firmwareUpgrade.getStruc({pepProjectId})).then((res)=>{ + if(res.success) { + setStrucAndDeviceType( res.payload.data) + setStruc( res.payload.data?.map(item=>{ + return {label:item.strucName,value:item.thingId} + })) + setThingIds(res.payload.data?.map(item=>item.thingId)?.join(',')||'') + } + + }) + // console.log('xxxx111',user) + },[]) + useEffect(()=>{ + const query={thingIds} + getData(query) + },[thingIds]) + + const structChange =value => { + clearSelectedRows() + setUpdataButtonDisabled(true) + const deviceTypeList= strucAndDeviceType?.find(item=>item.thingId==value)?.deviceType?.map(child=>{ + return { + label:child.model, + value:child.id + } + })||[] + setDefaultVal('') + // console.log('event',deviceTypeList) + setDeviceType(deviceTypeList) + setThingId(value) + const query={thingIds:value,device_meta_id:defaultVal} + getData(query) + + }; + const deviceTypeChange=value=>{ + setUpdataButtonDisabled(true) + clearSelectedRows() + setDefaultVal(value) + const query={thingIds:thingId,device_meta_id:value} + getData(query) + // console.log(value,'event') + } + //清除结构物的逻辑 + const clearHandler=()=>{ + setUpdataButtonDisabled(true) + clearSelectedRows() + const query={thingIds} + getData(query) + + } + //清楚设备类型的逻辑 + const cleartypeHandler=()=>{ + setUpdataButtonDisabled(true) + clearSelectedRows() + setDefaultVal(null) + const query={thingIds:thingId} + getData(query) + } + //搜索按钮的逻辑 + const searchHandler=()=>{ + if(!thingId&&!defaultVal){ + const query={thingIds} + getData(query) + }else{ + const query={thingIds:thingId,device_meta_id:defaultVal,searchVal} + getData(query) + } + } + const clearSelectedRows = () => { + setSelectedRows([]); + }; + const rowSelection = { + selectedRowKeys: selectedRows, // 已选择的行的 keys + getCheckboxProps: record => ({ + name: record.name, + }), + + // onSelect: (record, selected) => { + // console.log(`select row: ${selected}`, record); + // }, + onSelectAll: (selected, selectedRows) => { + setUpdataButtonDisabled(!selectedRows.every(item=>selectedRows[0]?.deviceType===item.deviceType)) + }, + onChange: (selectedRowKeys, selectedRows) => { + setSelectedR(selectedRows) + setSelectedRows(selectedRowKeys) + // console.log('xxxx',selectedRows) + //选择之后,清空选择 + if(selectedRows&&selectedRows.length===0){ + setUpdataButtonDisabled(true) + } + //选择很多的时候,如果有设备型号不对应的情况 + if(selectedRows&&selectedRows.length>0){ + setUpdataButtonDisabled(!selectedRows.every(item=>selectedRows[0].deviceType===item.deviceType)) + } + + + }, + }; + + + + let columns=[{ + title: '序号', + render: (t, r, i) => { + return i + 1; + } + },{ + title: '设备名称', + dataIndex: 'deviceName' + },{ + title: '设备型号', + dataIndex: 'deviceType' + }, + { + title: '固件名称', + dataIndex: 'firmwareName' + }, + { + title: '固件版本号', + dataIndex: 'firmwareNo' + }, + { + title: '升级状态', + render:(_,record)=>{ + return record.status!=='未升级'&&record.status!=='升级成功'?:record.status + } + }, + { + title: '升级开关状态', + dataIndex: 'switchStatus' , + render:(_,record)=>{ + return + } + }, + { + title: '操作', + render:(_,record)=>{ + return
+ +
+ } + } + ] +return <>
+
+
+
+
设备管理
+
Device Management
+
+ + + + {setSearchVal(e)}}> + + +
+
+
+ {setFirmwareModalVis(false);setRecordRow(null)}}> +
+
+ +} + +function mapStateToProps (state) { + const { auth, global, getPush } = state; + return { + loading: getPush.isRequesting, + user: auth.user, + actions: global.actions, + pepProjectId:global.pepProjectId + }; + } + + export default connect(mapStateToProps)(DeviceManagement); \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/containers/firmwareLibrary.jsx b/web/client/src/sections/firmwareUpgrade/containers/firmwareLibrary.jsx new file mode 100644 index 0000000..564eb48 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/containers/firmwareLibrary.jsx @@ -0,0 +1,137 @@ +import React, { useEffect, useState } from 'react'; +import { connect } from 'react-redux'; +import { Button, Table, Popconfirm, Pagination,Input,Toast } from '@douyinfe/semi-ui'; +import moment from 'moment' +import AddFirmwareModal from '../components/addFirmwareModal' + + + +const FirmwareLibrary = (props) => { + const {actions,dispatch}=props + const [modalVis,setModalVis]=useState(false)//添加固件弹框的显示与隐藏 + const [recordRow,setRecordRow]=useState() + const [data,setData]=useState([])//列表数据 + const [searchVal,setSearchVal]=useState('')//存储搜索框的值 + const [users,setUsers]=useState([])//所有用户信息 + const {service,firmwareUpgrade}=actions + // console.log(data,'data1111') + const getData=(query)=>{ + dispatch(firmwareUpgrade.getFirmware(query)).then(res=>{ + if(res.success)setData(res.payload.data) + }) + } + useEffect(()=>{ + + //获得已上传的固件列表 + getData() + //用户信息 + dispatch(service.getOrganizationUsers()).then(res=>{ + if(res.success) setUsers(res.payload.data) + + }) + },[]) + + const searchHandler=()=>{ + const query={version:searchVal,device_meta_name:searchVal} + getData(query) + + } + const onConfirm = (record) => { + const query={version:record?.versionNo,device_meta_id:record?.device_meta_id,tokenup:'22767e1f-db8d-4a1d-87d4-56347cf21247'} + dispatch(firmwareUpgrade.deleteFirmware(query)).then(res=>{ + if(res.success) { + getData() + // Toast.success('删除成功'); + + } + + }) + }; + + const onCancel = () => { + Toast.warning('取消删除'); + }; +let columns=[{ + title: '序号', + render: (t, r, i) => { + return i + 1; + } +},{ + title: '固件名称', + dataIndex: 'firmwareName' +},{ + title: '设备型号', + dataIndex: 'deviceMetaName' +}, +{ + title: '版本号', + dataIndex: 'versionNo' +}, +{ + title: '上传时间', + dataIndex: 'uploadTime' +}, +{ + title: '上传人', + render:(_,record)=>{ + return {users?.find(item=>item.id==record.uploader)?.name||''} +} +}, +{ + title: '备注', + dataIndex: 'comment' +}, +{ + title: '操作', + render:(_,record)=>{ + return
onConfirm(record)} + onCancel={onCancel} + > + + + +
+ } +} + + + + +] + return <>
+
+
+
+
固件库
+
Firmware Library
+
+ {setSearchVal(e)}}> + + +
+
+
+ {getData({version:searchVal});setModalVis(false);setRecordRow(null)}}> +
+
+ + + +} + +function mapStateToProps (state) { + const { auth, global, getPush } = state; + // console.log('state1',state) + return { + loading: getPush.isRequesting, + user: auth.user, + actions: global.actions, + }; + } + + export default connect(mapStateToProps)(FirmwareLibrary); \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/containers/index.js b/web/client/src/sections/firmwareUpgrade/containers/index.js new file mode 100644 index 0000000..c83a49d --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/containers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +import FirmwareLibrary from './firmwareLibrary' +import DeviceManagement from './deviceManagement'; +export { DeviceManagement,FirmwareLibrary }; \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/index.js b/web/client/src/sections/firmwareUpgrade/index.js new file mode 100644 index 0000000..4acbd06 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/index.js @@ -0,0 +1,15 @@ +'use strict'; + +import reducers from './reducers'; +import routes from './routes'; +import actions from './actions'; +import { getNavItem } from './nav-item'; + +export default { + key: 'firmwareUpgrade', + name: '固件升级', + reducers: reducers, + routes: routes, + actions: actions, + getNavItem: getNavItem +}; \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/nav-item.jsx b/web/client/src/sections/firmwareUpgrade/nav-item.jsx new file mode 100644 index 0000000..5d2f255 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/nav-item.jsx @@ -0,0 +1,25 @@ +import React from 'react'; +import { IconCode } from '@douyinfe/semi-icons'; + +export function getNavItem (user, dispatch) { + return ( + [ + { + itemKey: 'device', + text: '设备', + icon: , + items: [ + { + itemKey: 'firmwareUpgrade', + text: '固件库', + icon: , + to: '/device/firmwareUpgrade/FirmwareLibrary', + items: [{ itemKey:'FirmwareLibrary',to:'/device/firmwareUpgrade/FirmwareLibrary',text:'固件库'}, + { itemKey:'DeviceManagement',to:'/device/firmwareUpgrade/DeviceManagement',text:'设备管理'} + ] + } + ] + }, + ] + ); +} \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/reducers/index.js b/web/client/src/sections/firmwareUpgrade/reducers/index.js new file mode 100644 index 0000000..7ed1088 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/reducers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +export default { + +} \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/routes.js b/web/client/src/sections/firmwareUpgrade/routes.js new file mode 100644 index 0000000..6cd6ae8 --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/routes.js @@ -0,0 +1,29 @@ +import { ReportManagement, CyclePlan, TemporaryResponse, EmPush, AppPush, MaintenanceModel, ServiceRecord, MaintenanceRecords,FirmwareLibrary,DeviceManagement } from './containers'; + +export default [{ + type: 'inner', + route: { + path: '/device', + key: 'device', + breadcrumb: '设备', + // 不设置 component 则面包屑禁止跳转 + childRoutes: [ + { + path: '/firmwareUpgrade', + key: 'firmwareUpgrade', + breadcrumb: '固件库', + childRoutes: [{ + path: '/FirmwareLibrary', + key: 'firmwareLibrary', + component: FirmwareLibrary, + breadcrumb: '固件库', + },{ + path: '/DeviceManagement', + key: 'deviceManagement', + component: DeviceManagement, + breadcrumb: '设备管理', + }] + } + ] + } +}]; \ No newline at end of file diff --git a/web/client/src/sections/firmwareUpgrade/style.less b/web/client/src/sections/firmwareUpgrade/style.less new file mode 100644 index 0000000..0eaa50f --- /dev/null +++ b/web/client/src/sections/firmwareUpgrade/style.less @@ -0,0 +1,5 @@ +.myempush { + .semi-input-wrapper { + margin-bottom: 0px !important; + } +} diff --git a/web/client/src/sections/install/components/memberModal.jsx b/web/client/src/sections/install/components/memberModal.jsx index ded1a1b..f411f4c 100644 --- a/web/client/src/sections/install/components/memberModal.jsx +++ b/web/client/src/sections/install/components/memberModal.jsx @@ -41,6 +41,11 @@ function memberModal (props) { value: 'customer_service', text: '拥有服务、工单、资料相关的权限' }, + { + label: '固件升级', + value: 'firmware_upgrade', + text: '拥有固件升级、固件包上传相关的权限' + }, ]); //权限配置 const [pomsList_, setPomsList_] = useState([]) //初始化 diff --git a/web/client/src/sections/install/containers/roles.jsx b/web/client/src/sections/install/containers/roles.jsx index fff1b65..4533852 100644 --- a/web/client/src/sections/install/containers/roles.jsx +++ b/web/client/src/sections/install/containers/roles.jsx @@ -259,6 +259,40 @@ const Roles = (props) => { ); } }, + { + title: ( +
+ 固件升级 + + + +
+ ), + render: (_, row) => { + let rolearr = row.role + return ( +
+ { + rolearr.indexOf('firmware_upgrade') != -1 ? ( +
+
+ +
+
有权限
+
+ ) : ( +
+
+ +
+
无权限
+
+ ) + } +
+ ); + } + }, { title: "管理", width: "20%", @@ -527,6 +561,7 @@ const Roles = (props) => { 售后运维 资源管理者 客户服务 + 固件升级
diff --git a/web/client/src/sections/service/nav-item.jsx b/web/client/src/sections/service/nav-item.jsx index d891eb5..94abaf4 100644 --- a/web/client/src/sections/service/nav-item.jsx +++ b/web/client/src/sections/service/nav-item.jsx @@ -58,15 +58,15 @@ export function getNavItem (user, dispatch) { to: '/service/serviceRecord/MaintenanceRecords', items: [{ itemKey:'MaintenanceRecords',to:'/service/serviceRecord/MaintenanceRecords',text:'维修记录'}] }, - { - itemKey: 'firmwareUpgrade', - text: '固件升级', - icon: , - to: '/service/firmwareUpgrade/FirmwareLibrary', - items: [{ itemKey:'FirmwareLibrary',to:'/service/firmwareUpgrade/FirmwareLibrary',text:'固件库'}, - { itemKey:'DeviceManagement',to:'/service/firmwareUpgrade/DeviceManagement',text:'设备管理'} - ] - } + // { + // itemKey: 'firmwareUpgrade', + // text: '固件升级', + // icon: , + // to: '/service/firmwareUpgrade/FirmwareLibrary', + // items: [{ itemKey:'FirmwareLibrary',to:'/service/firmwareUpgrade/FirmwareLibrary',text:'固件库'}, + // { itemKey:'DeviceManagement',to:'/service/firmwareUpgrade/DeviceManagement',text:'设备管理'} + // ] + // } ] }, ]