6
6
This commit is contained in:
@ -1,249 +0,0 @@
|
||||
import React from 'react';
|
||||
import { Button, Typography, Card, Space, Divider } from '@douyinfe/semi-ui';
|
||||
import { useState, useEffect } from 'react';
|
||||
import { RecordSelectionCard } from './components/RecordSelectionCard';
|
||||
import { useRecordSelection } from './hooks/useRecordSelection';
|
||||
import { QueryResultsDisplay } from './components/QueryResultsDisplay';
|
||||
import { LabelSelectionCard } from './components/LabelSelectionCard';
|
||||
import { TimelineModal } from './components/TimelineModal';
|
||||
import { apiService } from './services/apiService';
|
||||
import { TABLE_CONFIG, LABEL_CONFIG } from './constants/config';
|
||||
import type { RecordDetail, QueryResult, LabelOptions } from './types';
|
||||
|
||||
const { Title } = Typography;
|
||||
|
||||
export default function App() {
|
||||
// 使用自定义 Hook 管理记录选择
|
||||
const {
|
||||
selectedRecords,
|
||||
recordDetails,
|
||||
loading,
|
||||
handleSelectRecords,
|
||||
handleClearRecords
|
||||
} = useRecordSelection();
|
||||
|
||||
// 查询结果状态
|
||||
const [queryResults, setQueryResults] = useState<QueryResult[]>([]);
|
||||
const [secondaryProcessResults, setSecondaryProcessResults] = useState<QueryResult[]>([]);
|
||||
const [pricingDetailsResults, setPricingDetailsResults] = useState<QueryResult[]>([]);
|
||||
const [queryLoading, setQueryLoading] = useState(false);
|
||||
const [secondaryProcessLoading, setSecondaryProcessLoading] = useState(false);
|
||||
const [pricingDetailsLoading, setPricingDetailsLoading] = useState(false);
|
||||
|
||||
// 标签相关状态
|
||||
const [labelOptions, setLabelOptions] = useState<LabelOptions>({});
|
||||
const [selectedLabels, setSelectedLabels] = useState<{[key: string]: string | string[]}>({});
|
||||
const [expectedDate, setExpectedDate] = useState<Date | null>(null);
|
||||
const [labelLoading, setLabelLoading] = useState(false);
|
||||
|
||||
// 时效计算相关状态
|
||||
const [timelineVisible, setTimelineVisible] = useState(false);
|
||||
const [timelineLoading, setTimelineLoading] = useState(false);
|
||||
const [timelineResults, setTimelineResults] = useState<any[]>([]);
|
||||
const [timelineAdjustments, setTimelineAdjustments] = useState<{[key: number]: number}>({});
|
||||
|
||||
// 初始化标签选项
|
||||
useEffect(() => {
|
||||
const initializeLabelOptions = async () => {
|
||||
setLabelLoading(true);
|
||||
try {
|
||||
const options = await apiService.fetchLabelOptions();
|
||||
setLabelOptions(options);
|
||||
} catch (error) {
|
||||
console.error('获取标签选项失败:', error);
|
||||
} finally {
|
||||
setLabelLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
initializeLabelOptions();
|
||||
}, []);
|
||||
|
||||
// 当记录选择变化时,自动执行查询
|
||||
useEffect(() => {
|
||||
if (selectedRecords.length > 0 && recordDetails.length > 0) {
|
||||
// 自动清空标签选择
|
||||
setSelectedLabels({});
|
||||
setExpectedDate(null);
|
||||
|
||||
// 提取第一条记录的标签信息
|
||||
const firstRecord = recordDetails[0];
|
||||
const extractedLabels: {[key: string]: string | string[]} = {};
|
||||
|
||||
// 提取标签1-10的值
|
||||
for (let i = 1; i <= 10; i++) {
|
||||
const labelKey = `标签${i}`;
|
||||
const fieldValue = firstRecord[labelKey];
|
||||
if (fieldValue && fieldValue !== '') {
|
||||
const isMultiSelect = i === 7 || i === 8 || i === 10;
|
||||
if (isMultiSelect && Array.isArray(fieldValue)) {
|
||||
extractedLabels[labelKey] = fieldValue;
|
||||
} else if (!isMultiSelect && typeof fieldValue === 'string') {
|
||||
extractedLabels[labelKey] = fieldValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setSelectedLabels(extractedLabels);
|
||||
|
||||
// 顺序执行查询
|
||||
executeQueries();
|
||||
}
|
||||
}, [selectedRecords, recordDetails]);
|
||||
|
||||
// 执行所有查询
|
||||
const executeQueries = async () => {
|
||||
try {
|
||||
await Promise.all([
|
||||
handleQueryDatabase(),
|
||||
handleSecondaryProcessQuery(),
|
||||
handlePricingDetailsQuery()
|
||||
]);
|
||||
} catch (error) {
|
||||
console.error('查询执行失败:', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 面料数据查询
|
||||
const handleQueryDatabase = async () => {
|
||||
if (selectedRecords.length === 0) return;
|
||||
|
||||
setQueryLoading(true);
|
||||
try {
|
||||
const results = await apiService.queryDatabase(selectedRecords);
|
||||
setQueryResults(results);
|
||||
} catch (error) {
|
||||
console.error('面料数据查询失败:', error);
|
||||
setQueryResults([]);
|
||||
} finally {
|
||||
setQueryLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 二次工艺查询
|
||||
const handleSecondaryProcessQuery = async () => {
|
||||
if (selectedRecords.length === 0) return;
|
||||
|
||||
setSecondaryProcessLoading(true);
|
||||
try {
|
||||
const results = await apiService.querySecondaryProcess(selectedRecords);
|
||||
setSecondaryProcessResults(results);
|
||||
} catch (error) {
|
||||
console.error('二次工艺查询失败:', error);
|
||||
setSecondaryProcessResults([]);
|
||||
} finally {
|
||||
setSecondaryProcessLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 工艺价格查询
|
||||
const handlePricingDetailsQuery = async () => {
|
||||
if (selectedRecords.length === 0 || recordDetails.length === 0) return;
|
||||
|
||||
const packId = recordDetails[0]?.packId;
|
||||
if (!packId) {
|
||||
console.error('缺少 packId,无法执行工艺价格查询');
|
||||
return;
|
||||
}
|
||||
|
||||
setPricingDetailsLoading(true);
|
||||
try {
|
||||
const results = await apiService.queryPricingDetails(packId);
|
||||
setPricingDetailsResults(results);
|
||||
} catch (error) {
|
||||
console.error('工艺价格查询失败:', error);
|
||||
setPricingDetailsResults([]);
|
||||
} finally {
|
||||
setPricingDetailsLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 标签选择变化处理
|
||||
const handleLabelChange = (labelKey: string, value: string | string[]) => {
|
||||
setSelectedLabels(prev => ({
|
||||
...prev,
|
||||
[labelKey]: value
|
||||
}));
|
||||
};
|
||||
|
||||
// 计算预计时间
|
||||
const handleCalculateTimeline = async () => {
|
||||
if (Object.keys(selectedLabels).length === 0) {
|
||||
console.warn('请先选择标签');
|
||||
return;
|
||||
}
|
||||
|
||||
setTimelineLoading(true);
|
||||
try {
|
||||
const results = await apiService.calculateTimeline(selectedLabels, expectedDate);
|
||||
setTimelineResults(results);
|
||||
setTimelineVisible(true);
|
||||
} catch (error) {
|
||||
console.error('时效计算失败:', error);
|
||||
} finally {
|
||||
setTimelineLoading(false);
|
||||
}
|
||||
};
|
||||
|
||||
// 清空所有数据
|
||||
const handleClearAll = () => {
|
||||
handleClearRecords();
|
||||
setSelectedLabels({});
|
||||
setExpectedDate(null);
|
||||
setQueryResults([]);
|
||||
setSecondaryProcessResults([]);
|
||||
setPricingDetailsResults([]);
|
||||
setTimelineResults([]);
|
||||
setTimelineAdjustments({});
|
||||
};
|
||||
|
||||
return (
|
||||
<div style={{ padding: '20px', maxWidth: '1200px', margin: '0 auto' }}>
|
||||
<Title heading={2} style={{ marginBottom: '24px', textAlign: 'center' }}>
|
||||
版单数据管理系统
|
||||
</Title>
|
||||
|
||||
{/* 记录选择卡片 */}
|
||||
<RecordSelectionCard
|
||||
selectedRecords={selectedRecords}
|
||||
recordDetails={recordDetails}
|
||||
loading={loading}
|
||||
onSelectRecords={handleSelectRecords}
|
||||
onClearRecords={handleClearAll}
|
||||
/>
|
||||
|
||||
{/* 标签选择卡片 */}
|
||||
{labelOptions && Object.keys(labelOptions).length > 0 && (
|
||||
<LabelSelectionCard
|
||||
labelOptions={labelOptions}
|
||||
selectedLabels={selectedLabels}
|
||||
expectedDate={expectedDate}
|
||||
timelineLoading={timelineLoading}
|
||||
onLabelChange={handleLabelChange}
|
||||
onExpectedDateChange={setExpectedDate}
|
||||
onCalculateTimeline={handleCalculateTimeline}
|
||||
/>
|
||||
)}
|
||||
|
||||
{/* 查询结果展示 */}
|
||||
<QueryResultsDisplay
|
||||
queryResults={queryResults}
|
||||
secondaryProcessResults={secondaryProcessResults}
|
||||
pricingDetailsResults={pricingDetailsResults}
|
||||
queryLoading={queryLoading}
|
||||
secondaryProcessLoading={secondaryProcessLoading}
|
||||
pricingDetailsLoading={pricingDetailsLoading}
|
||||
/>
|
||||
|
||||
{/* 时效计算模态框 */}
|
||||
<TimelineModal
|
||||
visible={timelineVisible}
|
||||
loading={timelineLoading}
|
||||
results={timelineResults}
|
||||
adjustments={timelineAdjustments}
|
||||
onClose={() => setTimelineVisible(false)}
|
||||
onAdjustmentChange={setTimelineAdjustments}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user