fix: prevent duplicate score ranks

main
chenyuan 4 weeks ago
parent 689e5fa18a
commit 01eaacc32c

@ -53,7 +53,7 @@ public class ScoreRankServiceImpl implements ScoreRankService {
@Override @Override
@Scheduled(cron = "0 0 1 * * ?") @Scheduled(cron = "0 0 1 * * ?")
public Boolean doRank() { public synchronized Boolean doRank() {
ensureStuRankIndexes(); ensureStuRankIndexes();
if (schoolClassMapper != null) { if (schoolClassMapper != null) {
SchoolClassExample teachingClassExample = new SchoolClassExample(); SchoolClassExample teachingClassExample = new SchoolClassExample();
@ -176,7 +176,7 @@ public class ScoreRankServiceImpl implements ScoreRankService {
@Override @Override
public Boolean doRankOne(String schoolId) { public synchronized Boolean doRankOne(String schoolId) {
ensureStuRankIndexes(); ensureStuRankIndexes();
StuRankExample stuRankExample = new StuRankExample(); StuRankExample stuRankExample = new StuRankExample();
stuRankExample.createCriteria().andUpdateTimeEqualTo(getNowDate()).andSchoolIdEqualTo(schoolId); stuRankExample.createCriteria().andUpdateTimeEqualTo(getNowDate()).andSchoolIdEqualTo(schoolId);
@ -198,7 +198,7 @@ public class ScoreRankServiceImpl implements ScoreRankService {
} }
@Override @Override
public Boolean doRankTeachingClass(String schoolId, String teachingClassId) { public synchronized Boolean doRankTeachingClass(String schoolId, String teachingClassId) {
ensureStuRankIndexes(); ensureStuRankIndexes();
SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId); SchoolClass teachingClass = schoolClassMapper.selectByPrimaryKey(teachingClassId);
if (teachingClass == null || !"TEACHING".equals(teachingClass.getClassType())) { if (teachingClass == null || !"TEACHING".equals(teachingClass.getClassType())) {
@ -439,6 +439,7 @@ public class ScoreRankServiceImpl implements ScoreRankService {
} }
addIndexIfMissing("idx_stu_rank_update_school", "ALTER TABLE stu_rank ADD INDEX idx_stu_rank_update_school (update_time, school_id)"); addIndexIfMissing("idx_stu_rank_update_school", "ALTER TABLE stu_rank ADD INDEX idx_stu_rank_update_school (update_time, school_id)");
addIndexIfMissing("idx_stu_rank_update_class", "ALTER TABLE stu_rank ADD INDEX idx_stu_rank_update_class (update_time, school_class_id)"); addIndexIfMissing("idx_stu_rank_update_class", "ALTER TABLE stu_rank ADD INDEX idx_stu_rank_update_class (update_time, school_class_id)");
addIndexIfMissing("uq_stu_rank_update_class_user", "ALTER TABLE stu_rank ADD UNIQUE INDEX uq_stu_rank_update_class_user (update_time, school_class_id, user_id)");
stuRankIndexesChecked = true; stuRankIndexesChecked = true;
} }
} }

@ -26,6 +26,8 @@ import com.sztzjy.linkCommerce.mapper.WeightMapper;
import com.sztzjy.linkCommerce.service.SchoolDefaultTaskService; import com.sztzjy.linkCommerce.service.SchoolDefaultTaskService;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.mockito.ArgumentCaptor; import org.mockito.ArgumentCaptor;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.util.ReflectionTestUtils;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.Arrays; import java.util.Arrays;
@ -40,6 +42,19 @@ import static org.mockito.Mockito.when;
class ScoreRankServiceImplTeachingClassTest { class ScoreRankServiceImplTeachingClassTest {
@Test
void rankIndexesIncludeUniqueConstraintForDailyTeachingClassStudent() {
ScoreRankServiceImpl service = new ScoreRankServiceImpl();
service.jdbcTemplate = mock(JdbcTemplate.class);
ReflectionTestUtils.invokeMethod(service, "ensureStuRankIndexes");
ArgumentCaptor<String> ddlCaptor = ArgumentCaptor.forClass(String.class);
verify(service.jdbcTemplate, org.mockito.Mockito.atLeastOnce()).execute(ddlCaptor.capture());
assertTrue(ddlCaptor.getAllValues().stream().anyMatch(ddl -> ddl.contains(
"ADD UNIQUE INDEX uq_stu_rank_update_class_user (update_time, school_class_id, user_id)")));
}
@Test @Test
void doRankTeachingClassUsesTeachingClassMembersOnly() { void doRankTeachingClassUsesTeachingClassMembersOnly() {
ScoreRankServiceImpl service = serviceWithMocks(); ScoreRankServiceImpl service = serviceWithMocks();

Loading…
Cancel
Save