Browse Source

添加usb连接状态

feature/rail
LiLongLong 5 months ago
parent
commit
e255621b49
  1. 1
      src/assets/icon_usb.svg
  2. 33
      src/components/Header.tsx
  3. 4
      src/pages/measure/components/MeasureConfig.tsx
  4. 127
      src/pages/measure/components/MeasureDetail.tsx
  5. 2
      src/services/measure/analysis.ts

1
src/assets/icon_usb.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" fill="none" version="1.1" width="33" height="34" viewBox="0 0 33 34"><defs><clipPath id="master_svg0_46_7330"><rect x="0" y="0" width="33" height="34" rx="0"/></clipPath><clipPath id="master_svg1_46_7333"><rect x="0" y="1" width="32" height="32" rx="0"/></clipPath><clipPath id="master_svg2_46_7240"><rect x="0" y="1" width="43" height="43" rx="0"/></clipPath></defs><g clip-path="url(#master_svg0_46_7330)"><g clip-path="url(#master_svg1_46_7333)"><g clip-path="url(#master_svg2_46_7240)"><g><path d="M12.96739,10.75L14.5978,10.75C14.7473,10.75,14.8696,10.628499999999999,14.8696,10.48L14.8696,8.86C14.8696,8.711500000000001,14.7473,8.59,14.5978,8.59L12.96739,8.59C12.81793,8.59,12.69565,8.711500000000001,12.69565,8.86L12.69565,10.48C12.69565,10.628499999999999,12.81793,10.75,12.96739,10.75ZM24.9239,14.8L24.9239,5.08C24.9239,4.482625,24.4382,4,23.837,4L9.163039999999999,4C8.56182,4,8.07609,4.482625,8.07609,5.08L8.07609,14.8C5.82745,14.8,4,16.5584,4,18.715L4,30.73C4,30.8785,4.122283,31,4.271739,31L28.7283,31C28.8777,31,29,30.8785,29,30.73L29,18.715C29,16.5584,27.1726,14.8,24.9239,14.8ZM22.4783,14.8L10.521740000000001,14.8L10.521740000000001,6.43L22.4783,6.43L22.4783,14.8ZM18.4022,10.75L20.0326,10.75C20.1821,10.75,20.3043,10.628499999999999,20.3043,10.48L20.3043,8.86C20.3043,8.711500000000001,20.1821,8.59,20.0326,8.59L18.4022,8.59C18.2527,8.59,18.1304,8.711500000000001,18.1304,8.86L18.1304,10.48C18.1304,10.628499999999999,18.2527,10.75,18.4022,10.75Z" fill="#3165D2" fill-opacity="1" style="mix-blend-mode:passthrough"/></g></g></g></g></svg>

33
src/components/Header.tsx

@ -1,6 +1,7 @@
import { useSelector } from "react-redux";
import bluetooth_nc from "../assets/bluetooth_nc.svg";
import bluetooth_c from "../assets/bluetooth_c.svg";
import icon_usb from "../assets/icon_usb.svg";
import icon_avatar from "../assets/icon_avatar.svg";
import icon_logout from "../assets/icon_logout.svg";
import check_mark from "../assets/check_mark.svg";
@ -15,22 +16,29 @@ import { loginUser } from '../services/wsTypes';
export default function Header() {
const navigate = useNavigate();
const dispatch = useAppDispatch();
let [isConnect, setIsConnect] = useState(false)
//@ts-ignoref
const deviceState = useSelector(store => store.deviceState);
let [isConnect, setIsConnect] = useState(deviceState.isConnect)//
const [bluetoothInfo, setBluetoothInfo] = useState(deviceState)
//获取当前websocet的状态
const showBlueImg = () => {
if(!isConnect){
return <Popover content={getBtList()} title="可连接设备">
<div ></div>
<img src={bluetooth_nc} alt="" className="ext-base ml-2 h-6" />
</Popover>
}else {
if(isConnect){
return <Popover content={getBtContent()} title="">
<img src={bluetooth_c} onClick={onDisconnectBt} alt="" className="ext-base ml-2 h-6" />
<img src={icon_usb} onClick={onDisconnectBt} alt="" className="ext-base ml-2 h-6" />
</Popover>
}
return null;
// if(!isConnect){
// return <Popover content={getBtList()} title="可连接设备">
// <div ></div>
// <img src={bluetooth_nc} alt="" className="ext-base ml-2 h-6" />
// </Popover>
// }else {
// return <Popover content={getBtContent()} title="">
// <img src={icon_usb} onClick={onDisconnectBt} alt="" className="ext-base ml-2 h-6" />
// </Popover>
// }
}
let list = [{
@ -108,7 +116,7 @@ export default function Header() {
return Dom
}
//蓝牙已连接
//设备已连接
const getBtContent = ()=> {
return <div>
<div>
@ -117,7 +125,8 @@ export default function Header() {
<div className="ml-[10px]"></div>
</div>
<div className="pl-[15px]">
<div className="mt-[1rem]">{bluetoothInfo.connectPort}</div>
<div className="mt-[1rem]">sn码{bluetoothInfo.sn}</div>
<div className="mt-[1rem]">{bluetoothInfo.descriptivePortName}</div>
{/* <div className="mt-[1rem]">电量:{bluetoothInfo.power}</div> */}
</div>
</div>
@ -144,9 +153,9 @@ export default function Header() {
<div className="bg-[--bgColor] h-full flex items-center">
<div className="ml-auto mr-8 flex items-center">
{/* <div className="ml-auto mr-8 flex items-center w-[5rem]">
<div className="ml-auto mr-8 flex items-center w-[5rem]">
{showBlueImg()}
</div> */}
</div>
<Dropdown menu={{ items }} trigger={["click"]}>
<section className="flex items-center">
<img src={icon_avatar} alt="" className="h-8" />

4
src/pages/measure/components/MeasureConfig.tsx

@ -14,8 +14,8 @@ export default function MeasureConfig() {
console.log("Received values of form: ", values);
//判断是否连接了设备
if(!deviceState.isConnect){
message.error('设备尚未连接或连接失败,请重新连接')
return;
// message.error('设备尚未连接或连接失败,请重新连接')
// return;
}
createMeasure({
operatorName: values["username"],

127
src/pages/measure/components/MeasureDetail.tsx

@ -1,11 +1,16 @@
import {getDetailList, delDetail, getDetail, getPointByUuid} from '../../../services/measure/analysis'
import { useState, useEffect } from 'react'
import { useState, useEffect, useRef } from 'react'
import {message, Button, type TableColumnsType, type TableProps, Modal, Table, Pagination, Input } from 'antd';
import { useNavigate } from 'react-router-dom';
import type { DetailTable, SearchParams } from "../../../services/measure/type";
import type { AnalysisReport, AnalysisResults, DetailTable, SearchParams } from "../../../services/measure/type";
import { ExclamationCircleFilled } from '@ant-design/icons';
import { AnalysisData, BenchmarkShape, MeasurementCanvasRef } from './konva/MeasurementCanvas';
import MeasurementCanvas from "./konva/MeasurementCanvas";
import {
getBaseRecordPointSetByCode,
getReport
} from "../../../services/measure/analysis";
export default function MeasureDetail() {
const navigate = useNavigate();
const { Search } = Input;
@ -79,21 +84,19 @@ export default function MeasureDetail() {
title: '时间',
dataIndex: 'createTime',
},
// {
// title: '操作',
// dataIndex: 'op',
// width:180,
// align:'center',
// render:(_, record)=>{
// return <div>
// <Button type="link" onClick={()=>onDel(record)}>删除</Button>
// <br/>
// <Button type="link" onClick={()=>onShowDetail(record)}>导出测量数据</Button>
// <br/>
// <Button type="link" onClick={()=>onDetaiResult(record)}>导出分析结果</Button>
// </div>
// }
// },
{
title: '操作',
dataIndex: 'op',
width:180,
align:'center',
render:(_, record)=>{
return <div>
<Button type="link" onClick={()=>onDel(record)}></Button>
<br/>
<Button type="link" onClick={()=>onShowDetail(record)}></Button>
</div>
}
},
];
const [tableData, setTableData] = useState<DetailTable[]>([])
@ -152,25 +155,58 @@ export default function MeasureDetail() {
}
const onShowDetail = (item:DetailTable)=> {
message.warning('正在开发中')
return;
//获取基线
getBaseRecordPointSetByCode("6001").then(res => {
if (res.success) {
const benchmarkShapes = JSON.parse(res.data.points) as BenchmarkShape[];
if (canvasRef.current) {
console.log("解析后的基础图形数据:", benchmarkShapes);
canvasRef.current.setBenchmarkData(benchmarkShapes);
}
}
});
getDetail({id:item.id}).then(res=>{
console.log('res==测量记录详情=', res)
if(res){
setIsModalOpen(true)
//@ts-ignore
getRecordByUuid(res.data.uuid)
//@ts-ignore
onDetaiResult(res.data.uuid)
}
})
}
const onDetaiResult = (item:DetailTable) => {
message.warning('正在开发中')
return;
//法线
const onDetaiResult = (uuid:string) => {
getReport(uuid,'6001').then(res=> {
if (res.success) {
const report: AnalysisReport = res.data;
console.log(report);
// 更新 canvas 的分析数据
if (report && report.angleAnalysisList) {
// 先过滤掉 distance 为 null 的数据
const validItems = report.angleAnalysisList.filter(item => item.distance !== null);
const analysisData: AnalysisData[] = validItems.map(item => ({
pointA: { x: parseFloat(item.pointA.x), y: parseFloat(item.pointA.y) },
pointB: { x: parseFloat(item.pointB.x), y: parseFloat(item.pointB.y) },
base: { x: parseFloat(item.pointA.x), y: parseFloat(item.pointA.y) },
measure: { x: parseFloat(item.pointB.x), y: parseFloat(item.pointB.y) },
distance: parseFloat(item.distance),
describe: item.describe,
}));
canvasRef.current?.setAnalysisData(analysisData);
}
} else {
message.error("分析报告请求失败: " + res.data.info);
}
})
}
const getRecordByUuid = (uuid:string) => {
getPointByUuid({uuid}).then(res=>{
console.log('=========================', res)
canvasRef.current?.setMeasurementData(res.data.points);
})
}
@ -243,6 +279,17 @@ export default function MeasureDetail() {
getDetailDataList(searchParams)
}
let [loading, setLoading] = useState(false)
let [isModalOpen, setIsModalOpen] = useState(false)
const canvasRef = useRef<MeasurementCanvasRef>(null);
const [showGrid, setShowGrid] = useState(true);
const [showStandard, setShowStandard] = useState(true);
const [showMark, setShowMark] = useState(true);
const handleOk = () => {
}
const handleCancel = () => {
setIsModalOpen(false)
}
return (
<div>
<div className="p-[15px]">
@ -267,7 +314,7 @@ export default function MeasureDetail() {
rowKey="id"
dataSource={tableData && tableData.map(item => ({ ...item, key: item.name }))}
pagination={false}
scroll={{ y: 550 }}
scroll={{ y: 500 }}
/>
<div className="float-right">
@ -275,6 +322,36 @@ export default function MeasureDetail() {
</div>
</div>
<Modal
title="测量记录详情"
open={isModalOpen}
width={{ xl: '60%'}}
style={{ top: 20 }}
closable={false}
footer={[
<Button key="cancel" onClick={handleCancel}>
</Button>]}
>
<div className="flex justify-center">
<MeasurementCanvas
width={800}
height={600}
logicalExtent={{ minX: -50, maxX: 50, minY: -20, maxY: 60 }}
gridStep={1}
origin={{ x: 0, y: 20 }}
pixelPerMm={8}
maxZoom={10}
showGrid={showGrid}
showBenchmark={showStandard}
showAnalysis={showMark}
showScale={false}
scaleInterval={1}
showCoordinates={true}
ref={canvasRef}
/>
</div>
</Modal>
</div>
);
}

2
src/services/measure/analysis.ts

@ -92,7 +92,7 @@ export function getBaseRecordPointSetByCode(code: string) {
* @param code code
*/
export function getReport(uuid: string, code: string) {
return httpRequest<BaseResponse<AnalysisResults>>({
return httpRequest<BaseResponse<AnalysisReport>>({
url: `/measurement-analysis/report`,
method: "POST",
params: { uuid, code },

Loading…
Cancel
Save