|
@@ -76,6 +76,9 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Autowired
|
|
|
private MarkSpecialTagDao specialTagDao;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private MarkLockService lockService;
|
|
|
+
|
|
|
@Value("${mark.cleanTimeoutMinute}")
|
|
|
private long timeoutMinute;
|
|
|
|
|
@@ -107,7 +110,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
* @param group
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
public void releaseByGroup(MarkGroup group) {
|
|
|
CurrentTaskUtil.clear(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
}
|
|
@@ -120,15 +122,22 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void resetByGroup(MarkGroup group) {
|
|
|
- groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
- libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(), group.getNumber(),
|
|
|
- LibraryStatus.WAITING);
|
|
|
- arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
- trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
- specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
- releaseByGroup(group);
|
|
|
+ try {
|
|
|
+ lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ groupDao.resetCount(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ libraryDao.resetByExamIdAndSubjectCodeAndNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber(), LibraryStatus.WAITING);
|
|
|
+ arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ trackDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ specialTagDao.deleteByExamAndSubjectAndGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ releaseByGroup(group);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw e;
|
|
|
+ } finally {
|
|
|
+ lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -139,18 +148,25 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void deleteGroup(MarkGroup group) {
|
|
|
- questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- false, group.getNumber());
|
|
|
- libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
- arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
- markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
- group.getNumber());
|
|
|
- subjectService.updateScore(group.getExamId(), group.getSubjectCode());
|
|
|
-
|
|
|
- releaseByGroup(group);
|
|
|
- groupDao.delete(group);
|
|
|
+ try {
|
|
|
+ lockService.lockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ questionDao.deleteByExamIdAndSubjectCodeAndObjectiveAndMainNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ false, group.getNumber());
|
|
|
+ libraryDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ arbitrateDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ markerDao.deleteByExamIdAndSubjectCodeAndGroupNumber(group.getExamId(), group.getSubjectCode(),
|
|
|
+ group.getNumber());
|
|
|
+ subjectService.updateScore(group.getExamId(), group.getSubjectCode());
|
|
|
+
|
|
|
+ releaseByGroup(group);
|
|
|
+ groupDao.delete(group);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw e;
|
|
|
+ } finally {
|
|
|
+ lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -191,7 +207,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
* @param marker
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
public boolean applyLibrary(MarkLibrary library, Marker marker) {
|
|
|
// 首先判断多评情况下,同一个studentId是否已被该评卷员处理过
|
|
|
if (libraryDao.countByStudentIdAndMarkerId(library.getStudentId(), marker.getId()) > 0) {
|
|
@@ -206,7 +221,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
* @param marker
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
public void releaseLibrary(MarkLibrary library, Marker marker) {
|
|
|
CurrentTaskUtil.remove(marker, getApplyTaskId(library));
|
|
|
}
|
|
@@ -217,7 +231,6 @@ public class MarkServiceImpl implements MarkService {
|
|
|
* @param marker
|
|
|
*/
|
|
|
@Override
|
|
|
- @Transactional
|
|
|
public void releaseByMarker(Marker marker) {
|
|
|
CurrentTaskUtil.clear(marker);
|
|
|
}
|
|
@@ -230,12 +243,19 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void deleteMarker(Marker marker) {
|
|
|
- releaseByMarker(marker);
|
|
|
- libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING);
|
|
|
- trackDao.deleteByMarkerId(marker.getId());
|
|
|
- specialTagDao.deleteByMarkerId(marker.getId());
|
|
|
- updateLibraryCount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
- markerDao.delete(marker);
|
|
|
+ try {
|
|
|
+ lockService.lockGroup(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
+ releaseByMarker(marker);
|
|
|
+ libraryDao.resetByMarkerId(marker.getId(), LibraryStatus.WAITING);
|
|
|
+ trackDao.deleteByMarkerId(marker.getId());
|
|
|
+ specialTagDao.deleteByMarkerId(marker.getId());
|
|
|
+ updateLibraryCount(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
+ markerDao.delete(marker);
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw e;
|
|
|
+ } finally {
|
|
|
+ lockService.unlockGroup(marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -246,11 +266,18 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void deleteByStudent(ExamStudent student) {
|
|
|
- trackDao.deleteByStudentId(student.getId());
|
|
|
- specialTagDao.deleteByStudentId(student.getId());
|
|
|
- libraryDao.deleteByStudentId(student.getId());
|
|
|
- arbitrateDao.deleteByStudentId(student.getId());
|
|
|
- updateLibraryCount(student.getExamId(), student.getSubjectCode());
|
|
|
+ try {
|
|
|
+ lockService.lockStudent(student.getId());
|
|
|
+ trackDao.deleteByStudentId(student.getId());
|
|
|
+ specialTagDao.deleteByStudentId(student.getId());
|
|
|
+ libraryDao.deleteByStudentId(student.getId());
|
|
|
+ arbitrateDao.deleteByStudentId(student.getId());
|
|
|
+ updateLibraryCount(student.getExamId(), student.getSubjectCode());
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw e;
|
|
|
+ } finally {
|
|
|
+ lockService.unlockStudent(student.getId());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -269,6 +296,14 @@ public class MarkServiceImpl implements MarkService {
|
|
|
if (group == null) {
|
|
|
return;
|
|
|
}
|
|
|
+ // 等待大题释放锁定
|
|
|
+ lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ // 等待考生释放锁定
|
|
|
+ lockService.waitUnlockStudent(library.getStudentId());
|
|
|
+ // 若该评卷任务已被删除,则直接返回
|
|
|
+ if (!libraryDao.exists(library.getId())) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
// 保存阅卷轨迹
|
|
|
if (trackMap != null) {
|
|
|
for (String questionNumber : trackMap.keySet()) {
|
|
@@ -330,6 +365,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Transactional
|
|
|
public void backLibrary(MarkLibrary library) {
|
|
|
if (library.getStatus() == LibraryStatus.MARKED) {
|
|
|
+ lockService.waitUnlockGroup(library.getExamId(), library.getSubjectCode(), library.getGroupNumber());
|
|
|
trackDao.deleteByStudentIdAndMarkerId(library.getStudentId(), library.getMarkerId());
|
|
|
specialTagDao.deleteByLibraryId(library.getId());
|
|
|
libraryDao.resetById(library.getId(), LibraryStatus.BACKED);
|
|
@@ -357,6 +393,7 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void processArbitrate(ArbitrateHistory history) {
|
|
|
+ lockService.waitUnlockGroup(history.getExamId(), history.getSubjectCode(), history.getGroupNumber());
|
|
|
arbitrateDao.saveAndFlush(history);
|
|
|
libraryDao.updateHeaderResult(history.getStudentId(), history.getGroupNumber(), history.getUserId(),
|
|
|
history.getTotalScore(), history.getScoreList(), history.getUpdateTime(), LibraryStatus.ARBITRATED);
|
|
@@ -495,6 +532,10 @@ public class MarkServiceImpl implements MarkService {
|
|
|
@Override
|
|
|
@Transactional
|
|
|
public void buildLibrary(ExamStudent student, Campus campus, MarkGroup group) {
|
|
|
+ // 等待大题释放锁定
|
|
|
+ lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
|
|
|
+ // 等待考生释放锁定
|
|
|
+ lockService.waitUnlockStudent(student.getId());
|
|
|
// 查询是否已创建评卷任务
|
|
|
if (libraryDao.countByStudentIdAndGroupNumber(student.getId(), group.getNumber()) == 0) {
|
|
|
MarkLibrary library = new MarkLibrary();
|