import { useEffect, useState } from "react"; import { Badge, Button, Form, Input, Modal, Space, Table, message } from "antd"; import ControlWrapper from "@cqsjjb/jjb-react-admin-component/ControlWrapper"; import SearchForm from "~/components/SearchForm"; import TableAction from "@cqsjjb/jjb-react-admin-component/TableAction"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { NS_COURSEWARE } from "~/enumerate/namespace"; import { COURSEWARE_STATUS_MAP } from "~/enumerate/constant"; import ClassPaperConfig from "./PaperConfig"; /** 视频累计时长(小时)→ “X分钟Y秒” */ const formatVideoDuration = (hours) => { if (hours == null) return "-"; const totalSeconds = Math.round(hours * 3600); return `${Math.floor(totalSeconds / 60)}分钟${totalSeconds % 60}秒`; }; /** 班级详情 — 课程 Tab:班级课程查询 */ function ClassCourseTab(props) { const { classId } = props; const [searchForm] = Form.useForm(); const [query, setQuery] = useState({ current: 1, size: 10 }); const [selectOpen, setSelectOpen] = useState(false); const { classCourseList: dataSource, classCourseTotal: total, classCourseLoading: loading, } = props.courseware || {}; const tableSource = Array.isArray(dataSource) ? dataSource : []; const handleSearch = (params = query) => { props.classCoursePage({ ...params, classId }); }; useEffect(() => { if (!classId) return; handleSearch(query); }, [classId]); const columns = [ { title: "序号", width: 70, fixed: "left", render: (_, __, index) => (query.current - 1) * query.size + index + 1, }, { title: "课程名称", dataIndex: "courseName", width: 320, ellipsis: true, render: (v) => v || "-", }, { title: "要求完成总学时", dataIndex: "requiredTotalHours", width: 130, render: (v) => (v == null ? "-" : v), }, { title: "视频累计时长", dataIndex: "videoDuration", width: 130, render: (v) => formatVideoDuration(v), }, { title: "上课学员数", dataIndex: "studentCount", width: 110, render: (v) => (v == null ? "-" : v), }, { title: "已完成学员数", dataIndex: "completedCount", width: 120, render: (v) => (v == null ? "-" : v), }, { title: "操作", width: 140, fixed: "right", render: (_, record) => ( ), }, ]; return ( <> , ]} onReset={(value) => { const next = { ...value, current: 1, size: 10 }; setQuery(next); handleSearch(next); }} onFinish={(value) => { const next = { ...value, current: 1, size: 10 }; setQuery(next); handleSearch(next); }} /> `共 ${t} 条`, current: query.current, pageSize: query.size, onChange: (page, pageSize) => { const next = { ...query, current: page, size: pageSize }; setQuery(next); handleSearch(next); }, }} /> item.courseId)} onOk={async (rows) => { // 批量新增班级课程 const res = await props.classCourseBatchSave( rows.map(({ id, courseName, classHourDuration }) => ({ classId, courseId: id, courseName, requiredTotalHours: classHourDuration, })), ); if (res?.success === false) return; message.success("添加成功"); setSelectOpen(false); handleSearch(); }} onCancel={() => setSelectOpen(false)} /> ); } /** 选择课程弹窗:数据源同培训课程管理列表 */ function CourseSelectModal({ open, loading, confirmLoading, dataSource, total, requestPage, selectedIds, onOk, onCancel, }) { const [query, setQuery] = useState({ current: 1, size: 10 }); const [keyword, setKeyword] = useState(""); const [selectedRows, setSelectedRows] = useState([]); const handleSearch = (params) => { setQuery(params); requestPage(params); }; useEffect(() => { if (open) { setKeyword(""); setSelectedRows([]); handleSearch({ current: 1, size: 10 }); } }, [open]); return ( onOk(selectedRows)} onCancel={onCancel} > setKeyword(e.target.value)} onSearch={(value) => handleSearch({ current: 1, size: query.size, courseName: value }) } />
v || "-", }, { title: "课程状态", dataIndex: "status", width: 90, render: (v) => { const item = COURSEWARE_STATUS_MAP[v]; return item ? : "-"; }, }, { title: "总课时", dataIndex: "classHourDuration", width: 90, render: (v) => (v == null ? "-" : v), }, ]} dataSource={Array.isArray(dataSource) ? dataSource : []} rowSelection={{ preserveSelectedRowKeys: true, selectedRowKeys: selectedRows.map((r) => r.id), getCheckboxProps: (record) => ({ disabled: selectedIds.includes(record.id), }), onChange: (_, rows) => setSelectedRows(rows), }} pagination={{ total, size: "small", showTotal: (t) => `共 ${t} 条`, current: Number(query.current) || 1, pageSize: Number(query.size) || 10, onChange: (page, pageSize) => handleSearch({ current: page, size: pageSize, courseName: query.courseName, }), }} /> ); } export default Connect([NS_COURSEWARE], true)(ClassCourseTab);