Browse Source

删除答题卡卡格式

xiatian 1 year ago
parent
commit
c2af175dcc

+ 24 - 5
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanAnswerCardController.java

@@ -9,7 +9,6 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 import org.springframework.web.multipart.MultipartFile;
 
 
-import com.alibaba.fastjson.JSONObject;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.boot.core.exception.ParameterException;
@@ -44,7 +43,7 @@ public class ScanAnswerCardController {
 
 
 	@Autowired
 	@Autowired
 	private ConcurrentService concurrentService;
 	private ConcurrentService concurrentService;
-	
+
 	@Autowired
 	@Autowired
 	private BasicExamService basicExamService;
 	private BasicExamService basicExamService;
 
 
@@ -61,8 +60,8 @@ public class ScanAnswerCardController {
 			@RequestParam String coursePaperId, @RequestParam String md5,
 			@RequestParam String coursePaperId, @RequestParam String md5,
 			@RequestParam(required = false) Integer number, @RequestParam(required = false) String remark,
 			@RequestParam(required = false) Integer number, @RequestParam(required = false) String remark,
 			@RequestParam Integer paperCount, @RequestParam MultipartFile file) {
 			@RequestParam Integer paperCount, @RequestParam MultipartFile file) {
-		BasicExam exam=basicExamService.getById(examId);
-		if(exam==null) {
+		BasicExam exam = basicExamService.getById(examId);
+		if (exam == null) {
 			throw new ParameterException("未找到考试信息");
 			throw new ParameterException("未找到考试信息");
 		}
 		}
 		AnswerCardSaveDomain domain = new AnswerCardSaveDomain(number, examId, coursePaperId, remark, paperCount, file,
 		AnswerCardSaveDomain domain = new AnswerCardSaveDomain(number, examId, coursePaperId, remark, paperCount, file,
@@ -76,7 +75,27 @@ public class ScanAnswerCardController {
 				concurrentService.getLock(LockType.CARD_SAVE + "-" + examId).unlock();
 				concurrentService.getLock(LockType.CARD_SAVE + "-" + examId).unlock();
 			}
 			}
 		} else {
 		} else {
-			throw new ReentrantException("正在保存卡格式,请稍后再试");
+			throw new ReentrantException("正在处理卡格式,请稍后再试");
+		}
+	}
+
+	@ApiOperation(value = "删除答题卡卡格式")
+	@RequestMapping(value = "delete", method = RequestMethod.POST)
+	public AnswerCardSaveVo cardDelete(@RequestParam Long examId, @RequestParam Integer number) {
+		BasicExam exam = basicExamService.getById(examId);
+		if (exam == null) {
+			throw new ParameterException("未找到考试信息");
+		}
+		if (concurrentService.getLock(LockType.CARD_SAVE + "-" + examId).tryLock()) {
+			try {
+				scanAnswerCardService.cardDelete(examId,number);
+				AnswerCardSaveVo vo = new AnswerCardSaveVo(number, System.currentTimeMillis());
+				return vo;
+			} finally {
+				concurrentService.getLock(LockType.CARD_SAVE + "-" + examId).unlock();
+			}
+		} else {
+			throw new ReentrantException("正在处理卡格式,请稍后再试");
 		}
 		}
 	}
 	}
 }
 }

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanAnswerCardService.java

@@ -24,4 +24,6 @@ public interface ScanAnswerCardService extends IService<ScanAnswerCard> {
 
 
 	void cardSave(AnswerCardSaveDomain domain);
 	void cardSave(AnswerCardSaveDomain domain);
 
 
+	void cardDelete(Long examId, Integer number);
+
 }
 }

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperService.java

@@ -23,4 +23,6 @@ public interface ScanPaperService extends IService<ScanPaper> {
 	int getAssignedCount(Long examId, Boolean checked);
 	int getAssignedCount(Long examId, Boolean checked);
 
 
     List<StudentPaperDetailDto> listStudentPaperDetail(Long studentId);
     List<StudentPaperDetailDto> listStudentPaperDetail(Long studentId);
+
+	int getCountByExamAndCardNumber(Long examId, Integer number);
 }
 }

+ 87 - 60
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanAnswerCardServiceImpl.java

@@ -9,6 +9,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.boot.core.exception.ParameterException;
@@ -23,6 +24,7 @@ import com.qmth.teachcloud.mark.mapper.ScanAnswerCardMapper;
 import com.qmth.teachcloud.mark.service.FileService;
 import com.qmth.teachcloud.mark.service.FileService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
 import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
 import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
+import com.qmth.teachcloud.mark.service.ScanPaperService;
 
 
 /**
 /**
  * <p>
  * <p>
@@ -38,11 +40,13 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
 
 
 	@Autowired
 	@Autowired
 	private MarkPaperService markPaperService;
 	private MarkPaperService markPaperService;
+	
+	@Autowired
+	private ScanPaperService scanPaperService;
 
 
-    @Autowired
-    private FileService fileService;
+	@Autowired
+	private FileService fileService;
 
 
-	
 	@Override
 	@Override
 	public ScanAnswerCard findByExamAndNumber(Long examId, Integer cardNumber) {
 	public ScanAnswerCard findByExamAndNumber(Long examId, Integer cardNumber) {
 		if (examId == null) {
 		if (examId == null) {
@@ -60,25 +64,25 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
 
 
 	@Override
 	@Override
 	public List<AnswerCardVo> cardList(Long examId, String coursePaperId) {
 	public List<AnswerCardVo> cardList(Long examId, String coursePaperId) {
-		return baseMapper.cardList(examId,coursePaperId);
+		return baseMapper.cardList(examId, coursePaperId);
 	}
 	}
 
 
 	@Transactional
 	@Transactional
 	@Override
 	@Override
 	public void cardSave(AnswerCardSaveDomain domain) {
 	public void cardSave(AnswerCardSaveDomain domain) {
-		boolean singlePage=false;
-		MarkPaper mp=markPaperService.getByExamIdAndCoursePaperId(domain.getExamId(), domain.getCoursePaperId());
-		if(MarkPaperStatus.FINISH.equals(mp.getStatus())) {
+		boolean singlePage = false;
+		MarkPaper mp = markPaperService.getByExamIdAndCoursePaperId(domain.getExamId(), domain.getCoursePaperId());
+		if (MarkPaperStatus.FINISH.equals(mp.getStatus())) {
 			throw new ParameterException("阅卷已结束");
 			throw new ParameterException("阅卷已结束");
 		}
 		}
-		ScanAnswerCard card=null;
-		if(domain.getNumber()!=null) {
-			card=findByExamAndNumber(domain.getExamId(), domain.getNumber());
-			if(card==null) {
+		ScanAnswerCard card = null;
+		if (domain.getNumber() != null) {
+			card = findByExamAndNumber(domain.getExamId(), domain.getNumber());
+			if (card == null) {
 				throw new ParameterException("未找到卡格式信息");
 				throw new ParameterException("未找到卡格式信息");
 			}
 			}
-		}else {
-			card=new ScanAnswerCard();
+		} else {
+			card = new ScanAnswerCard();
 			card.setExamId(domain.getExamId());
 			card.setExamId(domain.getExamId());
 			card.setCoursePaperId(domain.getCoursePaperId());
 			card.setCoursePaperId(domain.getCoursePaperId());
 			card.setPaperCount(domain.getPaperCount());
 			card.setPaperCount(domain.getPaperCount());
@@ -86,58 +90,81 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
 			card.setRemark(domain.getRemark());
 			card.setRemark(domain.getRemark());
 			card.setDpi(domain.getDpi());
 			card.setDpi(domain.getDpi());
 			card.setSource(CardSource.CLIENT);
 			card.setSource(CardSource.CLIENT);
-			card.setNumber(findMaxCardNumberByExamId(domain.getExamId())+1);
+			card.setNumber(findMaxCardNumberByExamId(domain.getExamId()) + 1);
 			card.setNeedAdapte(false);
 			card.setNeedAdapte(false);
 		}
 		}
 		CardFile cardFile;
 		CardFile cardFile;
-        byte[] fileData;
-        String sliceConfig;
-        try {
-            fileData = domain.getFile().getBytes();
-            //解析卡格式文件
-            cardFile = parseCardFile(fileData);
-            if (singlePage && domain.getPaperCount()!=cardFile.getPages().size()) {
-                throw new ParameterException("卡格式数量不一致");
-            }
-            if (!singlePage && domain.getPaperCount()*2!=cardFile.getPages().size()) {
-                throw new ParameterException("卡格式数量不一致");
-            }
-            //提取裁切坐标
-            sliceConfig = cardFile.getSliceConfig().toString();
-        } catch (IOException e) {
-            throw new ParameterException("文件解析失败", e);
+		byte[] fileData;
+		String sliceConfig;
+		try {
+			fileData = domain.getFile().getBytes();
+			// 解析卡格式文件
+			cardFile = parseCardFile(fileData);
+			if (singlePage && domain.getPaperCount() != cardFile.getPages().size()) {
+				throw new ParameterException("卡格式数量不一致");
+			}
+			if (!singlePage && domain.getPaperCount() * 2 != cardFile.getPages().size()) {
+				throw new ParameterException("卡格式数量不一致");
+			}
+			// 提取裁切坐标
+			sliceConfig = cardFile.getSliceConfig().toString();
+		} catch (IOException e) {
+			throw new ParameterException("文件解析失败", e);
+		}
+		String filePath = null;
+		try {
+			fileService.uploadAnswerCard(domain.getFile().getInputStream(), domain.getMd5(), domain.getExamId(),
+					domain.getNumber());
+		} catch (IOException e) {
+			throw new ParameterException("文件上传失败", e);
+		}
+		card.setSliceConfig(sliceConfig);
+		card.setMd5(domain.getMd5());
+		card.setUri(filePath);
+		this.saveOrUpdate(card);
+	}
+
+	/**
+	 * 解析卡格式文件中的裁切图坐标,用于云阅卷同步
+	 *
+	 * @param data
+	 */
+	private CardFile parseCardFile(byte[] data) throws IOException {
+		ObjectMapper objectMapper = new ObjectMapper();
+		return objectMapper.readValue(data, CardFile.class);
+	}
+
+	private Integer findMaxCardNumberByExamId(Long examId) {
+		int number = 0;
+		QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
+		queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId);
+		List<ScanAnswerCard> list = this.list(queryWrapper);
+		for (ScanAnswerCard card : list) {
+			if (number < card.getNumber()) {
+				number = card.getNumber();
+			}
+		}
+		return number;
+	}
+
+	@Transactional
+	@Override
+	public void cardDelete(Long examId, Integer number) {
+		ScanAnswerCard card = findByExamAndNumber(examId, number);
+		if (card == null) {
+			throw new ParameterException("未找到卡格式信息");
+		}
+		int studentCount = scanPaperService.getCountByExamAndCardNumber(examId, number);
+        if (studentCount != 0) {
+            throw new ParameterException("卡格式已被使用,无法删除");
         }
         }
-		String filePath=null;
-        try {
-        	fileService.uploadAnswerCard(domain.getFile().getInputStream(), domain.getMd5(), domain.getExamId(), domain.getNumber());
-        } catch (IOException e) {
-            throw new ParameterException("文件上传失败", e);
+        UpdateWrapper<ScanAnswerCard> updateWrapper = new UpdateWrapper<>();
+        updateWrapper.lambda().eq(ScanAnswerCard::getExamId, examId);
+        updateWrapper.lambda().eq(ScanAnswerCard::getNumber, number);
+        int count = this.baseMapper.delete(updateWrapper);
+        if (count == 0) {
+            throw new ParameterException("未找到卡格式");
         }
         }
-        card.setSliceConfig(sliceConfig);
-        card.setMd5(domain.getMd5());
-        card.setUri(filePath);
-        this.saveOrUpdate(card);
 	}
 	}
-    /**
-     * 解析卡格式文件中的裁切图坐标,用于云阅卷同步
-     *
-     * @param data
-     */
-    private CardFile parseCardFile(byte[] data) throws IOException {
-        ObjectMapper objectMapper = new ObjectMapper();
-        return objectMapper.readValue(data, CardFile.class);
-    }
-    private Integer findMaxCardNumberByExamId(Long examId) {
-        int number = 0;
-        QueryWrapper<ScanAnswerCard> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(ScanAnswerCard::getExamId, examId);
-        List<ScanAnswerCard> list = this.list(queryWrapper);
-        for (ScanAnswerCard card : list) {
-            if (number < card.getNumber()) {
-                number = card.getNumber();
-            }
-        }
-        return number;
-    }
 
 
 }
 }

+ 11 - 5
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java

@@ -4,7 +4,6 @@ import java.util.List;
 
 
 import javax.validation.constraints.NotNull;
 import javax.validation.constraints.NotNull;
 
 
-import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
@@ -12,14 +11,13 @@ import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.teachcloud.mark.entity.MarkStudent;
-import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.enums.ScanStatus;
-import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
+import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
 import com.qmth.teachcloud.mark.entity.ScanPaperPage;
 import com.qmth.teachcloud.mark.entity.ScanPaperPage;
 import com.qmth.teachcloud.mark.mapper.ScanPaperMapper;
 import com.qmth.teachcloud.mark.mapper.ScanPaperMapper;
+import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
 import com.qmth.teachcloud.mark.service.ScanPaperPageService;
 import com.qmth.teachcloud.mark.service.ScanPaperPageService;
 import com.qmth.teachcloud.mark.service.ScanPaperService;
 import com.qmth.teachcloud.mark.service.ScanPaperService;
 
 
@@ -92,4 +90,12 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
         return this.baseMapper.listStudentPaperDetail(studentId);
         return this.baseMapper.listStudentPaperDetail(studentId);
     }
     }
 
 
+    @Override
+    public int getCountByExamAndCardNumber(Long examId, Integer number) {
+        LambdaQueryWrapper<ScanPaper> lw = new LambdaQueryWrapper<>();
+        lw.eq(ScanPaper::getExamId, examId);
+        lw.eq(ScanPaper::getCardNumber, number);
+        return this.count(lw);
+    }
+
 }
 }