SubjectServiceImpl.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. package cn.com.qmth.scancentral.service.impl;
  2. import java.io.File;
  3. import java.io.FileNotFoundException;
  4. import java.io.FileOutputStream;
  5. import java.io.IOException;
  6. import java.nio.charset.Charset;
  7. import java.util.ArrayList;
  8. import java.util.Calendar;
  9. import java.util.Date;
  10. import java.util.HashMap;
  11. import java.util.HashSet;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15. import java.util.concurrent.ExecutorService;
  16. import java.util.concurrent.LinkedBlockingQueue;
  17. import java.util.concurrent.ThreadPoolExecutor;
  18. import java.util.concurrent.TimeUnit;
  19. import org.apache.commons.collections4.CollectionUtils;
  20. import org.apache.commons.io.IOUtils;
  21. import org.apache.commons.lang3.StringUtils;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.transaction.annotation.Transactional;
  27. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  28. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  29. import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
  30. import com.linuxense.javadbf.DBFDataType;
  31. import com.linuxense.javadbf.DBFField;
  32. import com.linuxense.javadbf.DBFWriter;
  33. import com.qmth.boot.core.exception.ParameterException;
  34. import com.qmth.boot.core.exception.StatusException;
  35. import com.qmth.boot.core.fss.store.FileStore;
  36. import com.qmth.boot.tools.uuid.FastUUID;
  37. import cn.com.qmth.scancentral.bean.ImportSubjectDomain;
  38. import cn.com.qmth.scancentral.bean.SubjectConfigDomain;
  39. import cn.com.qmth.scancentral.bean.User;
  40. import cn.com.qmth.scancentral.consumer.AnswerDataExportConsumer;
  41. import cn.com.qmth.scancentral.consumer.SliceDataExportConsumer;
  42. import cn.com.qmth.scancentral.dao.SubjectDao;
  43. import cn.com.qmth.scancentral.entity.ExamEntity;
  44. import cn.com.qmth.scancentral.entity.MarkSiteEntity;
  45. import cn.com.qmth.scancentral.entity.SubjectEntity;
  46. import cn.com.qmth.scancentral.enums.ExamStatus;
  47. import cn.com.qmth.scancentral.service.AsyncTaskService;
  48. import cn.com.qmth.scancentral.service.BatchPaperService;
  49. import cn.com.qmth.scancentral.service.ExamService;
  50. import cn.com.qmth.scancentral.service.FileService;
  51. import cn.com.qmth.scancentral.service.MarkSiteService;
  52. import cn.com.qmth.scancentral.service.StudentService;
  53. import cn.com.qmth.scancentral.service.SubjectService;
  54. import cn.com.qmth.scancentral.support.SpringContextHolder;
  55. import cn.com.qmth.scancentral.util.Calculator;
  56. import cn.com.qmth.scancentral.util.DateUtil;
  57. import cn.com.qmth.scancentral.util.FileUtil;
  58. import cn.com.qmth.scancentral.vo.ExportCetMarkingQueryVo;
  59. import cn.com.qmth.scancentral.vo.ExportCetVo;
  60. import cn.com.qmth.scancentral.vo.SubjectConfigVo;
  61. import cn.com.qmth.scancentral.vo.examinfo.SubjectConfig;
  62. import cn.com.qmth.scancentral.vo.subject.DataExportTaskVo;
  63. import cn.com.qmth.scancentral.vo.subject.ScanProgressVo;
  64. import cn.com.qmth.scancentral.vo.subject.SubjectBreachVo;
  65. import cn.com.qmth.scancentral.vo.subject.SubjectCustStatusVo;
  66. import cn.com.qmth.scancentral.vo.subject.SubjectScanProgressVo;
  67. import cn.com.qmth.scancentral.vo.subject.TaskIdVo;
  68. @Service
  69. public class SubjectServiceImpl extends MppServiceImpl<SubjectDao, SubjectEntity> implements SubjectService {
  70. private static final Logger log = LoggerFactory.getLogger(SubjectService.class);
  71. private static ExecutorService exec;
  72. @Autowired
  73. private ExamService examService;
  74. @Autowired
  75. private StudentService studentService;
  76. @Autowired
  77. private FileService fileService;
  78. @Autowired
  79. private FileStore fileStore;
  80. @Autowired
  81. private BatchPaperService batchPaperService;
  82. @Autowired
  83. private AsyncTaskService asyncTaskService;
  84. @Autowired
  85. private MarkSiteService markSiteService;
  86. static {
  87. int threadCount = 5;
  88. exec = new ThreadPoolExecutor(threadCount, threadCount, 0L, TimeUnit.SECONDS,
  89. new LinkedBlockingQueue<>(threadCount * 2), r -> {
  90. Thread t = new Thread(r);
  91. return t;
  92. }, (r, executor) -> {
  93. if (!executor.isShutdown()) {
  94. try {
  95. executor.getQueue().put(r);
  96. } catch (InterruptedException e) {
  97. throw new RuntimeException(e);
  98. }
  99. }
  100. });
  101. }
  102. @Transactional
  103. @Override
  104. public int cleanByExamId(Long examId, String subjectCode) {
  105. QueryWrapper<SubjectEntity> wrapper = new QueryWrapper<>();
  106. LambdaQueryWrapper<SubjectEntity> lw = wrapper.lambda();
  107. lw.eq(SubjectEntity::getExamId, examId);
  108. lw.eq(SubjectEntity::getCode, subjectCode);
  109. return this.baseMapper.delete(wrapper);
  110. }
  111. @Override
  112. public List<SubjectEntity> listByExamId(Long examId) {
  113. QueryWrapper<SubjectEntity> queryWrapper = new QueryWrapper<>();
  114. queryWrapper.lambda().eq(SubjectEntity::getExamId, examId);
  115. queryWrapper.lambda().orderByDesc(SubjectEntity::getCode);
  116. return this.list(queryWrapper);
  117. }
  118. @Override
  119. public SubjectEntity findByExamIdAndCode(Long examId, String code) {
  120. QueryWrapper<SubjectEntity> queryWrapper = new QueryWrapper<>();
  121. queryWrapper.lambda().eq(SubjectEntity::getExamId, examId);
  122. queryWrapper.lambda().eq(SubjectEntity::getCode, code);
  123. return this.getOne(queryWrapper);
  124. }
  125. @Override
  126. public int countByExamId(Long examId) {
  127. QueryWrapper<SubjectEntity> wrapper = new QueryWrapper<>();
  128. LambdaQueryWrapper<SubjectEntity> lw = wrapper.lambda();
  129. lw.eq(SubjectEntity::getExamId, examId);
  130. return this.count(wrapper);
  131. }
  132. @Transactional
  133. @Override
  134. public int importSubject(List<ImportSubjectDomain> subjects) {
  135. Map<Long, Set<String>> map = new HashMap<Long, Set<String>>();
  136. List<SubjectEntity> list = this.list();
  137. for (SubjectEntity subjectEntity : list) {
  138. Set<String> set = map.get(subjectEntity.getExamId());
  139. if (set == null) {
  140. set = new HashSet<String>();
  141. }
  142. set.add(subjectEntity.getCode());
  143. map.put(subjectEntity.getExamId(), set);
  144. }
  145. List<SubjectEntity> saveList = new ArrayList<SubjectEntity>();
  146. for (ImportSubjectDomain importSubjectDomain : subjects) {
  147. Set<String> set = map.get(importSubjectDomain.getExamId());
  148. if (set != null) {
  149. if (!set.contains(importSubjectDomain.getSubjectCode())) {
  150. SubjectEntity subjectEntity = new SubjectEntity(importSubjectDomain.getExamId(),
  151. importSubjectDomain.getSubjectCode(), importSubjectDomain.getSubjectName());
  152. set.add(importSubjectDomain.getSubjectCode());
  153. saveList.add(subjectEntity);
  154. }
  155. } else {
  156. set = new HashSet<String>();
  157. SubjectEntity subjectEntity = new SubjectEntity(importSubjectDomain.getExamId(),
  158. importSubjectDomain.getSubjectCode(), importSubjectDomain.getSubjectName());
  159. set.add(importSubjectDomain.getSubjectCode());
  160. saveList.add(subjectEntity);
  161. }
  162. map.put(importSubjectDomain.getExamId(), set);
  163. }
  164. this.saveOrUpdateBatchByMultiId(saveList);
  165. return saveList.size();
  166. }
  167. @Transactional
  168. @Override
  169. public SubjectConfigVo config(User user, SubjectConfigDomain domain) {
  170. SubjectEntity s = this.findByExamIdAndCode(domain.getExamId(), domain.getSubjectCode());
  171. if (s == null) {
  172. throw new ParameterException("找不到对应的科目");
  173. }
  174. s.setPaperTypeBarcodeContent(domain.getPaperTypeBarcodeContent());
  175. this.saveOrUpdateByMultiId(s);
  176. return new SubjectConfigVo(s);
  177. }
  178. @Override
  179. public List<SubjectConfig> listConfigByExamId(Long examId) {
  180. QueryWrapper<SubjectEntity> queryWrapper = new QueryWrapper<>();
  181. queryWrapper.lambda().eq(SubjectEntity::getExamId, examId);
  182. queryWrapper.lambda().isNotNull(SubjectEntity::getPaperTypeBarcodeContent);
  183. List<SubjectEntity> list = this.list(queryWrapper);
  184. List<SubjectConfig> result = new ArrayList<SubjectConfig>();
  185. for (SubjectEntity subjectEntity : list) {
  186. result.add(new SubjectConfig(subjectEntity));
  187. }
  188. return result;
  189. }
  190. @Override
  191. public ScanProgressVo scanProgress(Long examId, String subjectCode) {
  192. ScanProgressVo ret = new ScanProgressVo();
  193. List<SubjectScanProgressVo> subjects = studentService.scanProgress(examId, subjectCode);
  194. ret.setSubjects(subjects);
  195. ret.setTotal(new SubjectScanProgressVo());
  196. if (CollectionUtils.isNotEmpty(subjects)) {
  197. Calendar now = Calendar.getInstance();
  198. long endTime = now.getTimeInMillis();
  199. now.add(Calendar.MINUTE, -1);
  200. long startTime = now.getTimeInMillis();
  201. for (SubjectScanProgressVo vo : subjects) {
  202. vo.setScannedCount(vo.getStudentCount() - vo.getUnexistCount());
  203. vo.setProgress(Calculator.percentage(vo.getScannedCount(), vo.getStudentCount(), 2));
  204. Integer count = batchPaperService.getScanStudentCount(examId, subjectCode, startTime, endTime);
  205. if (count == null || count == 0) {
  206. vo.setEstimation("-");
  207. } else {
  208. vo.setEstimation(Calculator.divide(
  209. Calculator.multiply(Calculator.divide(count, endTime - startTime), vo.getUnexistCount()),
  210. 3600000) + "h");
  211. }
  212. }
  213. int totalUnScanned = studentService.getUnscannedCountByExam(examId);
  214. int totalCount = studentService.getCountByExam(examId);
  215. ret.getTotal().setStudentCount(totalCount);
  216. ret.getTotal().setUnexistCount(totalUnScanned);
  217. ret.getTotal().setProgress(
  218. Calculator.percentage(ret.getTotal().getScannedCount(), ret.getTotal().getStudentCount(), 2));
  219. Integer count = batchPaperService.getScanStudentCount(examId, null, startTime, endTime);
  220. if (count == null || count == 0) {
  221. ret.getTotal().setEstimation("-");
  222. } else {
  223. ret.getTotal().setEstimation(
  224. Calculator.divide(Calculator.multiply(Calculator.divide(count, endTime - startTime),
  225. ret.getTotal().getUnexistCount()), 3600000) + "h");
  226. }
  227. }
  228. return ret;
  229. }
  230. @Override
  231. public List<SubjectBreachVo> breachList(Long examId) {
  232. List<SubjectBreachVo> ret = new ArrayList<>();
  233. List<SubjectEntity> subjects = listByExamId(examId);
  234. if (CollectionUtils.isNotEmpty(subjects)) {
  235. for (SubjectEntity e : subjects) {
  236. SubjectBreachVo vo = new SubjectBreachVo();
  237. ret.add(vo);
  238. vo.setSubjectCode(e.getCode());
  239. vo.setSubjectName(e.getName());
  240. String url = fileService.getBreachInfoUri(examId, e.getCode());
  241. try {
  242. if (fileStore.exist(url)) {
  243. vo.setBreachCount(Integer.valueOf(FileUtil.readFileContent(fileStore.read(url)).trim()));
  244. } else {
  245. vo.setBreachCount(0);
  246. }
  247. } catch (Exception e1) {
  248. throw new RuntimeException("文件访问异常", e1);
  249. }
  250. }
  251. }
  252. return ret;
  253. }
  254. @Override
  255. public List<SubjectCustStatusVo> custStatusList(Long examId) {
  256. List<SubjectCustStatusVo> ret = new ArrayList<>();
  257. List<SubjectEntity> subjects = listByExamId(examId);
  258. if (CollectionUtils.isNotEmpty(subjects)) {
  259. for (SubjectEntity e : subjects) {
  260. SubjectCustStatusVo vo = new SubjectCustStatusVo();
  261. ret.add(vo);
  262. vo.setSubjectCode(e.getCode());
  263. vo.setSubjectName(e.getName());
  264. String url = fileService.getCustStatusInfoUri(examId, e.getCode());
  265. try {
  266. if (fileStore.exist(url)) {
  267. vo.setCustStatusCount(Integer.valueOf(FileUtil.readFileContent(fileStore.read(url)).trim()));
  268. } else {
  269. vo.setCustStatusCount(0);
  270. }
  271. } catch (Exception e1) {
  272. throw new RuntimeException("文件访问异常", e1);
  273. }
  274. }
  275. }
  276. return ret;
  277. }
  278. @Override
  279. public TaskIdVo answerDataExport(Long examId, String subjectCode) {
  280. ExportCetMarkingQueryVo req = new ExportCetMarkingQueryVo();
  281. req.setExamId(examId);
  282. req.setSubjectCode(subjectCode);
  283. int scount = studentService.countCetMarking(req);
  284. if (scount == 0) {
  285. throw new StatusException("没有考生信息");
  286. }
  287. DataExportTaskVo vo = new DataExportTaskVo();
  288. vo.setTaskId(FastUUID.get());
  289. vo.setTotalCount(scount);
  290. vo.setExamId(examId);
  291. vo.setSubjectCode(subjectCode);
  292. vo.setSuccess(true);
  293. vo.setProgress(0.0);
  294. AnswerDataExportConsumer com = SpringContextHolder.getBean(AnswerDataExportConsumer.class);
  295. com.setVo(vo);
  296. exec.execute(com);
  297. asyncTaskService.addTask(vo);
  298. return TaskIdVo.create(vo.getTaskId());
  299. }
  300. @Override
  301. public TaskIdVo sliceDataExport(Long examId, String subjectCode) {
  302. ExportCetMarkingQueryVo req = new ExportCetMarkingQueryVo();
  303. req.setExamId(examId);
  304. req.setSubjectCode(subjectCode);
  305. int scount = studentService.countCetMarking(req);
  306. if (scount == 0) {
  307. throw new StatusException("没有考生信息");
  308. }
  309. DataExportTaskVo vo = new DataExportTaskVo();
  310. vo.setTaskId(FastUUID.get());
  311. vo.setTotalCount(scount);
  312. vo.setExamId(examId);
  313. vo.setSubjectCode(subjectCode);
  314. vo.setSuccess(true);
  315. vo.setProgress(0.0);
  316. SliceDataExportConsumer com = SpringContextHolder.getBean(SliceDataExportConsumer.class);
  317. com.setVo(vo);
  318. exec.execute(com);
  319. asyncTaskService.addTask(vo);
  320. return TaskIdVo.create(vo.getTaskId());
  321. }
  322. @Override
  323. public void answerDataExportDispose(DataExportTaskVo vo) {
  324. try {
  325. File temDir = new File("temp/" + FastUUID.get() + "/");
  326. temDir.mkdirs();
  327. File dbf = new File(temDir.getAbsolutePath() + "/answer-data.dbf");
  328. dbf.createNewFile();
  329. ExportCetMarkingQueryVo req = new ExportCetMarkingQueryVo();
  330. req.setExamId(vo.getExamId());
  331. req.setSubjectCode(vo.getSubjectCode());
  332. req.setPageSize(100000);
  333. int pageNumber = 0;
  334. req.setPageNumber(pageNumber);
  335. Set<String> examNumbers = new HashSet<>();
  336. Map<String, MarkSiteEntity> cms = readCetMarking(vo.getExamId(), vo.getSubjectCode());
  337. Map<String, String> breachMap = breachMap(vo.getExamId(), vo.getSubjectCode());
  338. Map<String, String> custStatusMap = custStatusMap(vo.getExamId(), vo.getSubjectCode());
  339. while (true) {
  340. req.setPageNumber(++pageNumber);
  341. List<ExportCetVo> list = studentService.exportCetData(req);
  342. if (CollectionUtils.isEmpty(list)) {
  343. break;
  344. }
  345. exportAnswer(examNumbers, breachMap, custStatusMap, dbf, list, cms, vo);
  346. }
  347. ExamEntity exam = examService.getById(vo.getExamId());
  348. SubjectEntity subejct = this.findByExamIdAndCode(vo.getExamId(), vo.getSubjectCode());
  349. vo.setFileName(subejct.getName() + "_" + exam.getScanSite() + "_OMR.dbf");
  350. vo.setFilePath(dbf.getAbsolutePath());
  351. } catch (StatusException e) {
  352. vo.setSuccess(false);
  353. vo.setErrMsg(e.getMessage());
  354. } catch (Exception e) {
  355. vo.setSuccess(false);
  356. vo.setErrMsg("系统异常");
  357. log.error("导出扫描答案DBF异常", e);
  358. }
  359. }
  360. private void exportAnswer(Set<String> examNumbers, Map<String, String> breachMap, Map<String, String> custStatusMap,
  361. File dbf, List<ExportCetVo> list, Map<String, MarkSiteEntity> cms, DataExportTaskVo vo)
  362. throws FileNotFoundException {
  363. FileOutputStream fos = null;
  364. DBFWriter writer = null;
  365. try {
  366. DBFField fields[] = new DBFField[11];
  367. fields[0] = new DBFField();
  368. fields[0].setName("Zkzh");
  369. fields[0].setType(DBFDataType.CHARACTER);
  370. fields[0].setLength(15);
  371. fields[1] = new DBFField();
  372. fields[1].setName("Xm");
  373. fields[1].setType(DBFDataType.CHARACTER);
  374. fields[1].setLength(30);
  375. fields[2] = new DBFField();
  376. fields[2].setName("Qk");
  377. fields[2].setType(DBFDataType.NUMERIC);
  378. fields[2].setLength(4);
  379. fields[3] = new DBFField();
  380. fields[3].setName("Km_h");
  381. fields[3].setType(DBFDataType.NUMERIC);
  382. fields[3].setLength(4);
  383. fields[4] = new DBFField();
  384. fields[4].setName("Smda");
  385. fields[4].setType(DBFDataType.CHARACTER);
  386. fields[4].setLength(100);
  387. fields[5] = new DBFField();
  388. fields[5].setName("Yc1");
  389. fields[5].setType(DBFDataType.NUMERIC);
  390. fields[5].setLength(4);
  391. fields[6] = new DBFField();
  392. fields[6].setName("Yc2");
  393. fields[6].setType(DBFDataType.NUMERIC);
  394. fields[6].setLength(4);
  395. fields[7] = new DBFField();
  396. fields[7].setName("Wi");
  397. fields[7].setType(DBFDataType.NUMERIC);
  398. fields[7].setLength(2);
  399. fields[8] = new DBFField();
  400. fields[8].setName("Barcode");
  401. fields[8].setType(DBFDataType.CHARACTER);
  402. fields[8].setLength(6);
  403. fields[9] = new DBFField();
  404. fields[9].setName("Pjd");
  405. fields[9].setType(DBFDataType.CHARACTER);
  406. fields[9].setLength(2);
  407. fields[10] = new DBFField();
  408. fields[10].setName("Kszt");
  409. fields[10].setType(DBFDataType.CHARACTER);
  410. fields[10].setLength(2);
  411. fos = new FileOutputStream(dbf);
  412. writer = new DBFWriter(fos, Charset.forName("gbk"));
  413. writer.setFields(fields);
  414. for (ExportCetVo data : list) {
  415. if (examNumbers.contains(data.getExamNumber())) {
  416. continue;
  417. }
  418. vo.setProgressCount(vo.getProgressCount() + 1);
  419. examNumbers.add(data.getExamNumber());
  420. Object[] rowData = new Object[11];
  421. rowData[0] = data.getExamNumber();
  422. rowData[1] = data.getName();
  423. if (ExamStatus.ABSENT.equals(data.getExamStatus())) {
  424. rowData[2] = 1;
  425. } else {
  426. rowData[2] = 0;
  427. }
  428. rowData[3] = getIntFromString(data.getSubjectCode());
  429. rowData[4] = data.getAnswer();
  430. rowData[5] = data.getCardFirst();
  431. rowData[6] = data.getCardSecond();
  432. String breach = breachMap.get(data.getExamNumber());
  433. rowData[7] = StringUtils.isBlank(breach) ? 0 : getIntFromString(breach);
  434. rowData[8] = data.getPaperType();
  435. int subjectCode = Integer.valueOf(data.getExamNumber().substring(9, 10));
  436. String markingCode;
  437. if (subjectCode >= 3 && subjectCode <= 9) {
  438. markingCode = "88";
  439. } else {
  440. if (ExamStatus.ABSENT.equals(data.getExamStatus()) || "000000".equals(data.getPaperType())
  441. || "999999".equals(data.getPaperType())) {
  442. markingCode = "00";
  443. } else {
  444. int site = Integer.valueOf(data.getExamNumber().substring(10, 13));
  445. MarkSiteEntity cm = cms.get(data.getSubjectCode() + "-" + data.getPaperType());
  446. if (cm == null) {
  447. throw new StatusException("未找到评卷点数据,SubjectCode:" + data.getSubjectCode() + " PaperType:"
  448. + data.getPaperType());
  449. }
  450. if (site % 2 == 0) {
  451. markingCode = cm.getEvenNumber();
  452. } else {
  453. markingCode = cm.getOddNumber();
  454. }
  455. }
  456. }
  457. rowData[9] = markingCode;
  458. String custStatus = custStatusMap.get(data.getExamNumber());
  459. rowData[10] = StringUtils.isBlank(custStatus) ? "0" : custStatus;
  460. writer.addRecord(rowData);
  461. }
  462. } finally {
  463. if (writer != null) {
  464. writer.close();
  465. }
  466. try {
  467. if (fos != null) {
  468. fos.close();
  469. }
  470. } catch (IOException e) {
  471. }
  472. }
  473. }
  474. private Map<String, String> breachMap(Long examId, String subjectCode) throws Exception {
  475. Map<String, String> ret = new HashMap<>();
  476. String path = fileService.getBreachUri(examId, subjectCode);
  477. if (fileStore.exist(path)) {
  478. List<String> list = IOUtils.readLines(fileStore.read(path), "utf-8");
  479. if (CollectionUtils.isNotEmpty(list)) {
  480. for (int i = 1; i < list.size(); i++) {
  481. String[] ss = list.get(i).split(",");
  482. ret.put(ss[0].trim(), ss[2].trim());
  483. }
  484. }
  485. }
  486. return ret;
  487. }
  488. private Map<String, String> custStatusMap(Long examId, String subjectCode) throws Exception {
  489. Map<String, String> ret = new HashMap<>();
  490. String path = fileService.getCustStatusUri(examId, subjectCode);
  491. if (fileStore.exist(path)) {
  492. List<String> list = IOUtils.readLines(fileStore.read(path), "utf-8");
  493. if (CollectionUtils.isNotEmpty(list)) {
  494. for (int i = 1; i < list.size(); i++) {
  495. String[] ss = list.get(i).split(",");
  496. ret.put(ss[0].trim(), ss[2].trim());
  497. }
  498. }
  499. }
  500. return ret;
  501. }
  502. private Integer getIntFromString(String v) {
  503. if (v == null) {
  504. return null;
  505. }
  506. return Integer.valueOf(v);
  507. }
  508. private Map<String, MarkSiteEntity> readCetMarking(Long examId, String subejctCode) {
  509. Map<String, MarkSiteEntity> ret = new HashMap<>();
  510. List<MarkSiteEntity> list = markSiteService.findByExamAndSubject(examId, subejctCode);
  511. if (CollectionUtils.isNotEmpty(list)) {
  512. for (MarkSiteEntity e : list) {
  513. ret.put(e.getPaperType(), e);
  514. }
  515. }
  516. return ret;
  517. }
  518. @Override
  519. public void sliceDataExportDispose(DataExportTaskVo vo) {
  520. try {
  521. File temDir = new File("temp/" + FastUUID.get() + "/");
  522. temDir.mkdirs();
  523. File dbf = new File(temDir.getAbsolutePath() + "/slice-data.dbf");
  524. dbf.createNewFile();
  525. ExportCetMarkingQueryVo req = new ExportCetMarkingQueryVo();
  526. req.setExamId(vo.getExamId());
  527. req.setSubjectCode(vo.getSubjectCode());
  528. req.setPageSize(100000);
  529. int pageNumber = 0;
  530. req.setPageNumber(pageNumber);
  531. Set<String> examNumbers = new HashSet<>();
  532. Map<String, MarkSiteEntity> cms = readCetMarking(vo.getExamId(), vo.getSubjectCode());
  533. while (true) {
  534. req.setPageNumber(++pageNumber);
  535. List<ExportCetVo> list = studentService.exportCetData(req);
  536. if (CollectionUtils.isEmpty(list)) {
  537. break;
  538. }
  539. exportSlice(examNumbers, dbf, list, cms, vo);
  540. }
  541. ExamEntity exam = examService.getById(vo.getExamId());
  542. vo.setFileName(exam.getScanSite() + "_" + vo.getTotalCount() + "_"
  543. + DateUtil.format(new Date(), DateUtil.DatePatterns.YYYYMMDDHH) + ".dbf");
  544. vo.setFilePath(dbf.getAbsolutePath());
  545. } catch (StatusException e) {
  546. vo.setSuccess(false);
  547. vo.setErrMsg(e.getMessage());
  548. } catch (Exception e) {
  549. vo.setSuccess(false);
  550. vo.setErrMsg("系统异常");
  551. log.error("导出打包DBF异常", e);
  552. }
  553. }
  554. private void exportSlice(Set<String> examNumbers, File dbf, List<ExportCetVo> list, Map<String, MarkSiteEntity> cms,
  555. DataExportTaskVo vo) throws FileNotFoundException {
  556. FileOutputStream fos = null;
  557. DBFWriter writer = null;
  558. try {
  559. DBFField fields[] = new DBFField[3];
  560. fields[0] = new DBFField();
  561. fields[0].setName("Zkzh");
  562. fields[0].setType(DBFDataType.CHARACTER);
  563. fields[0].setLength(15);
  564. fields[1] = new DBFField();
  565. fields[1].setName("Yjd");
  566. fields[1].setType(DBFDataType.CHARACTER);
  567. fields[1].setLength(2);
  568. fields[2] = new DBFField();
  569. fields[2].setName("Wjdx");
  570. fields[2].setType(DBFDataType.CHARACTER);
  571. fields[2].setLength(254);
  572. fos = new FileOutputStream(dbf);
  573. writer = new DBFWriter(fos, Charset.forName("gbk"));
  574. writer.setFields(fields);
  575. for (ExportCetVo data : list) {
  576. if (examNumbers.contains(data.getExamNumber())) {
  577. continue;
  578. }
  579. vo.setProgressCount(vo.getProgressCount() + 1);
  580. examNumbers.add(data.getExamNumber());
  581. String markingCode;
  582. if ("888888".equals(data.getPaperType())) {
  583. markingCode = "88";
  584. } else if (ExamStatus.ABSENT.equals(data.getExamStatus()) || "000000".equals(data.getPaperType())
  585. || "999999".equals(data.getPaperType())) {
  586. markingCode = "00";
  587. } else {
  588. int site = Integer.valueOf(data.getExamNumber().substring(10, 13));
  589. MarkSiteEntity cm = cms.get(data.getPaperType());
  590. if (cm == null) {
  591. throw new StatusException("未找到考点数据,PaperType:" + data.getPaperType());
  592. }
  593. if (site % 2 == 0) {
  594. markingCode = cm.getEvenNumber();
  595. } else {
  596. markingCode = cm.getOddNumber();
  597. }
  598. }
  599. Object[] rowData = new Object[3];
  600. rowData[0] = data.getExamNumber();
  601. rowData[1] = markingCode;
  602. rowData[2] = StringUtils.join(data.getSliceImageInfo(), ";") + ";";
  603. writer.addRecord(rowData);
  604. }
  605. } finally {
  606. if (writer != null) {
  607. writer.close();
  608. }
  609. try {
  610. if (fos != null) {
  611. fos.close();
  612. }
  613. } catch (IOException e) {
  614. }
  615. }
  616. }
  617. }