MesLaserController.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. package com.jeesite.modules.mes.web;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import javax.servlet.http.HttpServletRequest;
  6. import com.jeesite.common.lang.StringUtils;
  7. import com.jeesite.common.service.ServiceException;
  8. import com.jeesite.modules.mes.resp.CommonResp;
  9. import com.jeesite.modules.mes.service.MesLaserService;
  10. import org.springframework.beans.factory.annotation.Autowired;
  11. import org.springframework.stereotype.Controller;
  12. import org.springframework.web.bind.annotation.PostMapping;
  13. import org.springframework.web.bind.annotation.RequestMapping;
  14. import org.springframework.web.bind.annotation.RequestParam;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import com.jeesite.common.config.Global;
  17. import com.jeesite.common.web.BaseController;
  18. /**
  19. * 镭雕对接Controller(OP040)
  20. * MES客户端拿到镭雕软件回传的钢印码后,调用本接口生成并绑定21位客户编码。
  21. * @author hzd
  22. * @version 2026-07-08
  23. */
  24. @Controller
  25. @RequestMapping(value = "${adminPath}/mes/mesLaser")
  26. public class MesLaserController extends BaseController {
  27. @Autowired
  28. private MesLaserService mesLaserService;
  29. /**
  30. * 生成客户编码并与钢印码绑定
  31. * 请求参数(form):prodCode(T09/T68) steelSn(钢印码) oprno lineSn user
  32. * 返回 data:客户编码(21位)
  33. */
  34. @PostMapping(value = "genCustomerSn")
  35. @ResponseBody
  36. public CommonResp genCustomerSn(HttpServletRequest request) {
  37. CommonResp<String> resp = new CommonResp<>();
  38. String prodCode = request.getParameter("prodCode");
  39. String steelSn = request.getParameter("steelSn");
  40. String oprno = request.getParameter("oprno");
  41. String lineSn = request.getParameter("lineSn");
  42. String user = request.getParameter("user");
  43. if (StringUtils.isEmpty(prodCode) || StringUtils.isEmpty(steelSn)) {
  44. resp.setResult(Global.FALSE);
  45. resp.setMessage("参数错误:prodCode和steelSn不能为空");
  46. return resp;
  47. }
  48. try {
  49. String customerSn = mesLaserService.genAndBindCustomerSn(prodCode, steelSn, oprno, lineSn, user);
  50. resp.setData(customerSn);
  51. resp.setResult(Global.TRUE);
  52. resp.setMessage("生成成功");
  53. } catch (ServiceException e) {
  54. resp.setResult(Global.FALSE);
  55. resp.setMessage(e.getMessage());
  56. } catch (Exception e) {
  57. logger.error("生成客户编码失败:prodCode=" + prodCode + ", steelSn=" + steelSn, e);
  58. resp.setResult(Global.FALSE);
  59. resp.setMessage("生成失败:" + e.getMessage());
  60. }
  61. return resp;
  62. }
  63. /**
  64. * 解绑钢印码和客户码映射。客户码建档数据保留。
  65. * 请求参数(form):steelSn(钢印码) oprno lineSn
  66. * 返回 data:被解绑的客户码
  67. */
  68. @PostMapping(value = "unbindSteelSn")
  69. @ResponseBody
  70. public CommonResp unbindSteelSn(HttpServletRequest request) {
  71. CommonResp<String> resp = new CommonResp<>();
  72. String steelSn = request.getParameter("steelSn");
  73. String oprno = request.getParameter("oprno");
  74. String lineSn = request.getParameter("lineSn");
  75. if (StringUtils.isEmpty(steelSn)) {
  76. resp.setResult(Global.FALSE);
  77. resp.setMessage("参数错误:steelSn不能为空");
  78. return resp;
  79. }
  80. try {
  81. String customerSn = mesLaserService.unbindSteelSn(steelSn, oprno, lineSn);
  82. resp.setData(customerSn);
  83. resp.setResult(Global.TRUE);
  84. resp.setMessage("解绑成功,客户码:" + customerSn);
  85. } catch (ServiceException e) {
  86. resp.setResult(Global.FALSE);
  87. resp.setMessage(e.getMessage());
  88. } catch (Exception e) {
  89. logger.error("钢印码解绑失败:steelSn=" + steelSn, e);
  90. resp.setResult(Global.FALSE);
  91. resp.setMessage("解绑失败:" + e.getMessage());
  92. }
  93. return resp;
  94. }
  95. // ==== 新流程:PDA 提交 + OP40 客户端轮询打印 ====
  96. /**
  97. * PDA 端提交钢印码:服务端生成客户码,绑定并入待打印队列。
  98. * 请求参数(form):steelSn / prodCode
  99. * 返回 data.customerSn(21位客户码)
  100. * 说明:lineSn 和 user 由服务端固定填入(lineSn=T9,user=pda),PDA 端不用传。
  101. */
  102. @PostMapping(value = "submitSteelSn")
  103. @ResponseBody
  104. public CommonResp<Map<String, String>> submitSteelSn(HttpServletRequest request) {
  105. CommonResp<Map<String, String>> resp = new CommonResp<>();
  106. String steelSn = request.getParameter("steelSn");
  107. String prodCode = request.getParameter("prodCode");
  108. if (StringUtils.isEmpty(steelSn)) {
  109. resp.setResult(Global.FALSE);
  110. resp.setMessage("steelSn 不能为空");
  111. return resp;
  112. }
  113. if (StringUtils.isEmpty(prodCode)) {
  114. resp.setResult(Global.FALSE);
  115. resp.setMessage("prodCode 不能为空");
  116. return resp;
  117. }
  118. try {
  119. String customerSn = mesLaserService.submitSteelSn(prodCode, steelSn);
  120. Map<String, String> data = new HashMap<>();
  121. data.put("customerSn", customerSn);
  122. resp.setData(data);
  123. resp.setResult(Global.TRUE);
  124. resp.setMessage("提交成功");
  125. } catch (ServiceException e) {
  126. resp.setResult(Global.FALSE);
  127. resp.setMessage(e.getMessage());
  128. } catch (Exception e) {
  129. logger.error("PDA 提交钢印码失败:steelSn=" + steelSn, e);
  130. resp.setResult(Global.FALSE);
  131. resp.setMessage("提交失败:" + e.getMessage());
  132. }
  133. return resp;
  134. }
  135. /**
  136. * PDA 扫码打流转卡:把 steelSn 对应记录标记为拉铆待打印。
  137. * 请求参数(form):steelSn —— 内容可以是钢印码,也可以是软客户码(以 + 开头视为客户码)。
  138. * PDA 端不用改,后端根据内容自动路由到 steel_sn 或 customer_sn 查询。
  139. * 返回 data.rows = UPDATE 影响行数,0 表示未找到或状态不允许重复标记
  140. */
  141. @PostMapping(value = "markRvtPrint")
  142. @ResponseBody
  143. public CommonResp<Map<String, Object>> markRvtPrint(HttpServletRequest request) {
  144. CommonResp<Map<String, Object>> resp = new CommonResp<>();
  145. String steelSn = request.getParameter("steelSn");
  146. if (StringUtils.isEmpty(steelSn)) {
  147. resp.setResult(Global.FALSE);
  148. resp.setMessage("steelSn 不能为空");
  149. return resp;
  150. }
  151. // 自动判定:以 + 开头视为软客户码,否则按钢印码
  152. boolean byCustomer = steelSn.startsWith("+");
  153. String snType = byCustomer ? "客户码" : "钢印码";
  154. try {
  155. int rows = byCustomer
  156. ? mesLaserService.markRvtPrintByCustomerSn(steelSn)
  157. : mesLaserService.markRvtPrint(steelSn);
  158. Map<String, Object> data = new HashMap<>();
  159. data.put("rows", rows);
  160. resp.setData(data);
  161. if (rows > 0) {
  162. resp.setResult(Global.TRUE);
  163. resp.setMessage("已标记为拉铆待打印");
  164. } else {
  165. resp.setResult(Global.FALSE);
  166. resp.setMessage("未找到该" + snType + "或状态不允许重复标记:" + steelSn);
  167. }
  168. } catch (Exception e) {
  169. logger.error("markRvtPrint 失败:" + snType + "=" + steelSn, e);
  170. resp.setResult(Global.FALSE);
  171. resp.setMessage("标记失败:" + e.getMessage());
  172. }
  173. return resp;
  174. }
  175. /**
  176. * 拉铆打印代理客户端拉取待打印列表(FIFO,按创建时间升序)。
  177. * @param limit 单次条数上限,默认 10
  178. * @return data 列表元素含 customerSn / steelSn / prodCode / oprno / createDate
  179. */
  180. @RequestMapping(value = "pendingPrint")
  181. @ResponseBody
  182. public CommonResp<List<Map<String, Object>>> pendingPrint(
  183. @RequestParam(value = "limit", required = false, defaultValue = "10") int limit) {
  184. CommonResp<List<Map<String, Object>>> resp = new CommonResp<>();
  185. try {
  186. List<Map<String, Object>> list = mesLaserService.listPending(limit);
  187. resp.setData(list);
  188. resp.setResult(Global.TRUE);
  189. resp.setMessage("OK");
  190. } catch (Exception e) {
  191. logger.error("拉取待打印列表失败", e);
  192. resp.setResult(Global.FALSE);
  193. resp.setMessage("拉取失败:" + e.getMessage());
  194. }
  195. return resp;
  196. }
  197. /**
  198. * 拉铆打印代理上报打印结果。
  199. * 请求参数(form):customerSn / result=OK|NG / msg(失败原因,可选)
  200. * OK → rivet_print_status 1→2;NG → rivet_print_status 1→3。
  201. */
  202. @PostMapping(value = "printAck")
  203. @ResponseBody
  204. public CommonResp printAck(HttpServletRequest request) {
  205. CommonResp<String> resp = new CommonResp<>();
  206. String customerSn = request.getParameter("customerSn");
  207. String result = request.getParameter("result");
  208. String msg = request.getParameter("msg");
  209. if (StringUtils.isEmpty(customerSn)) {
  210. resp.setResult(Global.FALSE);
  211. resp.setMessage("customerSn 不能为空");
  212. return resp;
  213. }
  214. if (!"OK".equalsIgnoreCase(result) && !"NG".equalsIgnoreCase(result)) {
  215. resp.setResult(Global.FALSE);
  216. resp.setMessage("result 只能是 OK/NG");
  217. return resp;
  218. }
  219. try {
  220. int rows = mesLaserService.ackPrint(customerSn, result, msg);
  221. resp.setResult(Global.TRUE);
  222. resp.setMessage("ack 已接收,影响行数 " + rows);
  223. } catch (Exception e) {
  224. logger.error("打印结果 ack 失败:customerSn=" + customerSn, e);
  225. resp.setResult(Global.FALSE);
  226. resp.setMessage("ack 失败:" + e.getMessage());
  227. }
  228. return resp;
  229. }
  230. /**
  231. * 根据客户码查询钢印码(用于打印流转卡)
  232. * 请求参数(form):customerSn
  233. * 返回 data 为钢印码字符串
  234. */
  235. @PostMapping(value = "getSteelSn")
  236. @ResponseBody
  237. public CommonResp<Map<String, String>> getSteelSn(HttpServletRequest request) {
  238. CommonResp<Map<String, String>> resp = new CommonResp<>();
  239. String customerSn = request.getParameter("customerSn");
  240. if (StringUtils.isEmpty(customerSn)) {
  241. resp.setResult(Global.FALSE);
  242. resp.setMessage("customerSn 不能为空");
  243. return resp;
  244. }
  245. try {
  246. String steelSn = mesLaserService.getSteelSnByCustomerSn(customerSn);
  247. if (steelSn != null) {
  248. Map<String, String> data = new HashMap<>();
  249. data.put("steelSn", steelSn);
  250. resp.setData(data);
  251. resp.setResult(Global.TRUE);
  252. resp.setMessage("查询成功");
  253. } else {
  254. resp.setResult(Global.FALSE);
  255. resp.setMessage("未找到该客户码对应的钢印码");
  256. }
  257. } catch (Exception e) {
  258. logger.error("查询钢印码失败:customerSn=" + customerSn, e);
  259. resp.setResult(Global.FALSE);
  260. resp.setMessage("查询失败:" + e.getMessage());
  261. }
  262. return resp;
  263. }
  264. }