master
zhengpengju 3 years ago
parent 82ed86d4d9
commit 35c2fe430b

@ -59,7 +59,7 @@ const Analysis: FC<AnalysisProps> = () => {
<IntroduceRow />
</Suspense>
<Suspense fallback={null}>
{/** 课程浏览量/月柱形图 */}
{/** 课程浏览量/月柱形图 需要处理 */}
<CourseRow
rangePickerValue={rangePickerValue}
salesData={data?.salesData || []}

@ -15,7 +15,51 @@ import { useRequest } from 'umi';
const { Step } = Steps;
// 秒数转化为时分秒
const formatSeconds= (value)=>{
// 秒
let second = parseInt(value)
// 分
let minute = 0
// 小时
let hour = 0
// 天
// let day = 0
// 如果秒数大于60将秒数转换成整数
if (second > 60) {
// 获取分钟除以60取整数得到整数分钟
minute = parseInt(second / 60)
// 获取秒数,秒数取佘,得到整数秒数
second = parseInt(second % 60)
// 如果分钟大于60将分钟转换成小时
if (minute > 60) {
// 获取小时获取分钟除以60得到整数小时
hour = parseInt(minute / 60)
// 获取小时后取佘的分获取分钟除以60取佘的分
minute = parseInt(minute % 60)
// 如果小时大于24将小时转换成天
// if (hour > 23) {
// // 获取天数获取小时除以24得到整天数
// day = parseInt(hour / 24)
// // 获取天数后取余的小时获取小时除以24取余的小时
// hour = parseInt(hour % 24)
// }
}
}
let result = '' + parseInt(second) + ' 秒 '
if (minute > 0) {
result = '' + parseInt(minute) + ' 分 ' + result
}
if (hour > 0) {
result = '' + parseInt(hour) + ' 小时 ' + result
}
// if (day > 0) {
// result = '' + parseInt(day) + '天' + result
// }
console.log('result', result)
return result
}
export default () => {
const uuid = uuidv4()
console.log('uuid', uuidv4());
@ -131,12 +175,24 @@ export default () => {
const [selectedCourse, setSelectedCourse] = useState(0);
const [menu, setMenu] = useState();
const [timeData, setTimeData] = useState(0);
useEffect(() => {
let secondValue = 3000; // 秒 截至时间 - 服务器当前时间
setTimeData(secondValue)
const timer = setInterval(() => { //
setTimeData((secondValue > 1) ? secondValue-- : 0);
}, 1000);
return ()=>{
clearInterval(timer) // 清理计算器
}
},[])
/** 获取课程数据 */
const { data: listData } = useRequest(() => {
return queryCourseList();
});
useEffect(() => {
console.log('listData', listData)
setInterval(() => {
@ -261,6 +317,9 @@ export default () => {
<Radio value={4} defaultChecked>D</Radio>
</Radio.Group>
<a onClick={()=>{}}>rrrrr</a>
<div style={{padding:24,fontSize:30}}>{formatSeconds(timeData)}</div>
</>
)
};

@ -322,7 +322,6 @@ export default () => {
}}
>
<div style={{ margin: '0' }}>
{`试卷`}
<ProTable
page
headerTitle={false}
@ -361,8 +360,7 @@ export default () => {
page_number: value.current,
page_size: value.pageSize
}
);
);
const _questionTypeCountData = [];
_data.question_list[0]?.question_type_count.forEach((item)=>{
@ -486,6 +484,19 @@ export default () => {
console.log('批量设置分值v::::', values);
const {code, data: paper, msg} = await saveQuestionTypeScore({rules_id:Number(params?.id), type_score: JSON.stringify(values)})
console.log('paper', paper)
// 总分及通过分
let _sumScore = 0;
values?.forEach((item)=>{
console.log('item--',item)
_sumScore += item?.score
})
console.log('_sumScore', _sumScore)
/*
// 需要处理
console.log('passSocre',passSocre)
console.log('sumScore',sumScore)
const {success} = await updateScore({rules_id:Number(params?.id), pass_socre: passSocre, sum_score: _sumScore})*/
setSumScore(_sumScore)
// setUuidPaper(paper?.paper_uuid)
// message.success('提交成功');
handleScoreModalVisible(false)

@ -112,6 +112,7 @@ const QuestionSelector = (props: any, ref: any) => {
return selectedRowsState;
},
}));
return (
<>
<ProTable

@ -36,7 +36,7 @@ export type TableListItem = {
const ScoreSetter = (props: any, ref: any) => {
const {questionTypeValues} = props
console.log('questionTypeValues', questionTypeValues)
console.log('questionTypeValues:::', questionTypeValues)
const match = useRouteMatch();
console.log('match', match);
@ -47,8 +47,9 @@ const ScoreSetter = (props: any, ref: any) => {
const [dataSource, setDataSource] = useState([]);
//const [selectedRowsState, setSelectedRows] = useState<API.RuleListItem[]>([]);
//const [addType, setAddType] = useState({name: '', value: 0});
let sumScore = 0 // 总分
const [sumScore, setSumScore] = useState(0);
//let sumScore = 0 // 总分
const formRef = useRef();
@ -70,7 +71,7 @@ const ScoreSetter = (props: any, ref: any) => {
render: (text, record, index) =>
<Space direction='horizontal'>
<span></span>
<Form.Item style={{margin:0}} name={`score[${index}]`}><InputNumber type="number" defaultValue={questionTypeValues ? questionTypeValues[index]?.score : 0} placeholder="请输入" size="small" onChange={(value)=>{
<Form.Item style={{margin:0}} name={`score[${index}]`}><InputNumber min={0} type="number" defaultValue={questionTypeValues ? questionTypeValues[index]?.score : 0} placeholder="请输入" size="small" onChange={(value)=>{
console.log('row', index)
console.log('v1',value)
const _data = [];
@ -88,8 +89,8 @@ const ScoreSetter = (props: any, ref: any) => {
<span></span>
{ (record?.code === 1) &&
<>
<span>:: </span>
<Form.Item style={{margin:0}} name={`score_harf`}><InputNumber type="number" defaultValue={questionTypeValues ? questionTypeValues[index]?.score_harf : 0} placeholder="请输入" size="small" name='score_harf' onChange={(value)=>{
<span>:</span>
<Form.Item style={{margin:0}} name={`score_harf`}><InputNumber min={0} type="number" defaultValue={questionTypeValues ? questionTypeValues[index]?.score_harf : 0} placeholder="请输入" size="small" name='score_harf' onChange={(value)=>{
//
const _data = [];
console.log('typeScore',typeScore)
@ -107,7 +108,7 @@ const ScoreSetter = (props: any, ref: any) => {
title: '题目数量',
dataIndex: 'count',
width: 80,
render: (text, _, index) => <>{questionTypeValues ? questionTypeValues[index].count : '0'}</>,
render: (text, _, index) => <>{questionTypeValues ? questionTypeValues[index]?.count : '0'}</>,
/*
editable: (text, record, index) => {
return true;
@ -119,8 +120,6 @@ const ScoreSetter = (props: any, ref: any) => {
//key: 'age',
width: 80,
render: (text, _, index) => {
//console.log('===',typeScore ? typeScore[index].score * questionTypeValues[index].count : '0')
sumScore = sumScore + ((typeScore && questionTypeValues) ? typeScore[index]?.score * questionTypeValues[index]?.count : 0)
return <>
{(typeScore && questionTypeValues) ? typeScore[index]?.score * questionTypeValues[index]?.count : '0'}
</>
@ -170,6 +169,18 @@ const ScoreSetter = (props: any, ref: any) => {
//return ()=>{}
}, [data]);
/** 计算总分 */
useEffect(() => {
console.log('typeScore', typeScore)
let _sum = 0;
typeScore?.forEach((item, index)=>{
_sum += item.score * questionTypeValues[index]?.count;
})
setSumScore(_sum)
//return ()=>{}
}, [typeScore]);
// 暴露组件的方法 接受外部获取的ref
useImperativeHandle(ref, () => ({
// 构造ref的获取数据方法
@ -185,7 +196,7 @@ const ScoreSetter = (props: any, ref: any) => {
<EditableProTable
title={()=>{
return <Space> {sumQuestion} , {sumScore} 线
<Form.Item style={{margin:0}} name='win' initialValue={0}><InputNumber /></Form.Item>
<Form.Item style={{margin:0}} name='win' initialValue={0}><InputNumber min={0} /></Form.Item>
</Space>}}
//formMapRef={formMapRef}
//rowKey={'code'}

@ -16,7 +16,7 @@ import { Button, Checkbox, Col, Divider, Dropdown, Form, Input, List, Menu, mess
import { PageContainer } from '@ant-design/pro-layout';
import ProDescriptions from '@ant-design/pro-descriptions';
import styles from './index.less'
import { saveRules, querySubjectList, queryRulesView, queryTempQuestionList, saveQuestionTypeScore } from '../../service';
import { saveRules, querySubjectList, queryRulesView, queryTempQuestionList, saveQuestionTypeScore, queryRulesPaper, updateScore } from '../../service';
import { queryCourseView } from '@/pages/course/option/service';
import { queryQuestionList, queryQuestionById, queryQuestionType } from '@/pages/questionbank/service';
import { PlusOutlined, DownOutlined, DeleteOutlined, DownloadOutlined, UploadOutlined, EyeInvisibleOutlined, EyeOutlined, EditOutlined, ArrowDownOutlined, ArrowUpOutlined } from '@ant-design/icons';
@ -85,13 +85,6 @@ const handleAppend = async (rules_id: number, rows: any[]) => {
}
};
const waitTime = (time: number = 100) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(true);
}, time);
});
};
const labels = ['A','B','C','D','E','F','G','H','I','J','K']
// 模拟考试规则维护
export default () => {
@ -103,10 +96,15 @@ export default () => {
const [subjectId, setSubjectId] = useState<number>(0); // 关联主题id
const [subjectName, setSubjectName] = useState(''); // 关联主题name
const [questionTypeValues, setQuestionTypeValues] = useState([]); // 题型数据[{count:0, score:0, score_harf:0}]
const [uuidPaper, setUuidPaper] = useState<number>(0);
const [createType, setCreateType] = useState<number>(1); // 组卷类型
const [rulesName, setRulesName] = useState<string>(''); // 组卷类型
const [sumScore, setSumScore] = useState<number>(0); // 总分
const [passSocre, setPassSocre] = useState<number>(0); // 通过分数线
const [typeQuestionCount, setTypeQuestionCount] = useState([0, 0, 0]); // 临时卷 各题型数量
const formRef = useRef<ProFormInstance>();
@ -141,7 +139,38 @@ export default () => {
/** 组卷,查询试题临时表(当前选题列表) */
const { data: questions, run } = useRequest(async (params) => {
console.log('questions', questions)
return queryTempQuestionList(params);
const _data = await queryTempQuestionList(params);
return _data;
},{
manual: true,
formatResult: (result) => {
return result?.table_List;
}});
/** 从临时表中计算各题型数量 */
useEffect(() => {
let _data = [0, 0, 0]; // 当前仅支持 单选 / 多选 / 判断 的顺序
console.log('questions-info', questions)
questions?.forEach((item)=>{
_data[Number(item?.question_type)] += 1
})
setTypeQuestionCount(_data);
return ()=>{
/** 退出当前页面清空Map */
//parsingMap.clear();
}
}, [questions]);
//
const { data: paperData, run: runPaper } = useRequest(async (params) => {
console.log('paperData', paperData)
/**
* rules_id: params?.id,
page_number: value.current,
page_size: value.pageSize
*/
return queryRulesPaper(params);
},{
manual: true,
formatResult: (result) => {
@ -275,6 +304,7 @@ export default () => {
onFinish={async () => {
console.log(formRef.current?.getFieldsValue());
setCurrentStep(2) // 设置步骤号
runPaper({rules_id: params?.id })
return true;
}}
>
@ -359,7 +389,7 @@ export default () => {
<Divider style={{ margin: '6px 0', opacity: 0.5 }} />
<Space direction="vertical">
{ questionType.map((item)=>{
return <Typography>{item?.name} { '-' } { '-' } </Typography>
return <Typography>{item?.name} { typeQuestionCount[Number(item.code)] } { '-' } </Typography>
}
)}
</Space>
@ -378,6 +408,14 @@ export default () => {
}}></Button>
<Button size="large" block onClick={()=>{
/**
*
* [{count: 0, score: 0, score_harf: 0},{count: 0, score: 0, score_harf: 0},{count: 0, score: 0, score_harf: 0}]
*/
//setQuestionTypeValues()
console.log('typeQuestionCount', typeQuestionCount);
handleScoreModalVisible(true)
}}></Button>
<Button size="large" type="primary" block onClick={async ()=>{
@ -428,10 +466,11 @@ export default () => {
<ProDescriptions.Item dataIndex="examination_time" label="考试时长" valueType="text" renderText={(text)=>(`${text} 分钟`)} />
<ProDescriptions.Item dataIndex="grade" label="试卷信息" valueType="text" render={()=>{
{/** 需要从试卷 或 临时试卷 中读取 */}
return <Space direction="vertical">
<span> 0 , 100 </span>
<span>: 0 : 0 : 0 </span>
<span>线 60 </span>
<span>线 {0} </span>
</Space>
}} />
@ -447,11 +486,9 @@ export default () => {
<ModalForm
title={`手动组卷`}
//
width="60%"
visible={selectorModalVisible}
onVisibleChange={handleSelectorModalVisible}
footer={null}
onFinish={async (values) => {
console.log('v::::', values.name);
const rows = selectorRef?.current?.getSelectedRows()
@ -466,8 +503,7 @@ export default () => {
page_number: 1
}); // 获取当前选题列表
// message.success('提交成功');
handleSelectorModalVisible(false)
handleSelectorModalVisible(false)
return true;
}}
>
@ -499,11 +535,24 @@ export default () => {
visible={scoreModalVisible}
onVisibleChange={handleScoreModalVisible}
footer={null}
onFinish={async () => {
onFinish={async () => {
console.log('typeQuestionCount', typeQuestionCount)
const values = setterRef.current?.getData()
console.log('批量设置分值v::::', values);
console.log('批量设置分值v::::2', values);
// 题型分数
const {code, data: paper, msg} = await saveQuestionTypeScore({rules_id:Number(params?.id), type_score: JSON.stringify(values)})
// 总分及通过分
let _sumScore = 0;
values?.forEach((item)=>{
console.log('item--',item)
_sumScore += item?.score
})
console.log('_sumScore', _sumScore)
console.log('passSocre',passSocre)
console.log('sumScore',sumScore)
const {success} = await updateScore({rules_id:Number(params?.id), pass_socre: passSocre, sum_score: _sumScore})
setSumScore(_sumScore)
console.log('paper', paper)
// setUuidPaper(paper?.paper_uuid)
// message.success('提交成功');
@ -511,7 +560,7 @@ export default () => {
return true;
}}
>
<ScoreSetter ref={setterRef} />
<ScoreSetter ref={setterRef} questionTypeValues={questionTypeValues || false} />
</ModalForm>
</PageContainer>

@ -160,6 +160,16 @@ export async function queryTempQuestionList(
});
}
/** 19 组卷,删除临时表数据 */
export async function delTempQuestion(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/zygh/training/rules/delTempQuestion', {
data,
method: 'POST',
requestType: "form",
...(options || {}),
});
}
/** 组卷详情查询 */
export async function queryRulesPaper(
params: {
@ -218,6 +228,16 @@ export async function saveQuestionTypeScore(data: Record<string, any>, options?:
});
}
/** 24 组卷保存总分与通过线也可以使用01接口维护 */
export async function updateScore(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/zygh/training/rules/updateScore', {
data,
method: 'POST',
requestType: "form",
...(options || {}),
});
}
/** 22 组卷,资质考试组卷 */
export async function autoPaperOfficial(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/zygh/training/rules/autoPaperOfficial', {
@ -228,4 +248,12 @@ export async function autoPaperOfficial(data: Record<string, any>, options?: Rec
});
}
/** 27 组卷,交换临时表顺序 */
export async function exchangeSortNum(data: Record<string, any>, options?: Record<string, any>) {
return request<TableListItem>('/dsideal_yy/zygh/training/rules/exchangeSortNum', {
data,
method: 'POST',
requestType: "form",
...(options || {}),
});
}

@ -79,21 +79,6 @@ const Analysis: FC<AnalysisProps> = () => {
salesPieData = salesType === 'online' ? data?.salesTypeDataOnline : data?.salesTypeDataOffline;
}
const menu = (
<Menu>
<Menu.Item></Menu.Item>
<Menu.Item></Menu.Item>
</Menu>
);
const dropdownGroup = (
<span className={styles.iconGroup}>
<Dropdown overlay={menu} placement="bottomRight">
<EllipsisOutlined />
</Dropdown>
</span>
);
const handleChangeSalesType = (e: RadioChangeEvent) => {
setSalesType(e.target.value);
};

@ -197,19 +197,21 @@ const QuestionBank = () => {
hideInForm: false,
hideInSearch: true,
renderFormItem: (item, { defaultRender, ...rest }, form) => {
// 需要处理
// 需要处理 关联长度变化及编辑回显
console.log('edit answertrue11', item)
// 0 单选 1 多选 2 判断
return (addType?.value !== 1 ) ?
<ProFormRadio.Group
name="answertrue"
label=""
initialValue={'A'}
options={['A', 'B', 'C', 'D']}
/>
:
<ProFormCheckbox.Group
name="answertrue"
label=""
initialValue={[item]}
initialValue={[]}
options={['A', 'B', 'C', 'D']}
/>
@ -249,7 +251,7 @@ const QuestionBank = () => {
// tooltip="最长为 6 位汉字,需要与考生身份证一致"
placeholder="请填写试题解析"
// rules={[{ required: true }]}
value="锦书"
value=""
// disabled
/>
),

Loading…
Cancel
Save