Commit 63b43bd5 authored by baixian's avatar baixian

bug修改

parent 9463cde5
......@@ -94,9 +94,11 @@ export default {
addClassStudents: `${dakaapi}member/erp/class/student/add`,
plansAdd: `${dakaapi}member/erp/plans`,
wxConfig: `${dakaapi}member/erp/config`,
deleteClassMgt: `${dakaapi}member/class`,
},
teacherMgt: {
teacherInvitations: `${dakaapi}member/erp/teacher/invitations`,
courseStatistical: `${dakaapi}member/erp/teachers/course_statistical`,
},
studentMgt: {
studentsList: `${dakaapi}member/erp/students`,
......
......@@ -169,6 +169,29 @@ export default {
},
});
},
* deleteClass({ payload }, { call, put, select }) {
const { id } = payload;
const data = yield call(classMgtAjax.deleteClassMgt, {
id,
});
if (data.code == 200) {
message.success('删除成功', 0.5);
yield put({
type: 'queryClassList',
payload: {
params: {
},
},
});
} else {
yield put({
type: 'webapp/errorrequestresolve',
payload: {
data,
},
});
}
},
* queryStatusChanageClassList({ payload }, { call, put, select }) {
const { params, action } = payload;
const { sid } = yield select(state => state.webapp);
......
......@@ -518,6 +518,7 @@ export default {
operator_id,
isBuycourse,
force,
params,
} = payload;
const classids = new Array(class_ids).join(',');
const loadmessage = message.loading('资料保存中...', 0);
......@@ -542,6 +543,16 @@ export default {
});
setTimeout(loadmessage);
if (data.code == 200) {
console.log(data.data.name, 'data');
if (params && params.type === 'index') {
yield put(routerRedux.push('/sjd/student'));
yield put({
type: 'updateState',
payload: {
indexQrcodeTitle: `请学员${data.data.name}扫描绑定小程序`,
},
});
}
if (isBuycourse) {
const { courseList } = yield select(state => state.students);
const renewCourses = courseList;
......@@ -701,6 +712,7 @@ export default {
expend: values.expend,
remark: values.remark,
mode_type: values.course_mode || 1,
course_type: values.course_type,
});
yield put({
type: 'updateState',
......
......@@ -13,7 +13,6 @@ import * as schedulemgtAjax from '../services/schedulemgt';
import * as classroommgtAjax from '../services/classroommgt';
import * as courseAjax from '../services/course';
import * as commonAjax from '../services/common';
export default {
namespace: 'teachersinfo',
state: {
......@@ -98,6 +97,15 @@ export default {
callDetailShow: false,
// 查看点名详情的接口
timeArr: [],
courseStaticParams: {
start_time: '',
end_time: '',
course_id: '',
page: 1,
perPage: 10,
},
courseStaticList: [],
courseStaticTotal: 0,
},
subscriptions: {
setup({ dispatch, history }) { // eslint-disable-line
......@@ -235,6 +243,12 @@ export default {
yield put({
type: 'queryTimeList',
});
yield put({
type: 'selectCourseStatistical',
payload: {
params: {},
},
});
},
* queryClassroomList({ payload }, { call, put, select }) {
const { classroomList } = yield select(state => state.classmgt);
......@@ -668,6 +682,36 @@ export default {
// message.error(timeListData.msg, 1);
}
},
* selectCourseStatistical({ payload }, { call, put, select }) {
const { params } = payload;
const { sid } = yield select(state => state.webapp);
const { courseStaticParams, courseStaticTotal, teacherId } = yield select(state => state.teachersinfo);
const newParams = Object.assign(courseStaticParams, params, {
school_id: sid,
teacher_id: teacherId,
});
let newTotal = courseStaticTotal;
const data = yield call(teachersAjax.selectCourseStatistical, newParams);
if (data.code == 200) {
if (data.data.total != undefined) {
newTotal = data.data.total;
}
yield put({
type: 'updateState',
payload: {
courseStaticList: data.data && data.data.list,
courseStaticTotal: newTotal,
},
});
} else {
yield put({
type: 'webapp/errorrequestresolve',
payload: {
data,
},
});
}
},
* pageInit({ payload }, { call, put, select }) {
yield put({
type: 'updateState',
......@@ -750,7 +794,15 @@ export default {
callStudentTotal: 0,
callStudentList: [],
callDetailShow: false,
// 查看点名详情的接口
courseStaticParams: {
start_time: '',
end_time: '',
course_id: '',
page: 1,
perPage: 10,
},
courseStaticList: [],
courseStaticTotal: 0,
},
});
},
......
......@@ -445,6 +445,36 @@ class ClassMgtForm extends React.Component {
payload: timeKey,
});
}
deleteClass = (record) => {
const { dispatch } = this.props;
console.log(record, 'record');
Modal.confirm({
title: `确认要删除${record.title}这个班级吗?`,
okText: '确认',
cancelText: '取消',
okType: 'danger',
centered: true,
okButtonProps: {
type: 'danger',
style: {
color: '#fff',
backgroundColor: '#ff4d4f',
borderColor: '#ff4d4f',
},
},
icon: <Icon type="close-circle" style={{ color: 'red' }} />,
onOk: () => {
dispatch({
type: 'classmgt/deleteClass',
payload: {
id: record.id,
},
});
},
onCancel: () => {
},
});
}
render() {
const { getFieldDecorator } = this.props.form;
const {
......@@ -569,6 +599,8 @@ class ClassMgtForm extends React.Component {
}
{hasBtnPower('sjd/classmgt', 'singleWindingUp') && record.graduation_status == 2 && <span className="hreflink" onClick={() => this.singleResetClassStatusChange(record)}>已结业</span>}
{hasBtnPower('sjd/classmgt', 'singleWindingUp') && record.graduation_status == 1 && <span className="hreflink" onClick={() => this.singleClassStatusChange(record)}>结业</span>}
<span className={pageStyle.divideline}>|</span>
<span className="hreflink" onClick={() => this.deleteClass(record)}>删除</span>
</div>
);
},
......
......@@ -172,7 +172,6 @@ class StaticCenter extends React.Component {
queryCallStudentListParams,
schoolUserInfo,
} = this.props;
console.log(schoolUserInfo, 'schoolUserInfo');
const formItemLayout = {
labelCol: {
xs: { span: 9 },
......
......@@ -34,10 +34,38 @@ import PlanCourse from '../../components/PlanCourse';
import ClassRoomMgt from '../classmgt/classRoomMgt';
import AddCourseTime from '../classdetail/AddCourseTime';
import CourseTimeList from '../classdetail/CourseTimeList';
import StudentAdd from '../student/StudentAdd';
import Cropper from '../../components/Cropper';
const { RangePicker } = DatePicker;
const echarts = require('echarts');
class StaticCenter extends React.Component {
constructor(props) {
super(props);
this.state = {
avatorUploader: {
maxsize: 8192, // 奖品图片最大尺寸KBcropper: {
cropper: {
croppered_params: [], // 图片裁剪后的参数
config: {
dragMode: 'move',
viewMode: 1,
aspectRatio: 1,
autoCropArea: 0.8,
guides: !1,
center: !0,
highlight: !1,
dragCrop: !1,
cropBoxMovable: !1,
cropBoxResizable: !1,
zoom: -0.2,
checkImageOrigin: !0,
background: !1,
rotatable: !0,
},
},
},
};
}
componentDidMount() { // 挂载
pageIn('轻校-概况');
}
......@@ -103,19 +131,31 @@ class StaticCenter extends React.Component {
});
}
goDeadlineStudent = () => {
const { dispatch } = this.props;
const { dispatch, renew } = this.props;
if (renew.total === 0) {
message.warning('还没有续费提醒噢~');
return;
}
dispatch({
type: 'indexstaic/goDeadlineStudent',
});
}
goBirthStudent = () => {
const { dispatch } = this.props;
const { dispatch, birthday } = this.props;
if (birthday.total === 0) {
message.warning('还没有学员过生日噢~');
return;
}
dispatch({
type: 'indexstaic/goBirthStudent',
});
}
goCallStudent = () => {
const { dispatch } = this.props;
const { dispatch, callData } = this.props;
if (callData.total === 0) {
message.warning('还没有未点名的学生噢~');
return;
}
dispatch({
type: 'indexstaic/goCallStudent',
});
......@@ -127,7 +167,11 @@ class StaticCenter extends React.Component {
});
}
goPlanStudent = () => {
const { dispatch } = this.props;
const { dispatch, assign } = this.props;
if (assign.total === 0) {
message.warning('还没有分配的学员噢~');
return;
}
dispatch({
type: 'indexstaic/goPlanStudent',
});
......@@ -264,6 +308,69 @@ class StaticCenter extends React.Component {
this.ds.setState('start', new Date((`${startText} 00:00:00`).replace(/-/g, '/')).getTime());
this.ds.setState('end', new Date((`${endText} 23:59:59`).replace(/-/g, '/')).getTime());
}
// 添加学员方法
setModal1Visible(visible) {
const { dispatch, schoolUserInfo } = this.props;
dispatch({
type: 'students/updateState',
payload: {
operator: { ...schoolUserInfo },
studentAvator: '',
},
});
dispatch({
type: 'students/modalshoworhide',
payload: {
visible,
},
});
}
saveStudent = (value) => {
const { dispatch } = this.props;
dispatch({
type: 'students/studentsAdd',
payload: {
...value,
params: {
type: 'index', // 首页
},
},
});
}
uploadStudentAvator = ({ files, uploadtype }) => {
const { dispatch } = this.props;
dispatch({
type: 'uploader/queryimgsignature',
payload: {
files,
avatorUploader: this.state.avatorUploader,
uploadtype,
},
});
}
cancelCropper = () => {
const { dispatch } = this.props;
dispatch({
type: 'uploader/cancelcropper',
});
}
getCropperUrl = (url) => {
const { dispatch } = this.props;
dispatch({
type: 'uploader/updateState',
payload: {
cropperUrl: url,
},
});
}
sureCropper = () => {
const { dispatch } = this.props;
dispatch({
type: 'uploader/surecropper',
payload: {
},
});
}
render() {
const that = this;
const {
......@@ -287,6 +394,12 @@ class StaticCenter extends React.Component {
chartStartDate,
scheduleCount,
courseTimeListShow,
addOrUpdateDiaShow,
datetime,
studentAvator,
cropperboxShow,
uploadImgUrl,
avatorUploader,
} = this.props;
// 图表功能注释代码
// const dataArray = clockCharts;
......@@ -577,45 +690,45 @@ class StaticCenter extends React.Component {
<Card className={pageStyle.informList} bodyStyle={{ borderRadius: 6, padding: '36px 0' }} bordered={false}>
<Row gutter={24}>
<Col xs={{ span: 8, offset: 0 }} sm={{ span: 8, offset: 0 }} md={{ span: 4, offset: 1 }} lg={{ span: 4, offset: 1 }} xl={{ span: 4, offset: 1 }}>
<div className={pageStyle.informItem}>
<div className={pageStyle.informItem} onClick={() => this.setModal1Visible(true)}>
<div className={pageStyle.informImg}><img src={`${__IMGCDN__}/index/inform_icon1.png`} alt="" />
<Badge className={pageStyle.informNum} count={99}>
<Badge className={pageStyle.informNum}>
</Badge>
</div>
<div className={pageStyle.informTip}>学员报名</div>
</div>
</Col>
<Col xs={{ span: 8, offset: 0 }} sm={{ span: 8, offset: 0 }} md={{ span: 4, offset: 1 }} lg={{ span: 4, offset: 1 }} xl={{ span: 4, offset: 1 }}>
<div className={pageStyle.informItem}>
<div className={pageStyle.informItem} onClick={this.goCallStudent}>
<div className={pageStyle.informImg}><img src={`${__IMGCDN__}/index/inform_icon2.png`} alt="" />
<Badge className={pageStyle.informNum} count={99}>
<Badge className={pageStyle.informNum} overflowCount={999} count={callData.total}>
</Badge>
</div>
<div className={pageStyle.informTip}>点名提醒</div>
</div>
</Col>
<Col xs={{ span: 8, offset: 0 }} sm={{ span: 8, offset: 0 }} md={{ span: 4, offset: 1 }} lg={{ span: 4, offset: 1 }} xl={{ span: 4, offset: 1 }}>
<div className={pageStyle.informItem}>
<div className={pageStyle.informItem} onClick={this.goPlanStudent}>
<div className={pageStyle.informImg}><img src={`${__IMGCDN__}/index/inform_icon3.png`} alt="" />
<Badge className={pageStyle.informNum} count={99}>
<Badge className={pageStyle.informNum} overflowCount={999} count={assign.total}>
</Badge>
</div>
<div className={pageStyle.informTip}>分配提醒</div>
</div>
</Col>
<Col xs={{ span: 8, offset: 0 }} sm={{ span: 8, offset: 0 }} md={{ span: 4, offset: 1 }} lg={{ span: 4, offset: 1 }} xl={{ span: 4, offset: 1 }}>
<div className={pageStyle.informItem}>
<div className={pageStyle.informItem} onClick={this.goBirthStudent}>
<div className={pageStyle.informImg}><img src={`${__IMGCDN__}/index/inform_icon4.png`} alt="" />
<Badge className={pageStyle.informNum} count={99}>
<Badge className={pageStyle.informNum} overflowCount={999} count={birthday.total}>
</Badge>
</div>
<div className={pageStyle.informTip}>生日提醒</div>
</div>
</Col>
<Col xs={{ span: 8, offset: 0 }} sm={{ span: 8, offset: 0 }} md={{ span: 4, offset: 0 }} lg={{ span: 4, offset: 0 }} xl={{ span: 4, offset: 0 }}>
<div className={pageStyle.informItem}>
<div className={pageStyle.informItem} onClick={this.goDeadlineStudent}>
<div className={pageStyle.informImg}><img src={`${__IMGCDN__}/index/inform_icon5.png`} alt="" />
<Badge className={pageStyle.informNum} count={99}>
<Badge className={pageStyle.informNum} overflowCount={999} count={renew.total}>
</Badge>
</div>
<div className={pageStyle.informTip}>续费提醒</div>
......@@ -634,7 +747,21 @@ class StaticCenter extends React.Component {
</div>
</Col>
</Row>
<StudentAdd
visible={addOrUpdateDiaShow}
save={this.saveStudent}
datetime={datetime}
hide={() => this.setModal1Visible(false)}
uploadAvator={this.uploadStudentAvator}
studentAvator={studentAvator}
/>
{cropperboxShow && <Cropper
avatorUploader={this.state.avatorUploader}
cancelCropper={this.cancelCropper}
getCropperUrl={this.getCropperUrl}
sureCropper={this.sureCropper}
uploadImgUrl={uploadImgUrl}
/>}
{/* <AddCourseTime */}
{/* visible={addCourseTimeShow} */}
{/* saveCourseTime={this.saveCourseTime} */}
......@@ -678,6 +805,16 @@ function mapStateToProps(state) {
} = state.indexstaic;
// eslint-disable-next-line no-empty-pattern
const {} = state.createtheme;
const {
cropperboxShow,
uploadImgUrl,
avatorUploader,
} = state.uploader;
const {
addOrUpdateDiaShow,
datetime,
studentAvator,
} = state.students;
return {
staticcenter,
clockCharts,
......@@ -700,6 +837,12 @@ function mapStateToProps(state) {
chartStartDate,
scheduleCount,
courseTimeListShow,
addOrUpdateDiaShow,
datetime,
studentAvator,
cropperboxShow,
uploadImgUrl,
avatorUploader,
};
}
export default connect(mapStateToProps)(StaticCenter);
......
......@@ -184,6 +184,7 @@
border-radius: 6px;
margin: 14px 0;
.informItem {
cursor: pointer;
.informImg {
width: 77px;
height: 77px;
......
......@@ -322,6 +322,25 @@ class RenewEdit extends React.Component {
</div>
}
</Col>
<Col className={pageStyle.course}>
<Form.Item
label={<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}
labelCol={{
xs: { span: 24 },
sm: { span: 4 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 20 },
}}
>
{getFieldDecorator('remark', {
initialValue: '',
})(
<TextArea placeholder="请输入备注" rows={4} />,
)}
</Form.Item>
</Col>
<Col className={pageStyle.course}>
<Form.Item
label={<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}
......
import { connect } from 'dva';
import React from 'react';
import { Icon, Button, Row, Col, Input, InputNumber, Select, Checkbox, Table, Modal, Form, Alert } from 'antd';
import { Icon, Button, Row, Col, Input, InputNumber, Select, Checkbox, Table, Modal, Form, Radio } from 'antd';
import pageStyle from './eliminateEdit.less';
import { pageIn } from '../../utils/index';
const { Option } = Select;
......@@ -15,6 +15,8 @@ class eliminateEdit extends React.Component {
},
expendValue: null,
remarkTitle: '',
payCourseValue: 0,
giveCourseValue: 0,
};
}
componentDidMount() { // 挂载
......@@ -71,20 +73,25 @@ class eliminateEdit extends React.Component {
surplus: 0,
},
remarkTitle: '',
giveCourseValue: 0,
payCourseValue: 0,
});
}
expendChange = (e) => {
const { currentCourse } = this.state;
const { studentinfo } = this.props;
const { getFieldDecorator, getFieldValue } = this.props.form;
this.props.form.validateFields((err, values) => {
if (!err) {
this.setState({
expendValue: Number(currentCourse.surplus - Number(e.target.value)),
giveCourseValue: Number(getFieldValue('course_type')) === 2 ? Number(studentinfo.surplus_give - Number(e.target.value)) : studentinfo.surplus_give,
payCourseValue: Number(getFieldValue('course_type')) === 1 ? Number(studentinfo.surplus_buy - Number(e.target.value)) : studentinfo.surplus_buy,
});
}
});
}
handleChangeSize = (e) => {
console.log(e.target.value, '1111111');
this.setState({
remarkTitle: e.target.value,
});
......@@ -101,7 +108,9 @@ class eliminateEdit extends React.Component {
} = this.props;
const { getFieldDecorator, getFieldValue } = this.props.form;
const courseExcludeClassTypeList = (studentinfo.student_courses && studentinfo.student_courses.filter(ele => ele.course_mode != 3)) || [];
const { currentCourse, expendValue, remarkTitle } = this.state;
const {
currentCourse, expendValue, remarkTitle, giveCourseValue, payCourseValue,
} = this.state;
return (
<Modal
visible={visible}
......@@ -120,11 +129,11 @@ class eliminateEdit extends React.Component {
label="已购课程"
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
{getFieldDecorator('student_course_id', {
......@@ -139,11 +148,11 @@ class eliminateEdit extends React.Component {
label="当前剩余"
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
{currentCourse.course_mode == 1 &&
......@@ -156,15 +165,38 @@ class eliminateEdit extends React.Component {
) : (
''
)}
{
currentCourse.course_mode === 1 ?
<Form.Item
label="选择课时类型"
labelCol={{
xs: { span: 24 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 18 },
}}
>
{getFieldDecorator('course_type', {
initialValue: '1',
})(
<Radio.Group>
<Radio value="1">付费(剩余课时 {studentinfo.surplus_buy}</Radio>
<Radio value="2">赠送(赠送课时 {studentinfo.surplus_give}</Radio>
</Radio.Group>,
)}
</Form.Item> : ''
}
<Form.Item
label="本次消耗"
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
{getFieldDecorator('expend', {
......@@ -184,28 +216,44 @@ class eliminateEdit extends React.Component {
},
],
})(
<InputNumber onBlur={e => this.expendChange(e)} placeholder="请输入消课数量" style={{ width: 200 }} />,
<InputNumber step={currentCourse.course_mode === 1 ? 0.5 : 1} onBlur={e => this.expendChange(e)} placeholder="请输入消课数量" style={{ width: 200 }} />,
)}
<span className="ant-form-text">{currentCourse.course_mode === 1 ? '课时' : '天'}</span>
</Form.Item>
{getFieldValue('student_course_id') != undefined ? (
{getFieldValue('student_course_id') != undefined && currentCourse.course_mode === 1 ? (
<Form.Item
label="消耗后剩余"
label="消课后总剩余课时"
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
<div className={pageStyle.typeCourseList}>
<span>{expendValue || currentCourse.surplus }</span>
<span>付费剩余课时: {payCourseValue}</span>
<span>赠送剩余课时: {giveCourseValue}</span>
</div>
</Form.Item>
) : (
''
)}
{getFieldValue('student_course_id') != undefined && currentCourse.course_mode == 2 ? (
<Form.Item
label="消课后"
labelCol={{
xs: { span: 24 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 18 },
}}
>
{currentCourse.course_mode == 1 &&
<span>{expendValue || currentCourse.surplus } 课时</span>
}
{currentCourse.course_mode == 2 &&
<span>{expendValue || currentCourse.surplus} </span>
}
</Form.Item>
) : (
''
......@@ -214,11 +262,11 @@ class eliminateEdit extends React.Component {
label="备注"
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
{getFieldDecorator('remark', {
......@@ -233,11 +281,11 @@ class eliminateEdit extends React.Component {
label={<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>}
labelCol={{
xs: { span: 24 },
sm: { span: 5 },
sm: { span: 6 },
}}
wrapperCol={{
xs: { span: 24 },
sm: { span: 19 },
sm: { span: 18 },
}}
>
{getFieldDecorator('operator_id', {
......
......@@ -10,3 +10,9 @@
bottom: -2px;
}
}
.typeCourseList {
&>span {
display: inline-block;
margin-right: 10px;
}
}
......@@ -745,6 +745,7 @@ class StudentMgt extends React.Component {
historyStudentLoading,
deleteOneVisible,
deleteTabKey,
indexQrcodeTitle,
} = this.props;
const {
qrCodeTitle, isExpendMore, isChecked, isShowQuestion,
......@@ -785,38 +786,41 @@ class StudentMgt extends React.Component {
return (
<div>
{/* { new Date(Date(record.birthday)).getFullYear()} */}
{record.birthday ? (new Date().getFullYear() + 1) - new Date(record.birthday).getFullYear() : ''}
{record.birthday ? `${(new Date().getFullYear() + 1) - new Date(record.birthday).getFullYear()}岁` : ''}
</div>
);
},
},
{
title: '购买课时',
title: '购买课时',
dataIndex: 'buy',
key: 'buy',
},
{
title: '赠送课时',
dataIndex: 'give',
key: 'give',
},
{
title: '已消耗课时',
dataIndex: 'expend',
key: 'expend',
title: '付费课时(消耗/总数)',
dataIndex: 'expend_buy',
key: 'expend_buy',
render: (text, record) => {
return (
<div>{record.expend_buy} / {record.buy}</div>
);
},
},
{
title: '剩余课时',
dataIndex: 'remian',
key: 'remian',
title: '赠送课时(消耗/总数)',
dataIndex: 'expend_give',
key: 'expend_give',
render: (text, record) => {
return (
<div>
{record.total - record.expend}
</div>
<div>{record.expend_give } / {record.give}</div>
);
},
},
{
title: '剩余总课时',
dataIndex: 'surplus',
key: 'surplus',
},
{
title: '缺课次数',
dataIndex: 'truancy_count',
......@@ -1011,7 +1015,7 @@ class StudentMgt extends React.Component {
previewQrcodeShow={previewQrcodeShow}
closeQrcodeShow={this.closeQrcodeShow}
previewQrcode={previewQrcode}
title={qrCodeTitle}
title={qrCodeTitle || indexQrcodeTitle}
/>
<Modal
className={pageStyle.deleteModal}
......@@ -1298,6 +1302,7 @@ function mapStateToProps(state) {
historyStudentLoading,
deleteOneVisible,
deleteTabKey,
indexQrcodeTitle,
} = state.students;
const {
schoolUserInfo,
......@@ -1354,6 +1359,7 @@ function mapStateToProps(state) {
historyStudentLoading,
deleteOneVisible,
deleteTabKey,
indexQrcodeTitle,
};
}
export default connect(mapStateToProps)(ForgotPassword);
......
This diff is collapsed.
......@@ -184,3 +184,14 @@
color: #108EE9;
font-weight: 700;
}
.item {
:global {
.ant-descriptions-item-content {
&>img {
width: 22px;
height: 22px;
margin-right: 11px;
}
}
}
}
......@@ -344,13 +344,37 @@ class ClassMgt extends React.Component {
key: 'phone',
},
{
title: '上月课次',
title: '上月已上课次',
dataIndex: 'last_month_time',
key: 'last_month_time',
render: (text, record, index) => {
return (
<div>
{(record.last_month_time && record.last_month_time) || '-'}
{ text || '-'}
</div>
);
},
},
{
title: '上月点名课次',
dataIndex: 'last_month_call_time',
key: 'last_month_call_time',
render: (text) => {
return (
<div>
{ text || '-'}
</div>
);
},
},
{
title: '上月消耗课时',
dataIndex: 'last_extend_time',
key: 'last_extend_time',
render: (text, record) => {
return (
<div>
{ text || '-'}
</div>
);
},
......@@ -359,34 +383,46 @@ class ClassMgt extends React.Component {
title: '本月课次',
dataIndex: 'cur_month_time',
key: 'cur_month_time',
render: (text, record, index) => {
render: (text) => {
return (
<div>
{(record.cur_month_time && record.cur_month_time) || '-'}
{ text || '-'}
</div>
);
},
},
{
title: '已上课次',
title: '本月已上课次',
dataIndex: 'total_month_time',
key: 'total_month_time',
render: (text, record, index) => {
return (
<div>
{(record.total_month_time && record.total_month_time) || '-'}
{ text || '-'}
</div>
);
},
},
{
title: '点名课次',
title: '本月点名课次',
dataIndex: 'already_total_month_time',
key: 'already_total_month_time',
render: (text, record, index) => {
return (
<div>
{(record.already_total_month_time && record.already_total_month_time) || '-'}
{ text || '-'}
</div>
);
},
},
{
title: '本月消耗课时',
dataIndex: 'cur_extend_time',
key: 'cur_extend_time',
render: (text, record) => {
return (
<div>
{ text || '-'}
</div>
);
},
......
import { connect } from 'dva';
import React from 'react';
import { Icon, Button, Row, Col, message, Tabs, Select, Descriptions, InputNumber, DatePicker, Tooltip, Form, Table, Modal, Input, Pagination } from 'antd';
import moment from 'moment';
import pageStyle from './index.less';
import { pageIn, imagify, hasBtnPower } from '../../utils/index';
import ChangeCourse from '../classdetail/ChangeCourse';
......@@ -11,6 +12,7 @@ const { confirm } = Modal;
const { Option } = Select;
const { TextArea } = Input;
const { TabPane } = Tabs;
const FormItem = Form.Item;
class teachersForm extends React.Component {
state = {
// visible: false,
......@@ -412,9 +414,79 @@ class teachersForm extends React.Component {
},
});
}
handleSearchCourse = (e) => {
const { dispatch, form } = this.props;
e.preventDefault();
this.props.form.validateFields((err, values) => {
if (!err) {
const {
time,
course_id,
} = values;
let start_time;
let end_time;
if (time) {
start_time = moment(time[0]).format('YYYY-MM-DD');
end_time = moment(time[1]).format('YYYY-MM-DD');
delete ['time'];
}
dispatch({
type: 'teachersinfo/selectCourseStatistical',
payload: {
params: {
page: 1,
start_time,
end_time,
course_id,
},
},
});
}
});
}
courseStaticPagination = (page, perPage) => {
const { dispatch } = this.props;
dispatch({
type: 'teachersinfo/selectCourseStatistical',
payload: {
params: {
page,
perPage,
},
},
});
}
courseStaticSize = (page, perPage) => {
const { dispatch } = this.props;
dispatch({
type: 'teachersinfo/selectCourseStatistical',
payload: {
params: {
page,
perPage,
},
},
});
}
handleSearchResetCourse = () => {
const { dispatch, form } = this.props;
form.resetFields();
dispatch({
type: 'teachersinfo/selectCourseStatistical',
payload: {
params: {
perPage: 10,
page: 1,
start_time: '',
end_time: '',
course_id: '',
},
},
});
}
render() {
const { getFieldDecorator } = this.props.form;
const {
form: { getFieldDecorator, getFieldValue },
teachersdetail,
addOrUpdateDiaShow,
teachersschedulelist,
......@@ -451,6 +523,9 @@ class teachersForm extends React.Component {
callStudentTotal,
callStudentList,
timeArr,
courseStaticList,
courseStaticTotal,
courseStaticParams,
} = this.props;
const classinfo = [
{
......@@ -748,6 +823,47 @@ class teachersForm extends React.Component {
},
},
];
const courseStaticColumns = [
{
title: '课程名称',
dataIndex: 'title',
key: 'title',
},
{
title: '已上课次',
dataIndex: 'time',
key: 'time',
render: (text) => {
return <div> {text || 0}</div>;
},
},
{
title: '已点名课次',
dataIndex: 'call_time',
key: 'call_time',
render: (text) => {
return <div> {text || 0}</div>;
},
},
{
title: '已消耗课时',
dataIndex: 'extend_time',
key: 'extend_time',
render: (text) => {
return <div> {text || 0}</div>;
},
},
];
const formItemLayout = {
labelCol: {
xs: { span: 4 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 20 },
sm: { span: 19 },
},
};
return (
<div className={`${pageStyle.container} container`}>
<Modal
......@@ -818,7 +934,7 @@ class teachersForm extends React.Component {
<Col span={12}>
<Descriptions style={{ width: 600 }}>
<Descriptions.Item className={pageStyle.item}><img src={`${__IMGCDN__}/teacher/people_icon.png`} alt="" />{teachersdetail.nickname}</Descriptions.Item>
<Descriptions.Item className={pageStyle.item}><img src={`${__IMGCDN__}/teacher/phone_icon.png`} alt="" />{teachersdetail.phone}</Descriptions.Item>
<Descriptions.Item className={pageStyle.item}><img src={`${__IMGCDN__}/teacher/phone_icon.png`} alt="" />{teachersdetail.phone || '-'}</Descriptions.Item>
<Descriptions.Item className={pageStyle.item} label="备注">{teachersdetail.remark}</Descriptions.Item>
</Descriptions>
</Col>
......@@ -953,6 +1069,67 @@ class teachersForm extends React.Component {
<Table scroll={{ x: 'max-content' }} rowKey="id" dataSource={scheduleList} columns={columns} />
</div>
</TabPane>
<TabPane tab="课时统计" key="4">
<div>
<div className={pageStyle.name}>
<Form labelAlign="left" onSubmit={this.handleSearchCourse}>
<Row
gutter={{
sm: 2, xs: 12, md: 24, lg: 24,
}}
>
<Col xs={{ span: 24 }} sm={{ span: 24 }} md={{ span: 8 }} lg={{ span: 5 }} xl={{ span: 5 }}>
<FormItem {...formItemLayout} label="上课时间">
{getFieldDecorator('time', { initialValue: '' })(
<RangePicker style={{ width: '100%' }} />,
)}
</FormItem>
</Col>
<Col xs={{ span: 24 }} sm={{ span: 12 }} md={{ span: 8 }} lg={{ span: 5 }} xl={{ span: 5 }}>
<FormItem {...formItemLayout} label="课程">
{getFieldDecorator('course_id', { initialValue: '' })(
<Select style={{ width: 150 }}>
<Option value="">全部</Option>
{courseList.map(ele => <Option key={ele.id} value={ele.id}>{ele.title}</Option>)}
</Select>,
)}
</FormItem>
</Col>
<Col xs={{ span: 24 }} sm={{ span: 24 }} md={{ span: 8 }} lg={{ span: 5 }} xl={{ span: 5 }}>
<FormItem>
<Button onClick={this.handleSearchResetCourse} style={{ marginRight: 20 }} >
重置
</Button>
<Button type="primary" htmlType="submit">
搜索
</Button>
</FormItem>
</Col>
</Row>
</Form>
</div>
</div>
<div className={pageStyle.tablebox}>
<Table
rowKey="id"
dataSource={courseStaticList}
columns={courseStaticColumns}
pagination={false}
scroll={{ x: 'max-content' }}
footer={() => (
<div className="tablefooterbox">
<span className="tablefooterstatic">{courseStaticTotal}条数据</span>
<Pagination
showSizeChanger
total={Number(courseStaticTotal)}
onChange={this.courseStaticPagination}
onShowSizeChange={this.courseStaticSize}
/>
</div>
)}
/>
</div>
</TabPane>
</Tabs>
</div>
</div>
......@@ -1017,6 +1194,9 @@ function mapStateToProps(state) {
timeArr,
teacherList,
datetime,
courseStaticList,
courseStaticTotal,
courseStaticParams,
} = state.teachersinfo;
const {
changeScheduleIndex,
......@@ -1077,6 +1257,9 @@ function mapStateToProps(state) {
callStudentTotal,
callStudentList,
timeArr,
courseStaticList,
courseStaticTotal,
courseStaticParams,
};
}
export default connect(mapStateToProps)(ForgotPassword);
......
......@@ -127,3 +127,10 @@ export function GetWxConfig(params) {
data,
});
}
export function deleteClassMgt(params) {
const data = qs.stringify(params);
return request({
url: `${api.classMgt.deleteClassMgt}/${params.id}`,
method: 'DELETE',
});
}
......@@ -63,3 +63,11 @@ export function teacherInvitations(params) {
data,
});
}
export function selectCourseStatistical(params) {
const data = qs.stringify(params);
return request({
url: `${api.teacherMgt.courseStatistical}?${data}`,
method: 'GET',
data,
});
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment