import * as React from 'react'; import { observer } from 'mobx-react'; import { List, Button, Divider, Flex, Layout, Empty, Image, Modal, Tag, message, Tooltip, Select, Form } from 'antd'; import { PlusOutlined, FileOutlined, SettingOutlined, DeleteOutlined, StepForwardOutlined } from '@ant-design/icons'; import { apis } from '@/apis'; import './style.less'; import { PaginationConfig } from 'antd/es/pagination'; import router from '@/router'; import LocalStorage from '@/LocalStorage'; import { create } from 'domain'; import audit from '../../audit'; import { set } from 'mobx'; const { Header, Footer, Sider, Content } = Layout; const { Option } = Select; const FormItem = Form.Item; const headerStyle: React.CSSProperties = { textAlign: 'center', height: 24, paddingInline: 48, lineHeight: '30px', backgroundColor: '#fff', }; const contentStyle: React.CSSProperties = { textAlign: 'center', lineHeight: '40px', backgroundColor: '#fff', }; const siderStyle: React.CSSProperties = { paddingLeft: 30, paddingTop: 30, height: 80, backgroundColor: '#fff', }; const footerStyle: React.CSSProperties = { textAlign: 'center', color: '#fff', height: 24, backgroundColor: '#4096ff', }; const layoutStyle = { borderRadius: 8, overflow: 'hidden', width: 'calc(10% - 8px)', maxWidth: 'calc(20% - 8px)', }; const QuestionAnswerList: React.FC = () => { const [form] = Form.useForm(); interface Item { name: string, desc: string, appId: number, createBy: string, typeId: string; status: string; comment: string; auditStatus: string; projectName: string; }; interface PageInfo { pageNumber: number, pageSize: number, total: number, }; type AppTypeList = { label: string, value: string, }[]; type ProjectTypeList = { label: string, value: string, }[]; const [listLoading, setListLoading] = React.useState(false); const [list, setList] = React.useState([]); const [page, setPage] = React.useState({ pageNumber: 1, pageSize: 10, total: 0, }); const [appCount, setAppCount] = React.useState(); const [knowCount, setKnowCount] = React.useState(); const { Header, Footer, Sider, Content } = Layout; const [appTypeList, setAppTypeList] = React.useState([]); const [createFlag, setCreateFlag] = React.useState(false); const [deleteFlag, setDeleteFlag] = React.useState(false); const [updateFlag, setUpdateFlag] = React.useState(false); const [projectList, setProjectList] = React.useState([]); const [appProjectList, setAppProjectList] = React.useState([]); const [showSubPanel, setShowSubPanel] = React.useState(false); const [selectedType, setSelectedType] = React.useState(null); const wrapperRef = React.useRef(null); const selectRef = React.useRef(null); const [levelTypeList, setLevelTypeList] = React.useState([]); const appApi = { fetchList: async (typeId: any, projectId: any) => { setListLoading(true); try { const userInfo = LocalStorage.getUserInfo(); const userId = (userInfo?.id ?? '').toString(); const res = await apis.fetchTakaiAppList({ pageSize: page.pageSize, pageNumber: page.pageNumber, userId: userId, typeId: typeId, projectId: projectId, }) const list = res.rows.map((item: any) => { return { name: item.name, desc: item.desc, appId: item.appId, createBy: item.createBy, typeId: item.typeId, status: item.status, comment: item.comment, auditStatus: item.auditStatus, projectName: item.projectName } }); const c = LocalStorage.getStatusFlag('deepseek:application:create'); const u = LocalStorage.getStatusFlag('deepseek:application:delete'); const filteredList = list.filter((item: any) => { // 如果有 createFlag 或 updateFlag 权限,显示所有数据 if (c || u) { return true; } // 没有权限时排除 status='5' 的数据 return item.status !== '5'; }); setList(filteredList); setPage({ pageNumber: page.pageNumber, pageSize: page.pageSize, total: res.total, }); } catch (error) { console.error(error); } finally { setListLoading(false); } }, auditApplication: async (appId: string, userId: string) => { const res = await apis.auditTakaiApplicationLibApi(appId, userId); if (res.data === 9) { message.error('您没有添加审核人'); } await appApi.fetchList(null, null); } }; // 删除应用 const delApplication = async (appId: string) => { try { await apis.deleteTakaiApplicationApi(appId); await appApi.fetchList(null, null); } catch (error) { console.error(error); } } const indexApi = { fetchIndex: async (typeId: any, projectId: any) => { try { const userInfo = LocalStorage.getUserInfo(); const userId = (userInfo?.id ?? '').toString(); const res = await apis.fetchTakaiIndexCount({ pageSize: page.pageSize, pageNumber: page.pageNumber, userId: userId, typeId: typeId, projectId: projectId, }) setAppCount(res.data.applicationCount); setKnowCount(res.data.knowledgeCount); } catch (error) { console.error(error); } finally { setListLoading(false); } } }; // 获取应用类型 const appTypeApi = { fetchAppType: async () => { try { const res = await apis.fetchTakaiAppTypeList('app_type'); const list = res.data.map((item: any) => { return { label: item.dictLabel, value: item.dictCode, } }); setAppTypeList(list); } catch (error: any) { console.error(error); } }, }; // 项目级应用下的类型 const appProTypeApi = { fetchAppProType: async () => { try { const res = await apis.fetchTakaiAppTypeList('project_type'); const list = res.data.map((item: any) => { return { label: item.dictLabel, value: item.dictCode, } }); setAppProjectList(list); } catch (error: any) { console.error(error); } }, }; const projectApi = { fetchProject: async () => { try { const res = await apis.fetchTakaiProjectLibApi(); const list = res.data.map((item: any) => { return { label: item.projectName, value: item.projectId, } }); setProjectList(list); } catch (error: any) { console.error(error); } }, }; // 获取应用类型 const levelTypeApi = { fetchLevelAppType: async () => { try { const res = await apis.fetchTakaiAppTypeList('project_type'); const list = res.data.map((item: any) => { return { label: item.dictLabel, value: item.dictCode, } }); setLevelTypeList(list); } catch (error: any) { console.error(error); } }, }; const init = async () => { await appApi.fetchList(null, null); await indexApi.fetchIndex(null, null); await appTypeApi.fetchAppType(); await projectApi.fetchProject(); await appProTypeApi.fetchAppProType(); await levelTypeApi.fetchLevelAppType(); } React.useEffect(() => { setCreateFlag(LocalStorage.getStatusFlag('deepseek:application:create')); setDeleteFlag(LocalStorage.getStatusFlag('deepseek:application:delete')); setUpdateFlag(LocalStorage.getStatusFlag('deepseek:application:update')); init(); }, [page.pageSize, page.pageNumber]) const paginationConfig: PaginationConfig = { // 显示数据总量 showTotal: (total: number) => { return `共 ${total} 条`; }, // 展示分页条数切换 showSizeChanger: true, // 指定每页显示条数 // pageSizeOptions: ['2', '20', '50', '100'], // 快速跳转至某页 showQuickJumper: true, current: page.pageNumber, pageSize: page.pageSize, total: page.total, onChange: (pageNumber, pageSize) => { setPage({ pageNumber: pageNumber, pageSize: pageSize, total: page.total, }); }, }; // 点击查询 const handleClickSearch = async () => { form.validateFields().then(async (values) => { if(values.proTypeId){ values.typeId = values.proTypeId; } await indexApi.fetchIndex(values.typeId, values.projectId); await appApi.fetchList(values.typeId, values.projectId); }).catch((error) => { console.error(error); }); }; // 点击重置 const handleClickReset = async () => { form.resetFields(); setShowSubPanel(false); page.pageNumber = 1; page.pageSize = 10; await appApi.fetchList(null, null); await indexApi.fetchIndex(null, null); }; /** 点击外部关闭面板 */ React.useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (wrapperRef.current && !wrapperRef.current.contains(event.target as Node)) { setShowSubPanel(false); } }; document.addEventListener('mousedown', handleClickOutside, true); return () => { document.removeEventListener('mousedown', handleClickOutside, true); }; }, []); const handleAppTypeChange = (value: number) => { console.log(value, 'sssss'); if (value === 41) { // 如果是项目级应用,切换面板状态 // setShowSubPanel(prev => !prev); setShowSubPanel(true); } else { // 其他选项,隐藏面板 setShowSubPanel(false); } setSelectedType(value); form.setFieldsValue({ typeId: value }); }; const handleAppProTypeChange = (value: number) => { console.log(value, 'valuevalue'); setSelectedType(value); form.setFieldsValue({ typeId: value }); }; return (
{/* 主选择器 */} {/* 子选项面板 */} {showSubPanel && selectedType === 41 && ( //
//
)}
{/* { appProjectList.map((subItem, index) => (
{subItem.label}
)) } */}
{ list.length ?
问答应用总数
{appCount}个
知识库总数
{knowCount} 个
所有问答应用
{ createFlag && }
(
{item.name}
<> {item.projectName} { (item.status !== null && item.status !== '3') && < Tag style={{ marginLeft: 16, width: 65, color: '#fff', height: 25, backgroundColor: item.status === '1' ? '#D26900' : item.status === '2' ? '#408080' : item.auditStatus === '4' ? '#CE0000' : item.status === '5' ? '#5151A2' : '' }}> {item.status === '1' ? '待审核' : item.status === '2' ? '审核中' : item.auditStatus === '4' ? '审核拒绝' : item.status === '5' ? '待提交' : '未知'} } { (item.auditStatus === '4') && { item.comment !== '' && item.comment !== null && item.comment.length > 10 ? item.comment.substring(0, 10) + '......' : item.comment } }
{ item.desc !== '' && item.desc !== null && item.desc.length > 35 ? item.desc.substring(0, 35) + '......' : item.desc }
{ (item.status === '5' || item.status === '4' || item.status === '3' || item.status === '' || item.status === null) && <> { updateFlag && { router.navigate({ pathname: '/deepseek/questionAnswer/modify' }, { state: { id: item.appId } }); }}> 编辑 } { deleteFlag && { Modal.confirm({ title: '删除', content: `确定删除应用名称: ` + item.name + ` 吗?`, okType: 'danger', onOk: async () => { await delApplication(item.appId.toString()); } }); }}> 删除 } } { createFlag && item.status === '5' && { Modal.confirm({ title: '提交审核', content: `确认提交审核应用名称: ` + item.name + `吗?`, okType: 'danger', onOk: async () => { const userInfo = LocalStorage.getUserInfo(); const userId = (userInfo?.id ?? '').toString(); appApi.auditApplication(item.appId.toString(), userId); } }); }}> 提交审核 }
{ appTypeList .find(item1 => item1.value.toString() === item.typeId)?.label || levelTypeList.find(item2 => item2.value.toString() === item.typeId)?.label || '未分类' }
)} pagination={paginationConfig} // 分页 />
:
{ createFlag && }
}
) }; export default observer(QuestionAnswerList);