整理接口定义规范

This commit is contained in:
linxd
2025-07-02 12:02:52 +08:00
parent 500272f459
commit aa7f985a74
49 changed files with 1345 additions and 2862 deletions

View File

@ -1,13 +1,12 @@
import React from 'react';
import { Modal } from 'antd';
import EvaluateTaskPersonnelSelector from '@/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector';
import type { PersonnelItem } from '@/servers/types/evaluator';
interface BatchEvaluatorModalProps {
visible: boolean;
onCancel: () => void;
onSelect: (selectedEvaluators: PersonnelItem[]) => void;
selectedPersonnel?: PersonnelItem[];
onSelect: (selectedEvaluators: supplierAnnualTaskManage.PersonnelItem[]) => void;
selectedPersonnel?: supplierAnnualTaskManage.PersonnelItem[];
filter?: boolean;
filterUserIds?: string[];
}
@ -20,9 +19,40 @@ const BatchEvaluatorModal: React.FC<BatchEvaluatorModalProps> = ({
filter,
filterUserIds,
}) => {
// 将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem
const convertToTaskPersonnel = (items: API.PersonnelItem[]): supplierAnnualTaskManage.PersonnelItem[] => {
return items.map(item => ({
id: item.id,
name: item.name,
userId: item.id, // 使用 id 作为 userId
userName: item.name, // 使用 name 作为 userName
userDept: item.userDept,
userDeptId: item.userDeptId,
position: item.position || '',
isSelected: item.isSelected
}));
};
// 将 supplierAnnualTaskManage.PersonnelItem 转换为 API.PersonnelItem
const convertToAPIPersonnel = (items: supplierAnnualTaskManage.PersonnelItem[]): API.PersonnelItem[] => {
return items.map(item => ({
id: item.id,
name: item.name,
userDept: item.userDept,
userDeptId: item.userDeptId,
position: item.position,
isSelected: item.isSelected // 默认值
}));
};
// 处理选择事件,将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem
const handleSelect = (apiPersonnel: API.PersonnelItem[]) => {
onSelect(convertToTaskPersonnel(apiPersonnel));
};
return (
<Modal
title="批量选择评价人员"
title="批量选择年审人员"
visible={visible}
onCancel={onCancel}
footer={null}
@ -30,8 +60,8 @@ const BatchEvaluatorModal: React.FC<BatchEvaluatorModalProps> = ({
destroyOnClose={false}
>
<EvaluateTaskPersonnelSelector
onSelect={onSelect}
selectedPersonnel={selectedPersonnel}
onSelect={handleSelect}
selectedPersonnel={convertToAPIPersonnel(selectedPersonnel)}
filter={filter}
filterUserIds={filterUserIds}
onClose={onCancel}

View File

@ -1,14 +1,18 @@
import React, { useEffect, useState } from 'react';
import { Modal, Button, List, message } from 'antd';
import EvaluateTaskPersonnelSelector from '@/components/EvaluateTaskPersonnelSelector/EvaluateTaskPersonnelSelector';
import { ModalMode } from '@/servers/types/evaluator';
import type { PersonnelItem, SupplierItem } from '@/servers/types/evaluator';
// 模态框模式枚举
enum ModalMode {
SELECT = 'select', // 选择模式
VIEW = 'view', // 查看模式
}
interface SupplierEvaluatorModalProps {
visible: boolean; // 控制弹窗显示/隐藏
onCancel: () => void; // 取消按钮回调函数
onSelect: (personnel: PersonnelItem[]) => void; // 选择人员后的回调函数
currentSupplier: SupplierItem | null; // 当前操作的供应商对象
onSelect: (personnel: supplierAnnualTaskManage.PersonnelItem[]) => void; // 选择人员后的回调函数
currentSupplier: supplierAnnualTaskManage.SupplierItem | null; // 当前操作的供应商对象
mode: ModalMode; // 弹窗模式SELECT(选择) 或 VIEW(查看)
filter?: boolean; // 是否过滤评价人员
filterUserIds?: string[]; // 过滤评价人员ID列表
@ -24,7 +28,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
filterUserIds,
}) => {
// 本地保存当前选中的人员,确保在弹窗打开/关闭时能正确处理数据
const [localSelectedPersonnel, setLocalSelectedPersonnel] = useState<PersonnelItem[]>([]);
const [localSelectedPersonnel, setLocalSelectedPersonnel] = useState<supplierAnnualTaskManage.PersonnelItem[]>([]);
// 当currentSupplier变化时更新本地的选中人员
useEffect(() => {
@ -35,14 +39,41 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
}
}, [currentSupplier]);
// 将 API.PersonnelItem 转换为 supplierAnnualTaskManage.PersonnelItem
const convertToTaskPersonnel = (items: API.PersonnelItem[]): supplierAnnualTaskManage.PersonnelItem[] => {
return items.map(item => ({
id: item.id,
name: item.name,
userId: item.id, // 使用 id 作为 userId
userName: item.name, // 使用 name 作为 userName
userDept: item.userDept,
userDeptId: item.userDeptId,
position: item.position || '',
isSelected: item.isSelected
}));
};
// 将 supplierAnnualTaskManage.PersonnelItem 转换为 API.PersonnelItem
const convertToAPIPersonnel = (items: supplierAnnualTaskManage.PersonnelItem[]): API.PersonnelItem[] => {
return items.map(item => ({
id: item.id,
name: item.name,
userDept: item.userDept,
userDeptId: item.userDeptId,
position: item.position,
isSelected: item.isSelected // 默认值
}));
};
// 处理选择人员的回调
const handleSelect = (personnel: PersonnelItem[]) => {
const handleSelect = (personnel: API.PersonnelItem[]) => {
if (personnel.length === 0) {
message.warning('请至少选择一名评价人员');
return;
}
setLocalSelectedPersonnel(personnel);
onSelect(personnel);
const convertedPersonnel = convertToTaskPersonnel(personnel);
setLocalSelectedPersonnel(convertedPersonnel);
onSelect(convertedPersonnel);
};
// 渲染评价人员列表(用于查看模式)
@ -64,7 +95,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
<List
itemLayout="horizontal"
dataSource={currentSupplier.evaluators}
renderItem={(item: PersonnelItem) => (
renderItem={(item: supplierAnnualTaskManage.PersonnelItem) => (
<List.Item>
<List.Item.Meta
title={item.name}
@ -101,7 +132,7 @@ const SupplierEvaluatorModal: React.FC<SupplierEvaluatorModalProps> = ({
onSelect={handleSelect}
filter={filter}
filterUserIds={filterUserIds}
selectedPersonnel={localSelectedPersonnel}
selectedPersonnel={convertToAPIPersonnel(localSelectedPersonnel)}
onClose={onCancel}
/>
) : (

View File

@ -1,13 +1,12 @@
import React, { useEffect } from 'react';
import { Table, Space, Button, Tag, Modal, Tooltip } from 'antd';
import type { SupplierItem } from '@/servers/types/evaluator';
import React from 'react';
import { Table, Space, Button, Modal, Tooltip } from 'antd';
interface SupplierTableProps {
suppliers: SupplierItem[]; // 供应商数据列表
suppliers: supplierAnnualTaskManage.SupplierItem[]; // 供应商数据列表
selectedRowKeys: React.Key[]; // 选中的行keys
onSelectChange: (selectedRowKeys: React.Key[]) => void; // 选择行变化的回调
onViewEvaluators: (supplier: SupplierItem) => void; // 查看评价人员的回调
onSelectEvaluators: (supplier: SupplierItem) => void; // 选择评价人员的回调
onViewEvaluators: (supplier: supplierAnnualTaskManage.SupplierItem) => void; // 查看评价人员的回调
onSelectEvaluators: (supplier: supplierAnnualTaskManage.SupplierItem) => void; // 选择评价人员的回调
onDeleteSupplier: (key: string) => void; // 删除供应商的回调
mode?: string; // 模式
}
@ -28,11 +27,11 @@ const SupplierTable: React.FC<SupplierTableProps> = ({
};
// 删除确认对话框
const showDeleteConfirm = (record: SupplierItem) => {
const showDeleteConfirm = (record: supplierAnnualTaskManage.SupplierItem) => {
Modal.confirm({
title: '确定要删除此供应商吗?',
content: `供应商: ${record.supplierName}${
record.evaluatorCount > 0 ? `,将同时删除 ${record.evaluatorCount} 名关联的评价人员` : ''
record.evaluatorCount && record.evaluatorCount > 0 ? `,将同时删除 ${record.evaluatorCount} 名关联的评价人员` : ''
}`,
okText: '确定',
okType: 'danger',
@ -77,7 +76,7 @@ const SupplierTable: React.FC<SupplierTableProps> = ({
{
title: '操作',
key: 'action',
render: (_: any, record: SupplierItem) => (
render: (_: any, record: supplierAnnualTaskManage.SupplierItem) => (
<Space>
<Button
type="link"

View File

@ -5,15 +5,17 @@ import {
SupplierTable,
BatchEvaluatorModal,
SupplierEvaluatorModal,
WeightSettingModal,
} from './EvaluatorComponents';
import { ModalMode } from '@/servers/types/evaluator';
import type { PersonnelItem, SupplierItem } from '@/servers/types/evaluator';
import type { DeptWeightItem } from '@/servers/dao/supplierEvaluateTask';
import type { Dispatch } from 'umi';
import { connect } from 'umi';
import type { SupplierTaskModelState } from '@/models/supplierAnnualTaskManage';
// 模态框模式枚举
enum ModalMode {
SELECT = 'select', // 选择模式
VIEW = 'view', // 查看模式
}
/**
* 组件接收的Props接口
* supplierAnnualTaskManage: Dva model 状态
@ -44,33 +46,27 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
const [selectedRowKeys, setSelectedRowKeys] = useState<React.Key[]>([]);
// 供应商列表数据包含评价人员信息从Dva model获取初始数据维护在本地状态
const [suppliers, setSuppliers] = useState<SupplierItem[]>([]);
const [suppliers, setSuppliers] = useState<supplierAnnualTaskManage.SupplierItem[]>([]);
// 批量选择模态框的可见性控制
const [batchSelectModalVisible, setBatchSelectModalVisible] = useState(false);
// 权重设置模态框的可见性控制
const [weightSettingModalVisible, setWeightSettingModalVisible] = useState(false);
// 评价人员选择/查看模态框的可见性控制
const [evaluatorModalVisible, setEvaluatorModalVisible] = useState(false);
// 当前操作的供应商对象,用于评价人员的选择和查看
const [currentSupplier, setCurrentSupplier] = useState<SupplierItem | null>(null);
const [currentSupplier, setCurrentSupplier] = useState<supplierAnnualTaskManage.SupplierItem | null>(null);
// 模态框模式SELECT(选择模式) 或 VIEW(查看模式)
const [modalMode, setModalMode] = useState<ModalMode>(ModalMode.SELECT);
// 权重单位列表,根据评价人员部门动态生成
const [taskDeptWeightList, setTaskDeptWeightList] = useState<DeptWeightItem[]>([]);
// 表单实例,用于权重设置
const [form] = Form.useForm();
const [filterUserIds, setFilterUserIds] = useState<string[]>([]);
useEffect(() => {
if (mode === 'division' && taskFormData.userList && taskFormData.userList.length > 0) {
const filterUserIdsaa = taskFormData.userList
.map((user: PersonnelItem) => (user.isSelected === true ? user.id : null))
.map((user: any) => (user.isSelected === true ? user.id : null))
.filter((id: string | null) => id !== null);
setFilterUserIds(filterUserIdsaa);
}
@ -108,7 +104,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
if (taskFormData.selectedSuppliers && taskFormData.selectedSuppliers.length > 0) {
// 转换上一步的供应商数据,添加评价人员数量字段
const suppliersWithEvaluators = taskFormData.selectedSuppliers.map(
(supplier: SupplierItem) => {
(supplier: supplierAnnualTaskManage.SupplierItem) => {
// 确保evaluators字段存在且为数组
const evaluators = supplier.evaluators || [];
return {
@ -137,11 +133,11 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
*/
const updateFormData = (updatedData: any) => {
// 结构 更新数据中的suppliersWithEvaluators
const { suppliersWithEvaluators }: { suppliersWithEvaluators: SupplierItem[] } = updatedData;
const { suppliersWithEvaluators }: { suppliersWithEvaluators: supplierAnnualTaskManage.SupplierItem[] } = updatedData;
// 构建供应商ID列表
const supplierIds = suppliersWithEvaluators.map((supplier) => ({
suppliedId: supplier.id,
userIds: supplier.evaluators?.map((e: PersonnelItem) => e.id) || [],
userIds: supplier.evaluators?.map((e: supplierAnnualTaskManage.PersonnelItem) => e.id) || [],
}));
// 构建userList 并去重,确保保留 isSelected 为 true 的对象
@ -150,7 +146,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
.flatMap((s) => s.evaluators || [])
.forEach((user) => {
// 如果已存在此ID的用户且当前用户isSelected为true或者Map中不存在此用户则更新/添加
if (!userMap.has(user.id) || user.isSelected) {
if (!userMap.has(user.id) || (user as any).isSelected) {
userMap.set(user.id, user);
}
});
@ -182,7 +178,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
* 打开评价人员选择模态框
* @param supplier 当前选中的供应商
*/
const handleSelectEvaluators = (supplier: SupplierItem) => {
const handleSelectEvaluators = (supplier: supplierAnnualTaskManage.SupplierItem) => {
setCurrentSupplier(supplier);
setModalMode(ModalMode.SELECT);
setEvaluatorModalVisible(true);
@ -193,7 +189,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
* 打开评价人员查看模态框
* @param supplier 当前选中的供应商
*/
const handleViewEvaluators = (supplier: SupplierItem) => {
const handleViewEvaluators = (supplier: supplierAnnualTaskManage.SupplierItem) => {
// 查找完整的供应商数据包括evaluators
const fullSupplier = suppliers.find((s) => s.id === supplier.id);
if (fullSupplier) {
@ -211,7 +207,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
* 更新供应商的评价人员列表并同步到 Dva model
* @param selectedEvaluators 选中的评价人员列表
*/
const handleEvaluatorSelect = (selectedEvaluators: PersonnelItem[]) => {
const handleEvaluatorSelect = (selectedEvaluators: supplierAnnualTaskManage.PersonnelItem[]) => {
if (!currentSupplier) return;
// 更新当前供应商的评价人员列表
const updatedSuppliers = suppliers.map((supplier) => {
@ -241,7 +237,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
* 批量更新供应商的评价人员列表并同步到 Dva model
* @param selectedEvaluators 选中的评价人员列表
*/
const handleBatchEvaluatorSelect = (selectedEvaluators: PersonnelItem[]) => {
const handleBatchEvaluatorSelect = (selectedEvaluators: supplierAnnualTaskManage.PersonnelItem[]) => {
if (selectedRowKeys.length === 0) return;
// 更新所有选中供应商的评价人员列表
@ -288,7 +284,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
// 渲染组件
return (
<div className={styles.evaluatorSelectStep}>
<Card title="选择年审人员" bordered={false} className="inner-card">
<Card title="选择评价人员" bordered={false} className="inner-card">
{/* 工具栏区域 */}
{mode !== 'division' && (
<div className={styles.toolbar}>
@ -298,7 +294,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
onClick={handleBatchSelect}
disabled={selectedRowKeys.length === 0}
>
</Button>
</Space>
</div>
@ -321,7 +317,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
/>
)}
{/* 批量选择年审人员弹窗 */}
{/* 批量选择评价人员弹窗 */}
<BatchEvaluatorModal
visible={batchSelectModalVisible}
onCancel={() => setBatchSelectModalVisible(false)}
@ -330,7 +326,7 @@ const EvaluatorSelectStepComponent = (props: EvaluatorSelectStepProps) => {
onSelect={handleBatchEvaluatorSelect}
/>
{/* 单个供应商年审人员弹窗 */}
{/* 单个供应商评价人员弹窗 */}
<SupplierEvaluatorModal
visible={evaluatorModalVisible}
onCancel={() => setEvaluatorModalVisible(false)}

View File

@ -2,7 +2,6 @@ import React, { forwardRef, useImperativeHandle, useEffect, useState } from 'rea
import { Card } from 'antd';
import styles from '../supplierAnnualTaskManageAdd.less';
import SupplierSelector from '@/components/SupplierSelector';
import type { SupplierItem } from '@/servers/dao/supplierEvaluateTask';
import type { Dispatch } from 'umi';
import { connect } from 'umi';
import type { SupplierTaskModelState } from '@/models/supplierAnnualTaskManage';
@ -21,7 +20,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => {
const { taskFormData } = supplierAnnualTaskManage;
// 内部状态避免直接操作formData导致循环更新
const [selectedSuppliers, setSelectedSuppliers] = useState<SupplierItem[]>([]);
const [selectedSuppliers, setSelectedSuppliers] = useState<supplierAnnualTaskManage.SupplierItem[]>([]);
// 当taskFormData.selectedSuppliers更新时同步到本地状态
useEffect(() => {
@ -40,7 +39,7 @@ const SupplierSelectStepComponent = (props: SupplierSelectStepProps) => {
}));
// 处理供应商选择
const handleSupplierSelect = (suppliers: SupplierItem[]) => {
const handleSupplierSelect = (suppliers: supplierAnnualTaskManage.SupplierItem[]) => {
// 确保每个供应商都有evaluators字段
const suppliersWithEvaluators = suppliers.map(supplier => ({
...supplier,

View File

@ -167,7 +167,7 @@ const SupplierTaskManageAdd: React.FC<PageProps> = ({ supplierAnnualTaskManage,
* 提交任务数据
* @param taskStatus 任务状态,决定是否需要下级单位完善
*/
const submitTaskData = (taskStatus: TaskNotifyLowerUnits | null) => {
const submitTaskData = (taskStatus: string | null) => {
if (dispatch) {
dispatch({
type: 'supplierAnnualTaskManage/submitTaskData',