提交1 bmad搭建与项目启动 - ok
This commit is contained in:
9
crop-x/src/stores/index.ts
Normal file
9
crop-x/src/stores/index.ts
Normal file
@@ -0,0 +1,9 @@
|
||||
export { useAuthStore } from './modules/auth'
|
||||
export { useMachineryStore } from './modules/machinery'
|
||||
export { useLandStore } from './modules/land'
|
||||
export { useOperationStore } from './modules/operation'
|
||||
export { useAssetStore } from './modules/asset'
|
||||
export { useAIModelStore } from './modules/ai-model'
|
||||
export { useIrrigationStore } from './modules/irrigation'
|
||||
export { useConfigStore } from './modules/config'
|
||||
export { useGlobalStore } from './modules/global'
|
||||
396
crop-x/src/stores/modules/ai-model.ts
Normal file
396
crop-x/src/stores/modules/ai-model.ts
Normal file
@@ -0,0 +1,396 @@
|
||||
import { create } from 'zustand'
|
||||
import { AIModel, ModelTraining, PredictionResult, Recommendation } from '@api/modules/ai-model'
|
||||
import { aiModelApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface AIModelState {
|
||||
// 模型数据
|
||||
modelList: AIModel[]
|
||||
selectedModel: AIModel | null
|
||||
modelLoading: boolean
|
||||
modelPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 训练数据
|
||||
trainingList: ModelTraining[]
|
||||
selectedTraining: ModelTraining | null
|
||||
trainingLoading: boolean
|
||||
trainingPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 预测数据
|
||||
predictionList: PredictionResult[]
|
||||
selectedPrediction: PredictionResult | null
|
||||
predictionLoading: boolean
|
||||
predictionPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 推荐数据
|
||||
recommendationList: Recommendation[]
|
||||
selectedRecommendation: Recommendation | null
|
||||
recommendationLoading: boolean
|
||||
recommendationPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
}
|
||||
|
||||
interface AIModelActions {
|
||||
// 模型操作
|
||||
fetchModelList: (params?: QueryRequest) => Promise<void>
|
||||
fetchModelDetail: (id: string) => Promise<void>
|
||||
createModel: (data: Omit<AIModel, 'id' | 'createdAt' | 'updatedAt' | 'accuracy' | 'status' | 'trainingDate'>) => Promise<void>
|
||||
updateModel: (id: string, data: Partial<AIModel>) => Promise<void>
|
||||
deleteModel: (id: string) => Promise<void>
|
||||
deployModel: (id: string) => Promise<void>
|
||||
setSelectedModel: (model: AIModel | null) => void
|
||||
|
||||
// 训练操作
|
||||
startTraining: (data: Omit<ModelTraining, 'id' | 'status' | 'progress' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
fetchTrainingDetail: (id: string) => Promise<void>
|
||||
fetchTrainingList: (params?: QueryRequest) => Promise<void>
|
||||
stopTraining: (id: string) => Promise<void>
|
||||
setSelectedTraining: (training: ModelTraining | null) => void
|
||||
|
||||
// 预测操作
|
||||
makePrediction: (data: { modelId: string; inputData: Record<string, any>; options?: any }) => Promise<void>
|
||||
fetchPredictionHistory: (params?: QueryRequest) => Promise<void>
|
||||
fetchPredictionDetail: (id: string) => Promise<void>
|
||||
setSelectedPrediction: (prediction: PredictionResult | null) => void
|
||||
|
||||
// 推荐操作
|
||||
fetchRecommendations: (params?: QueryRequest & { type?: string; landParcelId?: string }) => Promise<void>
|
||||
applyRecommendation: (id: string) => Promise<void>
|
||||
dismissRecommendation: (id: string, reason: string) => Promise<void>
|
||||
setSelectedRecommendation: (recommendation: Recommendation | null) => void
|
||||
}
|
||||
|
||||
export const useAIModelStore = create<AIModelState & AIModelActions>((set, get) => ({
|
||||
// 初始状态
|
||||
modelList: [],
|
||||
selectedModel: null,
|
||||
modelLoading: false,
|
||||
modelPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
trainingList: [],
|
||||
selectedTraining: null,
|
||||
trainingLoading: false,
|
||||
trainingPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
predictionList: [],
|
||||
selectedPrediction: null,
|
||||
predictionLoading: false,
|
||||
predictionPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
recommendationList: [],
|
||||
selectedRecommendation: null,
|
||||
recommendationLoading: false,
|
||||
recommendationPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
// 模型操作
|
||||
fetchModelList: async (params) => {
|
||||
try {
|
||||
set({ modelLoading: true })
|
||||
const response = await aiModelApi.getModelList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
modelList: response.data.items,
|
||||
modelPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
modelLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取模型列表失败:', error)
|
||||
set({ modelLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchModelDetail: async (id) => {
|
||||
try {
|
||||
set({ modelLoading: true })
|
||||
const response = await aiModelApi.getModelDetail(id)
|
||||
set({
|
||||
selectedModel: response.data,
|
||||
modelLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取模型详情失败:', error)
|
||||
set({ modelLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createModel: async (data) => {
|
||||
try {
|
||||
const response = await aiModelApi.createModel(data)
|
||||
const currentList = get().modelList
|
||||
set({
|
||||
modelList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建模型失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateModel: async (id, data) => {
|
||||
try {
|
||||
const response = await aiModelApi.updateModel(id, data)
|
||||
const currentList = get().modelList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
modelList: updatedList,
|
||||
selectedModel: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新模型失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteModel: async (id) => {
|
||||
try {
|
||||
await aiModelApi.deleteModel(id)
|
||||
const currentList = get().modelList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
modelList: updatedList,
|
||||
selectedModel: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除模型失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deployModel: async (id) => {
|
||||
try {
|
||||
const response = await aiModelApi.deployModel(id)
|
||||
const currentList = get().modelList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
modelList: updatedList,
|
||||
selectedModel: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('部署模型失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedModel: (model) => set({ selectedModel: model }),
|
||||
|
||||
// 训练操作
|
||||
startTraining: async (data) => {
|
||||
try {
|
||||
const response = await aiModelApi.startTraining(data)
|
||||
const currentList = get().trainingList
|
||||
set({
|
||||
trainingList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('开始训练失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
fetchTrainingDetail: async (id) => {
|
||||
try {
|
||||
set({ trainingLoading: true })
|
||||
const response = await aiModelApi.getTrainingDetail(id)
|
||||
set({
|
||||
selectedTraining: response.data,
|
||||
trainingLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取训练详情失败:', error)
|
||||
set({ trainingLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchTrainingList: async (params) => {
|
||||
try {
|
||||
set({ trainingLoading: true })
|
||||
const response = await aiModelApi.getTrainingList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
trainingList: response.data.items,
|
||||
trainingPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
trainingLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取训练列表失败:', error)
|
||||
set({ trainingLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
stopTraining: async (id) => {
|
||||
try {
|
||||
await aiModelApi.stopTraining(id)
|
||||
const currentList = get().trainingList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? { ...item, status: 'completed' as const } : item
|
||||
)
|
||||
set({
|
||||
trainingList: updatedList,
|
||||
selectedTraining: get().selectedTraining?.id === id
|
||||
? { ...get().selectedTraining, status: 'completed' as const }
|
||||
: get().selectedTraining
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('停止训练失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedTraining: (training) => set({ selectedTraining: training }),
|
||||
|
||||
// 预测操作
|
||||
makePrediction: async (data) => {
|
||||
try {
|
||||
set({ predictionLoading: true })
|
||||
const response = await aiModelApi.makePrediction(data)
|
||||
const currentList = get().predictionList
|
||||
set({
|
||||
predictionList: [response.data, ...currentList],
|
||||
predictionLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('预测失败:', error)
|
||||
set({ predictionLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchPredictionHistory: async (params) => {
|
||||
try {
|
||||
set({ predictionLoading: true })
|
||||
const response = await aiModelApi.getPredictionHistory({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
predictionList: response.data.items,
|
||||
predictionPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
predictionLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取预测历史失败:', error)
|
||||
set({ predictionLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchPredictionDetail: async (id) => {
|
||||
try {
|
||||
set({ predictionLoading: true })
|
||||
const response = await aiModelApi.getPredictionDetail(id)
|
||||
set({
|
||||
selectedPrediction: response.data,
|
||||
predictionLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取预测详情失败:', error)
|
||||
set({ predictionLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedPrediction: (prediction) => set({ selectedPrediction: prediction }),
|
||||
|
||||
// 推荐操作
|
||||
fetchRecommendations: async (params) => {
|
||||
try {
|
||||
set({ recommendationLoading: true })
|
||||
const response = await aiModelApi.getRecommendations({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
recommendationList: response.data.items,
|
||||
recommendationPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
recommendationLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取推荐列表失败:', error)
|
||||
set({ recommendationLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
applyRecommendation: async (id) => {
|
||||
try {
|
||||
const response = await aiModelApi.applyRecommendation(id)
|
||||
const currentList = get().recommendationList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
recommendationList: updatedList,
|
||||
selectedRecommendation: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('应用推荐失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
dismissRecommendation: async (id, reason) => {
|
||||
try {
|
||||
const response = await aiModelApi.dismissRecommendation(id, reason)
|
||||
const currentList = get().recommendationList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
recommendationList: updatedList,
|
||||
selectedRecommendation: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('忽略推荐失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedRecommendation: (recommendation) => set({ selectedRecommendation: recommendation })
|
||||
}))
|
||||
370
crop-x/src/stores/modules/asset.ts
Normal file
370
crop-x/src/stores/modules/asset.ts
Normal file
@@ -0,0 +1,370 @@
|
||||
import { create } from 'zustand'
|
||||
import { AgriculturalAsset, MaintenanceRecord, AssetInventory } from '@api/modules/asset'
|
||||
import { assetApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface AssetState {
|
||||
// 资产数据
|
||||
assetList: AgriculturalAsset[]
|
||||
selectedAsset: AgriculturalAsset | null
|
||||
assetLoading: boolean
|
||||
assetError: string | null
|
||||
assetPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 维护记录数据
|
||||
maintenanceList: MaintenanceRecord[]
|
||||
selectedMaintenance: MaintenanceRecord | null
|
||||
maintenanceLoading: boolean
|
||||
maintenancePagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 库存数据
|
||||
inventoryList: AssetInventory[]
|
||||
selectedInventory: AssetInventory | null
|
||||
inventoryLoading: boolean
|
||||
inventoryPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
}
|
||||
|
||||
interface AssetActions {
|
||||
// 资产操作
|
||||
fetchAssetList: (params?: QueryRequest) => Promise<void>
|
||||
fetchAssetDetail: (id: string) => Promise<void>
|
||||
createAsset: (data: Omit<AgriculturalAsset, 'id' | 'createdAt' | 'updatedAt' | 'currentValue'>) => Promise<void>
|
||||
updateAsset: (id: string, data: Partial<AgriculturalAsset>) => Promise<void>
|
||||
deleteAsset: (id: string) => Promise<void>
|
||||
calculateDepreciation: (id: string, date: string) => Promise<void>
|
||||
setSelectedAsset: (asset: AgriculturalAsset | null) => void
|
||||
clearAssetError: () => void
|
||||
|
||||
// 维护记录操作
|
||||
fetchMaintenanceRecords: (params?: QueryRequest) => Promise<void>
|
||||
fetchMaintenanceDetail: (id: string) => Promise<void>
|
||||
createMaintenanceRecord: (data: Omit<MaintenanceRecord, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateMaintenanceRecord: (id: string, data: Partial<MaintenanceRecord>) => Promise<void>
|
||||
deleteMaintenanceRecord: (id: string) => Promise<void>
|
||||
|
||||
// 库存操作
|
||||
fetchInventoryList: (params?: QueryRequest) => Promise<void>
|
||||
fetchInventoryDetail: (id: string) => Promise<void>
|
||||
createInventoryRecord: (data: Omit<AssetInventory, 'id' | 'createdAt' | 'updatedAt' | 'variance'>) => Promise<void>
|
||||
updateInventoryRecord: (id: string, data: Partial<AssetInventory>) => Promise<void>
|
||||
verifyInventory: (id: string, verifiedBy: string) => Promise<void>
|
||||
}
|
||||
|
||||
export const useAssetStore = create<AssetState & AssetActions>((set, get) => ({
|
||||
// 初始状态
|
||||
assetList: [],
|
||||
selectedAsset: null,
|
||||
assetLoading: false,
|
||||
assetError: null,
|
||||
assetPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
maintenanceList: [],
|
||||
selectedMaintenance: null,
|
||||
maintenanceLoading: false,
|
||||
maintenancePagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
inventoryList: [],
|
||||
selectedInventory: null,
|
||||
inventoryLoading: false,
|
||||
inventoryPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
// 资产操作
|
||||
fetchAssetList: async (params) => {
|
||||
try {
|
||||
set({ assetLoading: true, assetError: null })
|
||||
const response = await assetApi.getAssetList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
assetList: response.data.items,
|
||||
assetPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
assetLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '获取资产列表失败',
|
||||
assetLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
fetchAssetDetail: async (id) => {
|
||||
try {
|
||||
set({ assetLoading: true, assetError: null })
|
||||
const response = await assetApi.getAssetDetail(id)
|
||||
set({
|
||||
selectedAsset: response.data,
|
||||
assetLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '获取资产详情失败',
|
||||
assetLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
createAsset: async (data) => {
|
||||
try {
|
||||
const response = await assetApi.createAsset(data)
|
||||
const currentList = get().assetList
|
||||
set({
|
||||
assetList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '创建资产失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateAsset: async (id, data) => {
|
||||
try {
|
||||
const response = await assetApi.updateAsset(id, data)
|
||||
const currentList = get().assetList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
assetList: updatedList,
|
||||
selectedAsset: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '更新资产失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
deleteAsset: async (id) => {
|
||||
try {
|
||||
await assetApi.deleteAsset(id)
|
||||
const currentList = get().assetList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
assetList: updatedList,
|
||||
selectedAsset: null
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '删除资产失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
calculateDepreciation: async (id, date) => {
|
||||
try {
|
||||
const response = await assetApi.calculateDepreciation(id, date)
|
||||
const currentList = get().assetList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? { ...item, currentValue: response.data.currentValue } : item
|
||||
)
|
||||
set({
|
||||
assetList: updatedList,
|
||||
selectedAsset: get().selectedAsset?.id === id
|
||||
? { ...get().selectedAsset, currentValue: response.data.currentValue }
|
||||
: get().selectedAsset
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
assetError: error instanceof Error ? error.message : '计算折旧失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedAsset: (asset) => set({ selectedAsset: asset }),
|
||||
clearAssetError: () => set({ assetError: null }),
|
||||
|
||||
// 维护记录操作
|
||||
fetchMaintenanceRecords: async (params) => {
|
||||
try {
|
||||
set({ maintenanceLoading: true })
|
||||
const response = await assetApi.getMaintenanceRecords({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
maintenanceList: response.data.items,
|
||||
maintenancePagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
maintenanceLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取维护记录失败:', error)
|
||||
set({ maintenanceLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchMaintenanceDetail: async (id) => {
|
||||
try {
|
||||
set({ maintenanceLoading: true })
|
||||
const response = await assetApi.getMaintenanceDetail(id)
|
||||
set({
|
||||
selectedMaintenance: response.data,
|
||||
maintenanceLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取维护记录详情失败:', error)
|
||||
set({ maintenanceLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createMaintenanceRecord: async (data) => {
|
||||
try {
|
||||
const response = await assetApi.createMaintenanceRecord(data)
|
||||
const currentList = get().maintenanceList
|
||||
set({
|
||||
maintenanceList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建维护记录失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateMaintenanceRecord: async (id, data) => {
|
||||
try {
|
||||
const response = await assetApi.updateMaintenanceRecord(id, data)
|
||||
const currentList = get().maintenanceList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
maintenanceList: updatedList,
|
||||
selectedMaintenance: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新维护记录失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteMaintenanceRecord: async (id) => {
|
||||
try {
|
||||
await assetApi.deleteMaintenanceRecord(id)
|
||||
const currentList = get().maintenanceList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
maintenanceList: updatedList,
|
||||
selectedMaintenance: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除维护记录失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 库存操作
|
||||
fetchInventoryList: async (params) => {
|
||||
try {
|
||||
set({ inventoryLoading: true })
|
||||
const response = await assetApi.getInventoryList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
inventoryList: response.data.items,
|
||||
inventoryPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
inventoryLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取库存列表失败:', error)
|
||||
set({ inventoryLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchInventoryDetail: async (id) => {
|
||||
try {
|
||||
set({ inventoryLoading: true })
|
||||
const response = await assetApi.getInventoryDetail(id)
|
||||
set({
|
||||
selectedInventory: response.data,
|
||||
inventoryLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取库存详情失败:', error)
|
||||
set({ inventoryLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createInventoryRecord: async (data) => {
|
||||
try {
|
||||
const response = await assetApi.createInventoryRecord(data)
|
||||
const currentList = get().inventoryList
|
||||
set({
|
||||
inventoryList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建库存记录失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateInventoryRecord: async (id, data) => {
|
||||
try {
|
||||
const response = await assetApi.updateInventoryRecord(id, data)
|
||||
const currentList = get().inventoryList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
inventoryList: updatedList,
|
||||
selectedInventory: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新库存记录失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
verifyInventory: async (id, verifiedBy) => {
|
||||
try {
|
||||
const response = await assetApi.verifyInventory(id, verifiedBy)
|
||||
const currentList = get().inventoryList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
inventoryList: updatedList,
|
||||
selectedInventory: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('验证库存失败:', error)
|
||||
}
|
||||
}
|
||||
}))
|
||||
150
crop-x/src/stores/modules/auth.ts
Normal file
150
crop-x/src/stores/modules/auth.ts
Normal file
@@ -0,0 +1,150 @@
|
||||
import { create } from 'zustand'
|
||||
import { persist } from 'zustand/middleware'
|
||||
import { User, LoginRequest, PhoneLoginRequest, LoginResponse } from '@api/modules/auth'
|
||||
import { authApi } from '@api'
|
||||
|
||||
interface AuthState {
|
||||
user: User | null
|
||||
token: string | null
|
||||
refreshToken: string | null
|
||||
isAuthenticated: boolean
|
||||
isLoading: boolean
|
||||
error: string | null
|
||||
}
|
||||
|
||||
interface AuthActions {
|
||||
login: (credentials: LoginRequest) => Promise<void>
|
||||
loginByPhone: (credentials: PhoneLoginRequest) => Promise<void>
|
||||
logout: () => void
|
||||
refreshToken: () => Promise<void>
|
||||
getUserInfo: () => Promise<void>
|
||||
updateUserInfo: (data: Partial<User>) => Promise<void>
|
||||
clearError: () => void
|
||||
setLoading: (loading: boolean) => void
|
||||
}
|
||||
|
||||
export const useAuthStore = create<AuthState & AuthActions>()(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
// State
|
||||
user: null,
|
||||
token: null,
|
||||
refreshToken: null,
|
||||
isAuthenticated: false,
|
||||
isLoading: false,
|
||||
error: null,
|
||||
|
||||
// Actions
|
||||
login: async (credentials) => {
|
||||
try {
|
||||
set({ isLoading: true, error: null })
|
||||
const response = await authApi.login(credentials)
|
||||
const { token, refreshToken, user } = response.data
|
||||
|
||||
localStorage.setItem('token', token)
|
||||
localStorage.setItem('refreshToken', refreshToken)
|
||||
|
||||
set({
|
||||
user,
|
||||
token,
|
||||
refreshToken,
|
||||
isAuthenticated: true,
|
||||
isLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
error: error instanceof Error ? error.message : '登录失败',
|
||||
isLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
loginByPhone: async (credentials) => {
|
||||
try {
|
||||
set({ isLoading: true, error: null })
|
||||
const response = await authApi.loginByPhone(credentials)
|
||||
const { token, refreshToken, user } = response.data
|
||||
|
||||
localStorage.setItem('token', token)
|
||||
localStorage.setItem('refreshToken', refreshToken)
|
||||
|
||||
set({
|
||||
user,
|
||||
token,
|
||||
refreshToken,
|
||||
isAuthenticated: true,
|
||||
isLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
error: error instanceof Error ? error.message : '登录失败',
|
||||
isLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
logout: () => {
|
||||
localStorage.removeItem('token')
|
||||
localStorage.removeItem('refreshToken')
|
||||
set({
|
||||
user: null,
|
||||
token: null,
|
||||
refreshToken: null,
|
||||
isAuthenticated: false,
|
||||
error: null
|
||||
})
|
||||
},
|
||||
|
||||
refreshToken: async () => {
|
||||
try {
|
||||
const { refreshToken } = get()
|
||||
if (!refreshToken) {
|
||||
get().logout()
|
||||
return
|
||||
}
|
||||
|
||||
const response = await authApi.refreshToken(refreshToken)
|
||||
const { token } = response.data
|
||||
|
||||
localStorage.setItem('token', token)
|
||||
set({ token })
|
||||
} catch (error) {
|
||||
get().logout()
|
||||
}
|
||||
},
|
||||
|
||||
getUserInfo: async () => {
|
||||
try {
|
||||
const response = await authApi.getUserInfo()
|
||||
set({ user: response.data })
|
||||
} catch (error) {
|
||||
console.error('获取用户信息失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateUserInfo: async (data) => {
|
||||
try {
|
||||
const response = await authApi.updateUserInfo(data)
|
||||
set({ user: response.data })
|
||||
} catch (error) {
|
||||
set({
|
||||
error: error instanceof Error ? error.message : '更新用户信息失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
clearError: () => set({ error: null }),
|
||||
|
||||
setLoading: (loading) => set({ isLoading: loading })
|
||||
}),
|
||||
{
|
||||
name: 'auth-storage',
|
||||
partialize: (state) => ({
|
||||
user: state.user,
|
||||
token: state.token,
|
||||
refreshToken: state.refreshToken,
|
||||
isAuthenticated: state.isAuthenticated
|
||||
})
|
||||
}
|
||||
)
|
||||
)
|
||||
675
crop-x/src/stores/modules/config.ts
Normal file
675
crop-x/src/stores/modules/config.ts
Normal file
@@ -0,0 +1,675 @@
|
||||
import { create } from 'zustand'
|
||||
import {
|
||||
Tenant,
|
||||
User,
|
||||
SystemParameter,
|
||||
SystemLog,
|
||||
Message
|
||||
} from '@api/modules/config'
|
||||
import { configApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface ConfigState {
|
||||
// 租户数据
|
||||
tenantList: Tenant[]
|
||||
selectedTenant: Tenant | null
|
||||
tenantLoading: boolean
|
||||
tenantPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 用户数据
|
||||
userList: User[]
|
||||
selectedUser: User | null
|
||||
userLoading: boolean
|
||||
userPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 系统参数数据
|
||||
parameterList: SystemParameter[]
|
||||
selectedParameter: SystemParameter | null
|
||||
parameterLoading: boolean
|
||||
parameterPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 系统日志数据
|
||||
logList: SystemLog[]
|
||||
logLoading: boolean
|
||||
logPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 消息数据
|
||||
messageList: Message[]
|
||||
selectedMessage: Message | null
|
||||
messageLoading: boolean
|
||||
messagePagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
unreadCount: number
|
||||
|
||||
// 系统指标数据
|
||||
systemMetrics: {
|
||||
totalUsers: number
|
||||
activeUsers: number
|
||||
totalTenants: number
|
||||
activeTenants: number
|
||||
systemUptime: number
|
||||
cpuUsage: number
|
||||
memoryUsage: number
|
||||
diskUsage: number
|
||||
databaseConnections: number
|
||||
} | null
|
||||
|
||||
systemHealth: {
|
||||
status: 'healthy' | 'warning' | 'critical'
|
||||
services: Array<{
|
||||
name: string
|
||||
status: 'up' | 'down'
|
||||
responseTime: number
|
||||
lastCheck: string
|
||||
}>
|
||||
issues: Array<{
|
||||
type: 'error' | 'warning'
|
||||
message: string
|
||||
timestamp: string
|
||||
}>
|
||||
} | null
|
||||
}
|
||||
|
||||
interface ConfigActions {
|
||||
// 租户操作
|
||||
fetchTenantList: (params?: QueryRequest) => Promise<void>
|
||||
fetchTenantDetail: (id: string) => Promise<void>
|
||||
createTenant: (data: Omit<Tenant, 'id' | 'createdAt' | 'updatedAt' | 'currentUsers'>) => Promise<void>
|
||||
updateTenant: (id: string, data: Partial<Tenant>) => Promise<void>
|
||||
deleteTenant: (id: string) => Promise<void>
|
||||
suspendTenant: (id: string) => Promise<void>
|
||||
activateTenant: (id: string) => Promise<void>
|
||||
setSelectedTenant: (tenant: Tenant | null) => void
|
||||
|
||||
// 用户操作
|
||||
fetchUserList: (params?: QueryRequest) => Promise<void>
|
||||
fetchUserDetail: (id: string) => Promise<void>
|
||||
createUser: (data: Omit<User, 'id' | 'createdAt' | 'updatedAt' | 'lastLoginAt'>) => Promise<void>
|
||||
updateUser: (id: string, data: Partial<User>) => Promise<void>
|
||||
deleteUser: (id: string) => Promise<void>
|
||||
resetPassword: (id: string, newPassword: string) => Promise<void>
|
||||
lockUser: (id: string) => Promise<void>
|
||||
unlockUser: (id: string) => Promise<void>
|
||||
setSelectedUser: (user: User | null) => void
|
||||
|
||||
// 系统参数操作
|
||||
fetchParameterList: (params?: QueryRequest) => Promise<void>
|
||||
fetchParameterDetail: (id: string) => Promise<void>
|
||||
createParameter: (data: Omit<SystemParameter, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateParameter: (id: string, data: Partial<SystemParameter>) => Promise<void>
|
||||
deleteParameter: (id: string) => Promise<void>
|
||||
getParametersByCategory: (category: string) => Promise<void>
|
||||
setSelectedParameter: (parameter: SystemParameter | null) => void
|
||||
|
||||
// 系统监控操作
|
||||
fetchSystemLogs: (params?: QueryRequest & { level?: string; category?: string }) => Promise<void>
|
||||
fetchSystemMetrics: () => Promise<void>
|
||||
fetchSystemHealth: () => Promise<void>
|
||||
|
||||
// 消息操作
|
||||
fetchMessageList: (params?: QueryRequest) => Promise<void>
|
||||
fetchMessageDetail: (id: string) => Promise<void>
|
||||
createMessage: (data: Omit<Message, 'id' | 'createdAt' | 'readAt' | 'status'>) => Promise<void>
|
||||
markMessageAsRead: (id: string) => Promise<void>
|
||||
archiveMessage: (id: string) => Promise<void>
|
||||
deleteMessage: (id: string) => Promise<void>
|
||||
getUnreadCount: () => Promise<void>
|
||||
setSelectedMessage: (message: Message | null) => void
|
||||
}
|
||||
|
||||
export const useConfigStore = create<ConfigState & ConfigActions>((set, get) => ({
|
||||
// 初始状态
|
||||
tenantList: [],
|
||||
selectedTenant: null,
|
||||
tenantLoading: false,
|
||||
tenantPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
userList: [],
|
||||
selectedUser: null,
|
||||
userLoading: false,
|
||||
userPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
parameterList: [],
|
||||
selectedParameter: null,
|
||||
parameterLoading: false,
|
||||
parameterPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
logList: [],
|
||||
logLoading: false,
|
||||
logPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
messageList: [],
|
||||
selectedMessage: null,
|
||||
messageLoading: false,
|
||||
messagePagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
unreadCount: 0,
|
||||
|
||||
systemMetrics: null,
|
||||
systemHealth: null,
|
||||
|
||||
// 租户操作
|
||||
fetchTenantList: async (params) => {
|
||||
try {
|
||||
set({ tenantLoading: true })
|
||||
const response = await configApi.getTenantList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
tenantList: response.data.items,
|
||||
tenantPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
tenantLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取租户列表失败:', error)
|
||||
set({ tenantLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchTenantDetail: async (id) => {
|
||||
try {
|
||||
set({ tenantLoading: true })
|
||||
const response = await configApi.getTenantDetail(id)
|
||||
set({
|
||||
selectedTenant: response.data,
|
||||
tenantLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取租户详情失败:', error)
|
||||
set({ tenantLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createTenant: async (data) => {
|
||||
try {
|
||||
const response = await configApi.createTenant(data)
|
||||
const currentList = get().tenantList
|
||||
set({
|
||||
tenantList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建租户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateTenant: async (id, data) => {
|
||||
try {
|
||||
const response = await configApi.updateTenant(id, data)
|
||||
const currentList = get().tenantList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
tenantList: updatedList,
|
||||
selectedTenant: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新租户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteTenant: async (id) => {
|
||||
try {
|
||||
await configApi.deleteTenant(id)
|
||||
const currentList = get().tenantList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
tenantList: updatedList,
|
||||
selectedTenant: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除租户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
suspendTenant: async (id) => {
|
||||
try {
|
||||
const response = await configApi.suspendTenant(id)
|
||||
const currentList = get().tenantList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
tenantList: updatedList,
|
||||
selectedTenant: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('暂停租户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
activateTenant: async (id) => {
|
||||
try {
|
||||
const response = await configApi.activateTenant(id)
|
||||
const currentList = get().tenantList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
tenantList: updatedList,
|
||||
selectedTenant: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('激活租户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedTenant: (tenant) => set({ selectedTenant: tenant }),
|
||||
|
||||
// 用户操作
|
||||
fetchUserList: async (params) => {
|
||||
try {
|
||||
set({ userLoading: true })
|
||||
const response = await configApi.getUserList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
userList: response.data.items,
|
||||
userPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
userLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取用户列表失败:', error)
|
||||
set({ userLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchUserDetail: async (id) => {
|
||||
try {
|
||||
set({ userLoading: true })
|
||||
const response = await configApi.getUserDetail(id)
|
||||
set({
|
||||
selectedUser: response.data,
|
||||
userLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取用户详情失败:', error)
|
||||
set({ userLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createUser: async (data) => {
|
||||
try {
|
||||
const response = await configApi.createUser(data)
|
||||
const currentList = get().userList
|
||||
set({
|
||||
userList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建用户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateUser: async (id, data) => {
|
||||
try {
|
||||
const response = await configApi.updateUser(id, data)
|
||||
const currentList = get().userList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
userList: updatedList,
|
||||
selectedUser: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新用户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteUser: async (id) => {
|
||||
try {
|
||||
await configApi.deleteUser(id)
|
||||
const currentList = get().userList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
userList: updatedList,
|
||||
selectedUser: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除用户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
resetPassword: async (id, newPassword) => {
|
||||
try {
|
||||
await configApi.resetPassword(id, newPassword)
|
||||
} catch (error) {
|
||||
console.error('重置密码失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
lockUser: async (id) => {
|
||||
try {
|
||||
const response = await configApi.lockUser(id)
|
||||
const currentList = get().userList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
userList: updatedList,
|
||||
selectedUser: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('锁定用户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
unlockUser: async (id) => {
|
||||
try {
|
||||
const response = await configApi.unlockUser(id)
|
||||
const currentList = get().userList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
userList: updatedList,
|
||||
selectedUser: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('解锁用户失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedUser: (user) => set({ selectedUser: user }),
|
||||
|
||||
// 系统参数操作
|
||||
fetchParameterList: async (params) => {
|
||||
try {
|
||||
set({ parameterLoading: true })
|
||||
const response = await configApi.getParameterList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
parameterList: response.data.items,
|
||||
parameterPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
parameterLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取系统参数列表失败:', error)
|
||||
set({ parameterLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchParameterDetail: async (id) => {
|
||||
try {
|
||||
set({ parameterLoading: true })
|
||||
const response = await configApi.getParameterDetail(id)
|
||||
set({
|
||||
selectedParameter: response.data,
|
||||
parameterLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取系统参数详情失败:', error)
|
||||
set({ parameterLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createParameter: async (data) => {
|
||||
try {
|
||||
const response = await configApi.createParameter(data)
|
||||
const currentList = get().parameterList
|
||||
set({
|
||||
parameterList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建系统参数失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateParameter: async (id, data) => {
|
||||
try {
|
||||
const response = await configApi.updateParameter(id, data)
|
||||
const currentList = get().parameterList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
parameterList: updatedList,
|
||||
selectedParameter: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新系统参数失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteParameter: async (id) => {
|
||||
try {
|
||||
await configApi.deleteParameter(id)
|
||||
const currentList = get().parameterList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
parameterList: updatedList,
|
||||
selectedParameter: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除系统参数失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
getParametersByCategory: async (category) => {
|
||||
try {
|
||||
set({ parameterLoading: true })
|
||||
const response = await configApi.getParametersByCategory(category)
|
||||
set({
|
||||
parameterList: response.data,
|
||||
parameterLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取分类参数失败:', error)
|
||||
set({ parameterLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedParameter: (parameter) => set({ selectedParameter: parameter }),
|
||||
|
||||
// 系统监控操作
|
||||
fetchSystemLogs: async (params) => {
|
||||
try {
|
||||
set({ logLoading: true })
|
||||
const response = await configApi.getSystemLogs({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
logList: response.data.items,
|
||||
logPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
logLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取系统日志失败:', error)
|
||||
set({ logLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchSystemMetrics: async () => {
|
||||
try {
|
||||
const response = await configApi.getSystemMetrics()
|
||||
set({
|
||||
systemMetrics: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取系统指标失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
fetchSystemHealth: async () => {
|
||||
try {
|
||||
const response = await configApi.getSystemHealth()
|
||||
set({
|
||||
systemHealth: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取系统健康状态失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 消息操作
|
||||
fetchMessageList: async (params) => {
|
||||
try {
|
||||
set({ messageLoading: true })
|
||||
const response = await configApi.getMessageList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
messageList: response.data.items,
|
||||
messagePagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
messageLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取消息列表失败:', error)
|
||||
set({ messageLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchMessageDetail: async (id) => {
|
||||
try {
|
||||
set({ messageLoading: true })
|
||||
const response = await configApi.getMessageDetail(id)
|
||||
set({
|
||||
selectedMessage: response.data,
|
||||
messageLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取消息详情失败:', error)
|
||||
set({ messageLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createMessage: async (data) => {
|
||||
try {
|
||||
const response = await configApi.createMessage(data)
|
||||
const currentList = get().messageList
|
||||
set({
|
||||
messageList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建消息失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
markMessageAsRead: async (id) => {
|
||||
try {
|
||||
const response = await configApi.markMessageAsRead(id)
|
||||
const currentList = get().messageList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
messageList: updatedList,
|
||||
selectedMessage: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('标记消息已读失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
archiveMessage: async (id) => {
|
||||
try {
|
||||
const response = await configApi.archiveMessage(id)
|
||||
const currentList = get().messageList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
messageList: updatedList,
|
||||
selectedMessage: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('归档消息失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteMessage: async (id) => {
|
||||
try {
|
||||
await configApi.deleteMessage(id)
|
||||
const currentList = get().messageList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
messageList: updatedList,
|
||||
selectedMessage: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除消息失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
getUnreadCount: async () => {
|
||||
try {
|
||||
const response = await configApi.getUnreadCount()
|
||||
set({
|
||||
unreadCount: response.data.count
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取未读消息数量失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedMessage: (message) => set({ selectedMessage: message })
|
||||
}))
|
||||
145
crop-x/src/stores/modules/global.ts
Normal file
145
crop-x/src/stores/modules/global.ts
Normal file
@@ -0,0 +1,145 @@
|
||||
import { create } from 'zustand'
|
||||
import { persist } from 'zustand/middleware'
|
||||
|
||||
interface GlobalState {
|
||||
// 主题设置
|
||||
theme: 'light' | 'dark' | 'auto'
|
||||
|
||||
// 语言设置
|
||||
language: 'zh-CN' | 'en-US'
|
||||
|
||||
// 侧边栏状态
|
||||
sidebarCollapsed: boolean
|
||||
|
||||
// 全局加载状态
|
||||
globalLoading: boolean
|
||||
|
||||
// 面包屑导航
|
||||
breadcrumbs: Array<{
|
||||
title: string
|
||||
path?: string
|
||||
}>
|
||||
|
||||
// 通知消息
|
||||
notifications: Array<{
|
||||
id: string
|
||||
type: 'success' | 'error' | 'warning' | 'info'
|
||||
title: string
|
||||
message: string
|
||||
duration?: number
|
||||
timestamp: number
|
||||
}>
|
||||
|
||||
// 当前选中的租户(如果是多租户系统)
|
||||
currentTenant: {
|
||||
id: string
|
||||
name: string
|
||||
code: string
|
||||
} | null
|
||||
}
|
||||
|
||||
interface GlobalActions {
|
||||
// 主题操作
|
||||
setTheme: (theme: 'light' | 'dark' | 'auto') => void
|
||||
|
||||
// 语言操作
|
||||
setLanguage: (language: 'zh-CN' | 'en-US') => void
|
||||
|
||||
// 侧边栏操作
|
||||
toggleSidebar: () => void
|
||||
setSidebarCollapsed: (collapsed: boolean) => void
|
||||
|
||||
// 全局加载状态
|
||||
setGlobalLoading: (loading: boolean) => void
|
||||
|
||||
// 面包屑操作
|
||||
setBreadcrumbs: (breadcrumbs: Array<{ title: string; path?: string }>) => void
|
||||
addBreadcrumb: (breadcrumb: { title: string; path?: string }) => void
|
||||
|
||||
// 通知操作
|
||||
addNotification: (notification: {
|
||||
type: 'success' | 'error' | 'warning' | 'info'
|
||||
title: string
|
||||
message: string
|
||||
duration?: number
|
||||
}) => void
|
||||
removeNotification: (id: string) => void
|
||||
clearNotifications: () => void
|
||||
|
||||
// 租户操作
|
||||
setCurrentTenant: (tenant: { id: string; name: string; code: string } | null) => void
|
||||
}
|
||||
|
||||
export const useGlobalStore = create<GlobalState & GlobalActions>()(
|
||||
persist(
|
||||
(set, get) => ({
|
||||
// 初始状态
|
||||
theme: 'light',
|
||||
language: 'zh-CN',
|
||||
sidebarCollapsed: false,
|
||||
globalLoading: false,
|
||||
breadcrumbs: [],
|
||||
notifications: [],
|
||||
currentTenant: null,
|
||||
|
||||
// 主题操作
|
||||
setTheme: (theme) => set({ theme }),
|
||||
|
||||
// 语言操作
|
||||
setLanguage: (language) => set({ language }),
|
||||
|
||||
// 侧边栏操作
|
||||
toggleSidebar: () => set((state) => ({ sidebarCollapsed: !state.sidebarCollapsed })),
|
||||
setSidebarCollapsed: (collapsed) => set({ sidebarCollapsed: collapsed }),
|
||||
|
||||
// 全局加载状态
|
||||
setGlobalLoading: (loading) => set({ globalLoading: loading }),
|
||||
|
||||
// 面包屑操作
|
||||
setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),
|
||||
addBreadcrumb: (breadcrumb) => set((state) => ({
|
||||
breadcrumbs: [...state.breadcrumbs, breadcrumb]
|
||||
})),
|
||||
|
||||
// 通知操作
|
||||
addNotification: (notification) => {
|
||||
const id = Date.now().toString()
|
||||
const newNotification = {
|
||||
...notification,
|
||||
id,
|
||||
timestamp: Date.now(),
|
||||
duration: notification.duration || 4500
|
||||
}
|
||||
|
||||
set((state) => ({
|
||||
notifications: [...state.notifications, newNotification]
|
||||
}))
|
||||
|
||||
// 自动移除通知
|
||||
if (newNotification.duration && newNotification.duration > 0) {
|
||||
setTimeout(() => {
|
||||
get().removeNotification(id)
|
||||
}, newNotification.duration)
|
||||
}
|
||||
},
|
||||
|
||||
removeNotification: (id) => set((state) => ({
|
||||
notifications: state.notifications.filter(n => n.id !== id)
|
||||
})),
|
||||
|
||||
clearNotifications: () => set({ notifications: [] }),
|
||||
|
||||
// 租户操作
|
||||
setCurrentTenant: (tenant) => set({ currentTenant: tenant })
|
||||
}),
|
||||
{
|
||||
name: 'global-storage',
|
||||
partialize: (state) => ({
|
||||
theme: state.theme,
|
||||
language: state.language,
|
||||
sidebarCollapsed: state.sidebarCollapsed,
|
||||
currentTenant: state.currentTenant
|
||||
})
|
||||
}
|
||||
)
|
||||
)
|
||||
458
crop-x/src/stores/modules/irrigation.ts
Normal file
458
crop-x/src/stores/modules/irrigation.ts
Normal file
@@ -0,0 +1,458 @@
|
||||
import { create } from 'zustand'
|
||||
import {
|
||||
IrrigationSystem,
|
||||
IrrigationZone,
|
||||
IrrigationSchedule,
|
||||
MonitoringData,
|
||||
ControlCommand
|
||||
} from '@api/modules/irrigation'
|
||||
import { irrigationApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface IrrigationState {
|
||||
// 系统数据
|
||||
systemList: IrrigationSystem[]
|
||||
selectedSystem: IrrigationSystem | null
|
||||
systemLoading: boolean
|
||||
systemPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 分区数据
|
||||
zoneList: IrrigationZone[]
|
||||
selectedZone: IrrigationZone | null
|
||||
zoneLoading: boolean
|
||||
|
||||
// 调度数据
|
||||
scheduleList: IrrigationSchedule[]
|
||||
selectedSchedule: IrrigationSchedule | null
|
||||
scheduleLoading: boolean
|
||||
schedulePagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 监控数据
|
||||
monitoringData: MonitoringData[]
|
||||
realTimeData: MonitoringData[]
|
||||
monitoringLoading: boolean
|
||||
|
||||
// 控制命令
|
||||
controlCommands: ControlCommand[]
|
||||
controlLoading: boolean
|
||||
}
|
||||
|
||||
interface IrrigationActions {
|
||||
// 系统操作
|
||||
fetchSystemList: (params?: QueryRequest) => Promise<void>
|
||||
fetchSystemDetail: (id: string) => Promise<void>
|
||||
createSystem: (data: Omit<IrrigationSystem, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateSystem: (id: string, data: Partial<IrrigationSystem>) => Promise<void>
|
||||
deleteSystem: (id: string) => Promise<void>
|
||||
startIrrigation: (systemId: string, zoneId?: string, duration?: number) => Promise<void>
|
||||
stopIrrigation: (systemId: string, zoneId?: string) => Promise<void>
|
||||
setSelectedSystem: (system: IrrigationSystem | null) => void
|
||||
|
||||
// 分区操作
|
||||
fetchZoneList: (systemId: string, params?: QueryRequest) => Promise<void>
|
||||
fetchZoneDetail: (id: string) => Promise<void>
|
||||
createZone: (data: Omit<IrrigationZone, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateZone: (id: string, data: Partial<IrrigationZone>) => Promise<void>
|
||||
deleteZone: (id: string) => Promise<void>
|
||||
setSelectedZone: (zone: IrrigationZone | null) => void
|
||||
|
||||
// 调度操作
|
||||
fetchScheduleList: (params?: QueryRequest) => Promise<void>
|
||||
fetchScheduleDetail: (id: string) => Promise<void>
|
||||
createSchedule: (data: Omit<IrrigationSchedule, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateSchedule: (id: string, data: Partial<IrrigationSchedule>) => Promise<void>
|
||||
deleteSchedule: (id: string) => Promise<void>
|
||||
pauseSchedule: (id: string) => Promise<void>
|
||||
resumeSchedule: (id: string) => Promise<void>
|
||||
setSelectedSchedule: (schedule: IrrigationSchedule | null) => void
|
||||
|
||||
// 监控操作
|
||||
fetchMonitoringData: (zoneId: string, params?: QueryRequest & { sensorType?: string }) => Promise<void>
|
||||
fetchRealTimeData: (zoneId: string) => Promise<void>
|
||||
|
||||
// 清理操作
|
||||
clearData: () => void
|
||||
}
|
||||
|
||||
export const useIrrigationStore = create<IrrigationState & IrrigationActions>((set, get) => ({
|
||||
// 初始状态
|
||||
systemList: [],
|
||||
selectedSystem: null,
|
||||
systemLoading: false,
|
||||
systemPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
zoneList: [],
|
||||
selectedZone: null,
|
||||
zoneLoading: false,
|
||||
|
||||
scheduleList: [],
|
||||
selectedSchedule: null,
|
||||
scheduleLoading: false,
|
||||
schedulePagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
monitoringData: [],
|
||||
realTimeData: [],
|
||||
monitoringLoading: false,
|
||||
|
||||
controlCommands: [],
|
||||
controlLoading: false,
|
||||
|
||||
// 系统操作
|
||||
fetchSystemList: async (params) => {
|
||||
try {
|
||||
set({ systemLoading: true })
|
||||
const response = await irrigationApi.getSystemList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
systemList: response.data.items,
|
||||
systemPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
systemLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉系统列表失败:', error)
|
||||
set({ systemLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchSystemDetail: async (id) => {
|
||||
try {
|
||||
set({ systemLoading: true })
|
||||
const response = await irrigationApi.getSystemDetail(id)
|
||||
set({
|
||||
selectedSystem: response.data,
|
||||
systemLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉系统详情失败:', error)
|
||||
set({ systemLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createSystem: async (data) => {
|
||||
try {
|
||||
const response = await irrigationApi.createSystem(data)
|
||||
const currentList = get().systemList
|
||||
set({
|
||||
systemList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建灌溉系统失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateSystem: async (id, data) => {
|
||||
try {
|
||||
const response = await irrigationApi.updateSystem(id, data)
|
||||
const currentList = get().systemList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
systemList: updatedList,
|
||||
selectedSystem: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新灌溉系统失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteSystem: async (id) => {
|
||||
try {
|
||||
await irrigationApi.deleteSystem(id)
|
||||
const currentList = get().systemList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
systemList: updatedList,
|
||||
selectedSystem: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除灌溉系统失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
startIrrigation: async (systemId, zoneId, duration) => {
|
||||
try {
|
||||
set({ controlLoading: true })
|
||||
const response = await irrigationApi.startIrrigation(systemId, zoneId, duration)
|
||||
const currentCommands = get().controlCommands
|
||||
set({
|
||||
controlCommands: [response.data, ...currentCommands],
|
||||
controlLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('启动灌溉失败:', error)
|
||||
set({ controlLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
stopIrrigation: async (systemId, zoneId) => {
|
||||
try {
|
||||
set({ controlLoading: true })
|
||||
const response = await irrigationApi.stopIrrigation(systemId, zoneId)
|
||||
const currentCommands = get().controlCommands
|
||||
set({
|
||||
controlCommands: [response.data, ...currentCommands],
|
||||
controlLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('停止灌溉失败:', error)
|
||||
set({ controlLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedSystem: (system) => set({ selectedSystem: system }),
|
||||
|
||||
// 分区操作
|
||||
fetchZoneList: async (systemId, params) => {
|
||||
try {
|
||||
set({ zoneLoading: true })
|
||||
const response = await irrigationApi.getZoneList(systemId, {
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 20,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
zoneList: response.data.items,
|
||||
zoneLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉分区列表失败:', error)
|
||||
set({ zoneLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchZoneDetail: async (id) => {
|
||||
try {
|
||||
set({ zoneLoading: true })
|
||||
const response = await irrigationApi.getZoneDetail(id)
|
||||
set({
|
||||
selectedZone: response.data,
|
||||
zoneLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉分区详情失败:', error)
|
||||
set({ zoneLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createZone: async (data) => {
|
||||
try {
|
||||
const response = await irrigationApi.createZone(data)
|
||||
const currentList = get().zoneList
|
||||
set({
|
||||
zoneList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建灌溉分区失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateZone: async (id, data) => {
|
||||
try {
|
||||
const response = await irrigationApi.updateZone(id, data)
|
||||
const currentList = get().zoneList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
zoneList: updatedList,
|
||||
selectedZone: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新灌溉分区失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteZone: async (id) => {
|
||||
try {
|
||||
await irrigationApi.deleteZone(id)
|
||||
const currentList = get().zoneList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
zoneList: updatedList,
|
||||
selectedZone: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除灌溉分区失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedZone: (zone) => set({ selectedZone: zone }),
|
||||
|
||||
// 调度操作
|
||||
fetchScheduleList: async (params) => {
|
||||
try {
|
||||
set({ scheduleLoading: true })
|
||||
const response = await irrigationApi.getScheduleList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
scheduleList: response.data.items,
|
||||
schedulePagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
scheduleLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉调度列表失败:', error)
|
||||
set({ scheduleLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchScheduleDetail: async (id) => {
|
||||
try {
|
||||
set({ scheduleLoading: true })
|
||||
const response = await irrigationApi.getScheduleDetail(id)
|
||||
set({
|
||||
selectedSchedule: response.data,
|
||||
scheduleLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取灌溉调度详情失败:', error)
|
||||
set({ scheduleLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createSchedule: async (data) => {
|
||||
try {
|
||||
const response = await irrigationApi.createSchedule(data)
|
||||
const currentList = get().scheduleList
|
||||
set({
|
||||
scheduleList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建灌溉调度失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateSchedule: async (id, data) => {
|
||||
try {
|
||||
const response = await irrigationApi.updateSchedule(id, data)
|
||||
const currentList = get().scheduleList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
scheduleList: updatedList,
|
||||
selectedSchedule: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新灌溉调度失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteSchedule: async (id) => {
|
||||
try {
|
||||
await irrigationApi.deleteSchedule(id)
|
||||
const currentList = get().scheduleList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
scheduleList: updatedList,
|
||||
selectedSchedule: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除灌溉调度失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
pauseSchedule: async (id) => {
|
||||
try {
|
||||
const response = await irrigationApi.pauseSchedule(id)
|
||||
const currentList = get().scheduleList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
scheduleList: updatedList,
|
||||
selectedSchedule: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('暂停灌溉调度失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
resumeSchedule: async (id) => {
|
||||
try {
|
||||
const response = await irrigationApi.resumeSchedule(id)
|
||||
const currentList = get().scheduleList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
scheduleList: updatedList,
|
||||
selectedSchedule: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('恢复灌溉调度失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedSchedule: (schedule) => set({ selectedSchedule: schedule }),
|
||||
|
||||
// 监控操作
|
||||
fetchMonitoringData: async (zoneId, params) => {
|
||||
try {
|
||||
set({ monitoringLoading: true })
|
||||
const response = await irrigationApi.getMonitoringData(zoneId, {
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 50,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
monitoringData: response.data.items,
|
||||
monitoringLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取监控数据失败:', error)
|
||||
set({ monitoringLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchRealTimeData: async (zoneId) => {
|
||||
try {
|
||||
const response = await irrigationApi.getRealTimeData(zoneId)
|
||||
set({
|
||||
realTimeData: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取实时数据失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
clearData: () => set({
|
||||
zoneList: [],
|
||||
selectedZone: null,
|
||||
scheduleList: [],
|
||||
selectedSchedule: null,
|
||||
monitoringData: [],
|
||||
realTimeData: [],
|
||||
controlCommands: []
|
||||
})
|
||||
}))
|
||||
344
crop-x/src/stores/modules/land.ts
Normal file
344
crop-x/src/stores/modules/land.ts
Normal file
@@ -0,0 +1,344 @@
|
||||
import { create } from 'zustand'
|
||||
import { LandParcel, LandClassification, MapLayer, SpatialAnalysis } from '@api/modules/land'
|
||||
import { landApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface LandState {
|
||||
// 地块数据
|
||||
landParcelList: LandParcel[]
|
||||
selectedLandParcel: LandParcel | null
|
||||
landLoading: boolean
|
||||
landError: string | null
|
||||
landPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 分类数据
|
||||
classificationList: LandClassification[]
|
||||
selectedClassification: LandClassification | null
|
||||
classificationLoading: boolean
|
||||
|
||||
// 地图数据
|
||||
mapLayers: MapLayer[]
|
||||
mapLoading: boolean
|
||||
|
||||
// 分析数据
|
||||
analysisList: SpatialAnalysis[]
|
||||
selectedAnalysis: SpatialAnalysis | null
|
||||
analysisLoading: boolean
|
||||
analysisPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
}
|
||||
|
||||
interface LandActions {
|
||||
// 地块操作
|
||||
fetchLandParcelList: (params?: QueryRequest) => Promise<void>
|
||||
fetchLandParcelDetail: (id: string) => Promise<void>
|
||||
createLandParcel: (data: Omit<LandParcel, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateLandParcel: (id: string, data: Partial<LandParcel>) => Promise<void>
|
||||
deleteLandParcel: (id: string) => Promise<void>
|
||||
setSelectedLandParcel: (landParcel: LandParcel | null) => void
|
||||
clearLandError: () => void
|
||||
|
||||
// 分类操作
|
||||
fetchClassificationList: (params?: QueryRequest) => Promise<void>
|
||||
createClassification: (data: Omit<LandClassification, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateClassification: (id: string, data: Partial<LandClassification>) => Promise<void>
|
||||
deleteClassification: (id: string) => Promise<void>
|
||||
|
||||
// 地图操作
|
||||
fetchMapLayers: () => Promise<void>
|
||||
createMapLayer: (data: Omit<MapLayer, 'id'>) => Promise<void>
|
||||
updateMapLayer: (id: string, data: Partial<MapLayer>) => Promise<void>
|
||||
deleteMapLayer: (id: string) => Promise<void>
|
||||
|
||||
// 分析操作
|
||||
performSpatialAnalysis: (data: Omit<SpatialAnalysis, 'id' | 'createdAt' | 'result'>) => Promise<void>
|
||||
fetchAnalysisHistory: (params?: QueryRequest) => Promise<void>
|
||||
setSelectedAnalysis: (analysis: SpatialAnalysis | null) => void
|
||||
}
|
||||
|
||||
export const useLandStore = create<LandState & LandActions>((set, get) => ({
|
||||
// 初始状态
|
||||
landParcelList: [],
|
||||
selectedLandParcel: null,
|
||||
landLoading: false,
|
||||
landError: null,
|
||||
landPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
classificationList: [],
|
||||
selectedClassification: null,
|
||||
classificationLoading: false,
|
||||
|
||||
mapLayers: [],
|
||||
mapLoading: false,
|
||||
|
||||
analysisList: [],
|
||||
selectedAnalysis: null,
|
||||
analysisLoading: false,
|
||||
analysisPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
// 地块操作
|
||||
fetchLandParcelList: async (params) => {
|
||||
try {
|
||||
set({ landLoading: true, landError: null })
|
||||
const response = await landApi.getLandParcelList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
landParcelList: response.data.items,
|
||||
landPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
landLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
landError: error instanceof Error ? error.message : '获取地块列表失败',
|
||||
landLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
fetchLandParcelDetail: async (id) => {
|
||||
try {
|
||||
set({ landLoading: true, landError: null })
|
||||
const response = await landApi.getLandParcelDetail(id)
|
||||
set({
|
||||
selectedLandParcel: response.data,
|
||||
landLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
landError: error instanceof Error ? error.message : '获取地块详情失败',
|
||||
landLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
createLandParcel: async (data) => {
|
||||
try {
|
||||
const response = await landApi.createLandParcel(data)
|
||||
const currentList = get().landParcelList
|
||||
set({
|
||||
landParcelList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
landError: error instanceof Error ? error.message : '创建地块失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateLandParcel: async (id, data) => {
|
||||
try {
|
||||
const response = await landApi.updateLandParcel(id, data)
|
||||
const currentList = get().landParcelList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
landParcelList: updatedList,
|
||||
selectedLandParcel: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
landError: error instanceof Error ? error.message : '更新地块失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
deleteLandParcel: async (id) => {
|
||||
try {
|
||||
await landApi.deleteLandParcel(id)
|
||||
const currentList = get().landParcelList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
landParcelList: updatedList,
|
||||
selectedLandParcel: null
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
landError: error instanceof Error ? error.message : '删除地块失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedLandParcel: (landParcel) => set({ selectedLandParcel: landParcel }),
|
||||
clearLandError: () => set({ landError: null }),
|
||||
|
||||
// 分类操作
|
||||
fetchClassificationList: async (params) => {
|
||||
try {
|
||||
set({ classificationLoading: true })
|
||||
const response = await landApi.getClassificationList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 50,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
classificationList: response.data.items,
|
||||
classificationLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取分类列表失败:', error)
|
||||
set({ classificationLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createClassification: async (data) => {
|
||||
try {
|
||||
const response = await landApi.createClassification(data)
|
||||
const currentList = get().classificationList
|
||||
set({
|
||||
classificationList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建分类失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateClassification: async (id, data) => {
|
||||
try {
|
||||
const response = await landApi.updateClassification(id, data)
|
||||
const currentList = get().classificationList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
classificationList: updatedList,
|
||||
selectedClassification: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新分类失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteClassification: async (id) => {
|
||||
try {
|
||||
await landApi.deleteClassification(id)
|
||||
const currentList = get().classificationList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
classificationList: updatedList,
|
||||
selectedClassification: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除分类失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 地图操作
|
||||
fetchMapLayers: async () => {
|
||||
try {
|
||||
set({ mapLoading: true })
|
||||
const response = await landApi.getMapLayers()
|
||||
set({
|
||||
mapLayers: response.data,
|
||||
mapLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取地图图层失败:', error)
|
||||
set({ mapLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createMapLayer: async (data) => {
|
||||
try {
|
||||
const response = await landApi.createMapLayer(data)
|
||||
const currentList = get().mapLayers
|
||||
set({
|
||||
mapLayers: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建地图图层失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateMapLayer: async (id, data) => {
|
||||
try {
|
||||
const response = await landApi.updateMapLayer(id, data)
|
||||
const currentList = get().mapLayers
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
mapLayers: updatedList
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新地图图层失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteMapLayer: async (id) => {
|
||||
try {
|
||||
await landApi.deleteMapLayer(id)
|
||||
const currentList = get().mapLayers
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
mapLayers: updatedList
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除地图图层失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 分析操作
|
||||
performSpatialAnalysis: async (data) => {
|
||||
try {
|
||||
set({ analysisLoading: true })
|
||||
const response = await landApi.performSpatialAnalysis(data)
|
||||
const currentList = get().analysisList
|
||||
set({
|
||||
analysisList: [response.data, ...currentList],
|
||||
analysisLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('执行空间分析失败:', error)
|
||||
set({ analysisLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchAnalysisHistory: async (params) => {
|
||||
try {
|
||||
set({ analysisLoading: true })
|
||||
const response = await landApi.getAnalysisHistory({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
analysisList: response.data.items,
|
||||
analysisPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
analysisLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取分析历史失败:', error)
|
||||
set({ analysisLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedAnalysis: (analysis) => set({ selectedAnalysis: analysis })
|
||||
}))
|
||||
305
crop-x/src/stores/modules/machinery.ts
Normal file
305
crop-x/src/stores/modules/machinery.ts
Normal file
@@ -0,0 +1,305 @@
|
||||
import { create } from 'zustand'
|
||||
import { Machinery, Driver, MonitoringData } from '@api/modules/machinery'
|
||||
import { machineryApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface MachineryState {
|
||||
// 农机数据
|
||||
machineryList: Machinery[]
|
||||
selectedMachinery: Machinery | null
|
||||
machineryLoading: boolean
|
||||
machineryError: string | null
|
||||
machineryPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 驾驶员数据
|
||||
driverList: Driver[]
|
||||
selectedDriver: Driver | null
|
||||
driverLoading: boolean
|
||||
driverError: string | null
|
||||
driverPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 监控数据
|
||||
monitoringData: MonitoringData[]
|
||||
realTimeData: MonitoringData | null
|
||||
monitoringLoading: boolean
|
||||
}
|
||||
|
||||
interface MachineryActions {
|
||||
// 农机操作
|
||||
fetchMachineryList: (params?: QueryRequest) => Promise<void>
|
||||
fetchMachineryDetail: (id: string) => Promise<void>
|
||||
createMachinery: (data: Omit<Machinery, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateMachinery: (id: string, data: Partial<Machinery>) => Promise<void>
|
||||
deleteMachinery: (id: string) => Promise<void>
|
||||
setSelectedMachinery: (machinery: Machinery | null) => void
|
||||
clearMachineryError: () => void
|
||||
|
||||
// 驾驶员操作
|
||||
fetchDriverList: (params?: QueryRequest) => Promise<void>
|
||||
fetchDriverDetail: (id: string) => Promise<void>
|
||||
createDriver: (data: Omit<Driver, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateDriver: (id: string, data: Partial<Driver>) => Promise<void>
|
||||
deleteDriver: (id: string) => Promise<void>
|
||||
setSelectedDriver: (driver: Driver | null) => void
|
||||
clearDriverError: () => void
|
||||
|
||||
// 监控操作
|
||||
fetchRealTimeData: (machineryId: string) => Promise<void>
|
||||
fetchMonitoringHistory: (machineryId: string, params?: QueryRequest) => Promise<void>
|
||||
}
|
||||
|
||||
export const useMachineryStore = create<MachineryState & MachineryActions>((set, get) => ({
|
||||
// 初始状态
|
||||
machineryList: [],
|
||||
selectedMachinery: null,
|
||||
machineryLoading: false,
|
||||
machineryError: null,
|
||||
machineryPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
driverList: [],
|
||||
selectedDriver: null,
|
||||
driverLoading: false,
|
||||
driverError: null,
|
||||
driverPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
monitoringData: [],
|
||||
realTimeData: null,
|
||||
monitoringLoading: false,
|
||||
|
||||
// 农机操作
|
||||
fetchMachineryList: async (params) => {
|
||||
try {
|
||||
set({ machineryLoading: true, machineryError: null })
|
||||
const response = await machineryApi.getMachineryList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
machineryList: response.data.items,
|
||||
machineryPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
machineryLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
machineryError: error instanceof Error ? error.message : '获取农机列表失败',
|
||||
machineryLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
fetchMachineryDetail: async (id) => {
|
||||
try {
|
||||
set({ machineryLoading: true, machineryError: null })
|
||||
const response = await machineryApi.getMachineryDetail(id)
|
||||
set({
|
||||
selectedMachinery: response.data,
|
||||
machineryLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
machineryError: error instanceof Error ? error.message : '获取农机详情失败',
|
||||
machineryLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
createMachinery: async (data) => {
|
||||
try {
|
||||
const response = await machineryApi.createMachinery(data)
|
||||
const currentList = get().machineryList
|
||||
set({
|
||||
machineryList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
machineryError: error instanceof Error ? error.message : '创建农机失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateMachinery: async (id, data) => {
|
||||
try {
|
||||
const response = await machineryApi.updateMachinery(id, data)
|
||||
const currentList = get().machineryList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
machineryList: updatedList,
|
||||
selectedMachinery: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
machineryError: error instanceof Error ? error.message : '更新农机失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
deleteMachinery: async (id) => {
|
||||
try {
|
||||
await machineryApi.deleteMachinery(id)
|
||||
const currentList = get().machineryList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
machineryList: updatedList,
|
||||
selectedMachinery: null
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
machineryError: error instanceof Error ? error.message : '删除农机失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedMachinery: (machinery) => set({ selectedMachinery: machinery }),
|
||||
clearMachineryError: () => set({ machineryError: null }),
|
||||
|
||||
// 驾驶员操作
|
||||
fetchDriverList: async (params) => {
|
||||
try {
|
||||
set({ driverLoading: true, driverError: null })
|
||||
const response = await machineryApi.getDriverList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
driverList: response.data.items,
|
||||
driverPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
driverLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
driverError: error instanceof Error ? error.message : '获取驾驶员列表失败',
|
||||
driverLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
fetchDriverDetail: async (id) => {
|
||||
try {
|
||||
set({ driverLoading: true, driverError: null })
|
||||
const response = await machineryApi.getDriverDetail(id)
|
||||
set({
|
||||
selectedDriver: response.data,
|
||||
driverLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
driverError: error instanceof Error ? error.message : '获取驾驶员详情失败',
|
||||
driverLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
createDriver: async (data) => {
|
||||
try {
|
||||
const response = await machineryApi.createDriver(data)
|
||||
const currentList = get().driverList
|
||||
set({
|
||||
driverList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
driverError: error instanceof Error ? error.message : '创建驾驶员失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateDriver: async (id, data) => {
|
||||
try {
|
||||
const response = await machineryApi.updateDriver(id, data)
|
||||
const currentList = get().driverList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
driverList: updatedList,
|
||||
selectedDriver: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
driverError: error instanceof Error ? error.message : '更新驾驶员失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
deleteDriver: async (id) => {
|
||||
try {
|
||||
await machineryApi.deleteDriver(id)
|
||||
const currentList = get().driverList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
driverList: updatedList,
|
||||
selectedDriver: null
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
driverError: error instanceof Error ? error.message : '删除驾驶员失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedDriver: (driver) => set({ selectedDriver: driver }),
|
||||
clearDriverError: () => set({ driverError: null }),
|
||||
|
||||
// 监控操作
|
||||
fetchRealTimeData: async (machineryId) => {
|
||||
try {
|
||||
set({ monitoringLoading: true })
|
||||
const response = await machineryApi.getRealTimeData(machineryId)
|
||||
set({
|
||||
realTimeData: response.data,
|
||||
monitoringLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取实时数据失败:', error)
|
||||
set({ monitoringLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchMonitoringHistory: async (machineryId, params) => {
|
||||
try {
|
||||
set({ monitoringLoading: true })
|
||||
const response = await machineryApi.getMonitoringHistory(machineryId, {
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 50,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
monitoringData: response.data.items,
|
||||
monitoringLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取监控历史失败:', error)
|
||||
set({ monitoringLoading: false })
|
||||
}
|
||||
}
|
||||
}))
|
||||
400
crop-x/src/stores/modules/operation.ts
Normal file
400
crop-x/src/stores/modules/operation.ts
Normal file
@@ -0,0 +1,400 @@
|
||||
import { create } from 'zustand'
|
||||
import { FarmingTask, TaskTemplate, ResourceAllocation, Workflow } from '@api/modules/operation'
|
||||
import { operationApi } from '@api'
|
||||
import { QueryRequest } from '@api/types'
|
||||
|
||||
interface OperationState {
|
||||
// 任务数据
|
||||
taskList: FarmingTask[]
|
||||
selectedTask: FarmingTask | null
|
||||
taskLoading: boolean
|
||||
taskError: string | null
|
||||
taskPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
|
||||
// 模板数据
|
||||
templateList: TaskTemplate[]
|
||||
selectedTemplate: TaskTemplate | null
|
||||
templateLoading: boolean
|
||||
|
||||
// 资源分配数据
|
||||
resourceAllocationList: ResourceAllocation[]
|
||||
selectedResourceAllocation: ResourceAllocation | null
|
||||
resourceLoading: boolean
|
||||
|
||||
// 工作流数据
|
||||
workflowList: Workflow[]
|
||||
selectedWorkflow: Workflow | null
|
||||
workflowLoading: boolean
|
||||
workflowPagination: {
|
||||
page: number
|
||||
pageSize: number
|
||||
total: number
|
||||
}
|
||||
}
|
||||
|
||||
interface OperationActions {
|
||||
// 任务操作
|
||||
fetchTaskList: (params?: QueryRequest) => Promise<void>
|
||||
fetchTaskDetail: (id: string) => Promise<void>
|
||||
createTask: (data: Omit<FarmingTask, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateTask: (id: string, data: Partial<FarmingTask>) => Promise<void>
|
||||
deleteTask: (id: string) => Promise<void>
|
||||
updateTaskStatus: (id: string, status: FarmingTask['status']) => Promise<void>
|
||||
setSelectedTask: (task: FarmingTask | null) => void
|
||||
clearTaskError: () => void
|
||||
|
||||
// 模板操作
|
||||
fetchTemplateList: (params?: QueryRequest) => Promise<void>
|
||||
createTemplate: (data: Omit<TaskTemplate, 'id'>) => Promise<void>
|
||||
updateTemplate: (id: string, data: Partial<TaskTemplate>) => Promise<void>
|
||||
deleteTemplate: (id: string) => Promise<void>
|
||||
|
||||
// 资源分配操作
|
||||
fetchResourceAllocations: (params?: QueryRequest) => Promise<void>
|
||||
allocateResource: (data: Omit<ResourceAllocation, 'id' | 'allocatedDate'>) => Promise<void>
|
||||
returnResource: (id: string) => Promise<void>
|
||||
|
||||
// 工作流操作
|
||||
fetchWorkflowList: (params?: QueryRequest) => Promise<void>
|
||||
fetchWorkflowDetail: (id: string) => Promise<void>
|
||||
createWorkflow: (data: Omit<Workflow, 'id' | 'createdAt' | 'updatedAt'>) => Promise<void>
|
||||
updateWorkflow: (id: string, data: Partial<Workflow>) => Promise<void>
|
||||
deleteWorkflow: (id: string) => Promise<void>
|
||||
setSelectedWorkflow: (workflow: Workflow | null) => void
|
||||
}
|
||||
|
||||
export const useOperationStore = create<OperationState & OperationActions>((set, get) => ({
|
||||
// 初始状态
|
||||
taskList: [],
|
||||
selectedTask: null,
|
||||
taskLoading: false,
|
||||
taskError: null,
|
||||
taskPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
templateList: [],
|
||||
selectedTemplate: null,
|
||||
templateLoading: false,
|
||||
|
||||
resourceAllocationList: [],
|
||||
selectedResourceAllocation: null,
|
||||
resourceLoading: false,
|
||||
|
||||
workflowList: [],
|
||||
selectedWorkflow: null,
|
||||
workflowLoading: false,
|
||||
workflowPagination: {
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
total: 0
|
||||
},
|
||||
|
||||
// 任务操作
|
||||
fetchTaskList: async (params) => {
|
||||
try {
|
||||
set({ taskLoading: true, taskError: null })
|
||||
const response = await operationApi.getTaskList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
taskList: response.data.items,
|
||||
taskPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
taskLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '获取任务列表失败',
|
||||
taskLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
fetchTaskDetail: async (id) => {
|
||||
try {
|
||||
set({ taskLoading: true, taskError: null })
|
||||
const response = await operationApi.getTaskDetail(id)
|
||||
set({
|
||||
selectedTask: response.data,
|
||||
taskLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '获取任务详情失败',
|
||||
taskLoading: false
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
createTask: async (data) => {
|
||||
try {
|
||||
const response = await operationApi.createTask(data)
|
||||
const currentList = get().taskList
|
||||
set({
|
||||
taskList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '创建任务失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateTask: async (id, data) => {
|
||||
try {
|
||||
const response = await operationApi.updateTask(id, data)
|
||||
const currentList = get().taskList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
taskList: updatedList,
|
||||
selectedTask: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '更新任务失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
deleteTask: async (id) => {
|
||||
try {
|
||||
await operationApi.deleteTask(id)
|
||||
const currentList = get().taskList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
taskList: updatedList,
|
||||
selectedTask: null
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '删除任务失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
updateTaskStatus: async (id, status) => {
|
||||
try {
|
||||
const response = await operationApi.updateTaskStatus(id, status)
|
||||
const currentList = get().taskList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
taskList: updatedList,
|
||||
selectedTask: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
set({
|
||||
taskError: error instanceof Error ? error.message : '更新任务状态失败'
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedTask: (task) => set({ selectedTask: task }),
|
||||
clearTaskError: () => set({ taskError: null }),
|
||||
|
||||
// 模板操作
|
||||
fetchTemplateList: async (params) => {
|
||||
try {
|
||||
set({ templateLoading: true })
|
||||
const response = await operationApi.getTaskTemplateList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 50,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
templateList: response.data.items,
|
||||
templateLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取模板列表失败:', error)
|
||||
set({ templateLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createTemplate: async (data) => {
|
||||
try {
|
||||
const response = await operationApi.createTaskTemplate(data)
|
||||
const currentList = get().templateList
|
||||
set({
|
||||
templateList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建模板失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateTemplate: async (id, data) => {
|
||||
try {
|
||||
const response = await operationApi.updateTaskTemplate(id, data)
|
||||
const currentList = get().templateList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
templateList: updatedList,
|
||||
selectedTemplate: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新模板失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteTemplate: async (id) => {
|
||||
try {
|
||||
await operationApi.deleteTaskTemplate(id)
|
||||
const currentList = get().templateList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
templateList: updatedList,
|
||||
selectedTemplate: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除模板失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 资源分配操作
|
||||
fetchResourceAllocations: async (params) => {
|
||||
try {
|
||||
set({ resourceLoading: true })
|
||||
const response = await operationApi.getResourceAllocations({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 20,
|
||||
...params
|
||||
})
|
||||
set({
|
||||
resourceAllocationList: response.data.items,
|
||||
resourceLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取资源分配列表失败:', error)
|
||||
set({ resourceLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
allocateResource: async (data) => {
|
||||
try {
|
||||
const response = await operationApi.allocateResource(data)
|
||||
const currentList = get().resourceAllocationList
|
||||
set({
|
||||
resourceAllocationList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('分配资源失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
returnResource: async (id) => {
|
||||
try {
|
||||
await operationApi.returnResource(id)
|
||||
const currentList = get().resourceAllocationList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? { ...item, status: 'returned' as const } : item
|
||||
)
|
||||
set({
|
||||
resourceAllocationList: updatedList
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('归还资源失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
// 工作流操作
|
||||
fetchWorkflowList: async (params) => {
|
||||
try {
|
||||
set({ workflowLoading: true })
|
||||
const response = await operationApi.getWorkflowList({
|
||||
page: params?.page || 1,
|
||||
pageSize: params?.pageSize || 10,
|
||||
...params
|
||||
})
|
||||
|
||||
set({
|
||||
workflowList: response.data.items,
|
||||
workflowPagination: {
|
||||
page: response.data.page,
|
||||
pageSize: response.data.pageSize,
|
||||
total: response.data.total
|
||||
},
|
||||
workflowLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取工作流列表失败:', error)
|
||||
set({ workflowLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
fetchWorkflowDetail: async (id) => {
|
||||
try {
|
||||
set({ workflowLoading: true })
|
||||
const response = await operationApi.getWorkflowDetail(id)
|
||||
set({
|
||||
selectedWorkflow: response.data,
|
||||
workflowLoading: false
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('获取工作流详情失败:', error)
|
||||
set({ workflowLoading: false })
|
||||
}
|
||||
},
|
||||
|
||||
createWorkflow: async (data) => {
|
||||
try {
|
||||
const response = await operationApi.createWorkflow(data)
|
||||
const currentList = get().workflowList
|
||||
set({
|
||||
workflowList: [response.data, ...currentList]
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('创建工作流失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
updateWorkflow: async (id, data) => {
|
||||
try {
|
||||
const response = await operationApi.updateWorkflow(id, data)
|
||||
const currentList = get().workflowList
|
||||
const updatedList = currentList.map(item =>
|
||||
item.id === id ? response.data : item
|
||||
)
|
||||
set({
|
||||
workflowList: updatedList,
|
||||
selectedWorkflow: response.data
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('更新工作流失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
deleteWorkflow: async (id) => {
|
||||
try {
|
||||
await operationApi.deleteWorkflow(id)
|
||||
const currentList = get().workflowList
|
||||
const updatedList = currentList.filter(item => item.id !== id)
|
||||
set({
|
||||
workflowList: updatedList,
|
||||
selectedWorkflow: null
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('删除工作流失败:', error)
|
||||
}
|
||||
},
|
||||
|
||||
setSelectedWorkflow: (workflow) => set({ selectedWorkflow: workflow })
|
||||
}))
|
||||
Reference in New Issue
Block a user