MachineController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. package com.iamberry.rst.controllers.pts;
  2. import com.iamberry.rst.controllers.sys.SysController;
  3. import com.iamberry.rst.core.pts.*;
  4. import com.iamberry.rst.core.sys.SysConfig;
  5. import com.iamberry.rst.core.tools.QRCJson;
  6. import com.iamberry.rst.core.tools.WeixinUtil;
  7. import com.iamberry.rst.faces.pts.*;
  8. import com.iamberry.rst.faces.sys.SysConfigService;
  9. import com.iamberry.wechat.tools.*;
  10. import net.sf.json.JSONArray;
  11. import net.sf.json.JSONObject;
  12. import org.apache.shiro.authz.annotation.RequiresPermissions;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Controller;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.ResponseBody;
  19. import javax.servlet.http.HttpServletRequest;
  20. import java.text.ParseException;
  21. import java.text.SimpleDateFormat;
  22. import java.util.*;
  23. /**
  24. * Created by LJK on 2017/8/29.
  25. */
  26. @Controller
  27. @RequestMapping("/mcahine")
  28. public class MachineController {
  29. private static Logger logger = LoggerFactory.getLogger(MachineController.class);
  30. @Autowired
  31. private ProduceService produceService;
  32. @Autowired
  33. private MachineService machineService;
  34. @Autowired
  35. private DeviceService deviceService;
  36. @Autowired
  37. private PtsEmployeeService ptsEmployeeService;
  38. @Autowired
  39. private MachineLogsService machineLogsService;
  40. @Autowired
  41. private PtsBatchService ptsBatchService;
  42. @Autowired
  43. private MachineBarQrcode machineBarQrcode;
  44. @ResponseBody
  45. @RequestMapping("/uploadProcessOptions")
  46. public ResponseJson uploadProcessOptions(HttpServletRequest request) {
  47. ResponseJson rj = new ResponseJson();
  48. String nodeList = request.getParameter("nodeList");
  49. if (nodeList == null || "".equals(nodeList)) {
  50. return ResponseJson.getFAILURE();
  51. }
  52. // 转换json数据
  53. JSONObject query = JSONObject.fromObject(nodeList);
  54. // 员工id
  55. Integer employeeId = query.getInt("employeeId");
  56. // 产品编号
  57. String produceNo = query.getString("produceId");
  58. // NFCID(卡片id)
  59. String nfcId = query.getString("nfcId");
  60. // 选项集合(包含一个或多个工序选项,详情见示例)
  61. JSONArray nodes = query.getJSONArray("nodes");
  62. /**
  63. * 判断当前卡片的内容是否已经上传到服务器(卡片ID+时间戳)
  64. */
  65. JSONObject machineJsonObject = nodes.getJSONObject(0);
  66. PtsMachine machine = new PtsMachine();
  67. machine.setMachineNfcId(nfcId);
  68. machine.setMachineCreateTime(timeConversions(machineJsonObject.getString("logsProcessTime")));
  69. Integer ishave = machineService.getMachineIsHave(machine);
  70. if (ishave > 0) {
  71. rj.setResultCode(500);
  72. rj.setResultMsg("500");
  73. rj.setResultMsg("此卡片内容已生成二维码");
  74. return rj;
  75. }
  76. //根据产品编号获取产品信息
  77. Produce produce = produceService.getProduce(produceNo);
  78. /*根据员工id,获取拉线,再将拉线存入机器表 */
  79. PtsEmployee employee = new PtsEmployee();
  80. employee.setEmployeeId(employeeId);
  81. employee = ptsEmployeeService.getPtsEmployeeWebApp(employee);
  82. String employeeLine = employee.getEmployeeLine();
  83. /* 获取当前产品使用的批次 */
  84. PtsBatch ptsBatch = ptsBatchService.getUseBatch(produce.getProduceId());
  85. if (ptsBatch == null) {
  86. rj.setResultCode(500);
  87. rj.setResultMsg("500");
  88. rj.setResultMsg("系统中没有该产品正在使用的批次,请到管理平台完善");
  89. return rj;
  90. }
  91. // 生成条形码
  92. String berQrcode = machineBarQrcode.ctrBarCode(produce);
  93. // 判断是否需要二维码
  94. String qrcode = null;
  95. if (produce.getIsPrintQrcode() == 1) {
  96. if (produce.getIsGeneralQrcode() == 1) {
  97. // 使用通用的二维码
  98. qrcode = produce.getGeneralQrcode();
  99. } else {
  100. // 单独生成二维码
  101. WechatMp wechatMp = produceService.getWechatMpById(produce.getWechatMpId());
  102. String json = String.format(NameUtils.QR_LIMIT_STR_SCENE, ResultInfo.barCodePrefix + berQrcode);
  103. QRCJson qrc = WeixinUtil.createQrcodeByWechatMp(json,wechatMp.getWechatMpAppid(),wechatMp.getWechatMpAppsecret(),wechatMp.getWechatMpPubno());
  104. qrcode = qrc.getUrl();
  105. }
  106. }
  107. /*获取公众号信息*/
  108. PtsMachine ptsMachine = new PtsMachine();
  109. {
  110. //二维码
  111. ptsMachine.setMachineQrcode(qrcode);
  112. //条形码
  113. ptsMachine.setMachineBarcode(berQrcode);
  114. //机器状态
  115. ptsMachine.setMachineStatus(1);
  116. //生产时间
  117. ptsMachine.setMachineProducedTime(new Date());
  118. //是否打印1:未打印2:已打印
  119. ptsMachine.setMachineIsPrint(1);
  120. ptsMachine.setMachineCompoundImg("合成的图片url");
  121. //生成流程状态1.正常2.异常
  122. ptsMachine.setMachineProcessState(1);
  123. //创建时间
  124. ptsMachine.setMachineCreateTime(new Date());
  125. //产品类型
  126. ptsMachine.setMachineProduceType(produce.getProduceType());
  127. ptsMachine.setMachineNfcId(nfcId);
  128. ptsMachine.setMachineSoftwareVersion(ptsBatch.getBatchSoftwareVersionId());
  129. ptsMachine.setMachineProduceId(produce.getProduceId());
  130. //默认为0
  131. ptsMachine.setMachineBomId(0);
  132. //默认为0
  133. ptsMachine.setMachineBatchId(0);
  134. ptsMachine.setMachineIsRetreading(2);
  135. //拉线信息
  136. ptsMachine.setMachineLine(employeeLine);
  137. //批次id
  138. ptsMachine.setMachineBatchId(ptsBatch.getBatchId());
  139. //bom单id
  140. ptsMachine.setMachineBomId(ptsBatch.getBomId());
  141. machineService.addMachine(ptsMachine);
  142. }
  143. //状态是否异常
  144. boolean isAbnormality = true;
  145. List<PtsMachineLogs> ptsMachineLogsList = new ArrayList<PtsMachineLogs>();
  146. for (int i = 0; i < nodes.size(); i++) {
  147. PtsMachineLogs ptsMachineLogs = new PtsMachineLogs();
  148. JSONObject jsonObject = nodes.getJSONObject(i);
  149. //工序编号
  150. String processNo = jsonObject.getString("processId");
  151. //工序选项编号
  152. String nodeNo = jsonObject.getString("nodeId");
  153. //工序执行时间 (时间戳)
  154. String logsProcessTime = jsonObject.getString("logsProcessTime");
  155. Date logsProcessDate = timeConversions(logsProcessTime);
  156. ProduceProcess produceProcess = produceService.getProduceProcessAndNode(produce.getProduceId(), processNo);
  157. ProcessNode processNode = produceService.getprocessNode(produceProcess.getProcessId(), nodeNo);
  158. String deviceName = produceProcess.getDeviceName();
  159. String employeeName = produceProcess.getEmployeeName();
  160. if (deviceName == null) {
  161. String processName = produceProcess.getProcessName();
  162. rj.setResultCode(500);
  163. rj.setResultMsg("500");
  164. rj.setResultMsg("\"" + processName + "\"工序的打卡设备未完善,请到管理平台完善");
  165. return rj;
  166. }
  167. if (employeeName == null) {
  168. String processName = produceProcess.getProcessName();
  169. rj.setResultCode(500);
  170. rj.setResultMsg("500");
  171. rj.setResultMsg("\"" + processName + "\"工序的员工信息未完善,请到管理平台完善");
  172. return rj;
  173. }
  174. ptsMachineLogs.setDeviceId(produceProcess.getDriveId());
  175. ptsMachineLogs.setEmployeeId(produceProcess.getEmployeeId());
  176. ptsMachineLogs.setProduceId(produce.getProduceId());
  177. ptsMachineLogs.setProcessId(produceProcess.getProcessId());
  178. ptsMachineLogs.setMachineId(ptsMachine.getMachineId());
  179. ptsMachineLogs.setEmployeeName(employeeName);
  180. ptsMachineLogs.setProduceName(produce.getProduceName());
  181. ptsMachineLogs.setProcessName(produceProcess.getProcessName());
  182. ptsMachineLogs.setDeviceName(deviceName);
  183. ptsMachineLogs.setProcessNodeId(processNode.getNodeId());
  184. ptsMachineLogs.setProcessNodeName(processNode.getNodeDes());
  185. if (i == 0) {
  186. //如果当前循环的是第一条数据则排序必须是1,否则为异常
  187. if (produceProcess.getProcessSort() == 1) {
  188. if (processNode.getNodeStatus() == 0) {
  189. //工序选项状态为异常则机器表状态也是异常
  190. isAbnormality = false;
  191. }
  192. ptsMachineLogs.setLogsProcessStatus(processNode.getNodeStatus());
  193. } else {
  194. ptsMachineLogs.setLogsProcessStatus(0);
  195. isAbnormality = false;
  196. }
  197. } else {
  198. //默认为正常
  199. ptsMachineLogs.setLogsProcessStatus(processNode.getNodeStatus());
  200. }
  201. ptsMachineLogs.setLogsProcessPrompt(processNode.getNodeStatus() == 0 ? "检查不通过" : null);
  202. ptsMachineLogs.setLogsProcessTime(logsProcessDate);
  203. ptsMachineLogs.setLogsCreateTime(new Date());
  204. //根据上一条工序选项信息判断当前工序是否正常,如果当前为修理工序则忽略,如果上一条为修理工序则查询上上一条
  205. if (i > 0) {
  206. int num = 0;
  207. // 当前工序的上一条非修理工序
  208. ProduceProcess produceProcess2 = null;
  209. //上一级工序信息
  210. JSONObject jsonObject2;
  211. //上一级工序编号
  212. String processNo2 = null;
  213. //先判断当前的上一次是否是修理工序,如果不是则不用执行下面的循环,否则需要循环判断
  214. jsonObject2 = nodes.getJSONObject(i - 1);
  215. if (jsonObject2 != null) {
  216. processNo2 = jsonObject2.getString("processId");
  217. produceProcess2 = produceService.getProduceProcess(produce.getProduceId(), processNo2);
  218. //判断当前工序是否是修理工序,如果是,则修改上一条为次品
  219. if (produceProcess.getProcessType() == 2) {
  220. //异常类型 1:流程异常 2:次品异常
  221. ptsMachineLogsList.get(ptsMachineLogsList.size()-1).setLogsErrorType(2);
  222. ptsMachineLogsList.get(ptsMachineLogsList.size()-1).setLogsProcessPrompt("次品异常");
  223. isAbnormality = false;
  224. ptsMachineLogs.setLogsId(null);
  225. ptsMachineLogs.setLogsErrorType(null);
  226. ptsMachineLogs.setLogsProcessPrompt(null);
  227. } else {
  228. //判断是否是修理工序 1:生产工序 2:修理工序
  229. if (produceProcess2.getProcessType() == 1) {
  230. if (produceProcess.getProcessSort() - produceProcess2.getProcessSort() != 1) {
  231. ptsMachineLogs.setLogsProcessStatus(0);
  232. //异常类型 1:流程异常 2:次品异常
  233. ptsMachineLogs.setLogsErrorType(1);
  234. ptsMachineLogs.setLogsProcessPrompt("流程异常");
  235. isAbnormality = false;
  236. }
  237. } else {
  238. for (int j = i - 1; j <= i - 1; j--) {
  239. if (num == i) {
  240. break;//只能循环 i 次,超出则跳出当前循环
  241. }
  242. jsonObject2 = nodes.getJSONObject(j);
  243. if (jsonObject2 != null) {
  244. processNo2 = jsonObject2.getString("processId");
  245. produceProcess2 = produceService.getProduceProcess(produce.getProduceId(), processNo2);
  246. if (produceProcess2.getProcessType() == 1) {
  247. //判断是否是修理工序 1:生产工序 2:修理工序
  248. if (produceProcess.getProcessSort() > produceProcess2.getProcessSort()) {
  249. ptsMachineLogs.setLogsProcessStatus(0);
  250. //异常类型 1:流程异常 2:次品异常
  251. ptsMachineLogs.setLogsErrorType(1);
  252. ptsMachineLogs.setLogsProcessPrompt("流程异常");
  253. isAbnormality = false;
  254. }
  255. break;
  256. }
  257. }
  258. num++;
  259. }
  260. }
  261. }
  262. }
  263. }
  264. //执行添加日志操作
  265. ptsMachineLogsList.add(ptsMachineLogs);
  266. //还原为默认值
  267. ptsMachineLogs.setLogsErrorType(null);
  268. }
  269. machineLogsService.addMachineLogs(ptsMachineLogsList);
  270. //修改机器信息
  271. PtsMachine ptsMachine2 = new PtsMachine();
  272. ptsMachine2.setMachineId(ptsMachine.getMachineId());
  273. if (!isAbnormality) {
  274. //2表示机器生产过程中出现异常
  275. ptsMachine2.setMachineProcessState(2);
  276. }
  277. ptsMachine2.setMachineUpdateTime(new Date());
  278. ptsMachine2.setMachineProduceId(produce.getProduceId());
  279. machineService.updateMachine(ptsMachine2);
  280. //截取条形码尾号(4位)
  281. rj.addResponseKeyValue("barcodeTail", berQrcode.substring(berQrcode.length() - 4, berQrcode.length()));
  282. return rj;
  283. }
  284. private static Date timeConversions(String time) {
  285. if (time == null || time.equals("")) {
  286. return new Date();
  287. }
  288. //08311112
  289. Calendar date = Calendar.getInstance();
  290. String year = String.valueOf(date.get(Calendar.YEAR));//年
  291. String months = null;//月
  292. String sky = null;//天
  293. String when = null;//时
  294. String subdivision = null;//分
  295. months = time.substring(0, 2);
  296. sky = time.substring(2, 4);
  297. when = time.substring(4, 6);
  298. subdivision = time.substring(6, 8);
  299. time = year + "-" + months + "-" + sky + " " + when + ":" + subdivision;
  300. Date dates = new Date();
  301. try {
  302. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");
  303. dates = sdf.parse(time);
  304. } catch (ParseException e) {
  305. System.out.println(e.getMessage());
  306. }
  307. return dates;
  308. }
  309. /**
  310. * 根据barcode查询机器信息(电动牙刷项目也调用此功能)
  311. * @param request
  312. * @return
  313. */
  314. @ResponseBody
  315. @RequestMapping("/getMachineInfo")
  316. public RespJsonBean getMachineInfo(HttpServletRequest request) {
  317. RespJsonBean rsj = new RespJsonBean();
  318. String barCode = request.getParameter("barCode");
  319. if (barCode == null || barCode.equals("")) {
  320. return null;
  321. }
  322. PtsMachine ptsMachine = machineService.getMachineByBarCode(barCode);
  323. if(ptsMachine != null){
  324. rsj.addResponseKeyValue("isBeing",1);
  325. rsj.addResponseKeyValue("productType",ptsMachine.getMachineProduceType() == 1?"净水机":"冲奶机");
  326. rsj.addResponseKeyValue("producedTime",ptsMachine.getMachineProducedTime() == null?null:ptsMachine.getMachineProducedTime().getTime());
  327. rsj.addResponseKeyValue("productId",ptsMachine.getMachineProduceId());//产品id
  328. /*rsj.addResponseKeyValue("producePattern",ptsMachine.getProducePattern());//产品型号前俩位
  329. rsj.addResponseKeyValue("produceModel",ptsMachine.getProduceModel());//产品型号后俩位
  330. rsj.addResponseKeyValue("produceName",ptsMachine.getProduceName());//产品名*/
  331. }else{
  332. rsj.addResponseKeyValue("isBeing",2);
  333. }
  334. return rsj;
  335. }
  336. /**
  337. * 查询所有牙刷信息(电动牙刷项目也调用此功能)
  338. * @param request
  339. * @return
  340. */
  341. @ResponseBody
  342. @RequestMapping("/listToothInfo")
  343. public RespJsonBean listToothInfo(HttpServletRequest request) {
  344. RespJsonBean rsj = new RespJsonBean();
  345. List<Produce> produce = produceService.listToothInfo();
  346. if(produce != null){
  347. rsj.setResultCode(200);
  348. rsj.addResponseKeyValue("produce",produce);
  349. }else{
  350. rsj.setResultCode(500);
  351. }
  352. return rsj;
  353. }
  354. }