MesMaterialRkController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. package com.jeesite.modules.mes.web;
  2. import java.text.ParseException;
  3. import java.util.Date;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. import com.alibaba.fastjson.JSONArray;
  10. import com.alibaba.fastjson.JSONObject;
  11. import com.jeesite.common.lang.DateUtils;
  12. import com.jeesite.common.lang.StringUtils;
  13. import com.jeesite.modules.mes.entity.MesMaterial;
  14. import com.jeesite.modules.mes.resp.CommonResp;
  15. import com.jeesite.modules.mes.service.MesMaterialService;
  16. import com.jeesite.modules.mes.util.U9cAuthUtil;
  17. import com.jeesite.modules.utils.DateLocalUtils;
  18. import org.apache.shiro.authz.annotation.RequiresPermissions;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.ui.Model;
  22. import org.springframework.validation.annotation.Validated;
  23. import org.springframework.web.bind.annotation.ModelAttribute;
  24. import org.springframework.web.bind.annotation.PostMapping;
  25. import org.springframework.web.bind.annotation.RequestMapping;
  26. import org.springframework.web.bind.annotation.ResponseBody;
  27. import com.jeesite.common.config.Global;
  28. import com.jeesite.common.entity.Page;
  29. import com.jeesite.common.web.BaseController;
  30. import com.jeesite.modules.mes.entity.MesMaterialRk;
  31. import com.jeesite.modules.mes.service.MesMaterialRkService;
  32. /**
  33. * 采购入库单Controller
  34. * @author sxl
  35. * @version 2026-06-23
  36. */
  37. @Controller
  38. @RequestMapping(value = "${adminPath}/mes/mesMaterialRk")
  39. public class MesMaterialRkController extends BaseController {
  40. @Autowired
  41. private MesMaterialRkService mesMaterialRkService;
  42. @Autowired
  43. private MesMaterialService mesMaterialService;
  44. /**
  45. * 获取数据
  46. */
  47. @ModelAttribute
  48. public MesMaterialRk get(String id, boolean isNewRecord) {
  49. return mesMaterialRkService.get(id, isNewRecord);
  50. }
  51. /**
  52. * 查询列表
  53. */
  54. @RequiresPermissions("mes:mesMaterialRk:view")
  55. @RequestMapping(value = {"list", ""})
  56. public String list(MesMaterialRk mesMaterialRk, Model model) {
  57. model.addAttribute("mesMaterialRk", mesMaterialRk);
  58. return "modules/mes/mesMaterialRkList";
  59. }
  60. /**
  61. * 查询列表数据
  62. */
  63. @RequiresPermissions("mes:mesMaterialRk:view")
  64. @RequestMapping(value = "listData")
  65. @ResponseBody
  66. public Page<MesMaterialRk> listData(MesMaterialRk mesMaterialRk, HttpServletRequest request, HttpServletResponse response) {
  67. mesMaterialRk.setPage(new Page<>(request, response));
  68. Page<MesMaterialRk> page = mesMaterialRkService.findPage(mesMaterialRk);
  69. return page;
  70. }
  71. /**
  72. * 查看编辑表单
  73. */
  74. @RequiresPermissions("mes:mesMaterialRk:view")
  75. @RequestMapping(value = "form")
  76. public String form(MesMaterialRk mesMaterialRk, Model model) {
  77. model.addAttribute("mesMaterialRk", mesMaterialRk);
  78. return "modules/mes/mesMaterialRkForm";
  79. }
  80. /**
  81. * 保存数据
  82. */
  83. @RequiresPermissions("mes:mesMaterialRk:edit")
  84. @PostMapping(value = "save")
  85. @ResponseBody
  86. public String save(@Validated MesMaterialRk mesMaterialRk) {
  87. mesMaterialRkService.save(mesMaterialRk);
  88. return renderResult(Global.TRUE, text("保存采购入库单成功!"));
  89. }
  90. /**
  91. * 停用数据
  92. */
  93. @RequiresPermissions("mes:mesMaterialRk:edit")
  94. @RequestMapping(value = "disable")
  95. @ResponseBody
  96. public String disable(MesMaterialRk mesMaterialRk) {
  97. mesMaterialRk.setStatus(MesMaterialRk.STATUS_DISABLE);
  98. mesMaterialRkService.updateStatus(mesMaterialRk);
  99. return renderResult(Global.TRUE, text("停用采购入库单成功"));
  100. }
  101. /**
  102. * 启用数据
  103. */
  104. @RequiresPermissions("mes:mesMaterialRk:edit")
  105. @RequestMapping(value = "enable")
  106. @ResponseBody
  107. public String enable(MesMaterialRk mesMaterialRk) {
  108. mesMaterialRk.setStatus(MesMaterialRk.STATUS_NORMAL);
  109. mesMaterialRkService.updateStatus(mesMaterialRk);
  110. return renderResult(Global.TRUE, text("启用采购入库单成功"));
  111. }
  112. /**
  113. * 删除数据
  114. */
  115. @RequiresPermissions("mes:mesMaterialRk:edit")
  116. @RequestMapping(value = "delete")
  117. @ResponseBody
  118. public String delete(MesMaterialRk mesMaterialRk) {
  119. mesMaterialRkService.delete(mesMaterialRk);
  120. return renderResult(Global.TRUE, text("删除采购入库单成功!"));
  121. }
  122. /**
  123. * 解析来料编码
  124. * 格式:ERP代码,采购订单号,采购订单行号,料号,生产日期,生产批次,批次数量
  125. * 样例:S-00015,LJR-PO2606030001,10,D3503-000001,20260608,26060001,1000
  126. */
  127. // @RequiresPermissions("mes:mesMaterialRk:api")
  128. @RequestMapping(value = "jxCode")
  129. @ResponseBody
  130. public CommonResp jxCode(HttpServletRequest req) {
  131. String materialCode = req.getParameter("materialCode");
  132. CommonResp<Map<String, Object>> resp = new CommonResp<>();
  133. if (StringUtils.isBlank(materialCode)) {
  134. resp.setResult(Global.FALSE);
  135. resp.setMessage("来料码不能为空!");
  136. return resp;
  137. }
  138. String[] parts = materialCode.split(",", -1);
  139. if (parts.length != 7) {
  140. resp.setResult(Global.FALSE);
  141. resp.setMessage("二维码规则不正确!");
  142. return resp;
  143. }
  144. String docTypeCode = parts[0].trim();
  145. String srcDocNo = parts[1].trim();
  146. String srcDocLineNoStr = parts[2].trim();
  147. String erpSn = parts[3].trim();
  148. String produceDateStr = parts[4].trim();
  149. String lotCode = parts[5].trim();
  150. String qtyStr = parts[6].trim();
  151. if (StringUtils.isBlank(docTypeCode) || StringUtils.isBlank(srcDocNo) || StringUtils.isBlank(srcDocLineNoStr)
  152. || StringUtils.isBlank(erpSn) || StringUtils.isBlank(produceDateStr) || StringUtils.isBlank(lotCode)
  153. || StringUtils.isBlank(qtyStr)) {
  154. resp.setResult(Global.FALSE);
  155. resp.setMessage("二维码规则不正确!");
  156. return resp;
  157. }
  158. Long srcDocLineNo;
  159. Long pcQty;
  160. try {
  161. srcDocLineNo = Long.valueOf(srcDocLineNoStr);
  162. pcQty = Long.valueOf(qtyStr);
  163. } catch (NumberFormatException e) {
  164. resp.setResult(Global.FALSE);
  165. resp.setMessage("二维码规则不正确!");
  166. return resp;
  167. }
  168. String produceDate;
  169. try {
  170. produceDate = DateLocalUtils.getCurrentDate2(produceDateStr);
  171. } catch (ParseException e) {
  172. resp.setResult(Global.FALSE);
  173. resp.setMessage("二维码规则不正确!");
  174. return resp;
  175. }
  176. // MesMaterial mesMaterial = new MesMaterial();
  177. // mesMaterial.setErpSn(erpSn);
  178. // MesMaterial material = mesMaterialService.findInfo(mesMaterial);
  179. // if (material == null) {
  180. // resp.setResult(Global.FALSE);
  181. // resp.setMessage("物料不存在!");
  182. // return resp;
  183. // }
  184. HashMap<String, Object> data = new HashMap<>();
  185. // data.put("materialCode", materialCode); // 来料码
  186. // data.put("docTypeCode", docTypeCode); // ERP代码/单据类型编码
  187. data.put("srcDocNo", srcDocNo); // 采购订单号
  188. data.put("srcDocLineNo", srcDocLineNo); // 采购订单行号
  189. data.put("docLineNo", srcDocLineNo); // 行号
  190. // data.put("erpSn", erpSn); // 料号/ERP编码
  191. data.put("produceDate", produceDate); // 生产日期
  192. data.put("lotCode", lotCode); // 生产批次/批号
  193. data.put("pcQty", pcQty); // 批次数量
  194. resp.setData(data);
  195. resp.setResult(Global.TRUE);
  196. resp.setMessage("解析成功");
  197. return resp;
  198. }
  199. /**
  200. * 同步数据到 ERP
  201. */
  202. // @RequiresPermissions("mes:mesMaterialRk:api")
  203. @RequestMapping(value = "mesToErp")
  204. @ResponseBody
  205. public String mesToErp(MesMaterialRk mesMaterialRk) {
  206. mesMaterialRkService.save(mesMaterialRk);
  207. if (StringUtils.isNotBlank(mesMaterialRk.getId())) {
  208. mesMaterialRk = mesMaterialRkService.get(mesMaterialRk);
  209. }
  210. if (mesMaterialRk == null) {
  211. return renderResult(Global.FALSE, text("采购入库单不存在!"));
  212. }
  213. String requestJson = buildCreateRcvJson(mesMaterialRk);
  214. JSONObject response = U9cAuthUtil.createRCV(requestJson);
  215. if (response == null) {
  216. return renderResult(Global.FALSE, text("同步ERP失败!"));
  217. }
  218. if (!Boolean.TRUE.equals(response.getBoolean("Success"))) {
  219. String msg = response.getString("ResMsg");
  220. return renderResult(Global.FALSE, text(StringUtils.isNotBlank(msg) ? msg : "同步ERP失败!"));
  221. }
  222. JSONArray dataList = response.getJSONArray("Data");
  223. if (dataList == null || dataList.isEmpty()) {
  224. return renderResult(Global.FALSE, text("同步ERP失败:返回数据为空!"));
  225. }
  226. JSONObject data = dataList.getJSONObject(0);
  227. if (data == null || !Boolean.TRUE.equals(data.getBoolean("IsSucceed"))) {
  228. String errorMsg = data != null ? data.getString("ErrorMsg") : null;
  229. return renderResult(Global.FALSE, text(StringUtils.isNotBlank(errorMsg) ? errorMsg : "同步ERP失败!"));
  230. }
  231. String code = data.getString("Code");
  232. String docId = data.getString("ID");
  233. StringBuilder successMsg = new StringBuilder(text("同步ERP成功!"));
  234. if (StringUtils.isNotBlank(code)) {
  235. successMsg.append(" ").append(code);
  236. }
  237. if (StringUtils.isNotBlank(docId)) {
  238. successMsg.append(" (").append(docId).append(")");
  239. }
  240. return renderResult(Global.TRUE, successMsg.toString());
  241. }
  242. /**
  243. * 构造 CreateRCV 接口请求 JSON
  244. */
  245. private String buildCreateRcvJson(MesMaterialRk mesMaterialRk) {
  246. JSONObject root = new JSONObject(true);
  247. root.put("OtherID", StringUtils.defaultIfBlank(mesMaterialRk.getOtherId(), ""));
  248. root.put("DocTypeCode", StringUtils.defaultIfBlank(mesMaterialRk.getDocTypeCode(), ""));
  249. root.put("BusinessDate", formatRkDate(mesMaterialRk.getBusineseDate()));
  250. root.put("ConfirmDate", formatRkDate(mesMaterialRk.getConfirmDate()));
  251. JSONObject line = new JSONObject(true);
  252. line.put("OtherID", StringUtils.defaultIfBlank(mesMaterialRk.getOtherId(), ""));
  253. line.put("DocLineNo", mesMaterialRk.getDocLineNo());
  254. line.put("SrcDocNo", StringUtils.defaultIfBlank(mesMaterialRk.getSrcDocNo(), ""));
  255. line.put("SrcDocLineNo", mesMaterialRk.getSrcDocLineNo());
  256. line.put("LotCode", StringUtils.defaultIfBlank(mesMaterialRk.getLotCode(), ""));
  257. line.put("Qty", mesMaterialRk.getQty());
  258. line.put("RtnDeductQty", mesMaterialRk.getRtnDeductQty());
  259. line.put("RtnFillQty", mesMaterialRk.getRtnFillQty());
  260. JSONArray lineDtos = new JSONArray();
  261. lineDtos.add(line);
  262. root.put("LineDtos", lineDtos);
  263. JSONArray requestArray = new JSONArray();
  264. requestArray.add(root);
  265. return requestArray.toJSONString();
  266. }
  267. private String formatRkDate(Date date) {
  268. if (date == null) {
  269. return "";
  270. }
  271. return DateUtils.formatDate(date, "yyyy-MM-dd");
  272. }
  273. }