From 5c54182ca14d1d9364cdef0d469bf1c92d31a1f2 Mon Sep 17 00:00:00 2001 From: linxd <544554903@qq.com> Date: Fri, 27 Jun 2025 17:15:45 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=B4=E5=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/router.config.ts | 117 ++++- .../EvaluateTemplateTable.tsx | 41 +- src/dicts/friendLinkDict.ts | 52 -- src/dicts/helpManageDict.ts | 62 --- src/dicts/noticeManageDict.ts | 41 -- src/dicts/policyManageDict.ts | 42 -- src/dicts/supplierAnnualDict.ts | 22 + src/dicts/supplierAnnualReviewDict.ts | 43 ++ src/locales/en-US/menu.ts | 1 + src/locales/zh-CN/menu.ts | 1 + .../supplierAnnualQuery.tsx | 12 - .../supplierAnnualResultDetail.tsx | 0 .../supplierAnnualQuery.tsx | 325 ++++++++++++ .../supplierAnnualReview.less | 60 +++ .../supplierAnnualScore.tsx | 305 +++++++++++ .../supplierAnnualScoreDetail.tsx | 211 ++++++++ .../supplierAnnualTaskManageAdd.tsx | 0 .../supplierAnnualTaskManageDetail.tsx | 0 .../supplierAnnualTemplateManage.less | 59 +++ .../supplierAnnualTemplateManage.tsx | 399 +++++++++++++- .../supplierAnnualTemplateManageAdd.tsx | 495 ++++++++++++++++++ .../supplierAnnualTemplateManageDetail.tsx | 181 +++++++ .../supplierEvaluateResult.tsx | 40 +- .../supplierEvaluateScore.less | 18 - .../supplierEvaluateScoreDetail.tsx | 3 + .../supplierTemplateManage.less | 49 +- .../supplierTemplateManageAdd.tsx | 12 +- .../supplierTemplateManageDetail.tsx | 3 +- src/servers/api/supplierAnnual.ts | 121 +++++ src/servers/api/supplierEvaluate.ts | 12 + src/servers/api/typings.d.ts | 2 +- .../supplierAnnualReview.d.ts | 92 ++++ .../supplierAnnualTemplateManage.d.ts | 142 +++++ 33 files changed, 2648 insertions(+), 315 deletions(-) delete mode 100644 src/dicts/friendLinkDict.ts delete mode 100644 src/dicts/helpManageDict.ts delete mode 100644 src/dicts/noticeManageDict.ts delete mode 100644 src/dicts/policyManageDict.ts create mode 100644 src/dicts/supplierAnnualDict.ts create mode 100644 src/dicts/supplierAnnualReviewDict.ts delete mode 100644 src/pages/supplierAnnualManage/supplierAnnualQuery/supplierAnnualQuery.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualResult/supplierAnnualResultDetail.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualQuery.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualReview.less create mode 100644 src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScore.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualReview/supplierAnnualScoreDetail.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageAdd.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualTaskManage/supplierAnnualTaskManageDetail.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManage.less create mode 100644 src/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageAdd.tsx create mode 100644 src/pages/supplierAnnualManage/supplierAnnualTemplateManage/supplierAnnualTemplateManageDetail.tsx create mode 100644 src/servers/api/supplierAnnual.ts create mode 100644 src/servers/dao/supplierAnnualManage/supplierAnnualReview.d.ts create mode 100644 src/servers/dao/supplierAnnualManage/supplierAnnualTemplateManage.d.ts 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) => ( + +