2023年4月9日 添加问卷功能
This commit is contained in:
parent
5b614ff176
commit
1702dcbe47
|
|
@ -50,6 +50,15 @@ const site: AppRouteModule = {
|
||||||
title: '预约课程',
|
title: '预约课程',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'qaAddPage',
|
||||||
|
name: 'qaAddPage',
|
||||||
|
component: () => import('/@/views/site/tingKeZuJi/page/qaAddPage.vue'),
|
||||||
|
meta: {
|
||||||
|
// affix: true,
|
||||||
|
title: '',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -38,7 +38,7 @@ import { defHttp } from '/@/utils/http/axios';
|
||||||
|
|
||||||
const barMultiData = reactive<any>([]);
|
const barMultiData = reactive<any>([]);
|
||||||
const queryParam = ref<any>({});
|
const queryParam = ref<any>({});
|
||||||
const list = (queryParam) => defHttp.get({ url: '/kcEvaluation/kcEvaluation/getPkfglTjt', params:queryParam });
|
const list = (queryParam) => defHttp.get({ url: '/qa/kcEvaluation/getPkfglTjt', params:queryParam });
|
||||||
|
|
||||||
//进入就加载
|
//进入就加载
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
@ -48,7 +48,7 @@ const list = (queryParam) => defHttp.get({ url: '/kcEvaluation/kcEvaluation/getP
|
||||||
queryParam.value.endTime = dateFormat(new Date(), format)
|
queryParam.value.endTime = dateFormat(new Date(), format)
|
||||||
loadData()
|
loadData()
|
||||||
});
|
});
|
||||||
|
|
||||||
function loadData(){
|
function loadData(){
|
||||||
barMultiData.length = 0
|
barMultiData.length = 0
|
||||||
list(queryParam.value).then(res=>{
|
list(queryParam.value).then(res=>{
|
||||||
|
|
@ -61,9 +61,9 @@ const list = (queryParam) => defHttp.get({ url: '/kcEvaluation/kcEvaluation/getP
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,13 @@ import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
const { createConfirm } = useMessage();
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
enum Api {
|
enum Api {
|
||||||
list = '/kcEvaluation/kcEvaluation/getPkmxbList',
|
list = '/qa/kcEvaluation/getPkmxbList',
|
||||||
save='/kcEvaluation/kcEvaluation/add',
|
save='/qa/kcEvaluation/add',
|
||||||
edit='/kcEvaluation/kcEvaluation/edit',
|
edit='/qa/kcEvaluation/edit',
|
||||||
deleteOne = '/kcEvaluation/kcEvaluation/delete',
|
deleteOne = '/qa/kcEvaluation/delete',
|
||||||
deleteBatch = '/kcEvaluation/kcEvaluation/deleteBatch',
|
deleteBatch = '/qa/kcEvaluation/deleteBatch',
|
||||||
importExcel = '/kcEvaluation/kcEvaluation/importExcel',
|
importExcel = '/qa/kcEvaluation/importExcel',
|
||||||
exportXls = '/kcEvaluation/kcEvaluation/exportXls',
|
exportXls = '/qa/kcEvaluation/exportXls',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -4,13 +4,13 @@ import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
const { createConfirm } = useMessage();
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
enum Api {
|
enum Api {
|
||||||
list = '/kcEvaluation/kcEvaluation/getPktjbList',
|
list = '/qa/kcEvaluation/getPktjbList',
|
||||||
save='/kcEvaluation/kcEvaluation/add',
|
save='/qa/kcEvaluation/add',
|
||||||
edit='/kcEvaluation/kcEvaluation/edit',
|
edit='/qa/kcEvaluation/edit',
|
||||||
deleteOne = '/kcEvaluation/kcEvaluation/delete',
|
deleteOne = '/qa/kcEvaluation/delete',
|
||||||
deleteBatch = '/kcEvaluation/kcEvaluation/deleteBatch',
|
deleteBatch = '/qa/kcEvaluation/deleteBatch',
|
||||||
importExcel = '/kcEvaluation/kcEvaluation/importExcel',
|
importExcel = '/qa/kcEvaluation/importExcel',
|
||||||
exportXls = '/kcEvaluation/kcEvaluation/exportXls',
|
exportXls = '/qa/kcEvaluation/exportXls',
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -43,7 +43,7 @@ import { defHttp } from '/@/utils/http/axios';
|
||||||
|
|
||||||
const barMultiData = reactive<any>([]);
|
const barMultiData = reactive<any>([]);
|
||||||
const queryParam = ref<any>({});
|
const queryParam = ref<any>({});
|
||||||
const list = (queryParam) => defHttp.get({ url: '/kcEvaluation/kcEvaluation/getPkztjTjt', params:queryParam });
|
const list = (queryParam) => defHttp.get({ url: '/qa/kcEvaluation/getPkztjTjt', params:queryParam });
|
||||||
|
|
||||||
//进入就加载
|
//进入就加载
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
|
|
@ -68,8 +68,8 @@ const list = (queryParam) => defHttp.get({ url: '/kcEvaluation/kcEvaluation/getP
|
||||||
console.log(`🚀 ~ file: tkztj.vue:67 ~ list ~ barMultiData:`, barMultiData)
|
console.log(`🚀 ~ file: tkztj.vue:67 ~ list ~ barMultiData:`, barMultiData)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
<style lang="less" scoped>
|
<style lang="less" scoped>
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
|
|
||||||
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
list = '/qa/kcEvaluation/list',
|
||||||
|
save='/qa/kcEvaluation/add',
|
||||||
|
edit='/qa/kcEvaluation/edit',
|
||||||
|
deleteOne = '/qa/kcEvaluation/delete',
|
||||||
|
deleteBatch = '/qa/kcEvaluation/deleteBatch',
|
||||||
|
importExcel = '/qa/kcEvaluation/importExcel',
|
||||||
|
exportXls = '/qa/kcEvaluation/exportXls',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出api
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getExportUrl = Api.exportXls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入api
|
||||||
|
*/
|
||||||
|
export const getImportUrl = Api.importExcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表接口
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const list = (params) => defHttp.get({ url: Api.list, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除单个
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const deleteOne = (params,handleSuccess) => {
|
||||||
|
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const batchDelete = (params, handleSuccess) => {
|
||||||
|
createConfirm({
|
||||||
|
iconType: 'warning',
|
||||||
|
title: '确认删除',
|
||||||
|
content: '是否删除选中数据',
|
||||||
|
okText: '确认',
|
||||||
|
cancelText: '取消',
|
||||||
|
onOk: () => {
|
||||||
|
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存或者更新
|
||||||
|
* @param params
|
||||||
|
* @param isUpdate
|
||||||
|
*/
|
||||||
|
export const saveOrUpdate = (params, isUpdate) => {
|
||||||
|
let url = isUpdate ? Api.edit : Api.save;
|
||||||
|
return defHttp.post({ url: url, params }, { isTransformResponse: false });
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,213 @@
|
||||||
|
import {BasicColumn} from '/@/components/Table';
|
||||||
|
import {FormSchema} from '/@/components/Table';
|
||||||
|
import { rules} from '/@/utils/helper/validator';
|
||||||
|
import { render } from '/@/utils/common/renderUtils';
|
||||||
|
//列表数据
|
||||||
|
export const columns: BasicColumn[] = [
|
||||||
|
{
|
||||||
|
title: '上传日期',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upDate',
|
||||||
|
customRender:({text}) =>{
|
||||||
|
return !text?"":(text.length>10?text.substr(0,10):text);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传时间',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upTime',
|
||||||
|
customRender:({text}) =>{
|
||||||
|
return !text?"":(text.length>10?text.substr(0,10):text);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer1'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传人',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upuser'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传人id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upuserid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传时间戳',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upTimestamp'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '课程最小id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'minkcid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案2',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer2'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案3',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer3'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案4',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer4'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案5',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer5'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案6',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer6'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案7',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer7'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案8',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer8'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案9',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer9'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案10',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer10'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案11',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'answer11'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '问卷版本',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'evaluationver'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
//查询数据
|
||||||
|
export const searchFormSchema: FormSchema[] = [
|
||||||
|
];
|
||||||
|
|
||||||
|
//表单数据
|
||||||
|
export const formSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '上传日期',
|
||||||
|
field: 'upDate',
|
||||||
|
component: 'DatePicker',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入上传日期!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传时间',
|
||||||
|
field: 'upTime',
|
||||||
|
component: 'DatePicker',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案',
|
||||||
|
field: 'answer1',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传人',
|
||||||
|
field: 'upuser',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传人id',
|
||||||
|
field: 'upuserid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传时间戳',
|
||||||
|
field: 'upTimestamp',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '课程最小id',
|
||||||
|
field: 'minkcid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案2',
|
||||||
|
field: 'answer2',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案3',
|
||||||
|
field: 'answer3',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案4',
|
||||||
|
field: 'answer4',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案5',
|
||||||
|
field: 'answer5',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案6',
|
||||||
|
field: 'answer6',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案7',
|
||||||
|
field: 'answer7',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案8',
|
||||||
|
field: 'answer8',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案9',
|
||||||
|
field: 'answer9',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案10',
|
||||||
|
field: 'answer10',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案11',
|
||||||
|
field: 'answer11',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '问卷版本',
|
||||||
|
field: 'evaluationver',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
// TODO 主键隐藏字段,目前写死为ID
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
field: 'id',
|
||||||
|
component: 'Input',
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!--查询区域-->
|
||||||
|
<div class="jeecg-basic-table-form-container">
|
||||||
|
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<!--引用表格-->
|
||||||
|
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||||
|
<!--插槽:table标题-->
|
||||||
|
<template #tableTitle>
|
||||||
|
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
|
||||||
|
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
|
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<template #overlay>
|
||||||
|
<a-menu>
|
||||||
|
<a-menu-item key="1" @click="batchHandleDelete">
|
||||||
|
<Icon icon="ant-design:delete-outlined"></Icon>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</template>
|
||||||
|
<a-button>批量操作
|
||||||
|
<Icon icon="mdi:chevron-down"></Icon>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
<!--操作栏-->
|
||||||
|
<template #action="{ record }">
|
||||||
|
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
|
||||||
|
</template>
|
||||||
|
<!--字段回显插槽-->
|
||||||
|
<template #htmlSlot="{text}">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
<!--省市区字段回显插槽-->
|
||||||
|
<!--<template #pcaSlot="{text}">
|
||||||
|
{{ getAreaTextByCode(text) }}
|
||||||
|
</template>-->
|
||||||
|
<template #fileSlot="{text}">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
|
||||||
|
</template>
|
||||||
|
</BasicTable>
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<KcEvaluationModal ref="registerModal" @success="handleSuccess"></KcEvaluationModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="qa-kcEvaluation" setup>
|
||||||
|
import { ref, reactive } from 'vue';
|
||||||
|
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||||
|
import { useListPage } from '/@/hooks/system/useListPage';
|
||||||
|
import { columns } from './KcEvaluation.data';
|
||||||
|
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './KcEvaluation.api';
|
||||||
|
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||||
|
import KcEvaluationModal from './components/KcEvaluationModal.vue'
|
||||||
|
|
||||||
|
const queryParam = ref<any>({});
|
||||||
|
const toggleSearchStatus = ref<boolean>(false);
|
||||||
|
const registerModal = ref();
|
||||||
|
//注册table数据
|
||||||
|
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
|
tableProps: {
|
||||||
|
title: '调查问卷-回答主表',
|
||||||
|
api: list,
|
||||||
|
columns,
|
||||||
|
canResize:false,
|
||||||
|
useSearchForm: false,
|
||||||
|
actionColumn: {
|
||||||
|
width: 120,
|
||||||
|
fixed: 'right',
|
||||||
|
},
|
||||||
|
beforeFetch: (params) => {
|
||||||
|
params.column = '',params.order = '';//新生成的默认不带排序
|
||||||
|
return Object.assign(params, queryParam.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exportConfig: {
|
||||||
|
name: "调查问卷-回答主表",
|
||||||
|
url: getExportUrl,
|
||||||
|
},
|
||||||
|
importConfig: {
|
||||||
|
url: getImportUrl,
|
||||||
|
success: handleSuccess
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 7 },
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 16 },
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增事件
|
||||||
|
*/
|
||||||
|
function handleAdd() {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.add();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑事件
|
||||||
|
*/
|
||||||
|
function handleEdit(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
function handleDetail(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = true;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除事件
|
||||||
|
*/
|
||||||
|
async function handleDelete(record) {
|
||||||
|
await deleteOne({ id: record.id }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除事件
|
||||||
|
*/
|
||||||
|
async function batchHandleDelete() {
|
||||||
|
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功回调
|
||||||
|
*/
|
||||||
|
function handleSuccess() {
|
||||||
|
(selectedRowKeys.value = []) && reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作栏
|
||||||
|
*/
|
||||||
|
function getTableAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '编辑',
|
||||||
|
onClick: handleEdit.bind(null, record),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉操作栏
|
||||||
|
*/
|
||||||
|
function getDropDownAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '详情',
|
||||||
|
onClick: handleDetail.bind(null, record),
|
||||||
|
}, {
|
||||||
|
label: '删除',
|
||||||
|
popConfirm: {
|
||||||
|
title: '是否确认删除',
|
||||||
|
confirm: handleDelete.bind(null, record),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
function searchQuery() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
function searchReset() {
|
||||||
|
queryParam.value = {};
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
//刷新数据
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
width: calc(50% - 15px);
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
|
|
||||||
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
list = '/qa/kcEvaluationans/list',
|
||||||
|
save='/qa/kcEvaluationans/add',
|
||||||
|
edit='/qa/kcEvaluationans/edit',
|
||||||
|
deleteOne = '/qa/kcEvaluationans/delete',
|
||||||
|
deleteBatch = '/qa/kcEvaluationans/deleteBatch',
|
||||||
|
importExcel = '/qa/kcEvaluationans/importExcel',
|
||||||
|
exportXls = '/qa/kcEvaluationans/exportXls',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出api
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getExportUrl = Api.exportXls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入api
|
||||||
|
*/
|
||||||
|
export const getImportUrl = Api.importExcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表接口
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const list = (params) => defHttp.get({ url: Api.list, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除单个
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const deleteOne = (params,handleSuccess) => {
|
||||||
|
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const batchDelete = (params, handleSuccess) => {
|
||||||
|
createConfirm({
|
||||||
|
iconType: 'warning',
|
||||||
|
title: '确认删除',
|
||||||
|
content: '是否删除选中数据',
|
||||||
|
okText: '确认',
|
||||||
|
cancelText: '取消',
|
||||||
|
onOk: () => {
|
||||||
|
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存或者更新
|
||||||
|
* @param params
|
||||||
|
* @param isUpdate
|
||||||
|
*/
|
||||||
|
export const saveOrUpdate = (params, isUpdate) => {
|
||||||
|
let url = isUpdate ? Api.edit : Api.save;
|
||||||
|
return defHttp.post({ url: url, params }, { isTransformResponse: false });
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
import {BasicColumn} from '/@/components/Table';
|
||||||
|
import {FormSchema} from '/@/components/Table';
|
||||||
|
import { rules} from '/@/utils/helper/validator';
|
||||||
|
import { render } from '/@/utils/common/renderUtils';
|
||||||
|
//列表数据
|
||||||
|
export const columns: BasicColumn[] = [
|
||||||
|
{
|
||||||
|
title: '问题ID',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'queid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '内容',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'content'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '分数',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'score'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '排序',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'ordernum'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态 0:可用 1:停用',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'status'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '是否参与评分 0:参与 1:不参与',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'inavg'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
//查询数据
|
||||||
|
export const searchFormSchema: FormSchema[] = [
|
||||||
|
];
|
||||||
|
|
||||||
|
//表单数据
|
||||||
|
export const formSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '问题ID',
|
||||||
|
field: 'queid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入问题ID!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '内容',
|
||||||
|
field: 'content',
|
||||||
|
component: 'Input',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入内容!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '分数',
|
||||||
|
field: 'score',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入分数!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '排序',
|
||||||
|
field: 'ordernum',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入排序!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '状态 0:可用 1:停用',
|
||||||
|
field: 'status',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入状态 0:可用 1:停用!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '是否参与评分 0:参与 1:不参与',
|
||||||
|
field: 'inavg',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
// TODO 主键隐藏字段,目前写死为ID
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
field: 'id',
|
||||||
|
component: 'Input',
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!--查询区域-->
|
||||||
|
<div class="jeecg-basic-table-form-container">
|
||||||
|
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<!--引用表格-->
|
||||||
|
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||||
|
<!--插槽:table标题-->
|
||||||
|
<template #tableTitle>
|
||||||
|
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
|
||||||
|
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
|
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<template #overlay>
|
||||||
|
<a-menu>
|
||||||
|
<a-menu-item key="1" @click="batchHandleDelete">
|
||||||
|
<Icon icon="ant-design:delete-outlined"></Icon>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</template>
|
||||||
|
<a-button>批量操作
|
||||||
|
<Icon icon="mdi:chevron-down"></Icon>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
<!--操作栏-->
|
||||||
|
<template #action="{ record }">
|
||||||
|
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
|
||||||
|
</template>
|
||||||
|
<!--字段回显插槽-->
|
||||||
|
<template #htmlSlot="{text}">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
<!--省市区字段回显插槽-->
|
||||||
|
<!--<template #pcaSlot="{text}">
|
||||||
|
{{ getAreaTextByCode(text) }}
|
||||||
|
</template>-->
|
||||||
|
<template #fileSlot="{text}">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
|
||||||
|
</template>
|
||||||
|
</BasicTable>
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<KcEvaluationansModal ref="registerModal" @success="handleSuccess"></KcEvaluationansModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="qa-kcEvaluationans" setup>
|
||||||
|
import { ref, reactive } from 'vue';
|
||||||
|
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||||
|
import { useListPage } from '/@/hooks/system/useListPage';
|
||||||
|
import { columns } from './KcEvaluationans.data';
|
||||||
|
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './KcEvaluationans.api';
|
||||||
|
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||||
|
import KcEvaluationansModal from './components/KcEvaluationansModal.vue'
|
||||||
|
|
||||||
|
const queryParam = ref<any>({});
|
||||||
|
const toggleSearchStatus = ref<boolean>(false);
|
||||||
|
const registerModal = ref();
|
||||||
|
//注册table数据
|
||||||
|
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
|
tableProps: {
|
||||||
|
title: '调查问卷-答案表',
|
||||||
|
api: list,
|
||||||
|
columns,
|
||||||
|
canResize:false,
|
||||||
|
useSearchForm: false,
|
||||||
|
actionColumn: {
|
||||||
|
width: 120,
|
||||||
|
fixed: 'right',
|
||||||
|
},
|
||||||
|
beforeFetch: (params) => {
|
||||||
|
params.column = '',params.order = '';//新生成的默认不带排序
|
||||||
|
return Object.assign(params, queryParam.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exportConfig: {
|
||||||
|
name: "调查问卷-答案表",
|
||||||
|
url: getExportUrl,
|
||||||
|
},
|
||||||
|
importConfig: {
|
||||||
|
url: getImportUrl,
|
||||||
|
success: handleSuccess
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 7 },
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 16 },
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增事件
|
||||||
|
*/
|
||||||
|
function handleAdd() {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.add();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑事件
|
||||||
|
*/
|
||||||
|
function handleEdit(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
function handleDetail(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = true;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除事件
|
||||||
|
*/
|
||||||
|
async function handleDelete(record) {
|
||||||
|
await deleteOne({ id: record.id }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除事件
|
||||||
|
*/
|
||||||
|
async function batchHandleDelete() {
|
||||||
|
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功回调
|
||||||
|
*/
|
||||||
|
function handleSuccess() {
|
||||||
|
(selectedRowKeys.value = []) && reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作栏
|
||||||
|
*/
|
||||||
|
function getTableAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '编辑',
|
||||||
|
onClick: handleEdit.bind(null, record),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉操作栏
|
||||||
|
*/
|
||||||
|
function getDropDownAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '详情',
|
||||||
|
onClick: handleDetail.bind(null, record),
|
||||||
|
}, {
|
||||||
|
label: '删除',
|
||||||
|
popConfirm: {
|
||||||
|
title: '是否确认删除',
|
||||||
|
confirm: handleDelete.bind(null, record),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
function searchQuery() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
function searchReset() {
|
||||||
|
queryParam.value = {};
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
//刷新数据
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
width: calc(50% - 15px);
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
|
|
||||||
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
list = '/qa/kcEvaluationque/list',
|
||||||
|
save='/qa/kcEvaluationque/add',
|
||||||
|
edit='/qa/kcEvaluationque/edit',
|
||||||
|
deleteOne = '/qa/kcEvaluationque/delete',
|
||||||
|
deleteBatch = '/qa/kcEvaluationque/deleteBatch',
|
||||||
|
importExcel = '/qa/kcEvaluationque/importExcel',
|
||||||
|
exportXls = '/qa/kcEvaluationque/exportXls',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出api
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getExportUrl = Api.exportXls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入api
|
||||||
|
*/
|
||||||
|
export const getImportUrl = Api.importExcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表接口
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const list = (params) => defHttp.get({ url: Api.list, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除单个
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const deleteOne = (params,handleSuccess) => {
|
||||||
|
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const batchDelete = (params, handleSuccess) => {
|
||||||
|
createConfirm({
|
||||||
|
iconType: 'warning',
|
||||||
|
title: '确认删除',
|
||||||
|
content: '是否删除选中数据',
|
||||||
|
okText: '确认',
|
||||||
|
cancelText: '取消',
|
||||||
|
onOk: () => {
|
||||||
|
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存或者更新
|
||||||
|
* @param params
|
||||||
|
* @param isUpdate
|
||||||
|
*/
|
||||||
|
export const saveOrUpdate = (params, isUpdate) => {
|
||||||
|
let url = isUpdate ? Api.edit : Api.save;
|
||||||
|
return defHttp.post({ url: url, params }, { isTransformResponse: false });
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,107 @@
|
||||||
|
import {BasicColumn} from '/@/components/Table';
|
||||||
|
import {FormSchema} from '/@/components/Table';
|
||||||
|
import { rules} from '/@/utils/helper/validator';
|
||||||
|
import { render } from '/@/utils/common/renderUtils';
|
||||||
|
//列表数据
|
||||||
|
export const columns: BasicColumn[] = [
|
||||||
|
{
|
||||||
|
title: '内容',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'content'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '状态 0:可用 1:不可用',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'status'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'genre'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '排序',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'ordernum'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '问题形式 1:单选 2:多选 3:多行文本',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'quetype'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '是否必填 0:是 1:否',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'isrequire'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '问题版本',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'evaluationver'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
//查询数据
|
||||||
|
export const searchFormSchema: FormSchema[] = [
|
||||||
|
];
|
||||||
|
|
||||||
|
//表单数据
|
||||||
|
export const formSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '内容',
|
||||||
|
field: 'content',
|
||||||
|
component: 'Input',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入内容!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '状态 0:可用 1:不可用',
|
||||||
|
field: 'status',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入状态 0:可用 1:不可用!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他',
|
||||||
|
field: 'genre',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '排序',
|
||||||
|
field: 'ordernum',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '问题形式 1:单选 2:多选 3:多行文本',
|
||||||
|
field: 'quetype',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '是否必填 0:是 1:否',
|
||||||
|
field: 'isrequire',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '问题版本',
|
||||||
|
field: 'evaluationver',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
// TODO 主键隐藏字段,目前写死为ID
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
field: 'id',
|
||||||
|
component: 'Input',
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!--查询区域-->
|
||||||
|
<div class="jeecg-basic-table-form-container">
|
||||||
|
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<!--引用表格-->
|
||||||
|
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||||
|
<!--插槽:table标题-->
|
||||||
|
<template #tableTitle>
|
||||||
|
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
|
||||||
|
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
|
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<template #overlay>
|
||||||
|
<a-menu>
|
||||||
|
<a-menu-item key="1" @click="batchHandleDelete">
|
||||||
|
<Icon icon="ant-design:delete-outlined"></Icon>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</template>
|
||||||
|
<a-button>批量操作
|
||||||
|
<Icon icon="mdi:chevron-down"></Icon>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
<!--操作栏-->
|
||||||
|
<template #action="{ record }">
|
||||||
|
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
|
||||||
|
</template>
|
||||||
|
<!--字段回显插槽-->
|
||||||
|
<template #htmlSlot="{text}">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
<!--省市区字段回显插槽-->
|
||||||
|
<!--<template #pcaSlot="{text}">
|
||||||
|
{{ getAreaTextByCode(text) }}
|
||||||
|
</template>-->
|
||||||
|
<template #fileSlot="{text}">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
|
||||||
|
</template>
|
||||||
|
</BasicTable>
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<KcEvaluationqueModal ref="registerModal" @success="handleSuccess"></KcEvaluationqueModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="qa-kcEvaluationque" setup>
|
||||||
|
import { ref, reactive } from 'vue';
|
||||||
|
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||||
|
import { useListPage } from '/@/hooks/system/useListPage';
|
||||||
|
import { columns } from './KcEvaluationque.data';
|
||||||
|
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './KcEvaluationque.api';
|
||||||
|
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||||
|
import KcEvaluationqueModal from './components/KcEvaluationqueModal.vue'
|
||||||
|
|
||||||
|
const queryParam = ref<any>({});
|
||||||
|
const toggleSearchStatus = ref<boolean>(false);
|
||||||
|
const registerModal = ref();
|
||||||
|
//注册table数据
|
||||||
|
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
|
tableProps: {
|
||||||
|
title: '调查问卷-题目表',
|
||||||
|
api: list,
|
||||||
|
columns,
|
||||||
|
canResize:false,
|
||||||
|
useSearchForm: false,
|
||||||
|
actionColumn: {
|
||||||
|
width: 120,
|
||||||
|
fixed: 'right',
|
||||||
|
},
|
||||||
|
beforeFetch: (params) => {
|
||||||
|
params.column = '',params.order = '';//新生成的默认不带排序
|
||||||
|
return Object.assign(params, queryParam.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exportConfig: {
|
||||||
|
name: "调查问卷-题目表",
|
||||||
|
url: getExportUrl,
|
||||||
|
},
|
||||||
|
importConfig: {
|
||||||
|
url: getImportUrl,
|
||||||
|
success: handleSuccess
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 7 },
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 16 },
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增事件
|
||||||
|
*/
|
||||||
|
function handleAdd() {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.add();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑事件
|
||||||
|
*/
|
||||||
|
function handleEdit(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
function handleDetail(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = true;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除事件
|
||||||
|
*/
|
||||||
|
async function handleDelete(record) {
|
||||||
|
await deleteOne({ id: record.id }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除事件
|
||||||
|
*/
|
||||||
|
async function batchHandleDelete() {
|
||||||
|
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功回调
|
||||||
|
*/
|
||||||
|
function handleSuccess() {
|
||||||
|
(selectedRowKeys.value = []) && reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作栏
|
||||||
|
*/
|
||||||
|
function getTableAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '编辑',
|
||||||
|
onClick: handleEdit.bind(null, record),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉操作栏
|
||||||
|
*/
|
||||||
|
function getDropDownAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '详情',
|
||||||
|
onClick: handleDetail.bind(null, record),
|
||||||
|
}, {
|
||||||
|
label: '删除',
|
||||||
|
popConfirm: {
|
||||||
|
title: '是否确认删除',
|
||||||
|
confirm: handleDelete.bind(null, record),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
function searchQuery() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
function searchReset() {
|
||||||
|
queryParam.value = {};
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
//刷新数据
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
width: calc(50% - 15px);
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,72 @@
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from "/@/hooks/web/useMessage";
|
||||||
|
|
||||||
|
const { createConfirm } = useMessage();
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
list = '/qa/kcEvaluations/list',
|
||||||
|
save='/qa/kcEvaluations/add',
|
||||||
|
edit='/qa/kcEvaluations/edit',
|
||||||
|
deleteOne = '/qa/kcEvaluations/delete',
|
||||||
|
deleteBatch = '/qa/kcEvaluations/deleteBatch',
|
||||||
|
importExcel = '/qa/kcEvaluations/importExcel',
|
||||||
|
exportXls = '/qa/kcEvaluations/exportXls',
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出api
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const getExportUrl = Api.exportXls;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导入api
|
||||||
|
*/
|
||||||
|
export const getImportUrl = Api.importExcel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 列表接口
|
||||||
|
* @param params
|
||||||
|
*/
|
||||||
|
export const list = (params) => defHttp.get({ url: Api.list, params });
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除单个
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const deleteOne = (params,handleSuccess) => {
|
||||||
|
return defHttp.delete({url: Api.deleteOne, params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除
|
||||||
|
* @param params
|
||||||
|
* @param handleSuccess
|
||||||
|
*/
|
||||||
|
export const batchDelete = (params, handleSuccess) => {
|
||||||
|
createConfirm({
|
||||||
|
iconType: 'warning',
|
||||||
|
title: '确认删除',
|
||||||
|
content: '是否删除选中数据',
|
||||||
|
okText: '确认',
|
||||||
|
cancelText: '取消',
|
||||||
|
onOk: () => {
|
||||||
|
return defHttp.delete({url: Api.deleteBatch, data: params}, {joinParamsToUrl: true}).then(() => {
|
||||||
|
handleSuccess();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 保存或者更新
|
||||||
|
* @param params
|
||||||
|
* @param isUpdate
|
||||||
|
*/
|
||||||
|
export const saveOrUpdate = (params, isUpdate) => {
|
||||||
|
let url = isUpdate ? Api.edit : Api.save;
|
||||||
|
return defHttp.post({ url: url, params }, { isTransformResponse: false });
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,138 @@
|
||||||
|
import {BasicColumn} from '/@/components/Table';
|
||||||
|
import {FormSchema} from '/@/components/Table';
|
||||||
|
import { rules} from '/@/utils/helper/validator';
|
||||||
|
import { render } from '/@/utils/common/renderUtils';
|
||||||
|
//列表数据
|
||||||
|
export const columns: BasicColumn[] = [
|
||||||
|
{
|
||||||
|
title: '上传日期',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upDate',
|
||||||
|
customRender:({text}) =>{
|
||||||
|
return !text?"":(text.length>10?text.substr(0,10):text);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传时间',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upTime',
|
||||||
|
customRender:({text}) =>{
|
||||||
|
return !text?"":(text.length>10?text.substr(0,10):text);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传人',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upuser'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传人id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upuserid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '上传时间戳',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'upTimestamp'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '课堂表id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'ketangbiaoid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '问题id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'queid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '答案id',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'ansid'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '多行文本型答案内容',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'textanscontent'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '问卷版本',
|
||||||
|
align: "center",
|
||||||
|
dataIndex: 'evaluationid'
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
//查询数据
|
||||||
|
export const searchFormSchema: FormSchema[] = [
|
||||||
|
];
|
||||||
|
|
||||||
|
//表单数据
|
||||||
|
export const formSchema: FormSchema[] = [
|
||||||
|
{
|
||||||
|
label: '上传日期',
|
||||||
|
field: 'upDate',
|
||||||
|
component: 'DatePicker',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入上传日期!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传时间',
|
||||||
|
field: 'upTime',
|
||||||
|
component: 'DatePicker',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传人',
|
||||||
|
field: 'upuser',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传人id',
|
||||||
|
field: 'upuserid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '上传时间戳',
|
||||||
|
field: 'upTimestamp',
|
||||||
|
component: 'Input',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '课堂表id',
|
||||||
|
field: 'ketangbiaoid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '问题id',
|
||||||
|
field: 'queid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
dynamicRules: ({model,schema}) => {
|
||||||
|
return [
|
||||||
|
{ required: true, message: '请输入问题id!'},
|
||||||
|
];
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '答案id',
|
||||||
|
field: 'ansid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '多行文本型答案内容',
|
||||||
|
field: 'textanscontent',
|
||||||
|
component: 'InputTextArea',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
label: '问卷版本',
|
||||||
|
field: 'evaluationid',
|
||||||
|
component: 'InputNumber',
|
||||||
|
},
|
||||||
|
// TODO 主键隐藏字段,目前写死为ID
|
||||||
|
{
|
||||||
|
label: '',
|
||||||
|
field: 'id',
|
||||||
|
component: 'Input',
|
||||||
|
show: false,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
@ -0,0 +1,215 @@
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<!--查询区域-->
|
||||||
|
<div class="jeecg-basic-table-form-container">
|
||||||
|
<a-form @keyup.enter.native="searchQuery" :model="queryParam" :label-col="labelCol" :wrapper-col="wrapperCol">
|
||||||
|
<a-row :gutter="24">
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</div>
|
||||||
|
<!--引用表格-->
|
||||||
|
<BasicTable @register="registerTable" :rowSelection="rowSelection">
|
||||||
|
<!--插槽:table标题-->
|
||||||
|
<template #tableTitle>
|
||||||
|
<a-button type="primary" @click="handleAdd" preIcon="ant-design:plus-outlined"> 新增</a-button>
|
||||||
|
<a-button type="primary" preIcon="ant-design:export-outlined" @click="onExportXls"> 导出</a-button>
|
||||||
|
<j-upload-button type="primary" preIcon="ant-design:import-outlined" @click="onImportXls">导入</j-upload-button>
|
||||||
|
<a-dropdown v-if="selectedRowKeys.length > 0">
|
||||||
|
<template #overlay>
|
||||||
|
<a-menu>
|
||||||
|
<a-menu-item key="1" @click="batchHandleDelete">
|
||||||
|
<Icon icon="ant-design:delete-outlined"></Icon>
|
||||||
|
删除
|
||||||
|
</a-menu-item>
|
||||||
|
</a-menu>
|
||||||
|
</template>
|
||||||
|
<a-button>批量操作
|
||||||
|
<Icon icon="mdi:chevron-down"></Icon>
|
||||||
|
</a-button>
|
||||||
|
</a-dropdown>
|
||||||
|
</template>
|
||||||
|
<!--操作栏-->
|
||||||
|
<template #action="{ record }">
|
||||||
|
<TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)"/>
|
||||||
|
</template>
|
||||||
|
<!--字段回显插槽-->
|
||||||
|
<template #htmlSlot="{text}">
|
||||||
|
<div v-html="text"></div>
|
||||||
|
</template>
|
||||||
|
<!--省市区字段回显插槽-->
|
||||||
|
<!--<template #pcaSlot="{text}">
|
||||||
|
{{ getAreaTextByCode(text) }}
|
||||||
|
</template>-->
|
||||||
|
<template #fileSlot="{text}">
|
||||||
|
<span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span>
|
||||||
|
<a-button v-else :ghost="true" type="primary" preIcon="ant-design:download-outlined" size="small" @click="downloadFile(text)">下载</a-button>
|
||||||
|
</template>
|
||||||
|
</BasicTable>
|
||||||
|
<!-- 表单区域 -->
|
||||||
|
<KcEvaluationsModal ref="registerModal" @success="handleSuccess"></KcEvaluationsModal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" name="qa-kcEvaluations" setup>
|
||||||
|
import { ref, reactive } from 'vue';
|
||||||
|
import { BasicTable, useTable, TableAction } from '/@/components/Table';
|
||||||
|
import { useListPage } from '/@/hooks/system/useListPage';
|
||||||
|
import { columns } from './KcEvaluations.data';
|
||||||
|
import { list, deleteOne, batchDelete, getImportUrl, getExportUrl } from './KcEvaluations.api';
|
||||||
|
import { downloadFile } from '/@/utils/common/renderUtils';
|
||||||
|
import KcEvaluationsModal from './components/KcEvaluationsModal.vue'
|
||||||
|
|
||||||
|
const queryParam = ref<any>({});
|
||||||
|
const toggleSearchStatus = ref<boolean>(false);
|
||||||
|
const registerModal = ref();
|
||||||
|
//注册table数据
|
||||||
|
const { prefixCls, tableContext, onExportXls, onImportXls } = useListPage({
|
||||||
|
tableProps: {
|
||||||
|
title: '调查问卷-回答子表',
|
||||||
|
api: list,
|
||||||
|
columns,
|
||||||
|
canResize:false,
|
||||||
|
useSearchForm: false,
|
||||||
|
actionColumn: {
|
||||||
|
width: 120,
|
||||||
|
fixed: 'right',
|
||||||
|
},
|
||||||
|
beforeFetch: (params) => {
|
||||||
|
params.column = '',params.order = '';//新生成的默认不带排序
|
||||||
|
return Object.assign(params, queryParam.value);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
exportConfig: {
|
||||||
|
name: "调查问卷-回答子表",
|
||||||
|
url: getExportUrl,
|
||||||
|
},
|
||||||
|
importConfig: {
|
||||||
|
url: getImportUrl,
|
||||||
|
success: handleSuccess
|
||||||
|
},
|
||||||
|
});
|
||||||
|
const [registerTable, { reload, collapseAll, updateTableDataRecord, findTableDataRecord, getDataSource }, { rowSelection, selectedRowKeys }] = tableContext;
|
||||||
|
const labelCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 7 },
|
||||||
|
});
|
||||||
|
const wrapperCol = reactive({
|
||||||
|
xs: { span: 24 },
|
||||||
|
sm: { span: 16 },
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增事件
|
||||||
|
*/
|
||||||
|
function handleAdd() {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.add();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑事件
|
||||||
|
*/
|
||||||
|
function handleEdit(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = false;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 详情
|
||||||
|
*/
|
||||||
|
function handleDetail(record: Recordable) {
|
||||||
|
registerModal.value.disableSubmit = true;
|
||||||
|
registerModal.value.edit(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除事件
|
||||||
|
*/
|
||||||
|
async function handleDelete(record) {
|
||||||
|
await deleteOne({ id: record.id }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 批量删除事件
|
||||||
|
*/
|
||||||
|
async function batchHandleDelete() {
|
||||||
|
await batchDelete({ ids: selectedRowKeys.value }, handleSuccess);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 成功回调
|
||||||
|
*/
|
||||||
|
function handleSuccess() {
|
||||||
|
(selectedRowKeys.value = []) && reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 操作栏
|
||||||
|
*/
|
||||||
|
function getTableAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '编辑',
|
||||||
|
onClick: handleEdit.bind(null, record),
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下拉操作栏
|
||||||
|
*/
|
||||||
|
function getDropDownAction(record) {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
label: '详情',
|
||||||
|
onClick: handleDetail.bind(null, record),
|
||||||
|
}, {
|
||||||
|
label: '删除',
|
||||||
|
popConfirm: {
|
||||||
|
title: '是否确认删除',
|
||||||
|
confirm: handleDelete.bind(null, record),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询
|
||||||
|
*/
|
||||||
|
function searchQuery() {
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 重置
|
||||||
|
*/
|
||||||
|
function searchReset() {
|
||||||
|
queryParam.value = {};
|
||||||
|
selectedRowKeys.value = [];
|
||||||
|
//刷新数据
|
||||||
|
reload();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.jeecg-basic-table-form-container {
|
||||||
|
.table-page-search-submitButtons {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.query-group-cust{
|
||||||
|
width: calc(50% - 15px);
|
||||||
|
min-width: 100px !important;
|
||||||
|
}
|
||||||
|
.query-group-split-cust{
|
||||||
|
width: 30px;
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,230 @@
|
||||||
|
<template>
|
||||||
|
<a-spin :spinning="confirmLoading">
|
||||||
|
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||||
|
<a-row>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传日期" v-bind="validateInfos.upDate">
|
||||||
|
<a-date-picker placeholder="请选择上传日期" v-model:value="formData.upDate" value-format="YYYY-MM-DD" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传时间" v-bind="validateInfos.upTime">
|
||||||
|
<a-date-picker placeholder="请选择上传时间" v-model:value="formData.upTime" value-format="YYYY-MM-DD" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案" v-bind="validateInfos.answer1">
|
||||||
|
<a-input v-model:value="formData.answer1" placeholder="请输入答案" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传人" v-bind="validateInfos.upuser">
|
||||||
|
<a-input v-model:value="formData.upuser" placeholder="请输入上传人" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传人id" v-bind="validateInfos.upuserid">
|
||||||
|
<a-input-number v-model:value="formData.upuserid" placeholder="请输入上传人id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传时间戳" v-bind="validateInfos.upTimestamp">
|
||||||
|
<a-input v-model:value="formData.upTimestamp" placeholder="请输入上传时间戳" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="课程最小id" v-bind="validateInfos.minkcid">
|
||||||
|
<a-input-number v-model:value="formData.minkcid" placeholder="请输入课程最小id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案2" v-bind="validateInfos.answer2">
|
||||||
|
<a-input v-model:value="formData.answer2" placeholder="请输入答案2" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案3" v-bind="validateInfos.answer3">
|
||||||
|
<a-input v-model:value="formData.answer3" placeholder="请输入答案3" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案4" v-bind="validateInfos.answer4">
|
||||||
|
<a-input v-model:value="formData.answer4" placeholder="请输入答案4" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案5" v-bind="validateInfos.answer5">
|
||||||
|
<a-input v-model:value="formData.answer5" placeholder="请输入答案5" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案6" v-bind="validateInfos.answer6">
|
||||||
|
<a-input v-model:value="formData.answer6" placeholder="请输入答案6" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案7" v-bind="validateInfos.answer7">
|
||||||
|
<a-input v-model:value="formData.answer7" placeholder="请输入答案7" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案8" v-bind="validateInfos.answer8">
|
||||||
|
<a-input v-model:value="formData.answer8" placeholder="请输入答案8" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案9" v-bind="validateInfos.answer9">
|
||||||
|
<a-input v-model:value="formData.answer9" placeholder="请输入答案9" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案10" v-bind="validateInfos.answer10">
|
||||||
|
<a-input v-model:value="formData.answer10" placeholder="请输入答案10" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案11" v-bind="validateInfos.answer11">
|
||||||
|
<a-input v-model:value="formData.answer11" placeholder="请输入答案11" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问卷版本" v-bind="validateInfos.evaluationver">
|
||||||
|
<a-input-number v-model:value="formData.evaluationver" placeholder="请输入问卷版本" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</a-spin>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getValueType } from '/@/utils';
|
||||||
|
import { saveOrUpdate } from '../KcEvaluation.api';
|
||||||
|
import { Form } from 'ant-design-vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
formDisabled: { type: Boolean, default: false },
|
||||||
|
formData: { type: Object, default: ()=>{} },
|
||||||
|
formBpm: { type: Boolean, default: true }
|
||||||
|
});
|
||||||
|
const formRef = ref();
|
||||||
|
const useForm = Form.useForm;
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
|
const formData = reactive<Record<string, any>>({
|
||||||
|
id: '',
|
||||||
|
upDate: '',
|
||||||
|
upTime: '',
|
||||||
|
answer1: '',
|
||||||
|
upuser: '',
|
||||||
|
upuserid: undefined,
|
||||||
|
upTimestamp: '',
|
||||||
|
minkcid: undefined,
|
||||||
|
answer2: '',
|
||||||
|
answer3: '',
|
||||||
|
answer4: '',
|
||||||
|
answer5: '',
|
||||||
|
answer6: '',
|
||||||
|
answer7: '',
|
||||||
|
answer8: '',
|
||||||
|
answer9: '',
|
||||||
|
answer10: '',
|
||||||
|
answer11: '',
|
||||||
|
evaluationver: undefined,
|
||||||
|
});
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||||
|
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
//表单验证
|
||||||
|
const validatorRules = {
|
||||||
|
upDate: [{ required: true, message: '请输入上传日期!'},],
|
||||||
|
};
|
||||||
|
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
|
||||||
|
|
||||||
|
// 表单禁用
|
||||||
|
const disabled = computed(()=>{
|
||||||
|
if(props.formBpm === true){
|
||||||
|
if(props.formData.disabled === false){
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return props.formDisabled;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
edit({});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
nextTick(() => {
|
||||||
|
resetFields();
|
||||||
|
//赋值
|
||||||
|
Object.assign(formData, record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交数据
|
||||||
|
*/
|
||||||
|
async function submitForm() {
|
||||||
|
// 触发表单验证
|
||||||
|
await validate();
|
||||||
|
confirmLoading.value = true;
|
||||||
|
const isUpdate = ref<boolean>(false);
|
||||||
|
//时间格式化
|
||||||
|
let model = formData;
|
||||||
|
if (model.id) {
|
||||||
|
isUpdate.value = true;
|
||||||
|
}
|
||||||
|
//循环数据
|
||||||
|
for (let data in model) {
|
||||||
|
//如果该数据是数组并且是字符串类型
|
||||||
|
if (model[data] instanceof Array) {
|
||||||
|
let valueType = getValueType(formRef.value.getProps, data);
|
||||||
|
//如果是字符串类型的需要变成以逗号分割的字符串
|
||||||
|
if (valueType === 'string') {
|
||||||
|
model[data] = model[data].join(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await saveOrUpdate(model, isUpdate.value)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
createMessage.success(res.message);
|
||||||
|
emit('ok');
|
||||||
|
} else {
|
||||||
|
createMessage.warning(res.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
confirmLoading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
submitForm,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.antd-modal-form {
|
||||||
|
min-height: 500px !important;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 24px 24px 24px 24px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
<template>
|
||||||
|
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||||
|
<KcEvaluationForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></KcEvaluationForm>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
import KcEvaluationForm from './KcEvaluationForm.vue'
|
||||||
|
|
||||||
|
const title = ref<string>('');
|
||||||
|
const width = ref<number>(800);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const emit = defineEmits(['register', 'success']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
title.value = '新增';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
* @param record
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.edit(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
emit('success');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,162 @@
|
||||||
|
<template>
|
||||||
|
<a-spin :spinning="confirmLoading">
|
||||||
|
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||||
|
<a-row>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问题ID" v-bind="validateInfos.queid">
|
||||||
|
<a-input-number v-model:value="formData.queid" placeholder="请输入问题ID" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="内容" v-bind="validateInfos.content">
|
||||||
|
<a-input v-model:value="formData.content" placeholder="请输入内容" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="分数" v-bind="validateInfos.score">
|
||||||
|
<a-input-number v-model:value="formData.score" placeholder="请输入分数" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="排序" v-bind="validateInfos.ordernum">
|
||||||
|
<a-input-number v-model:value="formData.ordernum" placeholder="请输入排序" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="状态 0:可用 1:停用" v-bind="validateInfos.status">
|
||||||
|
<a-input-number v-model:value="formData.status" placeholder="请输入状态 0:可用 1:停用" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="是否参与评分 0:参与 1:不参与" v-bind="validateInfos.inavg">
|
||||||
|
<a-input-number v-model:value="formData.inavg" placeholder="请输入是否参与评分 0:参与 1:不参与" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</a-spin>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getValueType } from '/@/utils';
|
||||||
|
import { saveOrUpdate } from '../KcEvaluationans.api';
|
||||||
|
import { Form } from 'ant-design-vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
formDisabled: { type: Boolean, default: false },
|
||||||
|
formData: { type: Object, default: ()=>{} },
|
||||||
|
formBpm: { type: Boolean, default: true }
|
||||||
|
});
|
||||||
|
const formRef = ref();
|
||||||
|
const useForm = Form.useForm;
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
|
const formData = reactive<Record<string, any>>({
|
||||||
|
id: '',
|
||||||
|
queid: undefined,
|
||||||
|
content: '',
|
||||||
|
score: undefined,
|
||||||
|
ordernum: undefined,
|
||||||
|
status: undefined,
|
||||||
|
inavg: undefined,
|
||||||
|
});
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||||
|
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
//表单验证
|
||||||
|
const validatorRules = {
|
||||||
|
queid: [{ required: true, message: '请输入问题ID!'},],
|
||||||
|
content: [{ required: true, message: '请输入内容!'},],
|
||||||
|
score: [{ required: true, message: '请输入分数!'},],
|
||||||
|
ordernum: [{ required: true, message: '请输入排序!'},],
|
||||||
|
status: [{ required: true, message: '请输入状态 0:可用 1:停用!'},],
|
||||||
|
};
|
||||||
|
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
|
||||||
|
|
||||||
|
// 表单禁用
|
||||||
|
const disabled = computed(()=>{
|
||||||
|
if(props.formBpm === true){
|
||||||
|
if(props.formData.disabled === false){
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return props.formDisabled;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
edit({});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
nextTick(() => {
|
||||||
|
resetFields();
|
||||||
|
//赋值
|
||||||
|
Object.assign(formData, record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交数据
|
||||||
|
*/
|
||||||
|
async function submitForm() {
|
||||||
|
// 触发表单验证
|
||||||
|
await validate();
|
||||||
|
confirmLoading.value = true;
|
||||||
|
const isUpdate = ref<boolean>(false);
|
||||||
|
//时间格式化
|
||||||
|
let model = formData;
|
||||||
|
if (model.id) {
|
||||||
|
isUpdate.value = true;
|
||||||
|
}
|
||||||
|
//循环数据
|
||||||
|
for (let data in model) {
|
||||||
|
//如果该数据是数组并且是字符串类型
|
||||||
|
if (model[data] instanceof Array) {
|
||||||
|
let valueType = getValueType(formRef.value.getProps, data);
|
||||||
|
//如果是字符串类型的需要变成以逗号分割的字符串
|
||||||
|
if (valueType === 'string') {
|
||||||
|
model[data] = model[data].join(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await saveOrUpdate(model, isUpdate.value)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
createMessage.success(res.message);
|
||||||
|
emit('ok');
|
||||||
|
} else {
|
||||||
|
createMessage.warning(res.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
confirmLoading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
submitForm,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.antd-modal-form {
|
||||||
|
min-height: 500px !important;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 24px 24px 24px 24px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
<template>
|
||||||
|
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||||
|
<KcEvaluationansForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></KcEvaluationansForm>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
import KcEvaluationansForm from './KcEvaluationansForm.vue'
|
||||||
|
|
||||||
|
const title = ref<string>('');
|
||||||
|
const width = ref<number>(800);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const emit = defineEmits(['register', 'success']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
title.value = '新增';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
* @param record
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.edit(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
emit('success');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,166 @@
|
||||||
|
<template>
|
||||||
|
<a-spin :spinning="confirmLoading">
|
||||||
|
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||||
|
<a-row>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="内容" v-bind="validateInfos.content">
|
||||||
|
<a-input v-model:value="formData.content" placeholder="请输入内容" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="状态 0:可用 1:不可用" v-bind="validateInfos.status">
|
||||||
|
<a-input-number v-model:value="formData.status" placeholder="请输入状态 0:可用 1:不可用" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他" v-bind="validateInfos.genre">
|
||||||
|
<a-input-number v-model:value="formData.genre" placeholder="请输入分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="排序" v-bind="validateInfos.ordernum">
|
||||||
|
<a-input-number v-model:value="formData.ordernum" placeholder="请输入排序" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问题形式 1:单选 2:多选 3:多行文本" v-bind="validateInfos.quetype">
|
||||||
|
<a-input-number v-model:value="formData.quetype" placeholder="请输入问题形式 1:单选 2:多选 3:多行文本" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="是否必填 0:是 1:否" v-bind="validateInfos.isrequire">
|
||||||
|
<a-input-number v-model:value="formData.isrequire" placeholder="请输入是否必填 0:是 1:否" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问题版本" v-bind="validateInfos.evaluationver">
|
||||||
|
<a-input-number v-model:value="formData.evaluationver" placeholder="请输入问题版本" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</a-spin>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getValueType } from '/@/utils';
|
||||||
|
import { saveOrUpdate } from '../KcEvaluationque.api';
|
||||||
|
import { Form } from 'ant-design-vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
formDisabled: { type: Boolean, default: false },
|
||||||
|
formData: { type: Object, default: ()=>{} },
|
||||||
|
formBpm: { type: Boolean, default: true }
|
||||||
|
});
|
||||||
|
const formRef = ref();
|
||||||
|
const useForm = Form.useForm;
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
|
const formData = reactive<Record<string, any>>({
|
||||||
|
id: '',
|
||||||
|
content: '',
|
||||||
|
status: undefined,
|
||||||
|
genre: undefined,
|
||||||
|
ordernum: undefined,
|
||||||
|
quetype: undefined,
|
||||||
|
isrequire: undefined,
|
||||||
|
evaluationver: undefined,
|
||||||
|
});
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||||
|
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
//表单验证
|
||||||
|
const validatorRules = {
|
||||||
|
content: [{ required: true, message: '请输入内容!'},],
|
||||||
|
status: [{ required: true, message: '请输入状态 0:可用 1:不可用!'},],
|
||||||
|
genre: [{ required: true, message: '请输入分类 0:总评 1:教学准备 2:教师情况 3:学生情况 4:教学效果 5:其他!'},],
|
||||||
|
};
|
||||||
|
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
|
||||||
|
|
||||||
|
// 表单禁用
|
||||||
|
const disabled = computed(()=>{
|
||||||
|
if(props.formBpm === true){
|
||||||
|
if(props.formData.disabled === false){
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return props.formDisabled;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
edit({});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
nextTick(() => {
|
||||||
|
resetFields();
|
||||||
|
//赋值
|
||||||
|
Object.assign(formData, record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交数据
|
||||||
|
*/
|
||||||
|
async function submitForm() {
|
||||||
|
// 触发表单验证
|
||||||
|
await validate();
|
||||||
|
confirmLoading.value = true;
|
||||||
|
const isUpdate = ref<boolean>(false);
|
||||||
|
//时间格式化
|
||||||
|
let model = formData;
|
||||||
|
if (model.id) {
|
||||||
|
isUpdate.value = true;
|
||||||
|
}
|
||||||
|
//循环数据
|
||||||
|
for (let data in model) {
|
||||||
|
//如果该数据是数组并且是字符串类型
|
||||||
|
if (model[data] instanceof Array) {
|
||||||
|
let valueType = getValueType(formRef.value.getProps, data);
|
||||||
|
//如果是字符串类型的需要变成以逗号分割的字符串
|
||||||
|
if (valueType === 'string') {
|
||||||
|
model[data] = model[data].join(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await saveOrUpdate(model, isUpdate.value)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
createMessage.success(res.message);
|
||||||
|
emit('ok');
|
||||||
|
} else {
|
||||||
|
createMessage.warning(res.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
confirmLoading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
submitForm,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.antd-modal-form {
|
||||||
|
min-height: 500px !important;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 24px 24px 24px 24px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
<template>
|
||||||
|
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||||
|
<KcEvaluationqueForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></KcEvaluationqueForm>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
import KcEvaluationqueForm from './KcEvaluationqueForm.vue'
|
||||||
|
|
||||||
|
const title = ref<string>('');
|
||||||
|
const width = ref<number>(800);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const emit = defineEmits(['register', 'success']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
title.value = '新增';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
* @param record
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.edit(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
emit('success');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,183 @@
|
||||||
|
<template>
|
||||||
|
<a-spin :spinning="confirmLoading">
|
||||||
|
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
||||||
|
<a-row>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传日期" v-bind="validateInfos.upDate">
|
||||||
|
<a-date-picker placeholder="请选择上传日期" v-model:value="formData.upDate" value-format="YYYY-MM-DD" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传时间" v-bind="validateInfos.upTime">
|
||||||
|
<a-date-picker placeholder="请选择上传时间" v-model:value="formData.upTime" value-format="YYYY-MM-DD" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传人" v-bind="validateInfos.upuser">
|
||||||
|
<a-input v-model:value="formData.upuser" placeholder="请输入上传人" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传人id" v-bind="validateInfos.upuserid">
|
||||||
|
<a-input-number v-model:value="formData.upuserid" placeholder="请输入上传人id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="上传时间戳" v-bind="validateInfos.upTimestamp">
|
||||||
|
<a-input v-model:value="formData.upTimestamp" placeholder="请输入上传时间戳" :disabled="disabled"></a-input>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="课堂表id" v-bind="validateInfos.ketangbiaoid">
|
||||||
|
<a-input-number v-model:value="formData.ketangbiaoid" placeholder="请输入课堂表id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问题id" v-bind="validateInfos.queid">
|
||||||
|
<a-input-number v-model:value="formData.queid" placeholder="请输入问题id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="答案id" v-bind="validateInfos.ansid">
|
||||||
|
<a-input-number v-model:value="formData.ansid" placeholder="请输入答案id" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="多行文本型答案内容" v-bind="validateInfos.textanscontent">
|
||||||
|
<a-textarea v-model:value="formData.textanscontent" rows="4" placeholder="请输入多行文本型答案内容" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-form-item label="问卷版本" v-bind="validateInfos.evaluationid">
|
||||||
|
<a-input-number v-model:value="formData.evaluationid" placeholder="请输入问卷版本" style="width: 100%" :disabled="disabled"/>
|
||||||
|
</a-form-item>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</a-form>
|
||||||
|
</a-spin>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted } from 'vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getValueType } from '/@/utils';
|
||||||
|
import { saveOrUpdate } from '../KcEvaluations.api';
|
||||||
|
import { Form } from 'ant-design-vue';
|
||||||
|
|
||||||
|
const props = defineProps({
|
||||||
|
formDisabled: { type: Boolean, default: false },
|
||||||
|
formData: { type: Object, default: ()=>{} },
|
||||||
|
formBpm: { type: Boolean, default: true }
|
||||||
|
});
|
||||||
|
const formRef = ref();
|
||||||
|
const useForm = Form.useForm;
|
||||||
|
const emit = defineEmits(['register', 'ok']);
|
||||||
|
const formData = reactive<Record<string, any>>({
|
||||||
|
id: '',
|
||||||
|
upDate: '',
|
||||||
|
upTime: '',
|
||||||
|
upuser: '',
|
||||||
|
upuserid: undefined,
|
||||||
|
upTimestamp: '',
|
||||||
|
ketangbiaoid: undefined,
|
||||||
|
queid: undefined,
|
||||||
|
ansid: undefined,
|
||||||
|
textanscontent: '',
|
||||||
|
evaluationid: undefined,
|
||||||
|
});
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
||||||
|
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
//表单验证
|
||||||
|
const validatorRules = {
|
||||||
|
upDate: [{ required: true, message: '请输入上传日期!'},],
|
||||||
|
queid: [{ required: true, message: '请输入问题id!'},],
|
||||||
|
};
|
||||||
|
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
|
||||||
|
|
||||||
|
// 表单禁用
|
||||||
|
const disabled = computed(()=>{
|
||||||
|
if(props.formBpm === true){
|
||||||
|
if(props.formData.disabled === false){
|
||||||
|
return false;
|
||||||
|
}else{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return props.formDisabled;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
edit({});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
nextTick(() => {
|
||||||
|
resetFields();
|
||||||
|
//赋值
|
||||||
|
Object.assign(formData, record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 提交数据
|
||||||
|
*/
|
||||||
|
async function submitForm() {
|
||||||
|
// 触发表单验证
|
||||||
|
await validate();
|
||||||
|
confirmLoading.value = true;
|
||||||
|
const isUpdate = ref<boolean>(false);
|
||||||
|
//时间格式化
|
||||||
|
let model = formData;
|
||||||
|
if (model.id) {
|
||||||
|
isUpdate.value = true;
|
||||||
|
}
|
||||||
|
//循环数据
|
||||||
|
for (let data in model) {
|
||||||
|
//如果该数据是数组并且是字符串类型
|
||||||
|
if (model[data] instanceof Array) {
|
||||||
|
let valueType = getValueType(formRef.value.getProps, data);
|
||||||
|
//如果是字符串类型的需要变成以逗号分割的字符串
|
||||||
|
if (valueType === 'string') {
|
||||||
|
model[data] = model[data].join(',');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await saveOrUpdate(model, isUpdate.value)
|
||||||
|
.then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
createMessage.success(res.message);
|
||||||
|
emit('ok');
|
||||||
|
} else {
|
||||||
|
createMessage.warning(res.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
confirmLoading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
submitForm,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.antd-modal-form {
|
||||||
|
min-height: 500px !important;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 24px 24px 24px 24px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,75 @@
|
||||||
|
<template>
|
||||||
|
<a-modal :title="title" :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" cancelText="关闭">
|
||||||
|
<KcEvaluationsForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"></KcEvaluationsForm>
|
||||||
|
</a-modal>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
import KcEvaluationsForm from './KcEvaluationsForm.vue'
|
||||||
|
|
||||||
|
const title = ref<string>('');
|
||||||
|
const width = ref<number>(800);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const emit = defineEmits(['register', 'success']);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function add() {
|
||||||
|
title.value = '新增';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.add();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 编辑
|
||||||
|
* @param record
|
||||||
|
*/
|
||||||
|
function edit(record) {
|
||||||
|
title.value = disableSubmit.value ? '详情' : '编辑';
|
||||||
|
visible.value = true;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.edit(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
emit('success');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
add,
|
||||||
|
edit,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -1,143 +1,49 @@
|
||||||
<template>
|
<template>
|
||||||
<a-spin :spinning="confirmLoading">
|
<a-card>
|
||||||
<a-card>
|
您可根据实际情况选择下面三个评价表中的一个或者两个给予评价:
|
||||||
您可根据实际情况选择下面三个评价表中的一个或者两个给予评价:
|
<div class="p15">
|
||||||
<a-form ref="formRef" class="antd-modal-form" :labelCol="labelCol" :wrapperCol="wrapperCol">
|
<a-row>
|
||||||
<a-row>
|
<a-col :span="8">
|
||||||
<a-col :span="24">
|
<a-button type="primary"><RouterLink target='_blank' :to="{path:'/site/qaAddPage',query:{ type: 4, ktId }}">线上课题评价表</RouterLink></a-button>
|
||||||
<!-- <a-form-item label="课前15分钟提醒"> -->
|
</a-col>
|
||||||
<a-checkbox-group v-model:value="formData.kqtx">
|
<a-col :span="8">
|
||||||
<a-checkbox value="1"/>
|
<a-button type="primary"><RouterLink target='_blank' :to="{path:'/site/qaAddPage',query:{ type: 3, ktId }}">听课记录表</RouterLink></a-button>
|
||||||
</a-checkbox-group>
|
</a-col>
|
||||||
课前15分钟提醒
|
<a-col :span="8">
|
||||||
<!-- <j-checkbox type="checkbox" v-model:value="formData.kqtx" dictCode="skzc" placeholder="请选择开课周次"/> -->
|
<a-button type="primary"><RouterLink target='_blank' :to="{path:'/site/qaAddPage',query:{ type: 2, ktId }}">同行评价表</RouterLink></a-button>
|
||||||
<!-- </a-form-item> -->
|
</a-col>
|
||||||
</a-col>
|
</a-row>
|
||||||
<a-col :span="24">
|
</div>
|
||||||
<!-- <a-form-item label="每天下午4点提醒明日课程"> -->
|
<p>
|
||||||
<a-checkbox-group v-model:value="formData.mrkctx">
|
说明:
|
||||||
<a-checkbox value="1"/>
|
</p>
|
||||||
</a-checkbox-group>
|
<p>
|
||||||
每天下午4点提醒明日课程
|
1.线上课堂评价表:是根据线上课堂的特点研制的,如果您听的是线上课堂,请您填写该评价表;如果您同时是该课程所属学科的专家/教师,也欢迎您同时填写《同行评价表》。
|
||||||
<!-- <j-checkbox type="checkbox" v-model:value="formData.mrkctx" dictCode="skzc" placeholder="请选择开课周次"/> -->
|
</p>
|
||||||
<!-- </a-form-item> -->
|
<p>
|
||||||
</a-col>
|
2.听课记录表:是方便行政人员和非该课程所属学科的教师听课使用的评价表,主要用来反映课堂教学的整体情况。
|
||||||
</a-row>
|
</p>
|
||||||
</a-form>
|
<p>
|
||||||
</a-card>
|
3.同行评价表:是专门为该课程方面的专家/教师听课研制的评价表,更能反映该课堂的教学质量。
|
||||||
</a-spin>
|
</p>
|
||||||
|
</a-card>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref, reactive, defineExpose, nextTick, defineProps, computed, onMounted, watch } from 'vue';
|
import { ref, defineExpose } from 'vue';
|
||||||
import { defHttp } from '/@/utils/http/axios';
|
|
||||||
import { useMessage } from '/@/hooks/web/useMessage';
|
|
||||||
// import JCheckbox from "/@/components/Form/src/jeecg/components/JCheckbox.vue";
|
|
||||||
import { getValueType } from '/@/utils';
|
|
||||||
import { Form } from 'ant-design-vue';
|
|
||||||
|
|
||||||
import { getUserId } from '/@/views/site/utils/index';
|
let ktId = ref('');
|
||||||
|
|
||||||
const formRef = ref();
|
|
||||||
const useForm = Form.useForm;
|
|
||||||
const emit = defineEmits(['register', 'ok']);
|
|
||||||
const formData = reactive<Record<string, any>>({
|
|
||||||
userid: '',
|
|
||||||
kqtx: '',
|
|
||||||
mrkctx: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
const { createMessage } = useMessage();
|
|
||||||
const labelCol = ref<any>({ xs: { span: 24 }, sm: { span: 5 } });
|
|
||||||
const wrapperCol = ref<any>({ xs: { span: 24 }, sm: { span: 16 } });
|
|
||||||
const confirmLoading = ref<boolean>(false);
|
|
||||||
//表单验证
|
|
||||||
const validatorRules = {
|
|
||||||
};
|
|
||||||
const { resetFields, validate, validateInfos } = useForm(formData, validatorRules, { immediate: true });
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 新增
|
|
||||||
*/
|
|
||||||
function add() {
|
|
||||||
edit({});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 编辑
|
* 编辑
|
||||||
*/
|
*/
|
||||||
function edit( record ) {
|
function view( ...data ) {
|
||||||
nextTick(() => {
|
let record = data[0]??{};
|
||||||
resetFields();
|
ktId.value = record.ketangbiaoid
|
||||||
//查询数据
|
|
||||||
let recordData = {};
|
|
||||||
let params = { userid: getUserId(), pageSize: 1 };//没有ID,用list查吧,,
|
|
||||||
defHttp.get({ url: '/kcKechengtixingdingyue/kcKechengtixingdingyue/list', params }).then(res => {
|
|
||||||
recordData = ((res?.records) ?? [])[0]
|
|
||||||
// recordData = {} //DEBUG
|
|
||||||
Object.assign(formData, recordData);
|
|
||||||
})
|
|
||||||
//赋值
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 提交数据
|
|
||||||
*/
|
|
||||||
async function submitForm() {
|
|
||||||
// 触发表单验证
|
|
||||||
await validate();
|
|
||||||
confirmLoading.value = true;
|
|
||||||
const isUpdate = ref<boolean>(false);
|
|
||||||
//时间格式化
|
|
||||||
// let model = Object.assign({},formData);
|
|
||||||
let model = formData;
|
|
||||||
|
|
||||||
if (model.userid) {
|
|
||||||
isUpdate.value = true;
|
|
||||||
}
|
|
||||||
//循环数据
|
|
||||||
for (let data in model) {
|
|
||||||
//如果该数据是数组并且是字符串类型
|
|
||||||
if (model[data] instanceof Array) {
|
|
||||||
let valueType = getValueType(formRef.value.getProps, data);
|
|
||||||
//如果是字符串类型的需要变成以逗号分割的字符串
|
|
||||||
if (valueType === 'string') {
|
|
||||||
model[data] = model[data].join(',');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
model.kqtx = model.kqtx || 0;
|
|
||||||
model.mrkctx = model.mrkctx || 0;
|
|
||||||
let url = '';
|
|
||||||
if(isUpdate.value){
|
|
||||||
url = '/kcKechengtixingdingyue/kcKechengtixingdingyue/edit';
|
|
||||||
}else{
|
|
||||||
url = '/kcKechengtixingdingyue/kcKechengtixingdingyue/add';
|
|
||||||
//新增补充用户ID
|
|
||||||
model.userid = getUserId();
|
|
||||||
}
|
|
||||||
|
|
||||||
await defHttp.post({ url: url, params: model }, { isTransformResponse: false }).then((res) => {
|
|
||||||
if (res.success) {
|
|
||||||
createMessage.success(res.message);
|
|
||||||
emit('ok');
|
|
||||||
} else {
|
|
||||||
createMessage.warning(res.message);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
confirmLoading.value = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
add,
|
view,
|
||||||
edit,
|
|
||||||
submitForm,
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|
@ -147,4 +53,7 @@
|
||||||
overflow-y: auto;
|
overflow-y: auto;
|
||||||
padding: 24px 24px 24px 24px;
|
padding: 24px 24px 24px 24px;
|
||||||
}
|
}
|
||||||
|
.p15 {
|
||||||
|
padding: 15px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
||||||
|
|
@ -25,21 +25,11 @@
|
||||||
/**
|
/**
|
||||||
* 新增
|
* 新增
|
||||||
*/
|
*/
|
||||||
function add() {
|
function view(...data) {
|
||||||
visible.value = true;
|
visible.value = true;
|
||||||
|
disableSubmit.value = true;
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
registerForm.value.add();
|
registerForm.value.view(...data);
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 编辑
|
|
||||||
* @param record
|
|
||||||
*/
|
|
||||||
function edit(record) {
|
|
||||||
visible.value = true;
|
|
||||||
nextTick(() => {
|
|
||||||
registerForm.value.edit(record);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -65,8 +55,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
add,
|
view,
|
||||||
edit,
|
|
||||||
disableSubmit,
|
disableSubmit,
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,154 @@
|
||||||
|
<template>
|
||||||
|
<a-spin :spinning="confirmLoading">
|
||||||
|
<a-card>
|
||||||
|
<a-table :data-source="list" :pagination="false" bordered size="middle" :row-class-name="(_record, index) => (index % 2 === 1 ? 'table-striped' : null)" class="ant-table-striped">
|
||||||
|
<a-table-column title="题号" key="index" data-index="index">
|
||||||
|
<template #default="{ index }">
|
||||||
|
{{ index + 1 }}
|
||||||
|
</template>
|
||||||
|
</a-table-column>
|
||||||
|
<a-table-column title="问题" key="content" data-index="content"/>
|
||||||
|
<a-table-column title="选项" key="list" data-index="list">
|
||||||
|
<template #default="{ text: ansList, record }">
|
||||||
|
<template v-if="record.quetype != 3">
|
||||||
|
<div v-for="(ans,ansIndex) in ansList" :key="ansIndex">{{ ans.content }}</div>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="record.quetype ==3">
|
||||||
|
-
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
|
</a-table-column>
|
||||||
|
<a-table-column title="评价" key="seleckedList" data-index="seleckedList">
|
||||||
|
<template #default="{ text: seleckedList,record }">
|
||||||
|
<div v-for="(selecked,seleckedIndex) in seleckedList" :key="seleckedIndex">
|
||||||
|
<template v-if="record.quetype != 3">
|
||||||
|
{{ getAns(selecked)?.content }}
|
||||||
|
</template>
|
||||||
|
<template v-else-if="record.quetype = 3">
|
||||||
|
{{ selecked.textanscontent }}
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</a-table-column>
|
||||||
|
<a-table-column title="赋分" key="score" data-index="score">
|
||||||
|
<template #default="{ record }">
|
||||||
|
<template v-if="record.quetype != 3">
|
||||||
|
{{ calcSum(record.seleckedList,'score') }}
|
||||||
|
</template>
|
||||||
|
<!-- <div v-for="(selecked,seleckedIndex) in record.seleckedList" :key="seleckedIndex">{{ getAns(selecked).score }}</div> -->
|
||||||
|
</template>
|
||||||
|
</a-table-column>
|
||||||
|
</a-table>
|
||||||
|
</a-card>
|
||||||
|
</a-spin>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, watch, onMounted } from 'vue';
|
||||||
|
import headerPage from '/@/views/site/common/header.vue';
|
||||||
|
import footerPage from '/@/views/site/common/footer.vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getUserId } from '/@/views/site/utils';
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
queryResData = '/qa/kcEvaluation/queryByParam',
|
||||||
|
que = '//qa/kcEvaluationque/list',
|
||||||
|
ans = '/qa/kcEvaluationans/list',
|
||||||
|
}
|
||||||
|
|
||||||
|
const form = ref<any>({});
|
||||||
|
const list = ref<any>([]);
|
||||||
|
const ansvMap = ref<any>({});
|
||||||
|
const selectedMap = ref<any>({});
|
||||||
|
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
function view(record){
|
||||||
|
console.log(route.query);
|
||||||
|
|
||||||
|
let params = { pageSize: -1, status: 0 }
|
||||||
|
//回答记录
|
||||||
|
let queryData = defHttp.get({ url: Api.queryResData, params: { userid: record.userid, minkcid: record.ketangbiaoid, evaluationver: record.evaluationver} });
|
||||||
|
//题目
|
||||||
|
let queryQue = defHttp.get({ url: Api.que, params: { ...params, evaluationver: record.evaluationver } });
|
||||||
|
//答案列表
|
||||||
|
let queryAns = defHttp.get({ url: Api.ans, params });
|
||||||
|
Promise.all([queryData,queryQue,queryAns]).then(([resData, resQue, resAns]) => {
|
||||||
|
console.log('resData =>',resData);
|
||||||
|
|
||||||
|
let dataList = resData?.ansList ?? [];
|
||||||
|
let queList = resQue?.records;
|
||||||
|
let ansList = resAns?.records;
|
||||||
|
let queMap = {},ansMap = {}, dataMap = {};
|
||||||
|
dataList.forEach(x => {
|
||||||
|
let list = dataMap[x.queid];
|
||||||
|
if(!list){
|
||||||
|
list = [];
|
||||||
|
dataMap[x.queid] = list;
|
||||||
|
}
|
||||||
|
list.push(x);
|
||||||
|
})
|
||||||
|
queList.forEach(x => {
|
||||||
|
x.seleckedList = [];
|
||||||
|
queMap[x.id] = x;
|
||||||
|
|
||||||
|
x.seleckedList = dataMap[x.id];
|
||||||
|
selectedMap.value[x.id] = '';
|
||||||
|
});
|
||||||
|
ansList.forEach(x => {
|
||||||
|
let data = queMap[x.queid];
|
||||||
|
ansMap[x.id] = x;
|
||||||
|
if(data){
|
||||||
|
let list = data.list;
|
||||||
|
if(!list){
|
||||||
|
list = [];
|
||||||
|
queMap[x.queid].list = list;
|
||||||
|
}
|
||||||
|
|
||||||
|
list.push(x);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
list.value = queList;
|
||||||
|
ansvMap.value = ansMap;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAns(selecked){
|
||||||
|
if(!selecked || !ansvMap.value) return {};
|
||||||
|
return ansvMap.value[selecked.ansid]??{};
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcSum(list,key) {
|
||||||
|
let sum = 0;
|
||||||
|
list.forEach(x => {
|
||||||
|
let num = getAns(x)[key];
|
||||||
|
if(num){
|
||||||
|
sum += Number(num);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
view,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
.antd-modal-form {
|
||||||
|
// min-height: 500px !important;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 24px 24px 24px 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-table-striped :deep(.table-striped) td {
|
||||||
|
background-color: #fafafa;
|
||||||
|
}
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
@ -0,0 +1,87 @@
|
||||||
|
<template>
|
||||||
|
<div class="renKeJiaoChengBase">
|
||||||
|
<a-modal :width="width" :visible="visible" @ok="handleOk" :okButtonProps="{ class: { 'jee-hidden': disableSubmit } }" @cancel="handleCancel" :getContainer="getPDom" cancelText="关闭">
|
||||||
|
<template #title>
|
||||||
|
<div style="text-align: center;">{{ form.kcmc }}-{{ form.skjs }}-星期{{ form.WEEK }}-{{ form.hh }}节</div>
|
||||||
|
</template>
|
||||||
|
<KcKetangbiaoForm ref="registerForm" @ok="submitCallback" :formDisabled="disableSubmit" :formBpm="false"/>
|
||||||
|
</a-modal>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, nextTick, defineExpose } from 'vue';
|
||||||
|
import KcKetangbiaoForm from './viewForm.vue'
|
||||||
|
|
||||||
|
const width = ref<number>(1200);
|
||||||
|
const visible = ref<boolean>(false);
|
||||||
|
const disableSubmit = ref<boolean>(false);
|
||||||
|
const registerForm = ref();
|
||||||
|
const form = ref();
|
||||||
|
|
||||||
|
function getPDom() {
|
||||||
|
return document.querySelector('.renKeJiaoChengBase')
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增
|
||||||
|
*/
|
||||||
|
function view(record) {
|
||||||
|
visible.value = true;
|
||||||
|
disableSubmit.value = true;
|
||||||
|
form.value = record;
|
||||||
|
nextTick(() => {
|
||||||
|
registerForm.value.view(record);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确定按钮点击事件
|
||||||
|
*/
|
||||||
|
function handleOk() {
|
||||||
|
registerForm.value.submitForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* form保存回调事件
|
||||||
|
*/
|
||||||
|
function submitCallback() {
|
||||||
|
handleCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 取消按钮回调事件
|
||||||
|
*/
|
||||||
|
function handleCancel() {
|
||||||
|
visible.value = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
defineExpose({
|
||||||
|
view,
|
||||||
|
disableSubmit,
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="less" scoped>
|
||||||
|
/**隐藏样式-modal确定按钮 */
|
||||||
|
|
||||||
|
// .renKeJiaoChengBaseModal :deep(.ant-modal-content) {
|
||||||
|
// text-align: center;
|
||||||
|
// background: red;
|
||||||
|
// }
|
||||||
|
.renKeJiaoChengBase {
|
||||||
|
.jee-hidden {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
// background: orange;
|
||||||
|
|
||||||
|
:deep(.ant-modal-content) {
|
||||||
|
// background: green;
|
||||||
|
.ant-modal-footer {
|
||||||
|
text-align: center;
|
||||||
|
// background: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
@ -10,8 +10,9 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #description>
|
<template #description>
|
||||||
<span v-if="item.score" style="color: #337ab7;">已评分:{{ item.score }}分</span>
|
<!-- -{{ item }}- -->
|
||||||
<span v-else style="color: #337ab7;"><FormOutlined/>填写评价</span>
|
<span v-if="item.score" style="color: #337ab7;" @click="viewModal.view(item)">已评分:{{ item.score }}分</span>
|
||||||
|
<span v-else style="color: #337ab7;" @click="tingKeZuJiAddModal.view(item)"><FormOutlined/>填写评价</span>
|
||||||
</template>
|
</template>
|
||||||
<template #avatar>
|
<template #avatar>
|
||||||
<div class="wenZiJuZhong">
|
<div class="wenZiJuZhong">
|
||||||
|
|
@ -24,18 +25,24 @@
|
||||||
</a-list-item>
|
</a-list-item>
|
||||||
</template>
|
</template>
|
||||||
</a-list>
|
</a-list>
|
||||||
|
<addModalPage ref="tingKeZuJiAddModal"/>
|
||||||
|
<viewModalPage ref="viewModal"/>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted } from 'vue';
|
import { ref, onMounted } from 'vue';
|
||||||
import { TeamOutlined, FormOutlined } from '@ant-design/icons-vue';
|
import { TeamOutlined, FormOutlined } from '@ant-design/icons-vue';
|
||||||
import { getUserId } from '/@/views/site/utils/index';
|
import { getUserId } from '/@/views/site/utils/index';
|
||||||
|
|
||||||
|
import addModalPage from '/@/views/site/tingKeZuJi/components/addModal.vue';
|
||||||
|
import viewModalPage from '/@/views/site/tingKeZuJi/components/viewModal.vue';
|
||||||
import { defHttp } from '/@/utils/http/axios';
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
enum Api {
|
enum Api {
|
||||||
list = '/kcTingke/kcTingke/findTingKeZuJiBytingketimeAndUserId'
|
list = '/kcTingke/kcTingke/findTingKeZuJiBytingketimeAndUserId'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const tingKeZuJiAddModal = ref();
|
||||||
|
const viewModal = ref();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 列表接口
|
* 列表接口
|
||||||
* @param params
|
* @param params
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,290 @@
|
||||||
|
<template>
|
||||||
|
<div id="siteMain">
|
||||||
|
<div id="maxSite">
|
||||||
|
<a-layout>
|
||||||
|
<!-- 页头 -->
|
||||||
|
<headerPage/>
|
||||||
|
<!-- 主体部分 -->
|
||||||
|
<a-layout-content>
|
||||||
|
<a-card>
|
||||||
|
<template #title>
|
||||||
|
<div style="text-align: center; font-size: 24px;font-weight: bold;">
|
||||||
|
<!-- 听课足迹{{ $route.query.ktId }}-{{ $route.query.type }} -->
|
||||||
|
<span v-if="$route.query.type == '4'">东北师范大学本科课堂教学质量评价表(同行专家用)</span>
|
||||||
|
<span v-else-if="$route.query.type == '3'">东北师范大学听课记录表</span>
|
||||||
|
<span v-else-if="$route.query.type == '2'">线上教学课堂看课、听课评价表</span>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center; font-size: 16px;font-weight: bold;font-weight: 400;line-height: 1;color: #777;">
|
||||||
|
<!-- 学院名,课程名,授课教师 -->
|
||||||
|
{{ form.kcmc }}-{{ form.kkdw }}-{{ form.skjs }}
|
||||||
|
<!-- kcmc,kkdw,skjs -->
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="text-align: center;font-size: 1rem;font-weight: 700;margin: 1rem;">
|
||||||
|
<span v-if="$route.query.type == '4'">该评价表是专门为该课程方面的专家/教师听课研制的评价表,更能反映该课堂的教学质量。</span>
|
||||||
|
<span v-else-if="$route.query.type == '3'">东北师范大学听课记录表</span>
|
||||||
|
<span v-else-if="$route.query.type == '2'">线上教学课堂看课、听课评价表</span>
|
||||||
|
</div>
|
||||||
|
<div style="padding: 0 15rem;font-weight: 700;">
|
||||||
|
<a-row :gutter="[16,16]">
|
||||||
|
<a-col :span="24" v-for="(item,index) in list" :key="index">
|
||||||
|
<template v-if="item.isrequire != 0"><span style="color:red;">*</span></template>
|
||||||
|
{{ index + 1 }}.{{ item.content }}
|
||||||
|
<a-row>
|
||||||
|
<template v-if="item.quetype == 3">
|
||||||
|
<a-col :span="24">
|
||||||
|
<a-textarea v-model:value="selectedMap[item.id]"></a-textarea>
|
||||||
|
</a-col>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.quetype == 1">
|
||||||
|
<a-radio-group v-model:value="selectedMap[item.id]">
|
||||||
|
<a-col :span="24" v-for="(ans,ansIndex) in item.list" :key="ansIndex">
|
||||||
|
<a-radio :value="ans.id">
|
||||||
|
({{ ansIndex + 1 }}){{ ans.content }}
|
||||||
|
</a-radio>
|
||||||
|
</a-col>
|
||||||
|
</a-radio-group>
|
||||||
|
</template>
|
||||||
|
<template v-else-if="item.quetype == 2">
|
||||||
|
<a-checkbox-group v-model:value="selectedMap[item.id]">
|
||||||
|
<a-col :span="24" v-for="(ans,ansIndex) in item.list" :key="ansIndex">
|
||||||
|
<a-checkbox :value="ans.id">
|
||||||
|
({{ ansIndex + 1 }}){{ ans.content }}
|
||||||
|
</a-checkbox>
|
||||||
|
</a-col>
|
||||||
|
</a-checkbox-group>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<!-- <a-col :span="24" v-for="(ans,ansIndex) in item.list" :key="ansIndex">
|
||||||
|
<template v-if="item.quetype == 1">
|
||||||
|
单选
|
||||||
|
</template>
|
||||||
|
<template v-if="item.quetype == 2">
|
||||||
|
多选
|
||||||
|
</template>
|
||||||
|
({{ ansIndex + 1 }}){{ ans.content }}
|
||||||
|
</a-col> -->
|
||||||
|
</a-row>
|
||||||
|
</a-col>
|
||||||
|
</a-row>
|
||||||
|
</div>
|
||||||
|
<div style="text-align: center;padding-top: 1rem;">
|
||||||
|
<a-button type="primary" @click="save" :loading="confirmLoading">提交</a-button>
|
||||||
|
</div>
|
||||||
|
<!-- <div>
|
||||||
|
{{ selectedMap }}
|
||||||
|
</div> -->
|
||||||
|
<!--<div style="border:#777;">
|
||||||
|
{{ list }}
|
||||||
|
</div> -->
|
||||||
|
</a-card>
|
||||||
|
</a-layout-content>
|
||||||
|
<!-- 页尾 -->
|
||||||
|
<footerPage/>
|
||||||
|
</a-layout>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, reactive, watch, onMounted } from 'vue';
|
||||||
|
import headerPage from '/@/views/site/common/header.vue';
|
||||||
|
import footerPage from '/@/views/site/common/footer.vue';
|
||||||
|
import { defHttp } from '/@/utils/http/axios';
|
||||||
|
import { useRoute } from 'vue-router'
|
||||||
|
import { useMessage } from '/@/hooks/web/useMessage';
|
||||||
|
import { getUserId } from '/@/views/site/utils';
|
||||||
|
// const queryParam = ref<any>({ startDate: '2023-02-19', endDate: '2023-02-19', pj: '' });
|
||||||
|
|
||||||
|
enum Api {
|
||||||
|
queryById = '/ktgl/kcKetangbiao/queryById',
|
||||||
|
que = '//qa/kcEvaluationque/list',
|
||||||
|
ans = '/qa/kcEvaluationans/list',
|
||||||
|
save = '/qa/kcEvaluation/addQaAll',
|
||||||
|
}
|
||||||
|
|
||||||
|
const form = ref<any>({});
|
||||||
|
const list = ref<any>([]);
|
||||||
|
const selectedMap = ref<any>({});
|
||||||
|
|
||||||
|
const confirmLoading = ref<boolean>(false);
|
||||||
|
const { createMessage } = useMessage();
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
onMounted(() => {
|
||||||
|
console.log(route.query );
|
||||||
|
let params = { pageSize: -1, status: 0 }
|
||||||
|
let queryQue = defHttp.get({ url: Api.que, params: { ...params, evaluationver: route.query.type } });
|
||||||
|
let queryAns = defHttp.get({ url: Api.ans, params });
|
||||||
|
|
||||||
|
Promise.all([queryQue,queryAns]).then(([resQue, resAns]) => {
|
||||||
|
let queList = resQue?.records;
|
||||||
|
let ansList = resAns?.records;
|
||||||
|
let queMap = {}
|
||||||
|
queList.forEach(x => {
|
||||||
|
// x.list = [];
|
||||||
|
queMap[x.id] = x;
|
||||||
|
selectedMap.value[x.id] = '';
|
||||||
|
});
|
||||||
|
ansList.forEach(x => {
|
||||||
|
let data = queMap[x.queid];
|
||||||
|
if(data){
|
||||||
|
let list = data.list;
|
||||||
|
if(!list){
|
||||||
|
list = [];
|
||||||
|
queMap[x.queid].list = list;
|
||||||
|
}
|
||||||
|
list.push(x);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
list.value = queList;
|
||||||
|
});
|
||||||
|
defHttp.get({ url: Api.queryById, params: { id: route.query.ktId } }).then(res => {
|
||||||
|
form.value = res;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function genAns(x,data,isArray): Array<Object> {
|
||||||
|
let textanscontent,ansid,queid,upuserid,ketangbiaoid;
|
||||||
|
if(isArray){
|
||||||
|
let rList = Array<Object>();
|
||||||
|
data.forEach(x2 => {
|
||||||
|
rList.push(...genAns(x,x2,false))
|
||||||
|
})
|
||||||
|
return rList;
|
||||||
|
}else{
|
||||||
|
queid = x.id;
|
||||||
|
ansid = data;
|
||||||
|
if(x.quetype == 3){
|
||||||
|
textanscontent = data;
|
||||||
|
ansid = 0;
|
||||||
|
}
|
||||||
|
upuserid = getUserId();
|
||||||
|
ketangbiaoid = route.query.ktId;
|
||||||
|
return [{ textanscontent,ansid,queid,upuserid,ketangbiaoid }];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function save() {
|
||||||
|
confirmLoading.value = true;
|
||||||
|
console.log('selectedMap ->',selectedMap);
|
||||||
|
let $selectedMap = Object.assign({},selectedMap.value);
|
||||||
|
let formData = {
|
||||||
|
evaluationver: route.query.type,
|
||||||
|
upuserid: getUserId(),
|
||||||
|
minkcid: route.query.ktId,
|
||||||
|
ansList: Array<Object>()
|
||||||
|
};
|
||||||
|
//验证
|
||||||
|
let errorMsg = '';
|
||||||
|
list.value.forEach(x => {
|
||||||
|
if(x.isrequire != 0){
|
||||||
|
let data = $selectedMap[x.id];
|
||||||
|
if(data){
|
||||||
|
if(Array.isArray(data)){
|
||||||
|
if(!data.length){
|
||||||
|
errorMsg = '有必填选项未填写,请检查后重新提交。';
|
||||||
|
}else{
|
||||||
|
formData.ansList.push(...genAns(x,data,true))
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
formData.ansList.push(...genAns(x,data,false))
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
errorMsg = '有必填选项未填写,请检查后重新提交。'+x.id+'-'+x.content + data;
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
//非必填收集数据
|
||||||
|
let data = $selectedMap[x.id];
|
||||||
|
if(data){
|
||||||
|
if(Array.isArray(data)){
|
||||||
|
if(data.length){
|
||||||
|
formData.ansList.push(...genAns(x,data,true))
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
formData.ansList.push(...genAns(x,data,false))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
if(errorMsg){
|
||||||
|
confirmLoading.value = false
|
||||||
|
createMessage.warning(errorMsg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
console.log('formData =>',formData);
|
||||||
|
//保存
|
||||||
|
defHttp.post({ url: Api.save, params: formData }, { isTransformResponse: false })
|
||||||
|
.then((res) => {
|
||||||
|
if (res.success) {
|
||||||
|
createMessage.success(res.message);
|
||||||
|
// emit('ok');
|
||||||
|
} else {
|
||||||
|
createMessage.warning(res.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
confirmLoading.value = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// setTimeout(() => {
|
||||||
|
// confirmLoading.value = false
|
||||||
|
// },5000)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
||||||
|
<style lang="less" scoped>
|
||||||
|
#siteMain {
|
||||||
|
// font-size: ;
|
||||||
|
// height: 100%;
|
||||||
|
background: #f3f3f4;
|
||||||
|
#maxSite {
|
||||||
|
//最大宽度
|
||||||
|
max-width: 1170px;
|
||||||
|
//居中
|
||||||
|
margin: 0 auto;
|
||||||
|
.rowGutter{
|
||||||
|
margin-top: 1rem;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ant-layout-header {
|
||||||
|
color: #fff;
|
||||||
|
background: #1ab394;
|
||||||
|
}
|
||||||
|
.ant-layout-footer {
|
||||||
|
line-height: 1.5;
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
.ant-layout-sider {
|
||||||
|
color: #fff;
|
||||||
|
line-height: 120px;
|
||||||
|
background: #3ba0e9;
|
||||||
|
}
|
||||||
|
.ant-layout-content {
|
||||||
|
min-height: 120px;
|
||||||
|
color: #000;
|
||||||
|
line-height: 120px;
|
||||||
|
background: #f3f3f4;
|
||||||
|
}
|
||||||
|
.dictBox :deep(.ant-select) {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
/**暗黑模式特殊配色*/
|
||||||
|
[data-theme='dark'] #siteMain #maxSite {
|
||||||
|
.ant-layout-header, .ant-layout-footer {
|
||||||
|
background: #6aa0c7;
|
||||||
|
}
|
||||||
|
.ant-layout-content {
|
||||||
|
background: #107bcb;
|
||||||
|
}
|
||||||
|
.ant-layout-sider {
|
||||||
|
background: #3499ec;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
Loading…
Reference in New Issue