提交代码到GIT,修改了满意度调查的问卷

This commit is contained in:
zlwu committed 2025-07-18 09:53:34 +08:00
1 parent c809141195
commit 1c8e15cc0f
43 files changed
+3487 -1606

No files matched your search

@@ -0,0 +1,43 @@
# 代码调整记录 2025-07-01
## 基本信息
- 日期:2025-07-01 10:30:15
- 开发者:Cursor AI
- 类型:功能完善
## 调整内容
### 1. 完善满意度调查题目选项管理功能
#### 修改内容
- 完善了题目选项管理功能,实现了选项的批量管理(包括新增、修改、删除)
- 实现了题目选项的加载显示
- 优化了选项编辑界面的交互体验
#### 涉及文件
- `web/src/views/hq/satQuestion/index.vue`:完善了选项管理相关函数
- `web/src/api/hq/satOption/types.ts`:更新了选项数据类型定义,确保与后端字段匹配
#### 实现方式
由于后端没有直接提供批量操作API,采用了以下策略实现选项批量管理:
1. 加载选项:调用`listSatOption`加载已有选项数据
2. 更新选项:针对有ID的选项调用`updateSatOption`进行更新
3. 新增选项:针对没有ID的选项调用`addSatOption`进行新增
4. 删除选项:对比前后选项ID差异,对不再存在的选项调用`delSatOption`进行删除
#### 数据字段映射
处理了前后端字段命名差异问题:
- 前端编辑界面:`optionContent` → 后端API:`optionText`
- 前端编辑界面:`optionScore` → 后端API:`optionValue`
- 前端编辑界面:`optionOrder` → 后端API:`sortOrder`
## 测试信息
- 测试人员:开发自测
- 测试结果:功能正常,可以完成选项的批量管理
## 遗留问题
- 无
## 备注
- 本次实现方案没有使用事务处理,如果后续需要保证数据一致性,建议后端增加批量操作接口
- 如果选项数量较多,可考虑进一步优化批量操作的性能
@@ -0,0 +1,35 @@
# 满意度调查选项排序优化记录
## 变更时间: 2025-07-17 16:15:30
## 问题描述
满意度调查模块中,题目选项的显示顺序不是按照预期的排序字段(optionOrder)排序,而是默认按ID字段排序,导致选项显示顺序可能与设计不符。
## 变更内容
修改了选项查询逻辑中的排序规则:
- 将原来仅按ID字段(id)升序排序修改为:
1. 首先按选项排序字段(optionOrder)升序排序
2. 然后按ID字段(id)升序排序作为次要排序条件
这样保证了选项按照用户设定的顺序显示,同时保持排序的稳定性。
## 变更文件
1. `backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatOptionServiceImpl.java`
## 技术细节
修改了`buildQueryWrapper`方法中的排序语句:
```java
// 修改前
lqw.orderByAsc(HqSatOption::getId);
// 修改后
lqw.orderByAsc(HqSatOption::getOptionOrder).orderByAsc(HqSatOption::getId);
```
## 测试验证
- 通过接口`/hq/satQuestion/{questionId}/options`检查返回的选项列表,确认选项已按照optionOrder字段升序排列
- 验证相同optionOrder值的选项按照ID升序排列
## 变更人员
Cursor AI
@@ -0,0 +1,24 @@
# 满意度调查问题选项过滤修复记录
## 变更时间: 2025-07-17 15:30:45
## 问题描述
满意度调查模块中,在查看问题选项时,系统返回的是所有选项数据,而不是按问题ID(question_id)进行过滤。这导致每个问题显示了所有选项,混淆了用户理解。
## 变更内容
修改了后端API实现,确保根据问题ID过滤选项数据:
- 在`HqSatQuestionController`的`getQuestionOptions`方法中,使用`questionId`参数对选项数据进行过滤
- 移除了注释中的"选项针对所有单选题和多选题通用,不区分具体题目",因为选项应该是特定于每个问题的
## 变更文件
1. `backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/controller/HqSatQuestionController.java`
## 相关API文档
此次变更影响了`docs/开发文档/API/后勤满意度调查API.md`中的选项获取API,但无需修改文档内容,因为API路径和参数未变,只是实现逻辑变更。
## 测试验证
通过访问`/hq/satQuestion/{questionId}/options`接口,确认返回的选项数据已正确按问题ID过滤。
## 变更人员
Cursor AI
@@ -0,0 +1,46 @@
# 代码调整记录 2025-07-17
## 基本信息
- 日期:2025-07-17 15:10:45
- 开发者:Cursor AI
- 类型:功能增强
## 调整内容
### 1. 增加保存题目选项时自动计算并更新题目分值功能
#### 功能描述
在保存题目选项时,自动计算题目分值并更新到题目表中,计算规则如下:
1. 单选题的分值是题目选项中最大的分值
2. 多选题的分值是所有题目选项的分值之和
#### 修改内容
1. 在前端类型定义文件中添加题目分值字段:
- `SatQuestionVO` 和 `SatQuestionForm` 中增加 `score` 字段
2. 在`saveOptions`函数中添加计算和更新题目分值的逻辑:
- 根据题目类型判断计算方式
- 单选题:取所有选项中最大分值
- 多选题:取所有选项分值之和
- 调用`updateSatQuestion`接口更新题目分值
#### 涉及文件
- `web/src/api/hq/satQuestion/types.ts`
- `web/src/views/hq/satQuestion/index.vue`
#### 实现方式
1. 过滤有效选项(排除空内容选项)
2. 根据题目类型计算分值:
- 单选题:`Math.max(...validOptions.map(opt => Number(opt.optionScore) || 0))`
- 多选题:`validOptions.reduce((sum, opt) => sum + (Number(opt.optionScore) || 0), 0)`
3. 调用更新接口,仅更新题目ID和分值字段
## 测试信息
- 测试方式:创建/修改选项后检查题目分值是否正确更新
- 测试内容:
1. 单选题:确认分值为最大选项分值
2. 多选题:确认分值为所有选项分值之和
## 备注
- 此功能使题目分值能够实时反映选项的变化,方便后续在问卷中计算总分
- 数据库表`hq_sat_question`中已有`score`字段,无需额外更改数据库结构
@@ -0,0 +1,47 @@
# 变更管理记录:修复问卷题库查询接口的ID参数不生效问题
**日期**: 2025-07-17 15:30:45
**类型**: Bug修复
**开发人员**: Cursor
## 问题描述
问卷题库查询接口(`/hq/satQuestion/list`)在使用ID参数进行查询时,无论传递什么ID值都返回相同的结果。例如:
- 请求1: `http://localhost/dev-api/hq/satQuestion/list?pageSize=1&pageNum=1&id=1937751675921375243`
- 请求2: `http://localhost/dev-api/hq/satQuestion/list?pageSize=1&pageNum=1&id=1937751675921375248`
这两个请求返回相同的数据,这表明ID参数没有被正确应用到查询条件中。
## 原因分析
在`HqSatQuestionServiceImpl`类的`buildQueryWrapper`方法中,没有对`id`参数进行处理,导致无论传递什么ID值,都会忽略ID条件,返回相同的查询结果。
## 修改内容
在`HqSatQuestionServiceImpl`类的`buildQueryWrapper`方法中添加ID查询条件:
```java
private LambdaQueryWrapper<HqSatQuestion> buildQueryWrapper(HqSatQuestionBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<HqSatQuestion> lqw = Wrappers.lambdaQuery();
lqw.orderByAsc(HqSatQuestion::getId);
// 添加ID查询条件
lqw.eq(bo.getId() != null, HqSatQuestion::getId, bo.getId());
// ... 其他查询条件 ...
return lqw;
}
```
## 影响范围
- 涉及文件: `backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatQuestionServiceImpl.java`
- 影响接口: `/hq/satQuestion/list`
- 影响功能: 问卷题目查询功能,通过ID查询问卷题目
## 测试结果
修改后,通过不同ID参数调用接口可以正确返回对应ID的题目数据,或者在ID不存在时返回空列表。
## 注意事项
这个问题可能会影响到其他基于同样模式实现的查询接口,建议检查其他查询接口的实现,确保都正确处理了ID参数。
@@ -0,0 +1,57 @@
# 代码调整记录 2025-07-17
## 基本信息
- 日期:2025-07-17 14:20:30
- 开发者:Cursor AI
- 类型:Bug修复
## 调整内容
### 1. 修复满意度调查题目选项实体类与数据库表结构不匹配问题
#### 问题描述
数据库表 `hq_sat_option` 结构已更新,但Java实体类未同步调整,导致操作选项时出现SQL异常:
```
org.springframework.jdbc.BadSqlGrammarException: Unknown column 'option_text' in 'field list'
```
#### 修改内容
1. 更新了四个与选项相关的类,将属性名称修改为与数据库字段对应:
- `HqSatOption.java`(实体类)
- `HqSatOptionBo.java`(业务对象)
- `HqSatOptionVo.java`(值对象)
- `HqSatOptionServiceImpl.java`(Service实现类)
2. 字段映射调整:
- `optionText` → `optionContent`
- `optionValue` → `optionScore`
- `sortOrder` → `optionOrder`
- `deleted` 类型从 `Long` 改为 `String`
- 新增字段 `questionId`(题目ID)
- 新增字段 `isDefault`(是否默认选项)
- 移除 `remark` 字段
- 在VO类中增加了基础字段(createBy, createTime, updateBy, updateTime)以符合VO类规范
3. 类注释更新:
- 将 "评分选项" 更新为 "满意度调查题目选项",使表意更明确
4. Service实现类调整:
- 修改了`buildQueryWrapper`方法中的Lambda表达式,更新为使用新的字段名
- 添加了对新字段`questionId`和`isDefault`的查询条件支持
#### 涉及文件
- `/backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/domain/HqSatOption.java`
- `/backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/domain/bo/HqSatOptionBo.java`
- `/backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/domain/vo/HqSatOptionVo.java`
- `/backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatOptionServiceImpl.java`
#### 变更原因
根据项目规范要求,数据库表结构变更后,需要同步更新相关Java实体类。本次修改确保了Java代码与数据库表结构的一致性。
## 测试信息
- 测试方式:修复后重新尝试保存题目选项
- 测试结果:选项可以正常保存,SQL异常已解决
## 备注
- 数据库表`hq_sat_option`结构的变更来自于`docs/设计文档/database/hzdyjs_xg.sql`文件
- 遵循VO类基础字段规范,确保VO类包含统一的基础字段
@@ -0,0 +1,62 @@
# 代码调整记录 - 2025-07-17
## 基本信息
- **日期**:2025-07-17 16:30:45
- **操作人**:wuzilong
- **模块**:后勤满意度调查系统
- **功能点**:题目选项保存功能
- **调整类型**:功能修复
## 问题描述
在满意度调查系统的题目管理页面中,当通过"设置选项"弹窗保存选项数据时,如果用户快速连续点击保存按钮,会触发服务端的幂等性控制,导致出现"不允许重复提交,请稍候再试"的错误提示,影响用户体验。
## 修复内容
修改了 `web/src/views/hq/satQuestion/index.vue` 文件,为选项保存功能添加前端防重复提交机制:
1. 在 `optionDialog` 对象中添加 `saveLoading` 状态变量
2. 在 `saveOptions` 函数开始处添加状态检查,防止重复调用
3. 为保存按钮添加 `:loading="optionDialog.saveLoading"` 绑定,在处理中禁用按钮
4. 在请求完成后(无论成功或失败)重置 `saveLoading` 状态
## 技术说明
这是一个前端防重复提交的典型实现方式,具体流程如下:
```
1. 用户点击保存按钮 -> 检查saveLoading状态
2. 如果saveLoading为true,直接返回不执行任何操作
3. 如果saveLoading为false,设置为true并禁用按钮
4. 执行保存操作
5. 操作完成后(无论成功或失败)重置saveLoading为false
```
此修复与前一次选项排序更新显示功能的修复配合,提供了更完整的用户体验:
1. 防止重复提交错误
2. 保存操作加载状态可视化
3. 保存后立即显示更新的排序结果
## 测试方法
1. 进入后勤满意度调查系统 -> 题库管理
2. 选择一个单选或多选题,点击"设置选项"按钮
3. 修改选项内容或排序值
4. 快速连续多次点击"保存"按钮
5. 验证按钮是否显示loading状态,且不会出现重复提交错误
6. 验证数据保存成功后,排序值正确更新
## 相关日志
后端日志显示在修复前存在多个重复的PUT请求,导致幂等性控制触发:
```
2025-07-17 21:37:58 [XNIO-1 task-2] ERROR o.d.c.w.h.GlobalExceptionHandler
- 不允许重复提交,请稍候再试
2025-07-17 21:37:58 [XNIO-1 task-7] ERROR o.d.c.w.h.GlobalExceptionHandler
- 不允许重复提交,请稍候再试
```
## 相关API文档
该功能的API文档位于:`docs/开发文档/API/后勤满意度调查API.md`
@@ -0,0 +1,48 @@
# 代码调整记录 - 2025-07-17
## 基本信息
- **日期**:2025-07-17 15:45:26
- **操作人**:wuzilong
- **模块**:后勤满意度调查系统
- **功能点**:题目选项排序功能
- **调整类型**:功能修复
## 问题描述
在满意度调查系统的题目管理页面中,当通过"设置选项"弹窗修改选项的排序值并保存时,虽然系统提示保存成功,但排序值没有在界面上更新,需要关闭弹窗后重新打开才能看到最新的排序值。
## 修复内容
修改了 `web/src/views/hq/satQuestion/index.vue` 文件中的 `saveOptions` 函数,在保存选项数据后不再关闭弹窗,而是立即重新加载选项数据并更新界面显示,使用户可以立即看到排序值的变化。
具体修改:
1. 保存成功后不再自动关闭对话框
2. 保存成功后立即从服务器获取最新的选项数据
3. 根据 `optionOrder` 字段重新对选项进行排序显示
## 技术说明
原来的实现中,保存选项后会刷新题目列表(`getList()`),但直接关闭了选项弹窗,导致用户无法在当前操作中看到排序更新结果。
修改后的流程:
```
1. 用户修改排序值 -> 点击保存
2. 服务端保存数据成功
3. 重新从服务器获取该题目的最新选项数据
4. 按optionOrder字段排序
5. 更新弹窗中的选项列表数据
6. 用户可以看到排序结果,确认无误后手动关闭弹窗
```
## 测试方法
1. 进入后勤满意度调查系统 -> 题库管理
2. 选择一个单选或多选题,点击"设置选项"按钮
3. 修改任意选项的排序值
4. 点击"保存"按钮
5. 验证排序值是否立即在界面上更新
## 相关API文档
该功能的API文档位于:`docs/开发文档/API/后勤满意度调查API.md`
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,41 @@
-- 满意度调查问卷结束时间扫描任务SQL脚本
-- 创建日期: 2025-07-01
-- 功能说明: 用于支持满意度调查问卷结束时间扫描任务的数据库配置
-- 确认hq_sat_survey表中的字段结构
/*
表结构说明:
hq_sat_survey表需具备以下字段:
- id: 主键,雪花ID
- title: 问卷标题
- start_time: 开始时间,datetime类型
- end_time: 结束时间,datetime类型
- status: 状态,整数类型(0:草稿, 1:进行中, 2:已结束)
- tenant_id: 租户ID
- create_by: 创建者
- create_time: 创建时间
- update_by: 更新者
- update_time: 更新时间
- deleted: 逻辑删除标记(0:未删除, 1:已删除)
*/
-- 在snailjob任务调度系统中注册任务
-- 备注: 以下SQL仅为参考,实际操作通过snailjob管理界面完成
/*
INSERT INTO snail_job_instance (
id, app_name, namespace, job_name, job_handler, timeout_seconds, concurrent_type, cron_expression,
delay_seconds, last_execute_time, execute_times, next_trigger_time,
status, retry_count, retry_interval, tenant_id, remark
) VALUES (
NEXT VAL FOR sequence_name, 'ruoyi-job', 'default', '满意度调查结束时间扫描', 'surveyEndTimeJobExecutor', 60,
'SERIAL', '0 0/30 * * * ?', 0, NULL, 0, NULL, 1, 3, 10, '000000', '自动将过期问卷状态标记为已结束'
);
*/
-- 任务注册说明:
-- 定时策略: 每30分钟执行一次 (0 0/30 * * * ?)
-- 执行器: surveyEndTimeJobExecutor
-- 并发策略: 串行执行
-- 超时时间: 60秒
-- 重试次数: 3次
-- 重试间隔: 10秒
+20 -18
View File
@@ -785,6 +785,7 @@ CREATE TABLE `hq_sat_detail` (
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`record_id` bigint(20) NOT NULL COMMENT '答题记录ID',
`question_id` bigint(20) NOT NULL COMMENT '题目ID',
`option_id` bigint(20) NOT NULL COMMENT '题目选项ID',
`answer_score` int(11) DEFAULT '0' COMMENT '答案分数',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
@@ -836,33 +837,32 @@ COMMIT;
-- ----------------------------
DROP TABLE IF EXISTS `hq_sat_option`;
CREATE TABLE `hq_sat_option` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` varchar(20) NOT NULL COMMENT '租户编号',
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`id` bigint(20) NOT NULL COMMENT '选项ID',
`question_id` bigint(20) NOT NULL COMMENT '题目ID',
`option_content` varchar(255) NOT NULL COMMENT '选项内容',
`option_score` int(11) DEFAULT 0 COMMENT '选项分值',
`option_order` int(11) DEFAULT 0 COMMENT '选项排序',
`is_default` char(1) DEFAULT 'N' COMMENT '是否默认选项(Y是 N否)',
`tenant_id` varchar(20) NOT NULL DEFAULT '000000' COMMENT '租户编号',
`create_by` bigint(20) DEFAULT NULL COMMENT '创建者',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_by` bigint(20) DEFAULT NULL COMMENT '更新者',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`option_text` varchar(50) NOT NULL COMMENT '选项文本',
`option_value` int(11) NOT NULL COMMENT '选项分值',
`sort_order` int(11) DEFAULT '0' COMMENT '排序',
`status` char(1) DEFAULT '0' COMMENT '状态(0正常 1停用)',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
PRIMARY KEY (`id`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_status` (`status`),
KEY `idx_sort_order` (`sort_order`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='评分选项表';
`create_dept` bigint(20) DEFAULT NULL COMMENT '创建部门',
`deleted` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
PRIMARY KEY (`id`) USING BTREE,
INDEX `idx_question_id` (`question_id`) COMMENT '题目ID索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='满意度调查题目选项表';
-- ----------------------------
-- Records of hq_sat_option
-- ----------------------------
BEGIN;
INSERT INTO `hq_sat_option` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `option_text`, `option_value`, `sort_order`, `status`, `remark`) VALUES (1, '000000', NULL, NULL, '2025-06-24 18:30:17', NULL, NULL, 0, '非常满意', 5, 1, '0', NULL);
INSERT INTO `hq_sat_option` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `option_text`, `option_value`, `sort_order`, `status`, `remark`) VALUES (2, '000000', NULL, NULL, '2025-06-24 18:30:17', NULL, NULL, 0, '满意', 3, 2, '0', NULL);
INSERT INTO `hq_sat_option` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `option_text`, `option_value`, `sort_order`, `status`, `remark`) VALUES (3, '000000', NULL, NULL, '2025-06-24 18:30:17', NULL, NULL, 0, '一般', 1, 3, '0', NULL);
INSERT INTO `hq_sat_option` (`id`, `tenant_id`, `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`, `option_text`, `option_value`, `sort_order`, `status`, `remark`) VALUES (4, '000000', NULL, NULL, '2025-06-24 18:30:17', NULL, NULL, 0, '不满意', 0, 4, '0', NULL);
INSERT INTO `hq_sat_option` (`id`, `question_id`, `option_content`, `option_score`, `option_order`, `is_default`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1937810382736855041, 1937751489358733313, '非常满意', 5, 1, 'N', '000000', 1, '2025-06-25 17:50:18', 1, '2025-06-25 17:50:18', '0');
INSERT INTO `hq_sat_option` (`id`, `question_id`, `option_content`, `option_score`, `option_order`, `is_default`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1937810382736855042, 1937751489358733313, '满意', 4, 2, 'N', '000000', 1, '2025-06-25 17:50:18', 1, '2025-06-25 17:50:18', '0');
INSERT INTO `hq_sat_option` (`id`, `question_id`, `option_content`, `option_score`, `option_order`, `is_default`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1937810382736855043, 1937751489358733313, '一般', 3, 3, 'N', '000000', 1, '2025-06-25 17:50:18', 1, '2025-06-25 17:50:18', '0');
INSERT INTO `hq_sat_option` (`id`, `question_id`, `option_content`, `option_score`, `option_order`, `is_default`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1937810382736855044, 1937751489358733313, '不满意', 1, 4, 'N', '000000', 1, '2025-06-25 17:50:18', 1, '2025-06-25 17:50:18', '0');
INSERT INTO `hq_sat_option` (`id`, `question_id`, `option_content`, `option_score`, `option_order`, `is_default`, `tenant_id`, `create_by`, `create_time`, `update_by`, `update_time`, `deleted`) VALUES (1937810382736855045, 1937751489358733313, '非常不满意', 0, 5, 'N', '000000', 1, '2025-06-25 17:50:18', 1, '2025-06-25 17:50:18', '0');
COMMIT;
-- ----------------------------
@@ -880,6 +880,7 @@ CREATE TABLE `hq_sat_question` (
`deleted` tinyint(1) DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
`question_title` varchar(200) NOT NULL COMMENT '题目标题',
`question_content` text COMMENT '题目内容(支持富文本)',
`score` int(11) DEFAULT 0 COMMENT '题目分值',
`category_id` bigint(20) NOT NULL COMMENT '所属分类ID',
`question_type` char(1) DEFAULT '1' COMMENT '题目类型(1单选题 2多选题 3问答题)',
`is_required` tinyint(1) DEFAULT '1' COMMENT '是否必填(0否 1是)',
@@ -1011,6 +1012,7 @@ CREATE TABLE `hq_sat_survey` (
`target_group` varchar(100) NOT NULL COMMENT '目标群体(1学生 2教职工 3全体)',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`score` int(11) DEFAULT 0 COMMENT '问卷总分值',
`max_submit_times` int(11) DEFAULT '1' COMMENT '最大提交次数(0不限制)',
`is_anonymous` tinyint(1) DEFAULT '0' COMMENT '是否匿名(0否 1是)',
`is_published` tinyint(1) DEFAULT '0' COMMENT '是否发布(0否 1是)',