@ -4,13 +4,21 @@ import cn.hutool.core.lang.UUID;
import cn.teammodel.common.ErrorCode ;
import cn.teammodel.common.PK ;
import cn.teammodel.config.exception.ServiceException ;
import cn.teammodel.dao.AppraiseRecordRepository ;
import cn.teammodel.dao.AppraiseRepository ;
import cn.teammodel.dao.SchoolRepository ;
import cn.teammodel.model.dto.Appraise.* ;
import cn.teammodel.model.entity.User ;
import cn.teammodel.model.entity.appraise.Appraise ;
import cn.teammodel.model.entity.appraise.AppraiseRecord ;
import cn.teammodel.model.entity.appraise.AppraiseRecordItem ;
import cn.teammodel.model.entity.appraise.AppraiseTreeNode ;
import cn.teammodel.model.entity.User ;
import cn.teammodel.model.entity. school.School ;
import cn.teammodel.security.utils.SecurityUtil ;
import cn.teammodel.service.EvaluationService ;
import cn.teammodel.utils.RepositoryUtil ;
import cn.teammodel.utils.SchoolDateUtil ;
import com.azure.cosmos.models.CosmosPatchOperations ;
import com.azure.spring.data.cosmos.core.CosmosTemplate ;
import org.apache.commons.lang3.ObjectUtils ;
import org.apache.commons.lang3.StringUtils ;
@ -18,8 +26,10 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service ;
import javax.annotation.Resource ;
import java.time.LocalDate ;
import java.time.LocalDateTime ;
import java.util.ArrayList ;
import java.util.Collections ;
import java.util.List ;
/ * *
@ -28,9 +38,18 @@ import java.util.List;
* /
@Service
public class EvaluationServiceImpl implements EvaluationService {
/ * *
* 评 价 记 录 对 象 的 类 型
* /
private final static String TARGET_STUDENT = "student" ;
private final static String TARGET_CLASS = "class" ;
@Resource
CosmosTemplate cosmosTemplate ;
@Resource
private SchoolRepository schoolRepository ;
@Resource
private AppraiseRecordRepository appraiseRecordRepository ;
@Resource
private AppraiseRepository appraiseRepository ;
/ * *
@ -98,6 +117,7 @@ public class EvaluationServiceImpl implements EvaluationService {
@Override
public Appraise insertNode ( InsertNodeDto insertNodeDto ) {
// todo: 如果不存在
Appraise appraise = findAppraise ( insertNodeDto . getPeriodId ( ) ) ;
User loginUser = SecurityUtil . getLoginUser ( ) ;
@ -168,19 +188,74 @@ public class EvaluationServiceImpl implements EvaluationService {
@Override
public void vote ( AppraiseVoteDto appraiseVoteDto ) {
String studentId = appraiseVoteDto . getStudentId ( ) ;
String targetId = appraiseVoteDto . getTargetId ( ) ;
boolean spread = appraiseVoteDto . isSpread ( ) ;
String targetType = appraiseVoteDto . getTargetType ( ) ;
String appraiseId = appraiseVoteDto . getAppraiseId ( ) ;
// 获取 school 中的 semesters
String periodId = appraiseVoteDto . getPeriodId ( ) ;
periodId = StringUtils . isEmpty ( periodId ) ? "default" : periodId ;
User loginUser = SecurityUtil . getLoginUser ( ) ;
List < AppraiseTreeNode > nodes = appraiseRepository . findNodeById ( loginUser . getSchoolId ( ) , periodId , PK . PK_APPRAISE , appraiseId ) ;
if ( ObjectUtils . isEmpty ( nodes ) | | nodes . size ( ) > 1 ) {
throw new ServiceException ( ErrorCode . PARAMS_ERROR . getCode ( ) , "找不到该评价项" ) ;
}
AppraiseTreeNode node = nodes . get ( 0 ) ;
String schoolId = loginUser . getSchoolId ( ) ;
// 组装 AppraiseRecord
List < AppraiseTreeNode > nodes = appraiseRepository . findNodeById ( PK . PK_APPRAISE , appraiseId ) ;
AppraiseTreeNode appraiseTreeNode = RepositoryUtil . findOne ( nodes ) ;
// 通过 periodId 获取 semesters
List < School . Period > periodById = schoolRepository . findPeriodById ( schoolId , periodId ) ;
School . Period period = RepositoryUtil . findOne ( periodById ) ;
List < School . Semester > semesters = period . getSemesters ( ) ;
// 获取当前学年学期组合 ID
String academicYearId = SchoolDateUtil . generateAcademicId ( semesters , LocalDate . now ( ) ) ;
// 查询是否存在记录,不存在则创建一条新的,存在则处理一下分值后再向其 nodes 中插入一条 item
AppraiseRecord record = appraiseRecordRepository . findAppraiseRecordByTargetIdAndAcademicYearIdAndCode (
targetId ,
academicYearId ,
String . format ( PK . PK_APPRAISE_RECORD , schoolId )
) ;
// 初始化新的评价节点
AppraiseRecordItem item = new AppraiseRecordItem ( ) ;
item . setId ( UUID . randomUUID ( ) . toString ( ) ) ;
item . setAppraiseNodeId ( appraiseId ) ;
item . setCreator ( loginUser . getName ( ) ) ;
item . setCreatorId ( loginUser . getId ( ) ) ;
item . setCreateTime ( LocalDateTime . now ( ) ) ;
if ( record = = null ) {
// 不存在, 创建新的 AppraiseRecord
List < AppraiseRecordItem > items = Collections . singletonList ( item ) ;
record = new AppraiseRecord ( ) ;
if ( targetType . equals ( TARGET_STUDENT ) ) {
record . setTargetType ( TARGET_STUDENT ) ;
} else if ( targetType . equals ( TARGET_CLASS ) ) {
record . setTargetType ( TARGET_CLASS ) ;
} else {
throw new ServiceException ( ErrorCode . PARAMS_ERROR . getCode ( ) , "不受支持的评价对象" ) ;
}
record . setTargetId ( targetId ) ;
record . setAcademicYearId ( academicYearId ) ;
record . setPraiseCount ( 0 ) ;
record . setScore ( 0 ) ;
record . setNodes ( items ) ;
record . setCode ( String . format ( PK . PK_APPRAISE_RECORD , schoolId ) ) ;
appraiseRecordRepository . save ( record ) ;
} else {
// 处理学校与学生的差异
it
CosmosPatchOperations operations = CosmosPatchOperations . create ( ) ;
operations . add ( "/nodes/0" , item ) ;
// 表扬
long praise = appraiseTreeNode . isPraise ( ) ? 1 : - 1 ;
operations . increment ( "/praiseCount" , praise ) ;
// 加分
int scoreToPlus = ObjectUtils . isEmpty ( appraiseTreeNode . getScore ( ) ) ? 0 : appraiseTreeNode . getScore ( ) ;
operations . increment ( "/score" , scoreToPlus ) ;
// patch doc
appraiseRecordRepository . save ( record . getId ( ) , PK . buildOf ( PK . PK_APPRAISE_RECORD , schoolId ) , AppraiseRecord . class , operations ) ;
}
}
/ * *