You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							311 lines
						
					
					
						
							14 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							311 lines
						
					
					
						
							14 KiB
						
					
					
				| 
 | |
| import React, { useState, useEffect, useRef } from "react"; | |
| import { connect } from "react-redux"; | |
| import { Button, Form, Modal, Skeleton, Pagination, Table } from "@douyinfe/semi-ui"; | |
| import moment from "moment"; | |
| import PerfectScrollbar from "perfect-scrollbar"; | |
| import './inspection.less' | |
| import { log } from "ezuikit-js"; | |
| 
 | |
| 
 | |
| let projectScrollbar; | |
| let timer | |
| const Inspection = ({ dispatch, actions, user, route, statistic }) => { | |
|    const { problem } = actions | |
|    const [selectProject, setSelectProject] = useState([])   //所选项目 | |
|    const [applyFilter, setApplyFilter] = useState([])     //应用筛选 | |
|    const [patrolAbnormal, setPatrolAbnormal] = useState([])     //巡检异常信息 | |
|    const [checkPatrol, setCheckPatrol] = useState({})     //巡检异常查询 | |
|    const [unfold, setUnfold] = useState(true)     //展开收起 | |
|    const [picturePop, setPicturePop] = useState(false)  //图片弹窗 | |
|    const [pictureId, setPictureId] = useState()  //图片id | |
|    const [pictureData, setPictureData] = useState({})  //图片数据 | |
|    const [notRead, setNotRead] = useState(0)  //已阅图片数量 | |
|  | |
|    const api = useRef(); | |
|    const unfoldApi = useRef(false); | |
| 
 | |
|    // console.log(actions); | |
|  | |
|    useEffect(() => { | |
| 
 | |
|       dispatch(problem.getProjectPoms()).then((res) => { | |
|          // console.log(res.payload.data); | |
|          if (res.success) { | |
|             let project = [] | |
|             let apply = [] | |
|             res.payload.data?.rows?.map(v => { | |
|                project.push({ name: v.pepProjectName || v.name || v.id, value: v.id }) | |
|                v.apps.map(app => apply.push({ name: app.name, value: app.id })) | |
|             }) | |
|             setSelectProject(project) | |
|             setApplyFilter(apply) | |
|          } | |
|       }) | |
|    }, []) | |
| 
 | |
|    useEffect(() => { | |
|       if (projectScrollbar) projectScrollbar.destroy() | |
|       const domEquipment = document.getElementById("inspection"); | |
|       if (unfold) { | |
|          projectScrollbar = new PerfectScrollbar("#inspection", { | |
|             suppressScrollY: true, | |
|          }); | |
|          if (domEquipment && projectScrollbar) projectScrollbar.update() | |
|       } else { | |
|          projectScrollbar = new PerfectScrollbar("#inspection", { | |
|             suppressScrollX: true, | |
|          }) | |
|          if (domEquipment && projectScrollbar) projectScrollbar.update() | |
|       } | |
|    }) | |
| 
 | |
|    useEffect(() => { | |
|       dispatch(problem.getAlarmLnspection(checkPatrol)).then((res) => { | |
|          // console.log(res.payload.data); | |
|          if (res.success) { | |
|             setPatrolAbnormal(res.payload.data) | |
|             setNotRead(res.payload.data.filter(v => !v.notedTime).length) | |
|          } | |
|       }) | |
|    }, [checkPatrol]); | |
| 
 | |
| 
 | |
|    useEffect(() => { | |
|       if (patrolAbnormal && pictureId >= 0) { | |
|          if (timer) clearTimeout(timer) | |
|          timer = setTimeout(() => { | |
|             if (!patrolAbnormal[pictureId]?.notedTime) { | |
|                patrolAbnormal[pictureId].notedPepUser = user.name | |
|                patrolAbnormal[pictureId].notedPepUserId = user.id | |
|                patrolAbnormal[pictureId].notedTime = new Date() | |
|                setPatrolAbnormal(patrolAbnormal) | |
|                setNotRead(notRead - 1) | |
|                setPictureData(patrolAbnormal[pictureId]) | |
|                dispatch(problem.putAlarmApplicationNoted({ inspectionId: patrolAbnormal[pictureId].id })) | |
|             } | |
|          }, 2000) | |
|          setPictureData(patrolAbnormal[pictureId]) | |
|       } | |
|    }, [pictureId]); | |
| 
 | |
|    return ( | |
| 
 | |
|       <div style={{ width: 'clac(100%)', backgroundColor: 'white', margin: "8px 12px", padding: "20px 20px 0" }}> | |
|          <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-start', marginLeft: 10 }}> | |
|             <div style={{ width: 450, }}> | |
|                <span style={{ width: 0, height: 20, display: "inline-block", margin: "0 8px 0 0", borderLeft: '3px solid #005ABD', borderTop: '3px solid transparent', borderBottom: '3px solid transparent' }}></span> | |
|                <span style={{ fontSize: 24, fontFamily: 'YouSheBiaoTiHei', color: '#101531', marginRight: 10 }}>{statistic[route]}</span> | |
|                <span style={{ fontSize: 12, color: 'rgb(150, 151, 153)' }}>APPLY SEMI-AUTOMATIC INSPECTION</span> | |
|                <div style={{ fontSize: 12, color: 'rgb(150, 151, 153)', marginLeft: 3 }}>仅保留48小时内的图片数据,每日8时、14时、17时系统巡检一次。<span style={{ fontWeight: 500, color: '#005ABD', fontSize: 12 }}>未阅共{notRead}个</span></div> | |
|             </div> | |
|             <div style={{ flex: 1, position: 'relative' }}> | |
|                <Form | |
|                   onSubmit={(v) => { | |
|                      setCheckPatrol({ | |
|                         appId: v.appId, | |
|                         noted: v.noted, | |
|                         projectId: v.projectId, | |
|                         timeStart: v.time == 'true' ? | |
|                            moment().startOf('day').format('YYYY-MM-DD HH:mm:ss') : | |
|                            v.time == 'false' ? | |
|                               moment().day(moment().day() - 1).startOf('day').format('YYYY-MM-DD HH:mm:ss') : "", | |
|                         timeEnd: v.time == 'true' ? | |
|                            moment().endOf('day').format('YYYY-MM-DD HH:mm:ss') : | |
|                            v.time == 'false' ? | |
|                               moment().day(moment().day() - 1).endOf('day').format('YYYY-MM-DD HH:mm:ss') : "", | |
|                      }) | |
|                   }} | |
|                   getFormApi={(formApi) => (api.current = formApi)} | |
|                   layout="horizontal" | |
|                > | |
|                   <Form.Select | |
|                      labelPosition="left" | |
|                      style={{ width: 80, marginBottom: 10 }} | |
|                      // new Date(new Date().setHours(00, 00, 00).getTime()), timeEnd: new Date(new Date().setHours(23, 59, 59).getTime()) | |
|                      label='时间筛选:' | |
|                      field='time' | |
|                      key='time' | |
|                      placeholder="全部" | |
|                      showClear | |
|                   > | |
|                      {[{ name: '今日', value: 'true' }, { name: '昨日', value: 'false' }].map((item) => { | |
|                         return ( | |
|                            <Form.Select.Option key={item.value} value={item.value}> | |
|                               {item.name} | |
|                            </Form.Select.Option> | |
|                         ); | |
|                      })} | |
|                   </Form.Select> | |
|                   <Form.Select | |
|                      label='所选项目:' | |
|                      labelPosition="left" | |
|                      field='projectId' | |
|                      key='projectId' | |
|                      style={{ width: 116, marginRight: 10, color: "#F9F9F9", marginBottom: 10 }} | |
|                      placeholder="全部" | |
|                      showClear | |
|                   > | |
|                      {selectProject?.map((item) => { | |
|                         return ( | |
|                            <Form.Select.Option key={item.value} value={item.value}> | |
|                               {item.name} | |
|                            </Form.Select.Option> | |
|                         ); | |
|                      })} | |
|                   </Form.Select> | |
|                   <Form.Select | |
|                      label='应用筛选:' | |
|                      labelPosition="left" | |
|                      field='appId' | |
|                      key='appId' | |
|                      style={{ width: 116, marginRight: 10, color: "#F9F9F9", marginBottom: 10 }} | |
|                      placeholder="全部" | |
|                      showClear | |
|                   > | |
|                      {applyFilter?.map((item) => { | |
|                         return ( | |
|                            <Form.Select.Option key={item.value} value={item.value}> | |
|                               {item.name} | |
|                            </Form.Select.Option> | |
|                         ); | |
|                      })} | |
|                   </Form.Select> | |
|                   <Form.Select | |
|                      label='显示范围:' | |
|                      labelPosition="left" | |
|                      field='noted' | |
|                      key='noted' | |
|                      style={{ width: 116, marginRight: 60, color: "#F9F9F9", marginBottom: 10 }} | |
|                      placeholder="全部" | |
|                      showClear | |
|                   > | |
|                      {[{ name: '已阅', value: 'noted' }, { name: '未阅', value: 'unnote' }].map((item) => { | |
|                         return ( | |
|                            <Form.Select.Option key={item.value} value={item.value}> | |
|                               {item.name} | |
|                            </Form.Select.Option> | |
|                         ); | |
|                      })} | |
|                   </Form.Select> | |
|                   <Button theme="solid" type="primary" htmlType='submit' style={{ width: 65, height: 30, borderRadius: 3, position: 'absolute', right: 10, bottom: 12 }}>查询</Button> | |
|                </Form> | |
|             </div> | |
|          </div> | |
|          <div | |
|             onMouseMove={() => document.getElementById('unfold').style.display = 'none'} | |
|             onMouseOut={() => document.getElementById('unfold').style.display = 'block'} | |
|             id="inspection" style={{ width: 'calc(100% - 20px)', marginLeft: 10, height: unfold ? 280 : 600, whiteSpace: unfold ? 'nowrap' : '', position: "relative", }}> | |
|             {patrolAbnormal?.map((v, i) => | |
|                <div key={'name' + v.id} | |
|                   style={{ | |
|                      width: 400, height: 238, | |
|                      display: 'inline-block', | |
|                      margin: '8px 20px 8px 0', | |
|                      boxShadow: ' 0px 2px 12px 1px #F2F3F5', | |
|                      borderRadius: 2, border: '1px solid rgba(220,222,224,0.2)' | |
|                   }} | |
|                   onClick={() => { | |
|                      setPicturePop(true) | |
|                      setPictureId(i); | |
|                   }} | |
|                > | |
|                   <img src={`/_file-server/${v.screenshot}`} style={{ width: 400, height: 182 }} /> | |
|                   <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'flex-end', margin: '10px 6px 0', color: '#005ABD' }}> | |
|                      <span style={{ fontSize: 12 }}>获取时间:{moment(v.createTime).format("YYYY-MM-DD HH:mm:ss")}</span> | |
|                      <span >{v.app?.name}</span> | |
|                   </div> | |
|                </div>)} | |
| 
 | |
|          </div> | |
|          <div id="unfold" | |
|             onMouseMove={(e) => e.stopPropagation()} | |
|             onMouseOut={(e) => e.stopPropagation()} | |
|             onClick={() => setUnfold(!unfold)} | |
|             style={{ | |
|                width: 'calc(100% - 20px)', marginLeft: 10, height: 24, | |
|                background: unfold ? 'linear-gradient(180deg, rgba(36,139,255,0) 0%, rgba(36,139,255,0.09) 100%)' : 'linear-gradient(180deg, rgba(218,218,218,0) 0%, rgba(212,212,212,0.38) 100%)', | |
|                borderRadius: 3, | |
|                lineHeight: '24px', | |
|                fontSize: 12, | |
|                zIndex: 100, | |
|                position: 'relative', | |
|                top: unfold ? -20 : 6, | |
|                left: 0, | |
|                textAlign: 'center', | |
|                color: unfold ? 'rgba(0,90,189,0.7)' : '#969799', | |
|                cursor: 'pointer', | |
|             }}>{unfold ? '展开更多' : '收起'}<img style={{ width: 17, paddingTop: 8, marginLeft: 3 }} src={`/assets/images/problem/${unfold ? "dropDown" : 'pullUp'}.png`} /> | |
|          </div> | |
|          {picturePop ? <Modal | |
|             title={<div style={{}}>{pictureData.app?.name} | |
|                <span style={{ | |
|                   width: 80, height: 20, display: 'inline-block', | |
|                   background: 'url(/assets/images/problem/preview.png)', | |
|                   backgroundRepeat: 'no-repeat', | |
|                   backgroundSize: '100% 100%', | |
|                   color: '#FFFFFF', fontSize: 12, | |
|                   textAlign: 'center', lineHeight: '20px', marginLeft: 10, | |
|                }}> | |
|                   未阅  {notRead}/{patrolAbnormal.length} | |
|                </span> | |
|             </div>} | |
|             hasCancel={false} | |
|             footer={<div style={{ width: 425, margin: 'auto', display: "flex", justifyContent: 'space-around', }}> | |
|                <Button style={{ width: 92, height: 32, border: '1px solid rgba(0,0,0,0.15)', borderRadius: 2 }} | |
|                   onClick={() => { | |
|                      if (!pictureId == 0) setPictureId(pictureId - 1) | |
|                   }} | |
|                >上一张</Button> | |
|                <a href={`/_file-server/${pictureData.screenshot + '?filename=' + encodeURIComponent(pictureData.app?.name)}.png`}> | |
|                   <Button style={{ width: 92, height: 32, color: '#005ABD', border: '1px solid #005ABD', borderRadius: 2 }}>图片下载</Button> | |
|                </a> | |
|                <a href={pictureData.app?.url} target="_blank"> | |
|                   <Button style={{ width: 92, height: 32, color: '#FFFFFF', background: '#005ABD', border: '1px solid rgba(0,0,0,0.15)', borderRadius: 2 }}>进入系统</Button> | |
|                </a> | |
|                <Button style={{ width: 92, height: 32, border: '1px solid rgba(0,0,0,0.15)', borderRadius: 2 }} | |
|                   onClick={() => { | |
|                      if (pictureId < patrolAbnormal.length - 1) setPictureId(pictureId + 1) | |
|                   }} | |
|                >下一张</Button> | |
|             </div>} | |
|             visible={true} | |
|             onOk={() => { | |
| 
 | |
|             }} | |
|             width={837} | |
|             onCancel={() => { | |
|                setPicturePop(false) | |
|                if (timer) clearTimeout(timer) | |
|             }} | |
|          > | |
|             <div style={{ marginBottom: 12 }}> | |
|                {pictureData.notedTime ? <span style={{ marginRight: 14 }}>核验信息:{pictureData.notedPepUser} {moment(pictureData.notedTime).format("YYYY-MM-DD HH:mm:ss")}</span> : ""} | |
|                <span>截取时间:{moment(pictureData.createTime).format("YYYY-MM-DD HH:mm:ss")}</span> | |
|                <img src={`/assets/images/problem/link.png`} | |
|                   style={{ width: 16, height: 16, marginLeft: 6 }} | |
|                /> | |
|             </div> | |
|             <img src={`/_file-server/${pictureData.screenshot}`} | |
|                style={{ width: 789, height: 359 }} | |
|             /> | |
| 
 | |
|          </Modal> | |
|             : "" | |
| 
 | |
|          } | |
|       </div > | |
|    ) | |
| } | |
| 
 | |
| 
 | |
| function mapStateToProps (state) { | |
|    const { auth, global, members } = state; | |
|    return { | |
|       user: auth.user, | |
|       actions: global.actions, | |
|       // global: global, | |
|       // members: members.data, | |
|    }; | |
| } | |
| export default connect(mapStateToProps)(Inspection);
 | |
| 
 |