MachineController.java 17 KB

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