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);