QrCodeService.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package co.dc.aptiv.service;
  2. import co.dc.aptiv.AptivApp;
  3. import co.dc.commons.basedao.CommonBaseDao;
  4. import co.dc.commons.utils.DateTimeUtil;
  5. import co.dc.aptiv.ScanFrame;
  6. import co.dc.aptiv.pojo.BillDetailPojo;
  7. import co.dc.aptiv.pojo.MaterielPojo;
  8. import org.apache.commons.dbutils.handlers.MapHandler;
  9. import org.apache.commons.logging.Log;
  10. import org.apache.commons.logging.LogFactory;
  11. import org.springframework.stereotype.Service;
  12. import javax.annotation.Resource;
  13. import java.sql.SQLException;
  14. import java.util.HashMap;
  15. import java.util.Map;
  16. /**
  17. * @describe: 二维码生成
  18. * @author: liuxinglong
  19. * @version: 2018/4/18 19:50
  20. */
  21. @Service("qrCodesService")
  22. public class QrCodeService {
  23. private ScanFrame scanFrame;
  24. @Resource(name = "commonBaseDao")
  25. private CommonBaseDao baseDao;
  26. private static final Log log = LogFactory.getLog(QrCodeService.class);
  27. protected String createDateTime = null;
  28. boolean isReCode = false;
  29. /**
  30. * 根据物料Id生成二维码
  31. *
  32. * @param materielId 物料Id
  33. * @return QR Code
  34. */
  35. public String generateQRCode(Long materielId) {
  36. createDateTime = DateTimeUtil.getDateTimeString();
  37. //当前日期
  38. String nowDate = createDateTime.substring(0, 10);
  39. //物料最后生产日期
  40. String lastDate = AptivApp.billDetailService.getLastDate(materielId);
  41. MaterielPojo materielPojo = AptivApp.materielService.findById(materielId);
  42. if (materielPojo == null) {
  43. log.info("物料不存在,无法生成码");
  44. return null;
  45. }
  46. /*lastDate == null || (nowDate - lastDate > 0) = 重置计数*/
  47. if (lastDate == null || (DateTimeUtil.compareDay(nowDate, lastDate) > 0)) {
  48. //重置计数
  49. materielPojo.setMaxNum(1);
  50. AptivApp.materielService.updateMaterielpojo(materielPojo);
  51. }
  52. //每天计数不能超过9999
  53. /*if (materielPojo.getMaxNum() > 9999) {
  54. return null;
  55. }*/
  56. String maxNum = materielPojo.getMaxNum() + "";
  57. //最大序号不足4位进行补位
  58. StringBuilder sb = new StringBuilder();
  59. for (int i = 0; i < 4 - maxNum.length(); i++) {
  60. sb.append("0");
  61. }
  62. maxNum = sb.toString() + maxNum;
  63. //更新物料序号
  64. AptivApp.materielService.updateMaterielpojoMaxNum(materielId);
  65. //物料编号+生产日期+(补位+最大序号)
  66. String code = materielPojo.getCpn() + " " + nowDate.replace("-", "").substring(2, 8) + maxNum;
  67. log.info("生成码 =" + code);
  68. return code;
  69. }
  70. /**
  71. * 将码发送到激光机
  72. */
  73. public int sendQrCode() {
  74. // if (AptivApp.flag && AptivApp.printStatus) {
  75. if (AptivApp.flag) {
  76. // AptivApp.printStatus = false;
  77. String code = generateQRCode(AptivApp.nowMaterielPojo.getId()).trim();
  78. if (code == null) {
  79. return 2;
  80. }
  81. AptivApp.qrCode = code;
  82. BillDetailPojo billDetailPojo = baseDao.findByParam(BillDetailPojo.class, "qrCode", AptivApp.qrCode);
  83. //不是重码才发往激光机打印,是重码提示管理员
  84. if (billDetailPojo == null) {
  85. getScanFrame().loadCode();
  86. //获取码并发送到激光机
  87. int status = AptivApp.printMina.sendByte(AptivApp.ccu.String2ASCII(AptivApp.nowMaterielPojo.getCpn() + AptivApp.nowMaterielPojo.getType() + AptivApp.qrCode));
  88. if (status > 0) {
  89. return status;
  90. }
  91. } else {
  92. log.error("生产出重码 =" + AptivApp.qrCode);
  93. getScanFrame().alertMsg(1, "生产出重码,请停止打印并联系管理员");
  94. }
  95. }
  96. return -1;
  97. }
  98. /**
  99. * 从采集器接收码并保存
  100. *
  101. * @param str
  102. */
  103. public void receiveQrCode(String str) {
  104. //设置扫描状态为不可扫描
  105. // AptivApp.scanStatus = false;
  106. //采集器未采到码
  107. if ("ERROR".equals(str)) {
  108. log.info("生产模式:采集器未采集到码");
  109. }
  110. //检查重码
  111. BillDetailPojo billDetailPojo = baseDao.findByParam(BillDetailPojo.class, "qrCode", str);
  112. boolean reCodeORFailed = billDetailPojo != null || (AptivApp.qrCode != null && !AptivApp.qrCode.equals(str));
  113. //重码或不合格返给采集器错误信号
  114. if (reCodeORFailed) {
  115. sendErrorCommand(billDetailPojo != null ? "生产模式:检测到重码!" : "生产模式:采集器采集到不合格的码");
  116. }
  117. //保存详情
  118. BillDetailPojo bdp = AptivApp.billDetailService.addBillDetail(AptivApp.billPojo.getId(), AptivApp.nowMaterielPojo.getId(), AptivApp.qrCode, str);
  119. getScanFrame().loadjtable1(bdp);
  120. //更新单据统计数据
  121. AptivApp.billService.updateBillStatistics(AptivApp.billPojo.getId(), bdp);
  122. log.info("成功保存码" + str);
  123. //设置打印状态为可打印
  124. // AptivApp.printStatus = true;
  125. //打印状态且非联机模式,重新发码
  126. if (AptivApp.flag && !getScanFrame().onLine) {
  127. int codeFlag = sendQrCode();
  128. if (codeFlag != 1) {
  129. log.info("发送码给激光机异常");
  130. getScanFrame().alertMsg(1, "生产码异常,请停止打印并联系管理员!");
  131. }
  132. }
  133. }
  134. /**
  135. * 统计当前日期打印总数
  136. *
  137. * @return
  138. */
  139. public Map<String, Object> countDayData() {
  140. String date = DateTimeUtil.getDateString();
  141. Map<String, Object> map = new HashMap<String, Object>(3);
  142. try {
  143. String sql = "SELECT SUM(number),sum(qualifiedNum),sum(UnqualifiedNum) FROM bill WHERE createTime BETWEEN '" + date + " 00:00:00' AND '" + date + " 23:59:59';";
  144. map = baseDao.query(sql, new MapHandler());
  145. log.info("统计当前日期打印总数" + map.toString());
  146. } catch (SQLException e) {
  147. log.error("统计当前日期打印总数异常:" + e);
  148. }
  149. return map;
  150. }
  151. public ScanFrame getScanFrame() {
  152. return scanFrame;
  153. }
  154. public void setScanFrame(ScanFrame scanFrame) {
  155. this.scanFrame = scanFrame;
  156. }
  157. /**
  158. * 检查重码
  159. * 判断是不是我们产的码
  160. * 不是我们产的码返给采集器错误信号
  161. * 是我们生产的那肯定是重码
  162. *
  163. * @return
  164. */
  165. public void checkReCode(String str) {
  166. //采到的码去找当前订单详情
  167. BillDetailPojo billDetailPojo = baseDao.findByParam(BillDetailPojo.class, "qrCode", str);
  168. sendErrorCommand(billDetailPojo == null ? "点检模式:检测到不是程序生产的码!" : "点检模式:检测到重码!");
  169. isReCode = billDetailPojo == null;
  170. javax.swing.SwingUtilities.invokeLater(new Runnable() {
  171. public void run() {
  172. getScanFrame().alertMsg(1, isReCode ? "检测到不是程序生产的码!" : "检测到重码!");
  173. }
  174. });
  175. }
  176. /**
  177. * 重置激光机的数据,以实现打印完就清空的效果
  178. * 目前不理想,二空格仍然会被识别成二维码,需要优化方案
  179. */
  180. public void resetLaserMachine() {
  181. //此处的33个空格是用来清空激光机上打过的最后一条数据
  182. AptivApp.printMina.sendByte(AptivApp.ccu.String2ASCII(" "));
  183. log.info("清空激光机保留的最后一条数据");
  184. }
  185. /**
  186. * 重码时返给采集器错误信号
  187. */
  188. public void sendErrorCommand(String errorMsg) {
  189. AptivApp.collectorMina.send("R");
  190. log.info(errorMsg);
  191. }
  192. }