MesOrderSnController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. package com.jeesite.modules.mes.web;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.List;
  5. import java.util.Map;
  6. import javax.servlet.http.HttpServletRequest;
  7. import javax.servlet.http.HttpServletResponse;
  8. import com.jeesite.common.lang.ObjectUtils;
  9. import com.jeesite.common.lang.StringUtils;
  10. import com.jeesite.modules.erp.entity.MesProductOrder;
  11. import com.jeesite.modules.erp.service.MesProductOrderService;
  12. import com.jeesite.modules.mes.entity.MesLine;
  13. import com.jeesite.modules.mes.entity.MesProduct;
  14. import com.jeesite.modules.mes.resp.BindMaterialResp;
  15. import com.jeesite.modules.mes.resp.CommonResp;
  16. import com.jeesite.modules.mes.resp.ParamsResp;
  17. import com.jeesite.modules.mes.service.MesLineProcessMaterialService;
  18. import com.jeesite.modules.mes.service.MesLineService;
  19. import com.jeesite.modules.mes.service.MesProductRecordService;
  20. import com.jeesite.modules.mes.service.MesProductService;
  21. import com.jeesite.modules.sys.entity.User;
  22. import com.jeesite.modules.sys.utils.UserUtils;
  23. import com.jeesite.modules.utils.ErrorMsg;
  24. import org.apache.shiro.authz.annotation.RequiresPermissions;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.context.annotation.Lazy;
  27. import org.springframework.stereotype.Controller;
  28. import org.springframework.transaction.annotation.Transactional;
  29. import org.springframework.transaction.interceptor.TransactionAspectSupport;
  30. import org.springframework.ui.Model;
  31. import org.springframework.validation.annotation.Validated;
  32. import org.springframework.web.bind.annotation.ModelAttribute;
  33. import org.springframework.web.bind.annotation.PostMapping;
  34. import org.springframework.web.bind.annotation.RequestMapping;
  35. import org.springframework.web.bind.annotation.ResponseBody;
  36. import com.jeesite.common.config.Global;
  37. import com.jeesite.common.entity.Page;
  38. import com.jeesite.common.lang.DateUtils;
  39. import com.jeesite.common.mybatis.mapper.query.QueryType;
  40. import com.jeesite.common.utils.excel.ExcelExport;
  41. import com.jeesite.common.web.BaseController;
  42. import com.jeesite.modules.mes.entity.MesOrderSn;
  43. import com.jeesite.modules.mes.service.MesOrderSnService;
  44. /**
  45. * 生产订单工件表Controller
  46. * @author sxl
  47. * @version 2026-07-18
  48. */
  49. @Controller
  50. @RequestMapping(value = "${adminPath}/mes/mesOrderSn")
  51. public class MesOrderSnController extends BaseController {
  52. @Autowired
  53. private MesOrderSnService mesOrderSnService;
  54. @Autowired
  55. private MesProductOrderService mesProductOrderService;
  56. @Autowired
  57. private MesProductService mesProductService;
  58. @Autowired
  59. private MesLineService mesLineService;
  60. @Autowired
  61. private MesProductRecordService mesProductRecordService;
  62. @Autowired
  63. private MesLineProcessMaterialService mesLineProcessMaterialService;
  64. @Lazy
  65. @Autowired
  66. private MesProductRecordController mesProductRecordController;
  67. /**
  68. * 获取数据
  69. */
  70. @ModelAttribute
  71. public MesOrderSn get(String id, boolean isNewRecord) {
  72. return mesOrderSnService.get(id, isNewRecord);
  73. }
  74. /**
  75. * 查询列表
  76. */
  77. @RequiresPermissions("mes:mesOrderSn:view")
  78. @RequestMapping(value = {"list", ""})
  79. public String list(MesOrderSn mesOrderSn, Model model) {
  80. model.addAttribute("mesOrderSn", mesOrderSn);
  81. return "modules/mes/mesOrderSnList";
  82. }
  83. /**
  84. * 查询列表数据
  85. */
  86. @RequiresPermissions("mes:mesOrderSn:view")
  87. @RequestMapping(value = "listData")
  88. @ResponseBody
  89. public Page<MesOrderSn> listData(MesOrderSn mesOrderSn, HttpServletRequest request, HttpServletResponse response) {
  90. mesOrderSn.setPage(new Page<>(request, response));
  91. Page<MesOrderSn> page = mesOrderSnService.findPage(mesOrderSn);
  92. return page;
  93. }
  94. /**
  95. * 导出数据
  96. */
  97. @RequiresPermissions("mes:mesOrderSn:view")
  98. @RequestMapping(value = "exportData")
  99. public void exportData(MesOrderSn mesOrderSn, HttpServletResponse response) {
  100. mesOrderSn.setPage(null);
  101. List<MesOrderSn> list = mesOrderSnService.findList(mesOrderSn);
  102. String fileName = "生产订单工件表" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
  103. try (ExcelExport ee = new ExcelExport("生产订单工件表", MesOrderSn.class)) {
  104. ee.setDataList(list).write(response, fileName);
  105. }
  106. }
  107. /**
  108. * 查看编辑表单
  109. */
  110. @RequiresPermissions("mes:mesOrderSn:view")
  111. @RequestMapping(value = "form")
  112. public String form(MesOrderSn mesOrderSn, Model model) {
  113. model.addAttribute("mesOrderSn", mesOrderSn);
  114. return "modules/mes/mesOrderSnForm";
  115. }
  116. /**
  117. * 保存数据
  118. */
  119. @RequiresPermissions("mes:mesOrderSn:edit")
  120. @PostMapping(value = "save")
  121. @ResponseBody
  122. public String save(@Validated MesOrderSn mesOrderSn) {
  123. mesOrderSnService.save(mesOrderSn);
  124. return renderResult(Global.TRUE, text("保存生产订单工件表成功!"));
  125. }
  126. /**
  127. * 删除数据
  128. */
  129. @RequiresPermissions("mes:mesOrderSn:edit")
  130. @RequestMapping(value = "delete")
  131. @ResponseBody
  132. public String delete(MesOrderSn mesOrderSn) {
  133. mesOrderSnService.delete(mesOrderSn);
  134. return renderResult(Global.TRUE, text("删除生产订单工件表成功!"));
  135. }
  136. /**
  137. * 生产订单绑定工件码(OP100 工位质量校验通过后方可绑定;绑定成功后提交 OP100 工位结果为 OK)
  138. * @param mesOrderSn
  139. * @return
  140. */
  141. @RequestMapping(value = "bandSn")
  142. @ResponseBody
  143. @Transactional
  144. public String bandSn(MesOrderSn mesOrderSn) {
  145. if (mesOrderSn == null || StringUtils.isBlank(mesOrderSn.getOrderId())) {
  146. return renderResult(Global.FALSE, text("订单编码不能为空!"));
  147. }
  148. if (StringUtils.isBlank(mesOrderSn.getSn())) {
  149. return renderResult(Global.FALSE, text("工件码不能为空!"));
  150. }
  151. String sn = mesOrderSn.getSn();
  152. // 判定工件是否存在,并解析产线编号(质量校验需要 lineSn)
  153. MesProduct mesProductQuery = new MesProduct();
  154. mesProductQuery.setSn(sn);
  155. List<MesProduct> productList = mesProductService.findList(mesProductQuery);
  156. if (productList == null || productList.isEmpty() || ObjectUtils.isEmpty(productList.get(0))) {
  157. return renderResult(Global.FALSE, text("工件不存在!"));
  158. }
  159. MesProduct mesProduct = productList.get(0);
  160. MesLine mesLine = new MesLine();
  161. mesLine.setProductCate(mesProduct.getCate());
  162. mesLine.setStatus("0");
  163. MesLine lineInfo = mesLineService.findInfo(mesLine);
  164. if (ObjectUtils.isEmpty(lineInfo) || StringUtils.isEmpty(lineInfo.getSn())) {
  165. return renderResult(Global.FALSE, text("产线信息不存在!"));
  166. }
  167. String lineSn = lineInfo.getSn();
  168. // OP100 质量校验(按子工位 OP100A);允许本工位已加工(OK/NG)时仍可绑定订单
  169. String userCode = "";
  170. User user = UserUtils.getUser();
  171. if (user != null && StringUtils.isNotEmpty(user.getUserCode())) {
  172. userCode = user.getUserCode();
  173. }
  174. String ret = mesProductRecordController.checkQualityCommon("OP100A", sn, lineSn, userCode);
  175. String checkret = ret.substring(3, 5);
  176. if (!"UD".equals(checkret) && !"OK".equalsIgnoreCase(checkret) && !"NG".equalsIgnoreCase(checkret)) {
  177. String lx = ret.substring(0, 3);
  178. return renderResult(Global.FALSE, text(ErrorMsg.getErrorMsg(checkret, lx)));
  179. }
  180. MesOrderSn query = new MesOrderSn();
  181. query.setSn(sn);
  182. List<MesOrderSn> list = mesOrderSnService.findList(query);
  183. if(!list.isEmpty()){
  184. return renderResult(Global.FALSE, text("该工件已和生产订单绑定!"));
  185. }
  186. // 校验已绑定数量是否已达订单生产数量,相同则不允许再绑定
  187. MesProductOrder orderQuery = new MesProductOrder();
  188. orderQuery.setSn(mesOrderSn.getOrderId());
  189. List<MesProductOrder> orderList = mesProductOrderService.findList(orderQuery);
  190. if (orderList == null || orderList.isEmpty() || ObjectUtils.isEmpty(orderList.get(0))) {
  191. return renderResult(Global.FALSE, text("生产订单不存在!"));
  192. }
  193. Integer orderNums = orderList.get(0).getNums();
  194. if (orderNums == null) {
  195. return renderResult(Global.FALSE, text("生产订单数量未配置!"));
  196. }
  197. MesOrderSn boundQuery = new MesOrderSn();
  198. boundQuery.setOrderId(mesOrderSn.getOrderId());
  199. long boundCount = mesOrderSnService.findCount(boundQuery);
  200. if (boundCount >= orderNums) {
  201. return renderResult(Global.FALSE, text("该订单已绑定数量已达生产数量,不允许再绑定!"));
  202. }
  203. try {
  204. mesOrderSnService.save(mesOrderSn);
  205. // 绑定成功后,将 OP100 工位结果提交为 OK
  206. List<ParamsResp> params = new ArrayList<>();
  207. List<BindMaterialResp> bmlists = mesLineProcessMaterialService.getBindMaterial("OP100A", lineSn);
  208. mesProductRecordService.updateRecordResult(sn, "OP100A", "100000", mesOrderSn.getOrderId(), "OK",
  209. userCode, params, lineSn, true, bmlists, null);
  210. } catch (Exception e) {
  211. TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
  212. return renderResult(Global.FALSE, text(StringUtils.isNotEmpty(e.getMessage()) ? e.getMessage() : "操作失败!"));
  213. }
  214. return renderResult(Global.TRUE, text("保存成功!"));
  215. }
  216. /**
  217. * 根据工件码判断是否已在生产订单工件表中存在
  218. * @param sn 工件码
  219. * @return result=true 表示已存在,false 表示不存在
  220. */
  221. @RequestMapping(value = "existBySn")
  222. @ResponseBody
  223. public String existBySn(String sn) {
  224. if (StringUtils.isBlank(sn)) {
  225. return renderResult(Global.FALSE, text("工件码不能为空!"));
  226. }
  227. MesOrderSn query = new MesOrderSn();
  228. query.setSn(sn);
  229. if (mesOrderSnService.findCount(query) > 0) {
  230. return renderResult(Global.TRUE, text("该工件码已存在!"));
  231. }
  232. return renderResult(Global.FALSE, text("该工件码不存在!"));
  233. }
  234. /**
  235. * 生产订单列表
  236. * @param mesProductOrder
  237. * @return
  238. */
  239. @RequestMapping(value = "orderList")
  240. @ResponseBody
  241. public CommonResp<List<Map<String, Object>>> orderList(MesProductOrder mesProductOrder) {
  242. CommonResp<List<Map<String, Object>>> resp = new CommonResp<>();
  243. //展示所有未结束的订单(产线编号以 B0110 开头)
  244. mesProductOrder.setState("1");//0=草稿 1=下发 2=完成
  245. mesProductOrder.getSqlMap().getWhere().and("a.line_sn", QueryType.RIGHT_LIKE, "B0110");
  246. List<MesProductOrder> list = mesProductOrderService.findList(mesProductOrder);
  247. List<Map<String, Object>> data = new ArrayList<>();
  248. for (MesProductOrder order : list) {
  249. Map<String, Object> item = new HashMap<>();
  250. item.put("orderId", order.getSn());
  251. MesOrderSn query = new MesOrderSn();
  252. query.setOrderId(order.getSn());
  253. item.put("qty", mesOrderSnService.findCount(query));
  254. data.add(item);
  255. }
  256. resp.setData(data);
  257. resp.setResult(Global.TRUE);
  258. resp.setMessage("操作成功!");
  259. return resp;
  260. }
  261. }