|
|
@@ -0,0 +1,405 @@
|
|
|
+/**
|
|
|
+ * 调查问卷管理页面 Mixin
|
|
|
+ * @fileoverview 提供调查问卷列表、新增、编辑、查看等功能的混入
|
|
|
+ */
|
|
|
+
|
|
|
+import {
|
|
|
+ getList,
|
|
|
+ add,
|
|
|
+ update,
|
|
|
+ getDetail
|
|
|
+} from '@/api/survey/survey'
|
|
|
+import {
|
|
|
+ SURVEY_STATUS_OPTIONS,
|
|
|
+ SURVEY_TEMPLATE_OPTIONS,
|
|
|
+ getSurveyStatusLabel,
|
|
|
+ getSurveyStatusType,
|
|
|
+ getSurveyTemplateLabel,
|
|
|
+ getSurveyTemplateType
|
|
|
+} from '@/constants/survey'
|
|
|
+
|
|
|
+/**
|
|
|
+ * 调查问卷管理mixin
|
|
|
+ * 提供问卷列表查询、新增、修改、查看等功能
|
|
|
+ */
|
|
|
+export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ // 表格数据
|
|
|
+ tableData: [],
|
|
|
+ loading: false,
|
|
|
+
|
|
|
+ // 分页信息
|
|
|
+ pagination: {
|
|
|
+ currentPage: 1,
|
|
|
+ pageSize: 20,
|
|
|
+ total: 0
|
|
|
+ },
|
|
|
+
|
|
|
+ // 搜索表单
|
|
|
+ searchForm: {
|
|
|
+ surveyCode: '',
|
|
|
+ title: '',
|
|
|
+ status: null,
|
|
|
+ isTemplate: null,
|
|
|
+ startTime: '',
|
|
|
+ endTime: ''
|
|
|
+ },
|
|
|
+
|
|
|
+ // 问卷表单
|
|
|
+ surveyForm: {
|
|
|
+ id: null,
|
|
|
+ surveyCode: '',
|
|
|
+ title: '',
|
|
|
+ description: '',
|
|
|
+ startTime: '',
|
|
|
+ endTime: '',
|
|
|
+ status: 0,
|
|
|
+ isTemplate: 0
|
|
|
+ },
|
|
|
+
|
|
|
+ // 对话框控制
|
|
|
+ dialogVisible: false,
|
|
|
+ dialogMode: 'add', // add, edit, view
|
|
|
+ submitLoading: false,
|
|
|
+
|
|
|
+ // 状态选项
|
|
|
+ statusOptions: [
|
|
|
+ { label: '草稿', value: 0 },
|
|
|
+ { label: '已发布', value: 1 },
|
|
|
+ { label: '已结束', value: 2 }
|
|
|
+ ],
|
|
|
+
|
|
|
+ // 模板选项
|
|
|
+ templateOptions: [
|
|
|
+ { label: '否', value: 0 },
|
|
|
+ { label: '是', value: 1 }
|
|
|
+ ],
|
|
|
+
|
|
|
+ // 表单验证规则
|
|
|
+ formRules: {
|
|
|
+ surveyCode: [
|
|
|
+ { required: true, message: '请输入问卷编码', trigger: 'blur' },
|
|
|
+ { min: 3, max: 50, message: '长度在 3 到 50 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ title: [
|
|
|
+ { required: true, message: '请输入问卷标题', trigger: 'blur' },
|
|
|
+ { min: 2, max: 100, message: '长度在 2 到 100 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ description: [
|
|
|
+ { required: true, message: '请输入问卷描述', trigger: 'blur' },
|
|
|
+ { min: 5, max: 500, message: '长度在 5 到 500 个字符', trigger: 'blur' }
|
|
|
+ ],
|
|
|
+ startTime: [
|
|
|
+ { required: true, message: '请选择开始时间', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ endTime: [
|
|
|
+ { required: true, message: '请选择结束时间', trigger: 'change' }
|
|
|
+ ],
|
|
|
+ status: [
|
|
|
+ { required: true, message: '请选择状态', trigger: 'change' }
|
|
|
+ ]
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ computed: {
|
|
|
+ /**
|
|
|
+ * 对话框标题
|
|
|
+ * @returns {string} 标题文本
|
|
|
+ */
|
|
|
+ dialogTitle() {
|
|
|
+ const titleMap = {
|
|
|
+ add: '新增调查问卷',
|
|
|
+ edit: '编辑调查问卷',
|
|
|
+ view: '查看调查问卷'
|
|
|
+ }
|
|
|
+ return titleMap[this.dialogMode] || '调查问卷'
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否为新增模式
|
|
|
+ * @returns {boolean} 是否新增模式
|
|
|
+ */
|
|
|
+ isAddMode() {
|
|
|
+ return this.dialogMode === 'add'
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否为编辑模式
|
|
|
+ * @returns {boolean} 是否编辑模式
|
|
|
+ */
|
|
|
+ isEditMode() {
|
|
|
+ return this.dialogMode === 'edit'
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 是否为查看模式
|
|
|
+ * @returns {boolean} 是否查看模式
|
|
|
+ */
|
|
|
+ isViewMode() {
|
|
|
+ return this.dialogMode === 'view'
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ mounted() {
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ methods: {
|
|
|
+ /**
|
|
|
+ * 加载表格数据
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async loadTableData() {
|
|
|
+ try {
|
|
|
+ this.loading = true
|
|
|
+ const response = await getList(
|
|
|
+ this.pagination.currentPage,
|
|
|
+ this.pagination.pageSize,
|
|
|
+ this.searchForm
|
|
|
+ )
|
|
|
+
|
|
|
+ if (response.data && response.data.success) {
|
|
|
+ const { records, total } = response.data.data
|
|
|
+ this.tableData = records || []
|
|
|
+ this.pagination.total = total || 0
|
|
|
+ } else {
|
|
|
+ this.$message.error('获取数据失败')
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('加载表格数据失败:', error)
|
|
|
+ this.$message.error('加载数据失败,请稍后重试')
|
|
|
+ } finally {
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 搜索处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleSearch() {
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置搜索
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleResetSearch() {
|
|
|
+ this.$refs.searchForm.resetFields()
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页大小变化
|
|
|
+ * @param {number} size - 新的分页大小
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleSizeChange(size) {
|
|
|
+ this.pagination.pageSize = size
|
|
|
+ this.pagination.currentPage = 1
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 当前页变化
|
|
|
+ * @param {number} page - 新的页码
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleCurrentChange(page) {
|
|
|
+ this.pagination.currentPage = page
|
|
|
+ this.loadTableData()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增问卷处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleAdd() {
|
|
|
+ this.resetForm()
|
|
|
+ this.dialogMode = 'add'
|
|
|
+ this.dialogVisible = true
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 编辑问卷处理
|
|
|
+ * @param {SurveyItem} row - 问卷数据
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async handleEdit(row) {
|
|
|
+ await this.loadSurveyDetail(row.id)
|
|
|
+ this.dialogMode = 'edit'
|
|
|
+ this.dialogVisible = true
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查看问卷处理
|
|
|
+ * @param {SurveyItem} row - 问卷数据
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async handleView(row) {
|
|
|
+ await this.loadSurveyDetail(row.id)
|
|
|
+ this.dialogMode = 'view'
|
|
|
+ this.dialogVisible = true
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 加载问卷详情
|
|
|
+ * @param {string|number} surveyId - 问卷ID
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async loadSurveyDetail(surveyId) {
|
|
|
+ try {
|
|
|
+ const response = await getDetail(surveyId)
|
|
|
+ if (response.data && response.data.success) {
|
|
|
+ const surveyData = response.data.data
|
|
|
+ this.setSurveyForm(surveyData)
|
|
|
+ } else {
|
|
|
+ this.$message.error('获取问卷详情失败')
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('加载问卷详情失败:', error)
|
|
|
+ this.$message.error('加载问卷详情失败,请稍后重试')
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 设置问卷表单数据
|
|
|
+ * @param {SurveyItem} data - 问卷数据
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ setSurveyForm(data) {
|
|
|
+ this.surveyForm = {
|
|
|
+ id: data.id,
|
|
|
+ surveyCode: data.surveyCode || '',
|
|
|
+ title: data.title || '',
|
|
|
+ description: data.description || '',
|
|
|
+ startTime: data.startTime || '',
|
|
|
+ endTime: data.endTime || '',
|
|
|
+ status: data.status || 0,
|
|
|
+ isTemplate: data.isTemplate || 0
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重置表单
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ resetForm() {
|
|
|
+ this.surveyForm = {
|
|
|
+ id: null,
|
|
|
+ surveyCode: '',
|
|
|
+ title: '',
|
|
|
+ description: '',
|
|
|
+ startTime: '',
|
|
|
+ endTime: '',
|
|
|
+ status: 0,
|
|
|
+ isTemplate: 0
|
|
|
+ }
|
|
|
+
|
|
|
+ if (this.$refs.surveyForm) {
|
|
|
+ this.$refs.surveyForm.clearValidate()
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 表单提交处理
|
|
|
+ * @returns {Promise<void>}
|
|
|
+ */
|
|
|
+ async handleSubmit() {
|
|
|
+ try {
|
|
|
+ // 表单验证
|
|
|
+ const isValid = await this.validateForm()
|
|
|
+ if (!isValid) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 时间验证
|
|
|
+ if (new Date(this.surveyForm.startTime) >= new Date(this.surveyForm.endTime)) {
|
|
|
+ this.$message.error('开始时间必须小于结束时间')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ this.submitLoading = true
|
|
|
+
|
|
|
+ if (this.isAddMode) {
|
|
|
+ await add(this.surveyForm)
|
|
|
+ this.$message.success('新增问卷成功')
|
|
|
+ } else if (this.isEditMode) {
|
|
|
+ await update(this.surveyForm)
|
|
|
+ this.$message.success('更新问卷成功')
|
|
|
+ }
|
|
|
+
|
|
|
+ this.dialogVisible = false
|
|
|
+ this.loadTableData()
|
|
|
+ } catch (error) {
|
|
|
+ console.error('提交问卷失败:', error)
|
|
|
+ this.$message.error('操作失败,请稍后重试')
|
|
|
+ } finally {
|
|
|
+ this.submitLoading = false
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 表单验证
|
|
|
+ * @returns {Promise<boolean>} 验证结果
|
|
|
+ */
|
|
|
+ async validateForm() {
|
|
|
+ try {
|
|
|
+ await this.$refs.surveyForm.validate()
|
|
|
+ return true
|
|
|
+ } catch (error) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 对话框关闭处理
|
|
|
+ * @returns {void}
|
|
|
+ */
|
|
|
+ handleDialogClose() {
|
|
|
+ this.resetForm()
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取状态标签
|
|
|
+ * @param {number} status - 状态值
|
|
|
+ * @returns {string} 状态标签
|
|
|
+ */
|
|
|
+ getStatusLabel(status) {
|
|
|
+ return getSurveyStatusLabel(status)
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取状态类型
|
|
|
+ * @param {number} status - 状态值
|
|
|
+ * @returns {string} 状态类型
|
|
|
+ */
|
|
|
+ getStatusType(status) {
|
|
|
+ return getSurveyStatusType(status)
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取模板标签
|
|
|
+ * @param {number} isTemplate - 模板值
|
|
|
+ * @returns {string} 模板标签
|
|
|
+ */
|
|
|
+ getTemplateLabel(isTemplate) {
|
|
|
+ return getSurveyTemplateLabel(isTemplate)
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取模板类型
|
|
|
+ * @param {number} isTemplate - 模板值
|
|
|
+ * @returns {string} 模板类型
|
|
|
+ */
|
|
|
+ getTemplateType(isTemplate) {
|
|
|
+ return getSurveyTemplateType(isTemplate)
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+}
|