From 894309c5f300c0f37e6f063adc2c4306a53e47ab Mon Sep 17 00:00:00 2001 From: zjlnb666 <14659021+zhangjianlong666@user.noreply.gitee.com> Date: Mon, 8 Dec 2025 10:51:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=BF=90=E7=BB=B4=E5=B7=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/routes.js | 13 + .../InspectionTemplate.js | 8 + .../nav_system_content/SystemContentList.js | 21 + src/pages/serviceticket_analysis/Analysis.js | 824 +++++++++++++++++- .../serviceticket_analysis/Analysis.less | 189 ++++ src/pages/serviceticket_history/History.css | 73 -- src/pages/serviceticket_history/History.js | 8 +- src/pages/serviceticket_my/My.js | 156 +++- src/pages/serviceticket_my/My.less | 83 ++ src/pages/topnavbar/TopNavBar.js | 7 +- 10 files changed, 1294 insertions(+), 88 deletions(-) create mode 100644 src/pages/inspection_inspectionTemplate/InspectionTemplate.js delete mode 100644 src/pages/serviceticket_history/History.css diff --git a/config/routes.js b/config/routes.js index 38eb358..ed6422a 100644 --- a/config/routes.js +++ b/config/routes.js @@ -128,6 +128,19 @@ export default [ }, ] }, + //智能巡检 + { + path: '/topnavbar00/business/inspection', + name: 'inspection_inspectionTemplate', + routes: [ + // 巡检模板 + { + path: '/topnavbar00/business/inspection/inspectionTemplate', + name: 'inspectionTemplate', + component: './inspection_inspectionTemplate/InspectionTemplate', + }, + ] + } ], }, ], diff --git a/src/pages/inspection_inspectionTemplate/InspectionTemplate.js b/src/pages/inspection_inspectionTemplate/InspectionTemplate.js new file mode 100644 index 0000000..1e807bc --- /dev/null +++ b/src/pages/inspection_inspectionTemplate/InspectionTemplate.js @@ -0,0 +1,8 @@ +const InspectionTemplate = () => { + return ( +
+ 巡检模板 +
+ ) +} +export default InspectionTemplate diff --git a/src/pages/nav_system_content/SystemContentList.js b/src/pages/nav_system_content/SystemContentList.js index 76340a8..5877823 100644 --- a/src/pages/nav_system_content/SystemContentList.js +++ b/src/pages/nav_system_content/SystemContentList.js @@ -231,6 +231,27 @@ const SystemContentList = (props) => { }, ] }, + { + path: '/topnavbar00/business/inspection', + icon: 智能巡检, + key: "/topnavbar00/business/inspection", + "label": "智能巡检", + children: [ + { + path: '/topnavbar00/business/inspection/inspectionTemplate', + key: "/topnavbar00/business/inspection/inspectionTemplate", + "label": "巡检模板" + }, + ] + } ] setMenuItems(fixedMenuItems) // 初始化默认路由 diff --git a/src/pages/serviceticket_analysis/Analysis.js b/src/pages/serviceticket_analysis/Analysis.js index 59b72e4..9e0bb92 100644 --- a/src/pages/serviceticket_analysis/Analysis.js +++ b/src/pages/serviceticket_analysis/Analysis.js @@ -1,9 +1,821 @@ -import Title from '@/pages/homepage/compontent/title' +import React, { useEffect, useRef, useState } from 'react'; +import Title from '@/pages/homepage/compontent/title'; +import { + Row, + Col, + Select, + DatePicker, + Statistic, + Card, + Table, + Tag, + Space, + Form, Button, +} from 'antd'; +import * as echarts from 'echarts'; +import styles from './Analysis.less'; + +const { Option } = Select; +const { RangePicker } = DatePicker; +const Title1=(props)=>{ + return( +
+ + {props.title} +
+ ) +} + const Analysis = () => { + const [form] = Form.useForm(); + const numberLineChartRef=useRef(null) + const numberLineChartRef1=useRef(null) + const numberLineChartRef2=useRef(null) + const pieChartRef = useRef(null); + const barChartRef = useRef(null); + const lineChartRef = useRef(null); + const barChartRef1 = useRef(null); + const barChartRef2 = useRef(null); + // 初始化图表 + useEffect(() => { + if (numberLineChartRef.current) { + const chart = echarts.init(numberLineChartRef.current); + const numberLineOption = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'line' + } + }, + grid: { + top: '10%', + left: '0%', + right: '6%', + bottom: '10%', + containLabel: true + }, + xAxis: [ + { + type: 'category', + data: ['5月', '6月', '7月', '8月', '9月', '10月', '11月'], + axisTick: { + alignWithLabel: true + }, + boundaryGap: false + } + ], + yAxis: [ + { + type: 'value', + name: '月环比增长15%', + } + ], + series: [ + { + name: '工单数量', + type: 'line', + data: [900, 1000, 950, 1050, 900, 850, 800], + lineStyle: { + color:'#006665' + }, + itemStyle:{ + color:'#006665' + }, + areaStyle:{ + color:'#DFEAE5' + } + } + ] + }; + chart.setOption(numberLineOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + }, []); + useEffect(() => { + if (numberLineChartRef1.current) { + const chart = echarts.init(numberLineChartRef1.current); + const numberLineOption1 = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'line' + } + }, + grid: { + top: '10%', + left: '0%', + right: '6%', + bottom: '10%', + containLabel: true + }, + xAxis: [ + { + type: 'category', + data: ['5月', '6月', '7月', '8月', '9月', '10月', '11月'], + axisTick: { + alignWithLabel: true + }, + boundaryGap: false + } + ], + yAxis: [ + { + type: 'value', + name: '月环比增长15%', + } + ], + series: [ + { + name: '工单数量', + type: 'line', + data: [900, 1000, 950, 1050, 900, 850, 800], + lineStyle: { + color:'#FF826D' + }, + itemStyle:{ + color:'#FF826D' + }, + areaStyle:{ + color:'#F4EDED' + } + } + ] + }; + chart.setOption(numberLineOption1); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + }, []); + useEffect(() => { + if (numberLineChartRef2.current) { + const chart = echarts.init(numberLineChartRef2.current); + const numberLineOption1 = { + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'line' + } + }, + grid: { + top: '10%', + left: '0%', + right: '6%', + bottom: '10%', + containLabel: true + }, + xAxis: [ + { + type: 'category', + data: ['5月', '6月', '7月', '8月', '9月', '10月', '11月'], + axisTick: { + alignWithLabel: true + }, + boundaryGap: false + } + ], + yAxis: [ + { + type: 'value', + name: '月环比增长15%', + } + ], + series: [ + { + name: '工单数量', + type: 'line', + data: [2.5, 3, 5, 2.5, 4, 4.5, 3.5], + lineStyle: { + color:'#006665' + }, + itemStyle:{ + color:'#006665' + }, + areaStyle:{ + color:'#E2EFEA' + } + } + ] + }; + chart.setOption(numberLineOption1); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + }, []); + + useEffect(()=>{ + // 饼图 - 工单分类统计 + if (pieChartRef.current) { + const chart = echarts.init(pieChartRef.current); + const pieOption = { + tooltip: { + trigger: 'item', + formatter: '{b}: {c} ({d}%)' + }, + legend: { + orient: 'vertical', + left: 'left', + textStyle: { + fontSize: 16 + }, + itemGap:30, + itemWidth:0, + formatter:'{name}' + + }, + series: [ + { + name: '工单类型', + type: 'pie', + radius: '70%', + center: ['75%', '40%'], + data: [ + {value: 85, name: '设备维修', itemStyle: {color: '#C1D3D1'}}, + {value: 60, name: '故障报修', itemStyle: {color: '#045F5E80'}}, + {value: 45, name: '软件升级', itemStyle: {color: '#FFBC00'}}, + {value: 30, name: '巡检任务', itemStyle: {color: '#FF826D'}} + ], + labelLine:{ + show:false + }, + label:{ + show:false + } + } + ] + }; + chart.setOption(pieOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + + },[]) + useEffect(()=>{ + // 柱状图 - 工单状态统计 + if (barChartRef.current) { + const chart = echarts.init(barChartRef.current); + const barOption = { + tooltip: { + trigger: 'item', + formatter: '{b}: {c} ({d}%)' + }, + legend: { + orient: 'vertical', + left: 'left', + textStyle: { + fontSize: 16 + }, + itemGap:30, + itemWidth:0, + formatter:'{name}' + + }, + series: [ + { + name: '工单类型', + type: 'pie', + radius: '70%', + center: ['75%', '40%'], + data: [ + {value: 85, name: '设备维修', itemStyle: {color: '#C1D3D1'}}, + {value: 60, name: '故障报修', itemStyle: {color: '#045F5E80'}}, + {value: 45, name: '软件升级', itemStyle: {color: '#FFBC00'}}, + {value: 30, name: '巡检任务', itemStyle: {color: '#FF826D'}} + ], + labelLine:{ + show:false + }, + label:{ + show:false + } + } + ] + }; + chart.setOption(barOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + + },[]) + useEffect(()=>{ + // 柱状图 - 工单状态统计 + if (barChartRef1.current) { + const chart = echarts.init(barChartRef1 .current); + const barOption = { + // 提示框(鼠标悬浮显示数据) + tooltip: { + trigger: 'axis', + axisPointer: { type: 'shadow' } + }, + // 图例(多系列时开启) + // legend: { + // top: 0, + // right: 10 + // }, + // 网格(调整图表内边距,适配容器) + grid: { + left: '3%', + right: '4%', + bottom: '3%', + top: '10%', + containLabel: true + }, + // X轴(替换为你的实际标签) + xAxis: { + type: 'category', + data: ['传感器', '服务器', '网络设备', '安全设备', '网关','摄像头','执行器','机房环境类','其他'], + axisLabel: { fontSize: 12 } + }, + // Y轴 + yAxis: { + type: 'value', + axisLabel: { fontSize: 12 } + }, + // 系列数据(替换为你的实际数值) + series: [ + { + name: '数据1', + type: 'bar', + data: [{value: 85, itemStyle: {color: '#C1D3D1'}}, {value: 95, itemStyle: {color: '#045F5E80'}}, {value: 96, itemStyle: {color: '#FFBC00'}}, {value: 65, itemStyle: {color: '#FF826D'}}, {value: 47, itemStyle: {color: '#045F5E80'}}, {value: 61, itemStyle: {color: '#FFBC00'}}, {value: 71, itemStyle: {color: '#FF826D'}}, {value: 45, itemStyle: {color: '#045F5E80'}}, {value: 92, itemStyle: {color: '#FFBC00'}}], // 匹配X轴的数值 + // 柱子样式(可选) + // itemStyle: { + // color: '#1890ff', // 阿里云蓝(可自定义) + // borderRadius: 4 // 圆角 + // }, + label:{ + position:'top', + color:'#333333', + show: true + }, + // 柱子宽度 + barWidth: '20%' + }, + // 如需多系列,新增对象即可 + // { + // name: '数据2', + // type: 'bar', + // data: [18, 35, 25, 48, 30], + // itemStyle: { color: '#52c41a' } + // } + ] + }; + chart.setOption(barOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + + },[]) + useEffect(()=>{ + // 折线图 - 工单趋势 + if (lineChartRef.current) { + const chart = echarts.init(lineChartRef.current); + const lineOption = { + tooltip: { + trigger: 'axis' + }, + // legend: { + // data: ['申请工单', '完成工单'], + // textStyle: { + // fontSize: 12 + // } + // }, + grid: { + top:'10%', + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + xAxis: { + type: 'category', + boundaryGap: false, + data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] + }, + yAxis: { + type: 'value' + }, + series: [ + + { + name: '完成工单', + type: 'line', + stack: '总量', + data: [25, 27, 27, 29, 22, 26, 21], + lineStyle: { + color: '#52c41a' + }, + + areaStyle: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + {offset: 0, color: 'rgba(82, 196, 26, 0.3)'}, + {offset: 1, color: 'rgba(82, 196, 26, 0.1)'} + ]) + } + } + ] + }; + chart.setOption(lineOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + + },[]) + useEffect(()=>{ + // 柱状图 - 工单状态统计 + if (barChartRef2.current) { + const chart = echarts.init(barChartRef2 .current); + const barOption = { + // 提示框(鼠标悬浮显示数据) + tooltip: { + trigger: 'axis', + axisPointer: { type: 'shadow' } + }, + // 图例(多系列时开启) + // legend: { + // top: 0, + // right: 10 + // }, + // 网格(调整图表内边距,适配容器) + grid: { + left: '3%', + right: '4%', + bottom: '3%', + top: '10%', + containLabel: true + }, + // X轴(替换为你的实际标签) + xAxis: { + type: 'category', + data: ['生产部', '研发部', '运维部', '财务部', '人事部'], + axisLabel: { fontSize: 12 } + }, + // Y轴 + yAxis: { + type: 'value', + axisLabel: { fontSize: 12 } + }, + // 系列数据(替换为你的实际数值) + series: [ + { + name: '数据1', + type: 'bar', + data: [{value: 74, itemStyle: {color: '#C1D3D1'}}, {value: 95, itemStyle: {color: '#045F5E80'}}, {value: 96, itemStyle: {color: '#FFBC00'}}, {value: 65, itemStyle: {color: '#FF826D'}}, {value: 47, itemStyle: {color: '#045F5E80'}}], // 匹配X轴的数值 + // 柱子样式(可选) + itemStyle: { + // color: '#1890ff', // 阿里云蓝(可自定义) + borderRadius: 4 // 圆角 + }, + label:{ + position:'top', + color:'#333333', + show: true + }, + // 柱子宽度 + barWidth: '20%' + }, + + ] + }; + chart.setOption(barOption); + const handleResize = () => { + chart.resize(); + }; + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + chart?.dispose(); + }; + } + + },[]) + // 表格数据 + const tableColumns = [ + { + title: '部门', + dataIndex: 'department', + key: 'department' + }, + { + title: '申请工单', + dataIndex: 'applied', + key: 'applied' + }, + { + title: '完成工单', + dataIndex: 'completed', + key: 'completed' + }, + { + title: '完成率', + dataIndex: 'completionRate', + key: 'completionRate', + render: (rate) => {rate} + }, + { + title: '平均处理时长', + dataIndex: 'avgDuration', + key: 'avgDuration' + } + ]; + + const tableData = [ + { key: '1', department: '生产部', applied: 120, completed: 108, completionRate: '90%', avgDuration: '2.5天' }, + { key: '2', department: '技术部', applied: 85, completed: 82, completionRate: '96.5%', avgDuration: '1.8天' }, + { key: '3', department: '运维部', applied: 156, completed: 148, completionRate: '94.9%', avgDuration: '2.2天' }, + { key: '4', department: '财务部', applied: 45, completed: 45, completionRate: '100%', avgDuration: '1.2天' }, + { key: '5', department: '行政部', applied: 68, completed: 62, completionRate: '91.2%', avgDuration: '1.9天' } + ]; + const pieColumns = [ + { + title: '工单类型', + dataIndex: 'type', + key: 'type', + }, + { + title: '数量', + dataIndex: 'count', + key: 'count', + }, + { + title: '占比', + dataIndex: 'proportion', + key: 'proportion', + }, + { + title: '平均处理时长', + dataIndex: 'avgTime', + key: 'avgTime', + }, + ]; + const pieData = [ + { + key: '1', + type: '设备维修', + count: 540, + proportion: '45%', + avgTime: '5.0小时', + }, + { + key: '2', + type: '软件升级', + count: 300, + proportion: '25%', + avgTime: '3.5小时', + }, + { + key: '3', + type: '故障报修', + count: 240, + proportion: '20%', + avgTime: '6.0小时', + }, + { + key: '4', + type: '巡检任务', + count: 120, + proportion: '10%', + avgTime: '2.0小时', + }, + ]; + + const pieColumns1=[ + { + title: '排名', + dataIndex: 'order', + key: 'order', + }, + { + title: '故障原因', + dataIndex: 'faultReason', + key: 'faultReason', + }, + ] + const pieData1=[ + { + key: '1', + order: 'NO.1', + faultReason: '传感器硬件损坏', + }, + { + key: '2', + order: 'NO.2', + faultReason: '网关软件版本不兼容', + }, + { + key: '3', + order: 'NO.3', + faultReason: '摄像头网络波动', + }, + + ] return ( -
- + <div className={styles.container}> + {/* 统计卡片 */} + <Row gutter={[20, 20]} className={styles.statsSection}> + <Col xs={24} sm={12} md={6}> + <div className={styles.statCard}> + <Row style={{width:'100%'}}> + <Col span={8}> + <div style={{height: '100%',margin:'15px 0'}}> + <div className={styles.statValue}>1200</div> + <div className={styles.statTitle}>工单总数</div> + </div> + </Col> + <Col span={16}> + <div style={{color:'#666666'}}>月环比增长 <span>15</span>%</div> + <div ref={numberLineChartRef} style={{width:'100%',height:'100%',marginBottom:'-15px'}}></div> + </Col> + </Row> + </div> + </Col> + <Col xs={24} sm={12} md={6}> + <div className={styles.statCard}> + <Row style={{width: '100%'}}> + <Col span={8}> + <div style={{height: '100%', margin: '15px 0'}}> + <div className={styles.statValue}>85</div> + <div className={styles.statTitle}>故障设备数</div> + </div> + </Col> + <Col span={16}> + <div style={{color: '#666666'}}>月环比下降 <span>15</span>%</div> + <div ref={numberLineChartRef1} style={{width: '100%', height: '100%', marginBottom: '-15px'}}></div> + </Col> + </Row> + </div> + </Col> + <Col xs={24} sm={12} md={6}> + <div className={styles.statCard}> + <Row style={{width: '100%'}}> + <Col span={8}> + <div style={{height: '100%', margin: '15px 0'}}> + <div className={styles.statValue}>92%</div> + <div className={styles.statTitle}>工单处理完成率</div> + </div> + </Col> + <Col span={16} > + <div style={{color: '#666666',lineHeight:'65px'}}>目标 95%,差距 3%</div> + <progress value={92} max={100} style={{height:'28px',padding:0}}>70%</progress> + </Col> + </Row> + </div> + </Col> + <Col xs={24} sm={12} md={6}> + <div className={styles.statCard}> + <Row style={{width: '100%'}}> + <Col span={8}> + <div style={{height: '100%', margin: '15px 0'}}> + <div className={styles.statValue}>4.2小时</div> + <div className={styles.statTitle}>平均处理时长</div> + </div> + </Col> + <Col span={16}> + <div style={{color: '#666666'}}>月环比缩短 <span>0.5</span>小时</div> + <div ref={numberLineChartRef2} style={{width: '100%', height: '100%', marginBottom: '-15px'}}></div> + </Col> + </Row> + </div> + </Col> + </Row> + + {/* 图表区域 */} + <Row gutter={[20, 20]} className={styles.chartsSection}> + {/* 饼图 */} + <Col xs={24} lg={6}> + <div className={styles.chartContainer}> + <Title1 title={'工单类型统计'}></Title1> + <div ref={pieChartRef} style={{height:'200px',width:'100%'}} /> + <div> + <Table columns={pieColumns} dataSource={pieData} style={{width:'100%'}} pagination={false}></Table> + </div> + </div> + </Col> + {/* 柱状图 */} + <Col xs={24} lg={6}> + <div className={styles.chartContainer}> + <Title1 title={'故障类型统计'}></Title1> + <div ref={barChartRef} className={styles.chart}/> + <div> + <Table columns={pieColumns1} dataSource={pieData1} style={{width: '100%'}} pagination={false}></Table> + </div> + </div> + </Col> + {/* 折线图 */} + <Col xs={24} lg={12}> + <Row gutter={[20, 20]} style={{display:'flex',flexDirection:'column'}}> + <Col xs={24} lg={24}> + <div className={styles.chartContainer}> + <Title1 title={'设备类型统计'}></Title1> + <div ref={barChartRef1} className={styles.chart}/> + </div> + </Col> + <Col xs={24} lg={24}> + <div className={styles.chartContainer}> + <Title1 title={'时间趋势统计'}></Title1> + <div ref={lineChartRef} className={styles.chart}/> + </div> + </Col> + </Row> + </Col> + </Row> + + {/* 部门统计表格 */} + <Row gutter={20}> + <Col span={6}> + <div className={styles.chartContainer}> + <Title1 title={'部门分布统计'}></Title1> + <div ref={barChartRef2} className={styles.chart}/> + </div> + </Col> + <Col span={18}> + <div className={styles.chartContainer}> + <Title1 title={'筛选导出'}></Title1> + <Form layout={"vertical"}> + <Row gutter={50} align={'middle'}> + <Col span={8}> + <Form.Item label="工单类型" > + <Select> + <Option value="1">故障工单</Option> + <Option value="2">维护工单</Option> + </Select> + </Form.Item> + </Col> + <Col span={8}> + <Form.Item label="设备类型" > + <Select> + <Option value="1">故障工单</Option> + <Option value="2">维护工单</Option> + </Select> + </Form.Item> + </Col> + <Col span={8}> + <Form.Item label="故障类型" > + <Select> + <Option value="1">故障工单</Option> + <Option value="2">维护工单</Option> + </Select> + </Form.Item> + </Col> + <Col span={8}> + <Form.Item label="时间范围" > + <DatePicker style={{width:'100%'}}></DatePicker> + </Form.Item> + </Col> + <Col span={8} offset={8} style={{textAlign:'right'}}> + <Button className={styles['search-button']} style={{marginRight:30}}>导出图表</Button> + <Button className={styles['reset-button']}>导出数据</Button> + </Col> + </Row> + + </Form> + </div> + </Col> + </Row> + </div> - ) -} -export default Analysis \ No newline at end of file + ); +}; + +export default Analysis; diff --git a/src/pages/serviceticket_analysis/Analysis.less b/src/pages/serviceticket_analysis/Analysis.less index e69de29..082ca19 100644 --- a/src/pages/serviceticket_analysis/Analysis.less +++ b/src/pages/serviceticket_analysis/Analysis.less @@ -0,0 +1,189 @@ +.container { + padding: 20px; + background-color: #fff; + //min-height: calc(100vh - 64px); + margin-bottom:50px; +} + +.statsSection { + margin-bottom: 20px; +} + +.statCard { + width:100%; + padding: 10px 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; + position: relative; + overflow: hidden; + background: + linear-gradient(#fff, #fff) padding-box, + /* 外层渐变背景作为边框 */ + conic-gradient(from 102.21deg at 52.75% 38.75%, + rgba(249, 249, 249, 0.5) -32.95deg, + rgba(64, 64, 64, 0.5) 10.52deg, + rgba(64, 64, 64, 0.35) 32.12deg, + #FFFFFF 60.28deg, + rgba(255, 255, 255, 0.5) 107.79deg, + rgba(64, 64, 64, 0.35) 187.59deg, + #F9F9F9 207.58deg, + #FFFFFF 287.31deg, + rgba(249, 249, 249, 0.5) 327.05deg, + rgba(64, 64, 64, 0.5) 370.52deg + ) border-box; + + /* 关键:设置透明边框,让渐变背景透出来 */ + border: 2px solid transparent; + + &:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + } + .statValue{ + font-size: 26px; + font-weight: 600; + line-height: 32px; + letter-spacing: 0em; + text-align: left; + color: #333333; + } + .statTitle{ + font-size: 16px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0em; + text-align: left; + margin-top: 20px; + color:#666666; + white-space: nowrap; + } + + + +} + +.chartsSection { + margin-bottom: 20px; +} + +.chartContainer { + background: + linear-gradient(#fff, #fff) padding-box, + /* 外层渐变背景作为边框 */ + conic-gradient(from 102.21deg at 52.75% 38.75%, + rgba(249, 249, 249, 0.5) -32.95deg, + rgba(64, 64, 64, 0.5) 10.52deg, + rgba(64, 64, 64, 0.35) 32.12deg, + #FFFFFF 60.28deg, + rgba(255, 255, 255, 0.5) 107.79deg, + rgba(64, 64, 64, 0.35) 187.59deg, + #F9F9F9 207.58deg, + #FFFFFF 287.31deg, + rgba(249, 249, 249, 0.5) 327.05deg, + rgba(64, 64, 64, 0.5) 370.52deg + ) border-box; + + /* 关键:设置透明边框,让渐变背景透出来 */ + border: 2px solid transparent; + padding: 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + //height: 350px; + //display: flex; + //flex-direction: column; + width:100%; + height:100%; +} + +.chartTitle { + font-size: 16px; + font-weight: 500; + color: #333; + margin-bottom: 16px; + text-align: center; +} + +.chart { + //flex: 1; + width: 100%; + height:200px; +} + +.tableSection { + background: #fff; + padding: 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.tableTitle { + font-size: 16px; + font-weight: 500; + color: #333; + margin-bottom: 16px; +} + +/* 响应式调整 */ +@media (max-width: 768px) { + .container { + padding: 12px; + } + + .queryForm { + flex-direction: column; + align-items: flex-start; + } + + .queryForm .ant-form-item { + margin-right: 0; + margin-bottom: 16px; + width: 100%; + } + + .queryForm .ant-form-item:last-child { + margin-bottom: 0; + } + + .chartContainer { + height: 300px; + padding: 16px; + } + + .statCard { + padding: 16px; + } +} +.search-button{ + background-image: url('../../assets/img/assetmangement1.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: #fff; + border-radius: 4px; + height: 36px; + border-color:#d9d9d9 ; + background-color: #045F5E80; +} +.reset-button{ + background-image: url('../../assets/img/assetmangement2.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: rgba(0, 102, 101, 1); + border-radius: 4px; + height: 36px; + border-color:#d9d9d9 ; + background-color: #B7E5D533; +} +.del-button{ + background-image: url('../../assets/img/assetmangement3.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: #000; + border-radius: 4px; + height: 36px; + width:88px; + border-color:#d9d9d9 ; + background-color: #E5B7B733; +} diff --git a/src/pages/serviceticket_history/History.css b/src/pages/serviceticket_history/History.css deleted file mode 100644 index 000b787..0000000 --- a/src/pages/serviceticket_history/History.css +++ /dev/null @@ -1,73 +0,0 @@ -.item { - padding: 20px; - background: #FFFFFF4D; - backdrop-filter: blur(15px); - border-radius: 8px; - position: relative; - margin-top: 20px; - box-shadow: -2px 4px 10px 0px #9191910D, -7px 17px 18px 0px #9191910A, -15px 37px 24px 0px #91919108, -27px 66px 29px 0px #91919103, -42px 103px 31px 0px #91919100; -} -.item::before { - content: ''; - position: absolute; - top: 0; - left: 0; - right: 0; - bottom: 0; - border: 1px solid transparent; - border-image-slice: 1; - border-image-source: conic-gradient(from 102.21deg at 52.75% 38.75%, rgba(249, 249, 249, 0.5) -32.95deg, rgba(64, 64, 64, 0.5) 10.52deg, rgba(64, 64, 64, 0.35) 32.12deg, #FFFFFF 60.28deg, rgba(255, 255, 255, 0.5) 107.79deg, rgba(64, 64, 64, 0.35) 187.59deg, #F9F9F9 207.58deg, #FFFFFF 287.31deg, rgba(249, 249, 249, 0.5) 327.05deg, rgba(64, 64, 64, 0.5) 370.52deg); - border-radius: 8px; - pointer-events: none; -} -.item-num { - font-size: 26px; - font-weight: 600; - line-height: 32px; - letter-spacing: 0em; - text-align: left; -} -.item-title { - font-size: 16px; - font-weight: 400; - line-height: 24px; - letter-spacing: 0em; - text-align: left; - margin-top: 20px; - color: #666666; - white-space: nowrap; -} -.search-button { - background-image: url('../../assets/img/assetmangement1.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - color: #fff; - border-radius: 4px; - height: 36px; - border-color: #d9d9d9; - background-color: #045F5E80; -} -.reset-button { - background-image: url('../../assets/img/assetmangement2.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - color: #006665; - border-radius: 4px; - height: 36px; - border-color: #d9d9d9; - background-color: #B7E5D533; -} -.del-button { - background-image: url('../../assets/img/assetmangement3.png'); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - color: #000; - border-radius: 4px; - height: 36px; - width: 88px; - border-color: #d9d9d9; - background-color: #E5B7B733; -} diff --git a/src/pages/serviceticket_history/History.js b/src/pages/serviceticket_history/History.js index 4b4090c..cb9e3bd 100644 --- a/src/pages/serviceticket_history/History.js +++ b/src/pages/serviceticket_history/History.js @@ -80,6 +80,12 @@ const History = () => { const chartDom = document.getElementById('ringChart'); const myChart = echarts.init(chartDom); const option = { + grid: { + top: '20%', + left: '20%', + right: '20%', + bottom: '20%', + }, tooltip: { trigger: 'item' }, legend: { orient: 'vertical', @@ -138,7 +144,7 @@ const History = () => { </div> <div className={styles['item']}> <div id="ringChart" style={{ height: 240 }}></div> - + </div> </div> </div> diff --git a/src/pages/serviceticket_my/My.js b/src/pages/serviceticket_my/My.js index de64366..ee75045 100644 --- a/src/pages/serviceticket_my/My.js +++ b/src/pages/serviceticket_my/My.js @@ -1,9 +1,151 @@ -import Title from '@/pages/homepage/compontent/title' +import { Button, Col, Progress, Row, Tag, Space, Form, Input, Select, DatePicker, } from "antd"; +import Title from '../homepage/compontent/title' +import styles from './My.less' +import svg1 from '../../assets/img/asset-main1.svg' +import { SearchOutlined } from "@ant-design/icons"; +import TableWithPagination from "@/components/assetmangement/table"; +import {useEffect} from 'react' +import * as echarts from 'echarts'; +const { Option } = Select; + +const { RangePicker } = DatePicker; + const My = () => { - return ( - <div> - <Title title="我的工单" /> - </div> - ) + const [form] = Form.useForm(); + // 表格列配置 + const ruleColumns = [ + { title: '工单ID', dataIndex: 'workOrderId', key: 'workOrderId' }, + { title: '工单类型', dataIndex: 'type', key: 'type' }, + { title: '申请人', dataIndex: 'applicant', key: 'applicant' }, + { title: '申请时间', dataIndex: 'applyTime', key: 'applyTime',align:'center'}, + { + title: '状态', + dataIndex: 'status', + key: 'status', + align: 'center', + render: (status) => { + // 根据图片中状态的颜色更新渲染逻辑 + let color = ''; + switch (status) { + case '已完成': + color = '#52c41a'; // 绿色 + break; + case '已驳回': + color = '#f5222d'; // 红色 + break; + case '处理中': + color = '#1890ff'; // 蓝色 + break; + case '待处理': + color = '#fa8c16'; // 橙色 + break; + default: + color = '#8c8c8c'; + } + return <span style={{color:color}}>{status}</span>; + } + }, + { title: '进度', dataIndex: 'progress', key: 'progress',align:'center' }, + { + title: '操作', + dataIndex: 'action', + key: 'action', + align:'center', + render: (text, record) => { + const actions = []; + if (record.status === '已完成') { + actions.push(<a key="view" style={{ color: '#2C9E9D' }}>查看详情</a>); + actions.push(<a key="evaluate" style={{ color: '#2C9E9D' }}>评价</a>); + actions.push(<a key="delete" style={{ color: '#2C9E9D' }}>删除</a>); + } else if (record.status === '已驳回') { + actions.push(<a key="edit" style={{ color: '#2C9E9D' }}>编辑</a>); + actions.push(<a key="reapply" style={{ color: '#2C9E9D' }}>重新申请</a>); + } else if (record.status === '处理中' || record.status === '待处理') { + actions.push(<a key="view" style={{ color: '#2C9E9D' }}>查看详情</a>); + actions.push(<a key="process" style={{ color: '#2C9E9D' }}>处理</a>); + actions.push(<a key="delete" style={{ color: '#2C9E9D' }}>删除</a>); + } + return <Space>{actions}</Space>; + } + }, + ]; + + // 表格数据 + const reminderRuleData = [ + { key: '1', workOrderId: 'WO-MY01', type: '设备维修', applicant: '李舒萍', applyTime: '2025-10-30', status: '处理中', progress: '50%', priority: '紧急' }, + { key: '2', workOrderId: 'WO-MY02', type: '软件升级', applicant: '吴洁丽', applyTime: '2025-10-29', status: '待处理', progress: '0%', priority: '高' }, + { key: '3', workOrderId: 'WO-MY03', type: '故障报修', applicant: '李姝萍', applyTime: '2025-10-28', status: '已完成', progress: '100%', priority: '中' }, + { key: '4', workOrderId: 'WO-MY04', type: '巡检任务', applicant: '何克金', applyTime: '2025-10-27', status: '处理中', progress: '60%', priority: '中' }, + { key: '5', workOrderId: 'WO-MY05', type: '设备维修', applicant: '李勇', applyTime: '2025-10-26', status: '已驳回', progress: '0%', priority: '中' }, + { key: '6', workOrderId: 'WO-MY06', type: '软件升级', applicant: '周校民', applyTime: '2025-10-25', status: '待处理', progress: '0%', priority: '高' }, + { key: '7', workOrderId: 'WO-MY07', type: '故障报修', applicant: '何艳丽', applyTime: '2025-10-24', status: '已完成', progress: '100%', priority: '中' } + ]; + const conicColors = { + '0%': '#006665', + '50%': '#45FFEC', + '55%': '#006665', + '90%': '#45FFEC', + }; + + return ( + <div style={{ backgroundColor: '#f0f7f7', overflowX: 'hidden' ,padding:'20px',width:'100%'}}> + <Row gutter={20} style={{ height: '100%' ,width:'100%'}}> + + <div style={{ padding: '20px', backgroundColor: '#fff', height: '100%' ,width:'100%'}}> + <Row style={{ marginBottom: '20px', backgroundColor: '#fff' }}> + <Row style={{ width: '100%', marginBottom: '20px' }}> + <Col span={12}> + <Title title="查询条件" /> + </Col> + <Col span={12} style={{ textAlign: 'right' }}> + <Space> + <Button icon={<SearchOutlined />} htmlType="submit" className={styles['search-button']}>查询</Button> + <Button className={styles['reset-button']}>重置</Button> + </Space> + </Col> + </Row> + <Form layout="inline" form={form} style={{ width: '100%', borderBottom: '1px solid #eeeeee', paddingBottom: '20px' }}> + <Row justify="space-between" style={{ width: '100%' }}> + <Form.Item name="applicant" > + <Input placeholder="分组名称、分组 ID" /> + </Form.Item> + <Form.Item name="type" label="工单类型"> + <Select placeholder="请选择工单类型"> + <Option value="设备维修">设备维修</Option> + <Option value="设备安装">设备安装</Option> + <Option value="设备巡检">设备巡检</Option> + <Option value="设备更换">设备更换</Option> + </Select> + </Form.Item> + <Form.Item name="status" label="工单状态"> + <Select placeholder="请选择状态"> + <Option value="待处理">待处理</Option> + <Option value="处理中">处理中</Option> + <Option value="已完成">已完成</Option> + <Option value="已取消">已取消</Option> + </Select> + </Form.Item> + <Form.Item name="applyTime" label="申请时间"> + <RangePicker style={{ width: 240 }} /> + </Form.Item> + </Row> + </Form> + </Row> + <Row style={{ width: '100%', marginTop: '20px', marginBottom: '50px' }}> + <Title title="待办工单" /> + <Row style={{ width: '100%', marginTop: '20px' }}> + + <Button className={styles['search-button']} style={{marginRight:'30px'}}>导出我的工单</Button> + <Button className={styles['del-button']}>删除</Button> + </Row> + <Row style={{ width: '100%', marginTop: '20px' }}> + <TableWithPagination columns={ruleColumns} dataSource={reminderRuleData} rowSelection={true}></TableWithPagination> + </Row> + </Row> + </div> + + </Row> + </div> + ) } -export default My \ No newline at end of file +export default My; diff --git a/src/pages/serviceticket_my/My.less b/src/pages/serviceticket_my/My.less index e69de29..3b0c222 100644 --- a/src/pages/serviceticket_my/My.less +++ b/src/pages/serviceticket_my/My.less @@ -0,0 +1,83 @@ +.item{ + padding: 20px; + background: #FFFFFF4D; + backdrop-filter: blur(15px); + border-radius: 8px; + position: relative; + margin-top: 20px; + + // 使用伪元素创建边框 + &::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + border: 1px solid transparent; + border-image-slice: 1; + border-image-source: conic-gradient(from 102.21deg at 52.75% 38.75%, rgba(249, 249, 249, 0.5) -32.95deg, rgba(64, 64, 64, 0.5) 10.52deg, rgba(64, 64, 64, 0.35) 32.12deg, #FFFFFF 60.28deg, rgba(255, 255, 255, 0.5) 107.79deg, rgba(64, 64, 64, 0.35) 187.59deg, #F9F9F9 207.58deg, #FFFFFF 287.31deg, rgba(249, 249, 249, 0.5) 327.05deg, rgba(64, 64, 64, 0.5) 370.52deg); + border-radius: 8px; + pointer-events: none; + } + // 合并多个阴影效果,用逗号分隔 + box-shadow: + -2px 4px 10px 0px #9191910D, + -7px 17px 18px 0px #9191910A, + -15px 37px 24px 0px #91919108, + -27px 66px 29px 0px #91919103, + -42px 103px 31px 0px #91919100; + + +} +.item-num{ + font-size: 26px; + font-weight: 600; + line-height: 32px; + letter-spacing: 0em; + text-align: left; +} +.item-title{ + font-size: 16px; + font-weight: 400; + line-height: 24px; + letter-spacing: 0em; + text-align: left; + margin-top: 20px; + color:#666666; + white-space: nowrap; +} +.search-button{ + background-image: url('../../assets/img/assetmangement1.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: #fff; + border-radius: 4px; + height: 36px; + border-color:#d9d9d9 ; + background-color: #045F5E80; +} +.reset-button{ + background-image: url('../../assets/img/assetmangement2.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: rgba(0, 102, 101, 1); + border-radius: 4px; + height: 36px; + border-color:#d9d9d9 ; + background-color: #B7E5D533; +} +.del-button{ + background-image: url('../../assets/img/assetmangement3.png'); + background-repeat: no-repeat; + background-size: cover; + background-position:center; + color: #000; + border-radius: 4px; + height: 36px; + width:88px; + border-color:#d9d9d9 ; + background-color: #E5B7B733; +} diff --git a/src/pages/topnavbar/TopNavBar.js b/src/pages/topnavbar/TopNavBar.js index 1b33b69..fdaa9b4 100644 --- a/src/pages/topnavbar/TopNavBar.js +++ b/src/pages/topnavbar/TopNavBar.js @@ -74,6 +74,11 @@ const menuItem = [ label: '统计分析', key: '/topnavbar00/business/serviceticket/analysis', }, + // 智能巡检 + { + label: '智能巡检', + key: '/topnavbar00/business/inspection/inspectionTemplate', + }, ] const TopNavBar = (props) => { @@ -219,7 +224,7 @@ const TopNavBar = (props) => { itemHoverColor:'#333333', itemSelectedColor:'#333333', }, - + }, } return ( From 09c6911b372db1abd1ea79b825ff8bd032c5d5fd Mon Sep 17 00:00:00 2001 From: zjlnb666 <14659021+zhangjianlong666@user.noreply.gitee.com> Date: Tue, 9 Dec 2025 09:28:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=BF=90=E7=BB=B4=E5=B7=A5=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/routes.js | 12 + src/assets/img/img.png | Bin 0 -> 41517 bytes .../InspectionRecords.js | 9 + .../InspectionTasks.js | 8 + .../InspectionTemplate.js | 275 +++++++++++++++++- .../InspectionTemplate.less | 73 +++++ .../nav_system_content/SystemContentList.js | 12 + src/pages/serviceticket_analysis/Analysis.css | 96 ++++++ src/pages/topnavbar/TopNavBar.js | 10 + 9 files changed, 493 insertions(+), 2 deletions(-) create mode 100644 src/assets/img/img.png create mode 100644 src/pages/inspection_inspectionRecords/InspectionRecords.js create mode 100644 src/pages/inspection_inspectionTasks/InspectionTasks.js create mode 100644 src/pages/inspection_inspectionTemplate/InspectionTemplate.less create mode 100644 src/pages/serviceticket_analysis/Analysis.css diff --git a/config/routes.js b/config/routes.js index ed6422a..486a1d8 100644 --- a/config/routes.js +++ b/config/routes.js @@ -139,6 +139,18 @@ export default [ name: 'inspectionTemplate', component: './inspection_inspectionTemplate/InspectionTemplate', }, + // 巡检任务 + { + path: '/topnavbar00/business/inspection/inspectionTasks', + name: 'inspectionTasks', + component: './inspection_inspectionTasks/InspectionTasks', + }, + // 巡检记录 + { + path: '/topnavbar00/business/inspection/inspectionRecords', + name: 'inspectionRecords', + component: './inspection_inspectionRecords/InspectionRecords', + }, ] } ], diff --git a/src/assets/img/img.png b/src/assets/img/img.png new file mode 100644 index 0000000000000000000000000000000000000000..c41b5e1bcde5a23f88f77e90ed282cb50a632bc2 GIT binary patch literal 41517 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 XczBG9m;YK400000NkvXXu0mjfVxbT~ literal 0 HcmV?d00001 diff --git a/src/pages/inspection_inspectionRecords/InspectionRecords.js b/src/pages/inspection_inspectionRecords/InspectionRecords.js new file mode 100644 index 0000000..9e765d3 --- /dev/null +++ b/src/pages/inspection_inspectionRecords/InspectionRecords.js @@ -0,0 +1,9 @@ +const InspectionRecords = () => { + return ( + <div> + <h1 >InspectionRecords</h1> + + </div> + ); +}; +export default InspectionRecords; diff --git a/src/pages/inspection_inspectionTasks/InspectionTasks.js b/src/pages/inspection_inspectionTasks/InspectionTasks.js new file mode 100644 index 0000000..aa26c78 --- /dev/null +++ b/src/pages/inspection_inspectionTasks/InspectionTasks.js @@ -0,0 +1,8 @@ +const InspectionTasks = () => { + return ( + <div> + <h1>InspectionTasks</h1> + </div> + ); +}; +export default InspectionTasks; diff --git a/src/pages/inspection_inspectionTemplate/InspectionTemplate.js b/src/pages/inspection_inspectionTemplate/InspectionTemplate.js index 1e807bc..d005073 100644 --- a/src/pages/inspection_inspectionTemplate/InspectionTemplate.js +++ b/src/pages/inspection_inspectionTemplate/InspectionTemplate.js @@ -1,7 +1,278 @@ +import {Button, Col, Row, Select, Space} from "antd"; +import Title from '../homepage/compontent/title' +import styles from './InspectionTemplate.less' +import {PlusOutlined, SearchOutlined, SyncOutlined} from "@ant-design/icons"; +import TableWithPagination from "@/components/assetmangement/table"; const InspectionTemplate = () => { + const columns = [ + { + title: '模板 ID', + dataIndex: 'id', + key: 'id', + }, + { + title: '模板名称', + dataIndex: 'name', + key: 'name', + }, + { + title: '类型', + dataIndex: 'type', + key: 'type', + filters: [ + { text: '设备巡检', value: '设备巡检' }, + { text: '环境巡检', value: '环境巡检' }, + { text: '综合巡检', value: '综合巡检' }, + ], + onFilter: (value, record) => record.type === value, + }, + { + title: '巡检周期', + dataIndex: 'cycle', + key: 'cycle', + sorter: (a, b) => { + const order = { '实时触发': 0, '天': 1, '周': 2, '月': 3 }; + return order[a.cycle] - order[b.cycle]; + }, + }, + { + title: '触发逻辑', + dataIndex: 'triggerLogic', + key: 'triggerLogic', + ellipsis: true, + }, + { + title: '地点范围', + dataIndex: 'location', + key: 'location', + }, + { + title: 'AI推荐度', + dataIndex: 'aiRecommendation', + key: 'aiRecommendation', + render: (text) => { + const colorMap = { + '高': 'red', + '中': 'orange', + '次': 'green' + }; + return ( + <span style={{ color: colorMap[text], fontWeight: 'bold' }}> + {text} + </span> + ); + }, + // sorter: (a, b) => { + // const order = { '高': 0, '中': 1, '次': 2 }; + // return order[a.aiRecommendation] - order[b.aiRecommendation]; + // }, + }, + { + title: '操作', + key: 'action', + render: (_, record) => ( + <Space size="middle"> + <a onClick={() => handleEdit(record)} style={{color:'#2C9E9D'}}>编辑</a> + <a onClick={() => handleDelete(record)} style={{ color: '#ff4d4f' }}>删除</a> + <a onClick={() => handleCopy(record)} style={{color: '#006665'}}>复制</a> + </Space> + ), + align: 'center', + }, + ]; + const dataSource = [ + { + key: '1', + id: 'TPL-001', + name: '核心设备日检', + type: '设备巡检', + cycle: '天', + triggerLogic: '设备在线时触发参数全检', + location: '机房 A', + aiRecommendation: '高', + }, + { + key: '2', + id: 'TPL-002', + name: '车间环境周检', + type: '环境巡检', + cycle: '周', + triggerLogic: '温湿度超阈值时触发专项巡检', + location: '车间 B', + aiRecommendation: '次', + }, + { + key: '3', + id: 'TPL-003', + name: '传感器月检', + type: '设备巡检', + cycle: '月', + triggerLogic: '设备离线时触发故障排查流程', + location: '园区传感器组', + aiRecommendation: '高', + }, + { + key: '4', + id: 'TPL-004', + name: '网关异常巡检', + type: '设备巡检', + cycle: '实时触发', + triggerLogic: '网关离线时自动触发巡检', + location: '全网关设备', + aiRecommendation: '高', + }, + { + key: '5', + id: 'TPL-005', + name: '仓库温湿度检', + type: '环境巡检', + cycle: '天', + triggerLogic: '温湿度波动>5% 时触发巡检', + location: '仓库 C', + aiRecommendation: '中', + }, + { + key: '6', + id: 'TPL-006', + name: '综合设备巡检', + type: '综合巡检', + cycle: '周', + triggerLogic: '设备状态异常时触发分级巡检', + location: '办公楼设备组', + aiRecommendation: '中', + }, + { + key: '7', + id: 'TPL-007', + name: '边缘节点巡检', + type: '设备巡检', + cycle: '天', + triggerLogic: '负载>80% 时触发性能巡检', + location: '边缘计算区', + aiRecommendation: '高', + }, + ]; + +// 操作函数示例 + const handleEdit = (record) => { + console.log('编辑:', record); + // 打开编辑弹窗 + }; + + const handleDelete = (record) => { + console.log('删除:', record); + // 确认删除逻辑 + }; + + const handleCopy = (record) => { + console.log('复制:', record); + // 复制逻辑 + }; return ( - <div> - 巡检模板 + <div style={{ backgroundColor: '#F0F7F7' ,height: '100%', width: '100%',overflowX: 'hidden' }}> + <Row gutter={20} style={{height:'100%'}}> + <Col span={15}> + <div style={{backgroundColor:'#fff',height:'100%',borderRadius:'6px',padding:'20px'}}> + <div style={{borderBottom:'1px solid #eeeeee',paddingBottom:'20px'}}> + <Row style={{width:'100%'}} justify={"space-between"} align={"middle"}> + <Col> + <Title title='查询条件'/> + </Col> + <Col> + <Button icon={<SearchOutlined />} className={styles['search-button']} style={{marginRight:'30px'}}>查询</Button> + <Button icon={<SyncOutlined />} className={styles['reset-button']}>重置</Button> + </Col> + </Row> + <Row gutter={20} style={{marginTop:'20px'}}> + <Col> + <label htmlFor="">模板类型:</label> + <Select options={[{ + label:'全部', + value:'1' + },{ + label:'巡检模板', + value:'2' + }]} + style={{width:132}} + ></Select> + </Col> + <Col> + <label htmlFor="">AI推荐度:</label> + <Select + options={ + [ + {label:'全部', value:'1'}, + {label:'高', value:'2'}, + {label:'中', value:'3'}, + {label:'低', value:'4'} + ] + } + style={{width:132}} + ></Select> + </Col> + </Row> + </div> + <div style={{marginTop:'20px'}}> + <Title title='模板列表'/> + <Row style={{margin:'20px 0'}} justify={"space-between"}> + <Col> + <Button className={styles['search-button']} style={{marginRight:'30px'}}>模版导入</Button> + <Button className={styles['reset-button']}>模板导出</Button> + </Col> + <Col> + <Button className={styles['reset-button']} style={{marginRight:'30px'}}>AI推荐模板</Button> + <Button icon={<PlusOutlined/>} className={styles['search-button']}>新增模板</Button> + </Col> + </Row> + <TableWithPagination columns={columns} dataSource={dataSource} rowSelection={true}> + </TableWithPagination> + </div> + </div> + </Col> + <Col span={9}> + <div style={{backgroundColor:'#fff',borderRadius:'6px',padding:'20px'}}> + <Title title='逻辑配置面板'/> + <img src={require('@/assets/img/img.png')} alt="" style={{width:'100%',height:'100%'}}/> + </div> + <div style={{backgroundColor: '#fff', borderRadius: '6px', padding: 20, marginTop: 20 ,marginBottom:'50px'}}> + <Title title='AI 推荐辅助面板'/> + <div className={styles['ai-recommend-panel']}> + <div style={{display: 'flex', alignItems: 'center', marginBottom: 10, fontSize: 16}}> + <span style={{ + width: 5, + height: 5, + backgroundColor: '#006665', + borderRadius: '50%', + marginRight: 10 + }}></span><span>推荐项 1:</span> + </div> + <p>在‘核心设备日检’中增加‘硬盘使用率≥90% 时自动触发巡检’</p> + <p style={{color: '#006665'}}>理由 “历史数据中硬盘满导致的故障占比 15%”</p> + <div style={{textAlign:'right'}}> + <Button className={styles['search-button']} style={{marginRight:'30px'}}>采纳</Button> + <Button className={styles['reset-button']}>忽略</Button> + </div> + </div> + <div className={styles['ai-recommend-panel']}> + <div style={{display: 'flex', alignItems: 'center', marginBottom: 10, fontSize: 16}}> + <span style={{ + width: 5, + height: 5, + backgroundColor: '#006665', + borderRadius: '50%', + marginRight: 10 + }}></span><span>推荐项 2:</span> + </div> + <p>将‘车间环境周检’的触发条件调整为‘温湿度波动>3% 时触发</p> + <p style={{color: '#006665'}}>理由 “该条件下环境异常的识别率提升 20%”</p> + <div style={{textAlign: 'right'}}> + <Button className={styles['search-button']} style={{marginRight: '30px'}}>采纳</Button> + <Button className={styles['reset-button']}>忽略</Button> + </div> + </div> + </div> + </Col> + </Row> </div> ) } diff --git a/src/pages/inspection_inspectionTemplate/InspectionTemplate.less b/src/pages/inspection_inspectionTemplate/InspectionTemplate.less new file mode 100644 index 0000000..507cfd6 --- /dev/null +++ b/src/pages/inspection_inspectionTemplate/InspectionTemplate.less @@ -0,0 +1,73 @@ +.search-button { + background-image: url('../../assets/img/assetmangement1.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + color: #fff; + border-radius: 4px; + height: 36px; + border-color: #d9d9d9; + background-color: #045F5E80; +} + +.reset-button { + background-image: url('../../assets/img/assetmangement2.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + color: rgba(0, 102, 101, 1); + border-radius: 4px; + height: 36px; + border-color: #d9d9d9; + background-color: #B7E5D533; +} + +.del-button { + background-image: url('../../assets/img/assetmangement3.png'); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + color: #000; + border-radius: 4px; + height: 36px; + width: 88px; + border-color: #d9d9d9; + background-color: #E5B7B733; +} +.ai-recommend-panel{ + /* 毛玻璃效果 - 核心! */ + backdrop-filter: blur(15px); + -webkit-backdrop-filter: blur(15px); + + /* 多层阴影 */ + box-shadow: + -2px 4px 10px 0px rgba(145, 145, 145, 0.05), + -7px 17px 18px 0px rgba(145, 145, 145, 0.04), + -15px 37px 24px 0px rgba(145, 145, 145, 0.03); + /* 渐变边框 */ + border: 1px solid; + border-image: conic-gradient( + from 102.21deg at 52.75% 38.75%, + rgba(249, 249, 249, 0.5) -32.95deg, + rgba(64, 64, 64, 0.5) 10.52deg, + rgba(64, 64, 64, 0.35) 32.12deg, + #FFFFFF 60.28deg, + rgba(255, 255, 255, 0.5) 107.79deg, + rgba(64, 64, 64, 0.35) 187.59deg, + #F9F9F9 207.58deg, + #FFFFFF 287.31deg, + rgba(249, 249, 249, 0.5) 327.05deg, + rgba(64, 64, 64, 0.5) 370.52deg + ) 1; + /* 内部背景(创建UI的渐变感) */ + background: linear-gradient( + 135deg, + rgba(255, 255, 255, 0.3), + rgba(255, 255, 255, 0.1) + ); + padding:20px; + margin-top: 20px; + p{ + font-size: 14px; + } +} diff --git a/src/pages/nav_system_content/SystemContentList.js b/src/pages/nav_system_content/SystemContentList.js index 5877823..6fa5bf9 100644 --- a/src/pages/nav_system_content/SystemContentList.js +++ b/src/pages/nav_system_content/SystemContentList.js @@ -250,6 +250,18 @@ const SystemContentList = (props) => { key: "/topnavbar00/business/inspection/inspectionTemplate", "label": "巡检模板" }, + // 巡检任务 + { + path: '/topnavbar00/business/inspection/inspectionTasks', + key: "/topnavbar00/business/inspection/inspectionTasks", + "label": "巡检任务" + }, + // 巡检记录 + { + path: '/topnavbar00/business/inspection/inspectionRecords', + key: "/topnavbar00/business/inspection/inspectionRecords", + "label": "巡检记录" + }, ] } ] diff --git a/src/pages/serviceticket_analysis/Analysis.css b/src/pages/serviceticket_analysis/Analysis.css new file mode 100644 index 0000000..f5008f0 --- /dev/null +++ b/src/pages/serviceticket_analysis/Analysis.css @@ -0,0 +1,96 @@ +.container { + padding: 20px; + background-color: #f0f2f5; + min-height: calc(100vh - 64px); +} +.header { + margin-bottom: 20px; +} +.querySection { + background: #fff; + padding: 16px 20px; + border-radius: 6px; + margin-bottom: 20px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.queryForm { + display: flex; + align-items: center; +} +.queryForm .ant-form-item { + margin-bottom: 0; + margin-right: 16px; +} +.statsSection { + margin-bottom: 20px; +} +.statCard { + background: #fff; + padding: 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + transition: all 0.3s ease; +} +.statCard:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); +} +.chartsSection { + margin-bottom: 20px; +} +.chartContainer { + background: #fff; + padding: 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + height: 350px; + display: flex; + flex-direction: column; +} +.chartTitle { + font-size: 16px; + font-weight: 500; + color: #333; + margin-bottom: 16px; + text-align: center; +} +.chart { + flex: 1; + width: 100%; +} +.tableSection { + background: #fff; + padding: 20px; + border-radius: 6px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.tableTitle { + font-size: 16px; + font-weight: 500; + color: #333; + margin-bottom: 16px; +} +/* 响应式调整 */ +@media (max-width: 768px) { + .container { + padding: 12px; + } + .queryForm { + flex-direction: column; + align-items: flex-start; + } + .queryForm .ant-form-item { + margin-right: 0; + margin-bottom: 16px; + width: 100%; + } + .queryForm .ant-form-item:last-child { + margin-bottom: 0; + } + .chartContainer { + height: 300px; + padding: 16px; + } + .statCard { + padding: 16px; + } +} diff --git a/src/pages/topnavbar/TopNavBar.js b/src/pages/topnavbar/TopNavBar.js index fdaa9b4..ce118a3 100644 --- a/src/pages/topnavbar/TopNavBar.js +++ b/src/pages/topnavbar/TopNavBar.js @@ -79,6 +79,16 @@ const menuItem = [ label: '智能巡检', key: '/topnavbar00/business/inspection/inspectionTemplate', }, + // 巡检任务 + { + label: '巡检任务', + key: '/topnavbar00/business/inspection/inspectionTasks', + }, + // 巡检记录 + { + label: '巡检记录', + key: '/topnavbar00/business/inspection/inspectionRecords', + }, ] const TopNavBar = (props) => {