1.sun-club-practice-api
1.enums
1.CompleteStatusEnum.java
package com. sunxiansheng. practice. api. enums ;
public enum CompleteStatusEnum {
NO_COMPLETE ( 0 , "未完成" ) ,
COMPLETE ( 1 , "已完成" ) ;
final private int code;
final private String desc;
CompleteStatusEnum ( int code, String desc) {
this . code = code;
this . desc = desc;
}
public int getCode ( ) {
return code;
}
public String getDesc ( ) {
return desc;
}
}
2.req
1.GetPracticeSubjectsReq.java
package com. sunxiansheng. practice. api. req ;
import lombok. Data ;
import java. io. Serializable ;
@Data
public class GetPracticeSubjectsReq implements Serializable {
private Long setId;
private Long practiceId;
}
3.vo
1.PracticeSubjectListVO.java
package com. sunxiansheng. practice. api. vo ;
import lombok. Data ;
import java. io. Serializable ;
import java. util. List ;
@Data
public class PracticeSubjectListVO implements Serializable {
private String title;
private List < PracticeSubjectDetailVO > subjectList;
private Long practiceId;
private String timeUse;
}
2.sun-club-practice-server
1.PracticeSetController.java
@PostMapping ( value = "/getPracticeSubject" )
public Result < PracticeSubjectVO > getPracticeSubject ( @RequestBody GetPracticeSubjectReq req) {
if ( log. isInfoEnabled ( ) ) {
log. info ( "获取练习题详情入参{}" , JSON . toJSONString ( req) ) ;
}
try {
Preconditions . checkArgument ( ! Objects . isNull ( req) , "参数不能为空!" ) ;
Preconditions . checkArgument ( ! Objects . isNull ( req. getSubjectId ( ) ) , "题目id不能为空!" ) ;
Preconditions . checkArgument ( ! Objects . isNull ( req. getSubjectType ( ) ) , "题目类型不能为空!" ) ;
PracticeSubjectDTO dto = new PracticeSubjectDTO ( ) ;
dto. setSubjectId ( req. getSubjectId ( ) ) ;
dto. setSubjectType ( req. getSubjectType ( ) ) ;
PracticeSubjectVO vo = practiceSetService. getPracticeSubject ( dto) ;
if ( log. isInfoEnabled ( ) ) {
log. info ( "获取练习题目详情出参{}" , JSON . toJSONString ( vo) ) ;
}
return Result . ok ( vo) ;
} catch ( IllegalArgumentException e) {
log. error ( "参数异常!错误原因{}" , e. getMessage ( ) , e) ;
return Result . fail ( e. getMessage ( ) ) ;
} catch ( Exception e) {
log. error ( "获取练习详情异常!错误原因{}" , e. getMessage ( ) , e) ;
return Result . fail ( "获取练习题目详情异常!" ) ;
}
}
2.service
1.PracticeSetServiceImpl.java
public PracticeSubjectListVO getSubjects ( GetPracticeSubjectsReq req) {
Long setId = req. getSetId ( ) ;
PracticeSubjectListVO vo = new PracticeSubjectListVO ( ) ;
List < PracticeSetDetailPO > practiceSetDetailPOS = practiceSetDetailDao. selectBySetId ( setId) ;
if ( CollectionUtils . isEmpty ( practiceSetDetailPOS) ) {
return vo;
}
Long practiceId = req. getPracticeId ( ) ;
String loginId = LoginUtil . getLoginId ( ) ;
List < PracticeSubjectDetailVO > practiceSubjectDetailVOList = practiceSetDetailPOS. stream ( ) . map (
practiceSetDetailPO -> {
PracticeSubjectDetailVO practiceSubjectDetailVO = new PracticeSubjectDetailVO ( ) ;
practiceSubjectDetailVO. setSubjectId ( practiceSetDetailPO. getSubjectId ( ) ) ;
practiceSubjectDetailVO. setSubjectType ( practiceSetDetailPO. getSubjectType ( ) ) ;
if ( Objects . nonNull ( practiceId) ) {
PracticeDetailPO practiceDetailPO = practiceDetailDao. selectDetail ( practiceId, practiceSetDetailPO. getSubjectId ( ) , loginId) ;
if ( Objects . nonNull ( practiceDetailPO) && StringUtils . isNotBlank ( practiceDetailPO. getAnswerContent ( ) ) ) {
practiceSubjectDetailVO. setIsAnswer ( 1 ) ;
} else {
practiceSubjectDetailVO. setIsAnswer ( 0 ) ;
}
}
return practiceSubjectDetailVO;
}
) . collect ( Collectors . toList ( ) ) ;
PracticeSetPO practiceSetPO = practiceSetDao. selectById ( setId) ;
vo. setTitle ( practiceSetPO. getSetName ( ) ) ;
vo. setSubjectList ( practiceSubjectDetailVOList) ;
if ( Objects . isNull ( practiceId) ) {
Long newPracticeId = insertUnCompletePractice ( setId) ;
vo. setPracticeId ( newPracticeId) ;
} else {
updateUnCompletePractice ( practiceId) ;
PracticePO practicePO = practiceDao. selectById ( practiceId) ;
vo. setTimeUse ( practicePO. getTimeUse ( ) ) ;
vo. setPracticeId ( practiceId) ;
}
return vo;
}
private Long insertUnCompletePractice ( Long practiceSetId) {
PracticePO practicePO = new PracticePO ( ) ;
practicePO. setSetId ( practiceSetId) ;
practicePO. setCompleteStatus ( CompleteStatusEnum . NO_COMPLETE . getCode ( ) ) ;
practicePO. setTimeUse ( "00:00:00" ) ;
practicePO. setSubmitTime ( new Date ( ) ) ;
practicePO. setCorrectRate ( new BigDecimal ( "0.00" ) ) ;
practicePO. setIsDeleted ( IsDeleteFlagEnum . UN_DELETED . getCode ( ) ) ;
practicePO. setCreatedBy ( LoginUtil . getLoginId ( ) ) ;
practicePO. setCreatedTime ( new Date ( ) ) ;
practiceDao. insert ( practicePO) ;
return practicePO. getId ( ) ;
}
private void updateUnCompletePractice ( Long practiceId) {
PracticePO practicePO = new PracticePO ( ) ;
practicePO. setId ( practiceId) ;
practicePO. setSubmitTime ( new Date ( ) ) ;
practiceDao. update ( practicePO) ;
}
3.dao
1.PracticeDao.java
package com. sunxiansheng. practice. server. dao ;
import com. sunxiansheng. practice. server. entity. po. PracticePO ;
public interface PracticeDao {
PracticePO selectById ( Long practiceId) ;
void insert ( PracticePO practicePO) ;
void update ( PracticePO practicePO) ;
}
2.PracticeDetailDao.java
package com. sunxiansheng. practice. server. dao ;
import com. sunxiansheng. practice. server. entity. po. PracticeDetailPO ;
import org. apache. ibatis. annotations. Param ;
public interface PracticeDetailDao {
PracticeDetailPO selectDetail ( @Param ( "practiceId" ) Long practiceId, @Param ( "subjectId" ) Long subjectId, @Param ( "loginId" ) String loginId) ;
}
4.mapper
1.PracticeDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace = " com.sunxiansheng.practice.server.dao.PracticeDao" >
< select id = " selectById" resultType = " com.sunxiansheng.practice.server.entity.po.PracticePO" >
select set_id as setId, time_use as timeUse, submit_time as submitTime, correct_rate as correctRate
from practice_info
where id = #{id}
and is_deleted = 0
</ select>
< insert id = " insert" >
< selectKey resultType = " java.lang.Long" keyProperty = " id" order = " AFTER" >
SELECT LAST_INSERT_ID()
</ selectKey>
INSERT INTO practice_info(set_id, complete_status, time_use, submit_time, correct_rate, is_deleted,
created_by, created_time)
values (#{setId,jdbcType=BIGINT},
#{completeStatus,jdbcType=INTEGER},
#{timeUse,jdbcType=VARCHAR},
#{submitTime,jdbcType=TIMESTAMP},
#{correctRate,jdbcType=VARCHAR},
#{isDeleted,jdbcType=INTEGER},
#{createdBy,jdbcType=VARCHAR},
#{createdTime,jdbcType=TIMESTAMP})
</ insert>
< update id = " update" >
update practice_info
< set>
< if test = " submitTime != null" >
submit_time = #{submitTime},
</ if>
< if test = " timeUse != null" >
time_use = #{timeUse},
</ if>
< if test = " completeStatus != null" >
complete_status = #{completeStatus},
</ if>
< if test = " correctRate != null" >
correct_rate = #{correctRate},
</ if>
</ set>
where id = #{id,jdbcType=BIGINT}
</ update>
</ mapper>
2.PracticeDetailDao.xml
<?xml version="1.0" encoding="UTF-8" ?>
<! DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
< mapper namespace = " com.sunxiansheng.practice.server.dao.PracticeDetailDao" >
< select id = " selectDetail" resultType = " com.sunxiansheng.practice.server.entity.po.PracticeDetailPO" >
select id,
subject_id as subjectId,
subject_type as subjectType,
answer_status as answerStatus,
answer_content as answerContent
from practice_detail
where is_deleted = 0
and practice_id = #{practiceId}
and subject_id = #{subjectId}
and created_by = #{loginId}
</ select>
</ mapper>
5.entity
1.po
1.PracticeDetailPO.java
package com. sunxiansheng. practice. server. entity. po ;
import lombok. Data ;
import java. io. Serializable ;
import java. util. Date ;
@Data
public class PracticeDetailPO implements Serializable {
private Long id;
private Long practiceId;
private Long subjectId;
private Integer subjectType;
private Integer answerStatus;
private String answerContent;
private String createdBy;
private Date createdTime;
private String updateBy;
private Integer isDeleted;
private Date updateTime;
}
2.PracticePO.java
package com. sunxiansheng. practice. server. entity. po ;
import lombok. Data ;
import java. io. Serializable ;
import java. math. BigDecimal ;
import java. util. Date ;
@Data
public class PracticePO implements Serializable {
private Long id;
private Long setId;
private Integer completeStatus;
private String timeUse;
private Date submitTime;
private BigDecimal correctRate;
private String createdBy;
private Date createdTime;
private String updateBy;
private Integer isDeleted;
private Date updateTime;
}
3.测试
1.不携带practiceId来获取练习题
1.响应
2.此时会新增一个练习
2.携带practiceId获取练习题
1.响应
2.此时会更新这个练习的提交时间
3.并且会获取每个题目的练习详情,来判断是否作答,但是为空,所以isAnswer都是0