增加量表权限发布一次可作答一次
This commit is contained in:
parent
b08a3a2ee2
commit
b549cacc04
|
|
@ -36,6 +36,7 @@ import com.ddnai.system.domain.psychology.vo.UserAssessmentSummaryVO;
|
|||
import com.ddnai.system.service.psychology.IPsyAssessmentService;
|
||||
import com.ddnai.system.service.psychology.IPsyAssessmentAnswerService;
|
||||
import com.ddnai.system.service.psychology.IPsyScaleItemService;
|
||||
import com.ddnai.system.service.psychology.IPsyScalePermissionService;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
|
|
@ -59,6 +60,9 @@ public class PsyAssessmentController extends BaseController
|
|||
@Autowired
|
||||
private com.ddnai.system.service.psychology.IPsyAssessmentReportService reportService;
|
||||
|
||||
@Autowired
|
||||
private IPsyScalePermissionService permissionService;
|
||||
|
||||
/**
|
||||
* 获取测评列表
|
||||
*/
|
||||
|
|
@ -209,11 +213,24 @@ public class PsyAssessmentController extends BaseController
|
|||
// 检查是否已存在该用户对该量表的测评记录
|
||||
if (assessmentUserId != null && startVO.getScaleId() != null)
|
||||
{
|
||||
Integer currentPublishNo = null;
|
||||
try {
|
||||
currentPublishNo = permissionService.selectCurrentPublishNoForUserScale(assessmentUserId, startVO.getScaleId());
|
||||
} catch (Exception ignored) {}
|
||||
if (currentPublishNo == null) {
|
||||
currentPublishNo = 1;
|
||||
}
|
||||
|
||||
// 使用不过滤的查询方法,获取所有测评记录
|
||||
List<PsyAssessment> existingList = assessmentService.selectAssessmentByUserAndScale(assessmentUserId, startVO.getScaleId());
|
||||
|
||||
for (PsyAssessment existing : existingList)
|
||||
{
|
||||
Integer existingPublishNo = existing.getPublishNo() != null ? existing.getPublishNo() : 1;
|
||||
if (!existingPublishNo.equals(currentPublishNo)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 检查是否已完成(状态为1),如果已完成则不允许再次测评
|
||||
if ("1".equals(existing.getStatus()))
|
||||
{
|
||||
|
|
@ -239,6 +256,13 @@ public class PsyAssessmentController extends BaseController
|
|||
// 初始状态为"已暂停",等用户真正进入答题页面后再改为"进行中"
|
||||
PsyAssessment assessment = new PsyAssessment();
|
||||
assessment.setScaleId(startVO.getScaleId());
|
||||
Integer publishNo = null;
|
||||
try {
|
||||
if (assessmentUserId != null && startVO.getScaleId() != null) {
|
||||
publishNo = permissionService.selectCurrentPublishNoForUserScale(assessmentUserId, startVO.getScaleId());
|
||||
}
|
||||
} catch (Exception ignored) {}
|
||||
assessment.setPublishNo(publishNo != null ? publishNo : 1);
|
||||
assessment.setAssesseeName(startVO.getAssesseeName());
|
||||
assessment.setAssesseeGender(startVO.getAssesseeGender());
|
||||
assessment.setAssesseeAge(startVO.getAssesseeAge());
|
||||
|
|
|
|||
|
|
@ -824,7 +824,20 @@ public class PsyAssessmentReportController extends BaseController
|
|||
ReportExportVO exportVO = new ReportExportVO();
|
||||
exportVO.setReportId(r.getReportId());
|
||||
exportVO.setAssessmentId(r.getAssessmentId());
|
||||
exportVO.setReportTitle(r.getReportTitle());
|
||||
String title = r.getReportTitle();
|
||||
Integer attemptNo = null;
|
||||
try {
|
||||
attemptNo = calcAttemptNoByAssessmentId(r.getAssessmentId());
|
||||
} catch (Exception ignored) {}
|
||||
if (attemptNo != null && attemptNo > 0)
|
||||
{
|
||||
if (title == null)
|
||||
{
|
||||
title = "";
|
||||
}
|
||||
title = title + "(次数" + attemptNo + ")";
|
||||
}
|
||||
exportVO.setReportTitle(title);
|
||||
exportVO.setReportType(r.getReportType());
|
||||
exportVO.setSummary(r.getSummary());
|
||||
exportVO.setIsGenerated(r.getIsGenerated());
|
||||
|
|
@ -864,6 +877,53 @@ public class PsyAssessmentReportController extends BaseController
|
|||
exportReportListAsPdf(exportList, response, fileName);
|
||||
}
|
||||
|
||||
private Integer calcAttemptNoByAssessmentId(Long assessmentId)
|
||||
{
|
||||
if (assessmentId == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
PsyAssessment assessment = assessmentService.selectAssessmentById(assessmentId);
|
||||
if (assessment == null || assessment.getUserId() == null || assessment.getScaleId() == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
List<PsyAssessment> list = assessmentService.selectAssessmentByUserAndScale(assessment.getUserId(), assessment.getScaleId());
|
||||
if (list == null || list.isEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
java.util.List<PsyAssessment> completed = new java.util.ArrayList<>();
|
||||
for (PsyAssessment a : list)
|
||||
{
|
||||
if (a != null && "1".equals(a.getStatus()))
|
||||
{
|
||||
completed.add(a);
|
||||
}
|
||||
}
|
||||
if (completed.isEmpty())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
completed.sort((a, b) -> {
|
||||
if (a.getSubmitTime() == null && b.getSubmitTime() == null) return 0;
|
||||
if (a.getSubmitTime() == null) return 1;
|
||||
if (b.getSubmitTime() == null) return -1;
|
||||
return a.getSubmitTime().compareTo(b.getSubmitTime());
|
||||
});
|
||||
|
||||
int idx = 1;
|
||||
for (PsyAssessment a : completed)
|
||||
{
|
||||
if (a.getAssessmentId() != null && a.getAssessmentId().equals(assessmentId))
|
||||
{
|
||||
return idx;
|
||||
}
|
||||
idx++;
|
||||
}
|
||||
return completed.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用 PDFBox 将报告导出为简单的文本 PDF
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ import com.ddnai.system.domain.psychology.PsyQuestionnaireAnswerDetail;
|
|||
import com.ddnai.system.service.psychology.IPsyQuestionnaireService;
|
||||
import com.ddnai.system.service.psychology.IPsyQuestionnaireItemService;
|
||||
import com.ddnai.system.service.psychology.IPsyQuestionnaireAnswerService;
|
||||
import com.ddnai.system.service.psychology.IPsyScalePermissionService;
|
||||
import com.ddnai.system.service.ISysUserService;
|
||||
|
||||
/**
|
||||
|
|
@ -59,6 +60,9 @@ public class PsyQuestionnaireAnswerController extends BaseController
|
|||
@Autowired
|
||||
private ISysUserService userService;
|
||||
|
||||
@Autowired
|
||||
private IPsyScalePermissionService permissionService;
|
||||
|
||||
/**
|
||||
* 获取问卷答题列表
|
||||
*/
|
||||
|
|
@ -97,9 +101,18 @@ public class PsyQuestionnaireAnswerController extends BaseController
|
|||
System.out.println("questionnaireId: " + questionnaireId + ", userId: " + userId);
|
||||
System.out.println("========================================");
|
||||
|
||||
Integer currentPublishNo = null;
|
||||
try {
|
||||
currentPublishNo = permissionService.selectCurrentPublishNoForUserScale(userId, -questionnaireId);
|
||||
} catch (Exception ignored) {}
|
||||
if (currentPublishNo == null) {
|
||||
currentPublishNo = 1;
|
||||
}
|
||||
|
||||
// 检查用户是否已完成该问卷
|
||||
PsyQuestionnaireAnswer query = new PsyQuestionnaireAnswer();
|
||||
query.setQuestionnaireId(questionnaireId);
|
||||
query.setPublishNo(currentPublishNo);
|
||||
query.setUserId(userId);
|
||||
List<PsyQuestionnaireAnswer> existingList = answerService.selectAnswerList(query);
|
||||
|
||||
|
|
@ -120,6 +133,7 @@ public class PsyQuestionnaireAnswerController extends BaseController
|
|||
// 没有已完成或进行中的记录,创建新的答题记录
|
||||
PsyQuestionnaireAnswer answer = new PsyQuestionnaireAnswer();
|
||||
answer.setQuestionnaireId(questionnaireId);
|
||||
answer.setPublishNo(currentPublishNo);
|
||||
answer.setUserId(userId);
|
||||
answer.setRespondentName(respondentName);
|
||||
answer.setStatus("0"); // 进行中
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ public class PsyAssessment extends BaseEntity
|
|||
/** 量表ID */
|
||||
private Long scaleId;
|
||||
|
||||
private Integer publishNo;
|
||||
|
||||
/** 量表名称(关联查询字段,不存储在表中) */
|
||||
private String scaleName;
|
||||
|
||||
|
|
@ -102,6 +104,16 @@ public class PsyAssessment extends BaseEntity
|
|||
this.scaleId = scaleId;
|
||||
}
|
||||
|
||||
public Integer getPublishNo()
|
||||
{
|
||||
return publishNo;
|
||||
}
|
||||
|
||||
public void setPublishNo(Integer publishNo)
|
||||
{
|
||||
this.publishNo = publishNo;
|
||||
}
|
||||
|
||||
public String getScaleName()
|
||||
{
|
||||
return scaleName;
|
||||
|
|
@ -297,6 +309,7 @@ public class PsyAssessment extends BaseEntity
|
|||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||
.append("assessmentId", getAssessmentId())
|
||||
.append("scaleId", getScaleId())
|
||||
.append("publishNo", getPublishNo())
|
||||
.append("userId", getUserId())
|
||||
.append("assesseeName", getAssesseeName())
|
||||
.append("assesseeGender", getAssesseeGender())
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@ public class PsyQuestionnaireAnswer extends BaseEntity
|
|||
/** 问卷ID */
|
||||
private Long questionnaireId;
|
||||
|
||||
private Integer publishNo;
|
||||
|
||||
/** 用户ID */
|
||||
private Long userId;
|
||||
|
||||
|
|
@ -67,6 +69,16 @@ public class PsyQuestionnaireAnswer extends BaseEntity
|
|||
this.questionnaireId = questionnaireId;
|
||||
}
|
||||
|
||||
public Integer getPublishNo()
|
||||
{
|
||||
return publishNo;
|
||||
}
|
||||
|
||||
public void setPublishNo(Integer publishNo)
|
||||
{
|
||||
this.publishNo = publishNo;
|
||||
}
|
||||
|
||||
public Long getUserId()
|
||||
{
|
||||
return userId;
|
||||
|
|
@ -152,6 +164,7 @@ public class PsyQuestionnaireAnswer extends BaseEntity
|
|||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||
.append("answerId", getAnswerId())
|
||||
.append("questionnaireId", getQuestionnaireId())
|
||||
.append("publishNo", getPublishNo())
|
||||
.append("userId", getUserId())
|
||||
.append("respondentName", getRespondentName())
|
||||
.append("startTime", getStartTime())
|
||||
|
|
|
|||
|
|
@ -40,6 +40,8 @@ public class PsyScalePermission extends BaseEntity
|
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||
private java.util.Date endTime;
|
||||
|
||||
private Integer publishNo;
|
||||
|
||||
/** 状态(0有效 1无效) */
|
||||
private String status;
|
||||
|
||||
|
|
@ -138,6 +140,16 @@ public class PsyScalePermission extends BaseEntity
|
|||
this.endTime = endTime;
|
||||
}
|
||||
|
||||
public Integer getPublishNo()
|
||||
{
|
||||
return publishNo;
|
||||
}
|
||||
|
||||
public void setPublishNo(Integer publishNo)
|
||||
{
|
||||
this.publishNo = publishNo;
|
||||
}
|
||||
|
||||
public String getStatus()
|
||||
{
|
||||
return status;
|
||||
|
|
@ -209,6 +221,7 @@ public class PsyScalePermission extends BaseEntity
|
|||
.append("className", getClassName())
|
||||
.append("startTime", getStartTime())
|
||||
.append("endTime", getEndTime())
|
||||
.append("publishNo", getPublishNo())
|
||||
.append("status", getStatus())
|
||||
.append("createBy", getCreateBy())
|
||||
.append("createTime", getCreateTime())
|
||||
|
|
@ -220,4 +233,3 @@ public class PsyScalePermission extends BaseEntity
|
|||
.toString();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -92,6 +92,12 @@ public interface PsyScalePermissionMapper
|
|||
*/
|
||||
public int deletePermissionByScaleId(Long scaleId);
|
||||
|
||||
public Integer selectMaxPublishNo(PsyScalePermission permission);
|
||||
|
||||
public int invalidatePermissionByScope(PsyScalePermission permission);
|
||||
|
||||
public Integer selectCurrentPublishNoForUserScale(@Param("userId") Long userId, @Param("scaleId") Long scaleId);
|
||||
|
||||
/**
|
||||
* 查询所有已配置权限的量表ID
|
||||
*
|
||||
|
|
|
|||
|
|
@ -88,6 +88,12 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
|
|||
return count > 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Integer selectCurrentPublishNoForUserScale(Long userId, Long scaleId)
|
||||
{
|
||||
return permissionMapper.selectCurrentPublishNoForUserScale(userId, scaleId);
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增量表权限
|
||||
*
|
||||
|
|
@ -104,37 +110,11 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
|
|||
permission.setStatus("0");
|
||||
}
|
||||
|
||||
// 检查是否已存在相同的权限记录(避免重复)
|
||||
PsyScalePermission query = new PsyScalePermission();
|
||||
query.setScaleId(permission.getScaleId());
|
||||
query.setUserId(permission.getUserId());
|
||||
query.setRoleId(permission.getRoleId());
|
||||
query.setDeptId(permission.getDeptId());
|
||||
query.setClassName(permission.getClassName());
|
||||
query.setStatus("0"); // 只检查有效状态的权限
|
||||
|
||||
List<PsyScalePermission> existing = permissionMapper.selectPermissionList(query);
|
||||
if (existing != null && !existing.isEmpty())
|
||||
{
|
||||
// 检查是否有完全相同的权限记录(除了时间范围)
|
||||
boolean hasDuplicate = existing.stream().anyMatch(p -> {
|
||||
boolean sameUser = (p.getUserId() == null && permission.getUserId() == null)
|
||||
|| (p.getUserId() != null && p.getUserId().equals(permission.getUserId()));
|
||||
boolean sameRole = (p.getRoleId() == null && permission.getRoleId() == null)
|
||||
|| (p.getRoleId() != null && p.getRoleId().equals(permission.getRoleId()));
|
||||
boolean sameDept = (p.getDeptId() == null && permission.getDeptId() == null)
|
||||
|| (p.getDeptId() != null && p.getDeptId().equals(permission.getDeptId()));
|
||||
boolean sameClass = (p.getClassName() == null && permission.getClassName() == null)
|
||||
|| (p.getClassName() != null && p.getClassName().equals(permission.getClassName()));
|
||||
return sameUser && sameRole && sameDept && sameClass;
|
||||
});
|
||||
|
||||
if (hasDuplicate)
|
||||
{
|
||||
throw new RuntimeException("该权限已存在,请勿重复添加");
|
||||
}
|
||||
}
|
||||
Integer maxPublishNo = permissionMapper.selectMaxPublishNo(permission);
|
||||
int nextPublishNo = (maxPublishNo == null ? 0 : maxPublishNo) + 1;
|
||||
permission.setPublishNo(nextPublishNo);
|
||||
|
||||
permissionMapper.invalidatePermissionByScope(permission);
|
||||
return permissionMapper.insertPermission(permission);
|
||||
}
|
||||
|
||||
|
|
@ -203,23 +183,41 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
|
|||
throw new IllegalArgumentException("用户ID不能为空");
|
||||
}
|
||||
|
||||
// 先删除该用户的所有现有权限
|
||||
try {
|
||||
permissionMapper.deletePermissionByUserId(userId);
|
||||
} catch (Exception e) {
|
||||
log.error("删除用户现有权限失败,userId: {}", userId, e);
|
||||
throw new RuntimeException("删除用户现有权限失败: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()), e);
|
||||
String username = SecurityUtils.getUsername();
|
||||
if (username == null || username.isEmpty()) {
|
||||
username = "system";
|
||||
}
|
||||
|
||||
java.util.Set<Long> newScaleSet = new java.util.HashSet<>();
|
||||
if (scaleIds != null) {
|
||||
for (Long scaleId : scaleIds) {
|
||||
if (scaleId != null) {
|
||||
newScaleSet.add(scaleId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
PsyScalePermission activeQuery = new PsyScalePermission();
|
||||
activeQuery.setUserId(userId);
|
||||
activeQuery.setStatus("0");
|
||||
List<PsyScalePermission> activeList = permissionMapper.selectPermissionList(activeQuery);
|
||||
if (activeList != null) {
|
||||
for (PsyScalePermission p : activeList) {
|
||||
if (p != null && p.getScaleId() != null && !newScaleSet.contains(p.getScaleId())) {
|
||||
p.setStatus("1");
|
||||
p.setUpdateBy(username);
|
||||
try {
|
||||
permissionMapper.updatePermission(p);
|
||||
} catch (Exception e) {
|
||||
log.warn("作废权限失败,permissionId: {}", p.getPermissionId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 批量插入新权限
|
||||
int count = 0;
|
||||
if (scaleIds != null && scaleIds.length > 0)
|
||||
{
|
||||
String username = SecurityUtils.getUsername();
|
||||
if (username == null || username.isEmpty()) {
|
||||
username = "system"; // 如果获取不到用户名,使用默认值
|
||||
}
|
||||
|
||||
for (Long scaleId : scaleIds)
|
||||
{
|
||||
if (scaleId == null) {
|
||||
|
|
@ -240,7 +238,7 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
|
|||
permission.setStatus("0");
|
||||
permission.setCreateBy(username);
|
||||
|
||||
int insertResult = permissionMapper.insertPermission(permission);
|
||||
int insertResult = insertPermission(permission);
|
||||
if (insertResult > 0) {
|
||||
count++;
|
||||
} else {
|
||||
|
|
@ -248,7 +246,6 @@ public class PsyScalePermissionServiceImpl implements IPsyScalePermissionService
|
|||
}
|
||||
} catch (Exception e) {
|
||||
log.error("处理量表权限失败,userId: {}, scaleId: {}", userId, scaleId, e);
|
||||
// 继续处理下一个,不中断整个流程
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,8 @@ public interface IPsyScalePermissionService
|
|||
*/
|
||||
public boolean checkUserScalePermission(Long userId, Long scaleId);
|
||||
|
||||
public Integer selectCurrentPublishNoForUserScale(Long userId, Long scaleId);
|
||||
|
||||
/**
|
||||
* 新增量表权限
|
||||
*
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<resultMap type="com.ddnai.system.domain.psychology.PsyAssessment" id="PsyAssessmentResult">
|
||||
<result property="assessmentId" column="assessment_id" />
|
||||
<result property="scaleId" column="scale_id" />
|
||||
<result property="publishNo" column="publish_no" />
|
||||
<result property="scaleName" column="scale_name" />
|
||||
<result property="userId" column="user_id" />
|
||||
<result property="assesseeName" column="assessee_name" />
|
||||
|
|
@ -34,7 +35,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</resultMap>
|
||||
|
||||
<sql id="selectAssessmentVo">
|
||||
select a.assessment_id, a.scale_id, s.scale_name, a.user_id,
|
||||
select a.assessment_id, a.scale_id, a.publish_no, s.scale_name, a.user_id,
|
||||
COALESCE(u.nick_name, a.assessee_name) as assessee_name,
|
||||
a.assessee_gender, a.assessee_age,
|
||||
a.assessee_id_card, a.assessee_phone, a.assessee_email, a.start_time, a.pause_time,
|
||||
|
|
@ -112,6 +113,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<insert id="insertAssessment" parameterType="com.ddnai.system.domain.psychology.PsyAssessment" useGeneratedKeys="true" keyProperty="assessmentId">
|
||||
insert into psy_assessment (
|
||||
<if test="scaleId != null">scale_id, </if>
|
||||
<if test="publishNo != null">publish_no, </if>
|
||||
<if test="userId != null">user_id, </if>
|
||||
<if test="assesseeName != null and assesseeName != ''">assessee_name, </if>
|
||||
<if test="assesseeGender != null">assessee_gender, </if>
|
||||
|
|
@ -128,6 +130,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
create_time
|
||||
)values(
|
||||
<if test="scaleId != null">#{scaleId}, </if>
|
||||
<if test="publishNo != null">#{publishNo}, </if>
|
||||
<if test="userId != null">#{userId}, </if>
|
||||
<if test="assesseeName != null and assesseeName != ''">#{assesseeName}, </if>
|
||||
<if test="assesseeGender != null">#{assesseeGender}, </if>
|
||||
|
|
@ -380,10 +383,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
|
||||
<!-- 查询用户已完成的量表ID列表 -->
|
||||
<select id="selectCompletedScaleIdsByUserId" parameterType="Long" resultType="java.lang.Long">
|
||||
select distinct scale_id
|
||||
from psy_assessment
|
||||
where user_id = #{userId}
|
||||
and status = '1'
|
||||
select distinct a.scale_id
|
||||
from psy_assessment a
|
||||
where a.user_id = #{userId}
|
||||
and a.status = '1'
|
||||
and ifnull(a.publish_no, 1) = (
|
||||
select ifnull(max(coalesce(p.publish_no, 1)), 1)
|
||||
from psy_scale_permission p
|
||||
where p.scale_id = a.scale_id
|
||||
and p.status = '0'
|
||||
and (
|
||||
(p.user_id = #{userId})
|
||||
or (p.role_id is not null and p.role_id in (
|
||||
select role_id from sys_user_role where user_id = #{userId}
|
||||
))
|
||||
or (p.dept_id is not null and p.dept_id in (
|
||||
select dept_id from sys_user where user_id = #{userId}
|
||||
))
|
||||
or (p.user_id is null and p.role_id is null and p.dept_id is null)
|
||||
)
|
||||
and (p.start_time is null or p.start_time <= now())
|
||||
and (p.end_time is null or p.end_time >= now())
|
||||
)
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<resultMap type="com.ddnai.system.domain.psychology.PsyQuestionnaireAnswer" id="PsyQuestionnaireAnswerResult">
|
||||
<result property="answerId" column="answer_id" />
|
||||
<result property="questionnaireId" column="questionnaire_id" />
|
||||
<result property="publishNo" column="publish_no" />
|
||||
<result property="userId" column="user_id" />
|
||||
<result property="respondentName" column="respondent_name" />
|
||||
<result property="startTime" column="start_time" />
|
||||
|
|
@ -22,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</resultMap>
|
||||
|
||||
<sql id="selectAnswerVo">
|
||||
select answer_id, questionnaire_id, user_id, respondent_name, start_time, submit_time,
|
||||
select answer_id, questionnaire_id, publish_no, user_id, respondent_name, start_time, submit_time,
|
||||
total_score, is_pass, `rank`, `status`, create_by, create_time, update_by, update_time
|
||||
from psy_questionnaire_answer
|
||||
</sql>
|
||||
|
|
@ -36,6 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<include refid="selectAnswerVo"/>
|
||||
<where>
|
||||
<if test="questionnaireId != null"> and questionnaire_id = #{questionnaireId}</if>
|
||||
<if test="publishNo != null"> and publish_no = #{publishNo}</if>
|
||||
<if test="userId != null"> and user_id = #{userId}</if>
|
||||
<if test="status != null and status != ''"> and `status` = #{status}</if>
|
||||
</where>
|
||||
|
|
@ -45,6 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<insert id="insertAnswer" parameterType="com.ddnai.system.domain.psychology.PsyQuestionnaireAnswer" useGeneratedKeys="true" keyProperty="answerId">
|
||||
insert into psy_questionnaire_answer (
|
||||
<if test="questionnaireId != null">questionnaire_id, </if>
|
||||
<if test="publishNo != null">publish_no, </if>
|
||||
<if test="userId != null">user_id, </if>
|
||||
<if test="respondentName != null and respondentName != ''">respondent_name, </if>
|
||||
<if test="startTime != null">start_time, </if>
|
||||
|
|
@ -53,6 +56,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
create_time
|
||||
)values(
|
||||
<if test="questionnaireId != null">#{questionnaireId}, </if>
|
||||
<if test="publishNo != null">#{publishNo}, </if>
|
||||
<if test="userId != null">#{userId}, </if>
|
||||
<if test="respondentName != null and respondentName != ''">#{respondentName}, </if>
|
||||
<if test="startTime != null">#{startTime}, </if>
|
||||
|
|
@ -85,10 +89,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
|
||||
<!-- 查询用户已完成的问卷ID列表 -->
|
||||
<select id="selectCompletedQuestionnaireIdsByUserId" parameterType="Long" resultType="java.lang.Long">
|
||||
select distinct questionnaire_id
|
||||
from psy_questionnaire_answer
|
||||
where user_id = #{userId}
|
||||
and status = '1'
|
||||
select distinct a.questionnaire_id
|
||||
from psy_questionnaire_answer a
|
||||
where a.user_id = #{userId}
|
||||
and a.status = '1'
|
||||
and ifnull(a.publish_no, 1) = (
|
||||
select ifnull(max(coalesce(p.publish_no, 1)), 1)
|
||||
from psy_scale_permission p
|
||||
where p.scale_id = -a.questionnaire_id
|
||||
and p.status = '0'
|
||||
and (
|
||||
(p.user_id = #{userId})
|
||||
or (p.role_id is not null and p.role_id in (
|
||||
select role_id from sys_user_role where user_id = #{userId}
|
||||
))
|
||||
or (p.dept_id is not null and p.dept_id in (
|
||||
select dept_id from sys_user where user_id = #{userId}
|
||||
))
|
||||
or (p.user_id is null and p.role_id is null and p.dept_id is null)
|
||||
)
|
||||
and (p.start_time is null or p.start_time <= now())
|
||||
and (p.end_time is null or p.end_time >= now())
|
||||
)
|
||||
</select>
|
||||
|
||||
</mapper>
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<result property="className" column="class_name" />
|
||||
<result property="startTime" column="start_time" />
|
||||
<result property="endTime" column="end_time" />
|
||||
<result property="publishNo" column="publish_no" />
|
||||
<result property="status" column="status" />
|
||||
<result property="createBy" column="create_by" />
|
||||
<result property="createTime" column="create_time" />
|
||||
|
|
@ -28,7 +29,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
|
||||
<sql id="selectPermissionVo">
|
||||
select p.permission_id, p.scale_id, p.dept_id, p.role_id, p.user_id, p.class_name,
|
||||
p.start_time, p.end_time, p.status, p.create_by, p.create_time, p.update_by, p.update_time, p.remark,
|
||||
p.start_time, p.end_time, p.publish_no, p.status, p.create_by, p.create_time, p.update_by, p.update_time, p.remark,
|
||||
case when p.scale_id < 0 then q.questionnaire_name else s.scale_name end as scale_name,
|
||||
case when p.scale_id < 0 then 'questionnaire' else 'scale' end as source_type,
|
||||
d.dept_name, r.role_name, u.user_name
|
||||
|
|
@ -123,6 +124,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="className != null and className != ''">class_name, </if>
|
||||
<if test="startTime != null">start_time, </if>
|
||||
<if test="endTime != null">end_time, </if>
|
||||
<if test="publishNo != null">publish_no, </if>
|
||||
<if test="status != null and status != ''">status, </if>
|
||||
<if test="remark != null">remark,</if>
|
||||
<if test="createBy != null and createBy != ''">create_by,</if>
|
||||
|
|
@ -135,6 +137,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="className != null and className != ''">#{className}, </if>
|
||||
<if test="startTime != null">#{startTime}, </if>
|
||||
<if test="endTime != null">#{endTime}, </if>
|
||||
<if test="publishNo != null">#{publishNo}, </if>
|
||||
<if test="status != null and status != ''">#{status}, </if>
|
||||
<if test="remark != null">#{remark},</if>
|
||||
<if test="createBy != null and createBy != ''">#{createBy},</if>
|
||||
|
|
@ -152,6 +155,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<if test="className != null and className != ''">class_name = #{className}, </if>
|
||||
<if test="startTime != null">start_time = #{startTime}, </if>
|
||||
<if test="endTime != null">end_time = #{endTime}, </if>
|
||||
<if test="publishNo != null">publish_no = #{publishNo}, </if>
|
||||
<if test="status != null and status != ''">status = #{status}, </if>
|
||||
<if test="remark != null">remark = #{remark}, </if>
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
|
|
@ -160,6 +164,76 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
where permission_id = #{permissionId}
|
||||
</update>
|
||||
|
||||
<select id="selectMaxPublishNo" parameterType="com.ddnai.system.domain.psychology.PsyScalePermission" resultType="java.lang.Integer">
|
||||
select ifnull(max(coalesce(publish_no, 1)), 0)
|
||||
from psy_scale_permission
|
||||
<where>
|
||||
<if test="scaleId != null"> and scale_id = #{scaleId}</if>
|
||||
<choose>
|
||||
<when test="deptId != null"> and dept_id = #{deptId}</when>
|
||||
<otherwise> and dept_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="roleId != null"> and role_id = #{roleId}</when>
|
||||
<otherwise> and role_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="userId != null"> and user_id = #{userId}</when>
|
||||
<otherwise> and user_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="className != null and className != ''"> and class_name = #{className}</when>
|
||||
<otherwise> and (class_name is null or class_name = '')</otherwise>
|
||||
</choose>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<update id="invalidatePermissionByScope" parameterType="com.ddnai.system.domain.psychology.PsyScalePermission">
|
||||
update psy_scale_permission
|
||||
set status = '1',
|
||||
<if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
|
||||
update_time = sysdate()
|
||||
<where>
|
||||
status = '0'
|
||||
<if test="scaleId != null"> and scale_id = #{scaleId}</if>
|
||||
<choose>
|
||||
<when test="deptId != null"> and dept_id = #{deptId}</when>
|
||||
<otherwise> and dept_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="roleId != null"> and role_id = #{roleId}</when>
|
||||
<otherwise> and role_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="userId != null"> and user_id = #{userId}</when>
|
||||
<otherwise> and user_id is null</otherwise>
|
||||
</choose>
|
||||
<choose>
|
||||
<when test="className != null and className != ''"> and class_name = #{className}</when>
|
||||
<otherwise> and (class_name is null or class_name = '')</otherwise>
|
||||
</choose>
|
||||
</where>
|
||||
</update>
|
||||
|
||||
<select id="selectCurrentPublishNoForUserScale" resultType="java.lang.Integer">
|
||||
select ifnull(max(coalesce(p.publish_no, 1)), 1)
|
||||
from psy_scale_permission p
|
||||
where p.scale_id = #{scaleId}
|
||||
and p.status = '0'
|
||||
and (
|
||||
(p.user_id = #{userId})
|
||||
or (p.role_id is not null and p.role_id in (
|
||||
select role_id from sys_user_role where user_id = #{userId}
|
||||
))
|
||||
or (p.dept_id is not null and p.dept_id in (
|
||||
select dept_id from sys_user where user_id = #{userId}
|
||||
))
|
||||
or (p.user_id is null and p.role_id is null and p.dept_id is null)
|
||||
)
|
||||
and (p.start_time is null or p.start_time <= now())
|
||||
and (p.end_time is null or p.end_time >= now())
|
||||
</select>
|
||||
|
||||
<delete id="deletePermissionById" parameterType="Long">
|
||||
delete from psy_scale_permission where permission_id = #{permissionId}
|
||||
</delete>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,31 @@
|
|||
-- 2025-12-22 add publish_no for per-release attempts
|
||||
|
||||
ALTER TABLE psy_scale_permission
|
||||
ADD COLUMN publish_no INT NULL;
|
||||
|
||||
UPDATE psy_scale_permission
|
||||
SET publish_no = 1
|
||||
WHERE publish_no IS NULL;
|
||||
|
||||
ALTER TABLE psy_assessment
|
||||
ADD COLUMN publish_no INT NULL;
|
||||
|
||||
UPDATE psy_assessment
|
||||
SET publish_no = 1
|
||||
WHERE publish_no IS NULL;
|
||||
|
||||
ALTER TABLE psy_questionnaire_answer
|
||||
ADD COLUMN publish_no INT NULL;
|
||||
|
||||
UPDATE psy_questionnaire_answer
|
||||
SET publish_no = 1
|
||||
WHERE publish_no IS NULL;
|
||||
|
||||
CREATE INDEX idx_psy_scale_permission_scope_publish
|
||||
ON psy_scale_permission (scale_id, user_id, role_id, dept_id, status, publish_no);
|
||||
|
||||
CREATE INDEX idx_psy_assessment_user_scale_publish
|
||||
ON psy_assessment (user_id, scale_id, publish_no, status);
|
||||
|
||||
CREATE INDEX idx_psy_questionnaire_answer_user_q_publish
|
||||
ON psy_questionnaire_answer (user_id, questionnaire_id, publish_no, status);
|
||||
Loading…
Reference in New Issue
Block a user