import { useEffect, useState } from "react"; import { Button, Col, DatePicker, Form, Input, InputNumber, Modal, Radio, Row, Select, Space, Spin, Tabs, message, } from "antd"; import dayjs from "dayjs"; import PageLayout from "@cqsjjb/jjb-react-admin-component/PageLayout"; import { Connect } from "@cqsjjb/jjb-dva-runtime"; import { tools } from "@cqsjjb/jjb-common-lib"; import { NS_COURSEWARE, NS_ORG_INFO } from "~/enumerate/namespace"; import { CLASS_UNIT_TYPE_OPTIONS, CLASS_YES_NO_OPTIONS, COURSEWARE_TRAINING_TYPE_OPTIONS, } from "~/enumerate/constant"; import StudentTab from "./StudentTab"; import CourseTab from "./CourseTab"; const { router } = tools; const { RangePicker } = DatePicker; /** 教育培训 — 新增/编辑班级 */ function ClassAddPage(props) { const [form] = Form.useForm(); /** 已保存的班级 id:有值时解锁学员/课程 Tab */ const [savedClassId, setSavedClassId] = useState(router.query.classId); const [orgOptions, setOrgOptions] = useState([]); const [activeTab, setActiveTab] = useState("base"); const isEdit = !!router.query.classId; const unlocked = !!savedClassId; const confirmLoading = props.courseware?.classConfirmLoading; const completeLoading = props.courseware?.classCompleteLoading; const detailLoading = props.courseware?.classDetailLoading; const { classDetailData, } = props.courseware || {}; /** 是否开启考试:选否时隐藏其余考试相关字段 */ const openExam = Form.useWatch("openExam", form); const handleUnitChange = (unitId) => { const target = orgOptions.find((item) => item.value === unitId); form.setFieldValue("unitName", target?.label); }; useEffect(() => { (async () => { props.registeredOrgList({ current: 1, size: 200, state: 0 }).then(orgRes => { const list = orgRes?.data || []; const options = list.map((item) => ({ label: item.unitName, value: item.id, })); setOrgOptions(options); }) if (!isEdit) return; const res = await props.classDetail({ id: router.query.classId }); if (res?.success !== false && res?.data) { const data = res.data; let unitId = data.unitId; form.setFieldsValue({ ...data, unitId, trainingDateRange: data.startDate && data.endDate ? [dayjs(data.startDate), dayjs(data.endDate)] : undefined, }); } else { props.history.goBack(); } })(); }, []); const handleSubmit = async () => { try { const values = await form.validateFields(); // 培训日期范围拆为后端 startDate/endDate(yyyy-MM-dd) const { trainingDateRange, ...rest } = values; const payload = { ...rest, startDate: trainingDateRange?.[0]?.format("YYYY-MM-DD"), endDate: trainingDateRange?.[1]?.format("YYYY-MM-DD"), ...(isEdit ? { id: router.query.classId } : {}), }; const res = await (isEdit ? props.classModify(payload) : props.classAdd(payload)); if (res?.success === false) return; message.success("保存成功"); if (isEdit) return; // 新增:save 接口返回新班级 id,同步 URL 并解锁学员/课程 Tab const newId = res?.data; if (newId) { router.query = { ...router.query, classId: newId }; setSavedClassId(newId); } } catch { // 表单校验失败或请求异常,由 antd / http 层提示 } }; const handleComplete = () => { Modal.confirm({ title: "提示", content: "完成之后将开班,不能再进行其它更改,确认继续吗?", okText: "确定", cancelText: "取消", onOk: async () => { const res = await props.classComplete({ id: savedClassId }); if (res?.success === false) return; message.success("完成成功"); props.history.goBack(); }, }); }; return ( {activeTab === "course" && unlocked && classDetailData?.status === 0 && ( )} } >

基本信息