diff --git a/config/router.config.ts b/config/router.config.ts index 62d8d2e..46534a7 100644 --- a/config/router.config.ts +++ b/config/router.config.ts @@ -181,25 +181,25 @@ export default [ }, component: '@/pages/supplierEvaluateManage/supplierEvaluateResult/supplierEvaluateResultByZb', }, - { - name: 'supplierEvaluateResultApproval', - path: 'supplierEvaluateResultApproval', - meta: { - title: '评价结果审批', - icon: 'icon-liebiaomoshi', - }, - component: '@/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval', - }, - { - name: 'supplierEvaluateResultApprovalInfo', - path: '/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo', - meta: { - title: '评价审批详情', - hide: true, - icon: 'icon-liebiaomoshi', - }, - component: '@/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo', - } + // { + // name: 'supplierEvaluateResultApproval', + // path: 'supplierEvaluateResultApproval', + // meta: { + // title: '评价结果审批', + // icon: 'icon-liebiaomoshi', + // }, + // component: '@/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApproval', + // }, + // { + // name: 'supplierEvaluateResultApprovalInfo', + // path: '/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo', + // meta: { + // title: '评价审批详情', + // hide: true, + // icon: 'icon-liebiaomoshi', + // }, + // component: '@/pages/supplierEvaluateManage/supplierEvaluateResultApproval/supplierEvaluateResultApprovalInfo', + // } ] }, // 供应商年审分组 @@ -221,6 +221,26 @@ export default [ }, component: '@/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManage', }, + { + name: 'supplierAnnualTemplateManageAdd', + path: 'supplierAnnualTemplateManageAdd', + meta: { + title: '年审模板管理新增', + hide: true, + icon: 'icon-fenlei', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageAdd', + }, + { + name: 'supplierAnnualTemplateManageDetail', + path: 'supplierAnnualTemplateManageDetail', + meta: { + title: '年审模板管理详情', + hide: true, + icon: 'icon-fenlei', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageDetail', + }, { name: 'supplierAnnualTaskManage', path: 'supplierAnnualTaskManage', @@ -231,14 +251,55 @@ export default [ component: '@/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManage', }, { - name: 'supplierAnnualQuery', - path: 'supplierAnnualQuery', + name: 'supplierAnnualTaskManageAdd', + path: 'supplierAnnualTaskManageAdd', meta: { - title: '年度查询', + title: '年审任务管理新增', + hide: true, icon: 'icon-liebiaomoshi', }, - component: '@/pages/supplierAnnualManage/supplierAnnualQuery/supplierAnnualQuery', + component: '@/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd', }, + { + name: 'supplierAnnualTaskManageDetail', + path: 'supplierAnnualTaskManageDetail', + meta: { + title: '年审任务管理详情', + hide: true, + icon: 'icon-liebiaomoshi', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageDetail', + }, + { + name: 'supplierAnnualReview', + path: 'supplierAnnualReview', + meta: { + title: '年度审查', + icon: 'icon-liebiaomoshi', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualQuery', + }, + { + name: 'supplierAnnualScore', + path: 'supplierAnnualScore', + meta: { + title: '年审打分', + hide: true, + icon: 'icon-liebiaomoshi', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScore', + }, + { + name: 'supplierAnnualScoreDetail', + path: 'supplierAnnualScoreDetail', + meta: { + title: '年审打分详情', + hide: true, + icon: 'icon-liebiaomoshi', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScoreDetail', + }, + { name: 'supplierAnnualResult', path: 'supplierAnnualResult', @@ -247,6 +308,16 @@ export default [ icon: 'icon-liebiaomoshi', }, component: '@/pages/supplierAnnualManage/supplierAnnualResult/supplierAnnualResult', + }, + { + name: 'supplierAnnualResultDetail', + path: 'supplierAnnualResultDetail', + meta: { + title: '年审结果详情', + hide: true, + icon: 'icon-liebiaomoshi', + }, + component: '@/pages/supplierAnnualManage/supplierAnnualResult/supplierAnnualResultDetail', } ] }, diff --git a/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx b/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx index 31e3e04..c1f5f11 100644 --- a/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx +++ b/src/components/EvaluateTemplateTable/EvaluateTemplateTable.tsx @@ -8,6 +8,7 @@ import { Form, InputNumber, message, + Popconfirm, } from 'antd'; import { PlusOutlined, @@ -626,13 +627,19 @@ const EvaluateTemplateTable: React.FC = ({ }} title="添加一级指标" /> - + {/* 只有待审核状态的可以打分 */} + {record.reviewStatus === AnnualReviewStatus.WAITING && ( + + )} + + ), + }, + ]; + + // 处理搜索 + const handleSearch = (values: any) => { + const { timeRange, ...rest } = values; + const params: AnnualReviewSearchParams = { ...rest }; + + if (timeRange && timeRange.length === 2) { + params.timeRange = [ + timeRange[0].format('YYYY-MM-DD'), + timeRange[1].format('YYYY-MM-DD') + ]; + } + + fetchReviewList(1, pagination.pageSize, params); + }; + + // 重置搜索表单 + const handleReset = () => { + form.resetFields(); + fetchReviewList(1, pagination.pageSize, {}); + }; + + return ( +
+ +
+
+ + + + + + + + + + + + + +
+
+ +
+ + + + + ); +}; + +export default SupplierAnnualReview; diff --git a/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualReview.less b/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualReview.less new file mode 100644 index 0000000..ea349bc --- /dev/null +++ b/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualReview.less @@ -0,0 +1,60 @@ +// 供应商年度审查样式 +.filter-action-row { + margin-bottom: 16px; +} + +.filter-form { + display: flex; + flex-wrap: wrap; + gap: 16px; + + .filter-btns { + display: flex; + gap: 8px; + margin-left: auto; + } +} + +.content-area { + margin-top: 16px; +} + +.status-tag { + margin-right: 0; +} + +// 详情页样式 +.page-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; +} + +.detail-card { + margin-bottom: 16px; +} + +.score-form { + + .score-form-item { + margin-bottom: 16px; + } + + .score-table { + margin-bottom: 16px; + + :global { + .ant-form-item { + margin-bottom: 0; + } + } + } + + .score-actions { + display: flex; + justify-content: center; + margin-top: 24px; + gap: 16px; + } +} diff --git a/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScore.tsx b/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScore.tsx new file mode 100644 index 0000000..0450ad8 --- /dev/null +++ b/src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScore.tsx @@ -0,0 +1,305 @@ +import React, { useState, useEffect } from 'react'; +import { history } from 'umi'; +import { + Button, + Card, + Descriptions, + Divider, + Spin, + message, + Typography, + Empty, + Space, + Form, + Radio, + Input, + Modal, + Tag, + Table, +} from 'antd'; +import { ArrowLeftOutlined, SaveOutlined } from '@ant-design/icons'; +import { getAnnualReviewDetail, submitAnnualReviewScore } from '@/servers/api/supplierAnnual'; +import { + AnnualReviewStatus, + AnnualReviewStatusText, + AnnualReviewStatusColor, + ExamineResult, + ExamineResultText, +} from '@/dicts/supplierAnnualReviewDict'; +import styles from './supplierAnnualReview.less'; + +const { Title } = Typography; +const { TextArea } = Input; + +interface ScoreFormItem { + id: string; + name: string; + description: string; + examineResult: string; + remark: string; +} + +const SupplierAnnualReviewScore: React.FC = () => { + const [form] = Form.useForm(); + const [loading, setLoading] = useState(false); + const [submitting, setSubmitting] = useState(false); + const [reviewDetail, setReviewDetail] = useState(null); + const [scoreItems, setScoreItems] = useState([]); + + // 从路由获取ID + const { id } = history.location.state as { id: string }; + + // 获取审查详情 + const fetchReviewDetail = async (reviewId: string) => { + try { + setLoading(true); + const res = await getAnnualReviewDetail(reviewId); + if (res.success && res.data) { + setReviewDetail(res.data); + + // 这里应该根据实际接口返回的数据设置打分项 + // 由于没有具体的数据结构,这里模拟一些打分项 + const mockScoreItems: ScoreFormItem[] = [ + { + id: '1', + name: '质量评价', + description: '供应商产品质量及质量管理体系评价', + examineResult: '', + remark: '', + }, + { + id: '2', + name: '交付评价', + description: '供应商交付及时性、准确性评价', + examineResult: '', + remark: '', + }, + { + id: '3', + name: '服务评价', + description: '供应商服务响应速度及服务质量评价', + examineResult: '', + remark: '', + }, + ]; + + setScoreItems(mockScoreItems); + + // 初始化表单 + const initialValues: any = {}; + mockScoreItems.forEach((item) => { + initialValues[`examineResult_${item.id}`] = ''; + initialValues[`remark_${item.id}`] = ''; + }); + + form.setFieldsValue(initialValues); + } else { + message.error(res.message || '获取审查详情失败'); + } + } catch (error) { + console.error('获取审查详情失败:', error); + message.error('获取审查详情失败'); + } finally { + setLoading(false); + } + }; + + // 首次加载获取数据 + useEffect(() => { + if (id) { + fetchReviewDetail(id); + } else { + message.error('审查ID不存在,无法获取详情'); + history.goBack(); + } + }, [id]); + + // 返回列表页 + const handleBack = () => { + history.goBack(); + }; + // 提交评分 + const submitScore = async () => { + if (!reviewDetail) return; + + try { + setSubmitting(true); + + // 准备提交数据 + const formValues = form.getFieldsValue(); + const scoreVoList = scoreItems.map((item) => ({ + id: item.id, + examineResult: formValues[`examineResult_${item.id}`], + remark: formValues[`remark_${item.id}`] || '', + })); + + const submitData: supplierAnnualReview.ScoreRequest = { + id: reviewDetail.id, + scoreVoList, + }; + + const res = await submitAnnualReviewScore(submitData); + + if (res.success) { + message.success('评审提交成功'); + history.goBack(); + } else { + message.error(res.message || '评审提交失败'); + } + } catch (error) { + console.error('评审提交失败:', error); + message.error('评审提交失败'); + } finally { + setSubmitting(false); + } + }; + // 提交表单 + const handleSubmit = async () => { + try { + // 表单验证 + await form.validateFields(); + + // 确认提交 + Modal.confirm({ + title: '确认提交', + content: '确定要提交评审结果吗?提交后将无法修改。', + okText: '确定', + cancelText: '取消', + onOk: submitScore, + }); + } catch (error) { + console.error('表单验证失败:', error); + } + }; + + // 获取状态标签 + const getStatusTag = (status: string | undefined, statusName: string | undefined) => { + if (!status) return 未知状态; + const color = + AnnualReviewStatusColor[status as keyof typeof AnnualReviewStatusColor] || 'default'; + const text = + statusName || + AnnualReviewStatusText[status as keyof typeof AnnualReviewStatusText] || + '未知状态'; + return {text}; + }; + + return ( +
+ +
+ + 年度审查评分 + + +
+ + {reviewDetail ? ( + <> + + + + {reviewDetail.annualreviewTheme} + + {reviewDetail.name} + + {reviewDetail.deptName || '-'} + + + {reviewDetail.userName || '-'} + + {reviewDetail.startTime} + {reviewDetail.endTime} + + {getStatusTag(reviewDetail.reviewStatus, reviewDetail.reviewStatusName)} + + + + + + + +
+
( + + + + {ExamineResultText[ExamineResult.QUALIFIED]} + + + {ExamineResultText[ExamineResult.UNQUALIFIED]} + + + + ), + }, + { + title: '评审说明', + dataIndex: 'remark', + width: '35%', + render: (_, record) => ( + +