ErpInStockController.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543
  1. package com.jeesite.modules.mes.web;
  2. import com.jeesite.common.config.Global;
  3. import com.jeesite.common.entity.Page;
  4. import com.jeesite.common.lang.StringUtils;
  5. import com.jeesite.common.web.BaseController;
  6. import com.jeesite.modules.mes.erp.ErpInStock;
  7. import com.jeesite.modules.mes.erp.ErpInStockService;
  8. import com.jeesite.modules.mes.erp.ErpInStockSaveService;
  9. import com.jeesite.modules.mes.erp.ErpInStockResult;
  10. import com.jeesite.modules.mes.erp.ErpInStockSubmitRequest;
  11. import com.jeesite.modules.mes.erp.ErpPurchaseOrder;
  12. import com.jeesite.modules.mes.erp.ErpPurchaseOrderService;
  13. import com.jeesite.modules.mes.erp.ErpLotMasterService;
  14. import com.jeesite.modules.mes.erp.ErpStockService;
  15. import com.jeesite.modules.mes.erp.ErpStockOption;
  16. import com.jeesite.modules.mes.erp.ErpStockLocService;
  17. import com.jeesite.modules.mes.erp.ErpStockLocOption;
  18. import com.jeesite.modules.mes.erp.ErpInventoryLotOption;
  19. import org.apache.shiro.authz.annotation.RequiresPermissions;
  20. import org.springframework.stereotype.Controller;
  21. import org.springframework.ui.Model;
  22. import org.springframework.web.bind.annotation.GetMapping;
  23. import org.springframework.web.bind.annotation.PostMapping;
  24. import org.springframework.web.bind.annotation.RequestBody;
  25. import org.springframework.web.bind.annotation.RequestMapping;
  26. import org.springframework.web.bind.annotation.ResponseBody;
  27. import javax.servlet.http.HttpServletRequest;
  28. import javax.servlet.http.HttpServletResponse;
  29. import java.util.ArrayList;
  30. import java.util.HashMap;
  31. import java.util.List;
  32. import java.util.Map;
  33. /**
  34. * ERP 采购入库单查询与增加入库。
  35. */
  36. @Controller
  37. @RequestMapping(value = "${adminPath}/mes/erpInStock")
  38. public class ErpInStockController extends BaseController {
  39. private final ErpInStockService erpInStockService;
  40. private final ErpPurchaseOrderService erpPurchaseOrderService;
  41. private final ErpLotMasterService erpLotMasterService;
  42. private final ErpInStockSaveService erpInStockSaveService;
  43. private final ErpStockService erpStockService;
  44. private final ErpStockLocService erpStockLocService;
  45. public ErpInStockController(ErpInStockService erpInStockService,
  46. ErpPurchaseOrderService erpPurchaseOrderService,
  47. ErpLotMasterService erpLotMasterService,
  48. ErpInStockSaveService erpInStockSaveService,
  49. ErpStockService erpStockService,
  50. ErpStockLocService erpStockLocService) {
  51. this.erpInStockService = erpInStockService;
  52. this.erpPurchaseOrderService = erpPurchaseOrderService;
  53. this.erpLotMasterService = erpLotMasterService;
  54. this.erpInStockSaveService = erpInStockSaveService;
  55. this.erpStockService = erpStockService;
  56. this.erpStockLocService = erpStockLocService;
  57. }
  58. @RequiresPermissions("mes:erpInStock:view")
  59. @RequestMapping(value = {"list", ""})
  60. public String list(ErpInStock erpInStock, Model model) {
  61. model.addAttribute("erpInStock", erpInStock);
  62. return "modules/mes/erpInStockList";
  63. }
  64. @RequiresPermissions("mes:erpInStock:view")
  65. @RequestMapping(value = "listData")
  66. @ResponseBody
  67. public Page<ErpInStock> listData(ErpInStock erpInStock,
  68. HttpServletRequest request, HttpServletResponse response) {
  69. Page<ErpInStock> page = new Page<>(request, response);
  70. int pageSize = page.getPageSize() > 0 ? page.getPageSize() : 20;
  71. int pageNo = page.getPageNo() > 0 ? page.getPageNo() : 1;
  72. int startRow = (pageNo - 1) * pageSize;
  73. List<ErpInStock> list = erpInStockService.findPageList(erpInStock, startRow, pageSize);
  74. page.setList(list);
  75. page.setCount(startRow + list.size() + (list.size() == pageSize ? 1 : 0));
  76. return page;
  77. }
  78. @RequiresPermissions("mes:erpInStock:view")
  79. @RequestMapping(value = "detail")
  80. public String detail(ErpInStock erpInStock, Model model) {
  81. model.addAttribute("erpInStock", erpInStock);
  82. return "modules/mes/erpInStockDetail";
  83. }
  84. @RequiresPermissions("mes:erpInStock:view")
  85. @RequestMapping(value = "detailData")
  86. @ResponseBody
  87. public Page<ErpInStock> detailData(ErpInStock erpInStock,
  88. HttpServletRequest request, HttpServletResponse response) {
  89. Page<ErpInStock> page = new Page<>(request, response);
  90. List<ErpInStock> list = erpInStockService.findDetailList(erpInStock.getBillNo());
  91. page.setList(list);
  92. page.setCount(list.size());
  93. return page;
  94. }
  95. @RequiresPermissions("mes:erpInStock:view")
  96. @RequestMapping(value = "selectOrder")
  97. public String selectOrder(ErpPurchaseOrder erpPurchaseOrder, Model model) {
  98. if (erpPurchaseOrder == null) {
  99. erpPurchaseOrder = new ErpPurchaseOrder();
  100. }
  101. String docStatus = erpPurchaseOrder.getDocumentStatusQuery();
  102. if (StringUtils.isBlank(docStatus)) {
  103. docStatus = "C";
  104. erpPurchaseOrder.setDocumentStatusQuery(docStatus);
  105. }
  106. model.addAttribute("erpPurchaseOrder", erpPurchaseOrder);
  107. model.addAttribute("docStatus", docStatus);
  108. return "modules/mes/erpInStockSelectOrder";
  109. }
  110. @RequiresPermissions("mes:erpInStock:view")
  111. @RequestMapping(value = "selectOrderData")
  112. @ResponseBody
  113. public Page<ErpPurchaseOrder> selectOrderData(ErpPurchaseOrder erpPurchaseOrder,
  114. HttpServletRequest request, HttpServletResponse response) {
  115. Page<ErpPurchaseOrder> page = new Page<>(request, response);
  116. int pageSize = page.getPageSize() > 0 ? page.getPageSize() : 20;
  117. int pageNo = page.getPageNo() > 0 ? page.getPageNo() : 1;
  118. int startRow = (pageNo - 1) * pageSize;
  119. List<ErpPurchaseOrder> list = erpPurchaseOrderService.findPageList(erpPurchaseOrder, startRow, pageSize);
  120. page.setList(list);
  121. page.setCount(startRow + list.size() + (list.size() == pageSize ? 1 : 0));
  122. return page;
  123. }
  124. @RequiresPermissions("mes:erpInStock:view")
  125. @RequestMapping(value = "selectDetail")
  126. public String selectDetail(ErpPurchaseOrder erpPurchaseOrder, Model model) {
  127. model.addAttribute("erpPurchaseOrder", erpPurchaseOrder);
  128. return "modules/mes/erpInStockSelectDetail";
  129. }
  130. @RequiresPermissions("mes:erpInStock:view")
  131. @RequestMapping(value = "selectDetailData")
  132. @ResponseBody
  133. public Page<ErpPurchaseOrder> selectDetailData(ErpPurchaseOrder erpPurchaseOrder,
  134. HttpServletRequest request, HttpServletResponse response) {
  135. Page<ErpPurchaseOrder> page = new Page<>(request, response);
  136. List<ErpPurchaseOrder> list = erpInStockService.findPendingPoDetailList(erpPurchaseOrder.getBillNo());
  137. page.setList(list);
  138. page.setCount(list.size());
  139. return page;
  140. }
  141. @RequiresPermissions("mes:erpInStock:view")
  142. @RequestMapping(value = "inspect")
  143. public String inspect(ErpPurchaseOrder erpPurchaseOrder, String entryIds, Model model) {
  144. String billNo = erpPurchaseOrder == null ? "" : erpPurchaseOrder.getBillNo();
  145. List<String> idList = parseEntryIds(entryIds, erpPurchaseOrder == null ? "" : erpPurchaseOrder.getEntryId());
  146. List<ErpPurchaseOrder> detailList = erpInStockService.findPendingPoDetails(billNo, idList);
  147. if (detailList.isEmpty()) {
  148. model.addAttribute("message", "所选分录已无剩余可入数量");
  149. } else {
  150. erpInStockService.enrichInspectLotInfo(detailList);
  151. }
  152. model.addAttribute("billNo", billNo);
  153. model.addAttribute("detailList", detailList);
  154. List<ErpStockOption> stockList = erpStockService.findUsableStockList();
  155. model.addAttribute("stockList", stockList);
  156. model.addAttribute("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stockList));
  157. return "modules/mes/erpInStockInspect";
  158. }
  159. /**
  160. * PDA/前端:入库仓库列表(与来料检页 inspect 一致)。
  161. */
  162. @RequiresPermissions("mes:erpInStock:view")
  163. @GetMapping(value = "stockList")
  164. @ResponseBody
  165. public Map<String, Object> stockList() {
  166. List<ErpStockOption> stocks = erpStockService.findUsableStockList();
  167. Map<String, Object> result = new HashMap<>(4);
  168. result.put("stockList", stocks);
  169. result.put("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stocks));
  170. if (stocks.isEmpty()) {
  171. result.put("stockHint", "未能从 ERP 加载仓库列表,请检查组织与 ERP 连接");
  172. } else {
  173. result.put("stockHint", "共 " + stocks.size() + " 个可用仓库");
  174. }
  175. return result;
  176. }
  177. /**
  178. * PDA/前端:来料检页初始化(勾选分录 + 仓库 + 批号信息一次返回)。
  179. */
  180. @RequiresPermissions("mes:erpInStock:view")
  181. @GetMapping(value = "inspectInit")
  182. @ResponseBody
  183. public Map<String, Object> inspectInit(String billNo, String entryIds, String entryId) {
  184. Map<String, Object> result = new HashMap<>(8);
  185. String poBillNo = billNo == null ? "" : billNo.trim();
  186. result.put("billNo", poBillNo);
  187. List<String> idList = parseEntryIds(entryIds, entryId);
  188. if (StringUtils.isBlank(poBillNo)) {
  189. result.put("result", Global.FALSE);
  190. result.put("message", "采购订单号不能为空");
  191. result.put("lines", new ArrayList<>());
  192. return result;
  193. }
  194. if (idList.isEmpty()) {
  195. result.put("result", Global.FALSE);
  196. result.put("message", "请至少选择一条待入分录");
  197. result.put("lines", new ArrayList<>());
  198. return result;
  199. }
  200. List<ErpPurchaseOrder> detailList = erpInStockService.findPendingPoDetails(poBillNo, idList);
  201. if (detailList.isEmpty()) {
  202. result.put("result", Global.FALSE);
  203. result.put("message", "所选分录已无剩余可入数量");
  204. result.put("lines", new ArrayList<>());
  205. } else {
  206. erpInStockService.enrichInspectLotInfo(detailList);
  207. result.put("result", Global.TRUE);
  208. result.put("message", "");
  209. result.put("lines", detailList);
  210. }
  211. List<ErpStockOption> stocks = erpStockService.findUsableStockList();
  212. result.put("stockList", stocks);
  213. result.put("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stocks));
  214. return result;
  215. }
  216. @RequiresPermissions("mes:erpInStock:view")
  217. @GetMapping(value = "stockLocOptions")
  218. @ResponseBody
  219. public Map<String, Object> stockLocOptions(String stockNumber) {
  220. List<ErpStockLocOption> locations = erpStockLocService.findLocationsByStock(stockNumber);
  221. Map<String, Object> result = new HashMap<>(4);
  222. boolean required = !locations.isEmpty();
  223. result.put("required", required);
  224. result.put("locations", locations);
  225. result.put("defaultLocNumber", erpStockLocService.resolveDefaultLocNumber(stockNumber, locations));
  226. if (locations.isEmpty()) {
  227. result.put("locHint", "该仓库未启用仓位或未配置仓位值集");
  228. } else {
  229. result.put("locHint", "共 " + locations.size() + " 个仓位,数据来自 ERP 仓位值集");
  230. if (StringUtils.isNotBlank(locations.get(0).getLocKey())) {
  231. result.put("locKey", locations.get(0).getLocKey());
  232. }
  233. }
  234. return result;
  235. }
  236. @RequiresPermissions("mes:erpInStock:view")
  237. @GetMapping(value = "lotOptions")
  238. @ResponseBody
  239. public Map<String, Object> lotOptions(String materialNumber) {
  240. List<ErpInventoryLotOption> lots = erpLotMasterService.findLotsByMaterial(materialNumber, null);
  241. String suggested = lots.isEmpty() ? "" : lots.get(0).getLotNumber();
  242. Map<String, Object> result = new HashMap<>(4);
  243. result.put("lots", lots);
  244. result.put("suggestedLotNumber", suggested);
  245. result.put("lotHint", erpLotMasterService.buildInStockLotHint(lots, suggested));
  246. return result;
  247. }
  248. @RequiresPermissions("mes:erpInStock:view")
  249. @GetMapping(value = "lotSearch")
  250. @ResponseBody
  251. public Map<String, Object> lotSearch(String materialNumber, String lotKeyword) {
  252. List<ErpInventoryLotOption> lots = erpLotMasterService.findLotsByMaterial(materialNumber, lotKeyword);
  253. Map<String, Object> result = new HashMap<>(3);
  254. result.put("lots", lots);
  255. if (lots.isEmpty()) {
  256. result.put("lotHint", "未查到符合条件的 ERP 批号档案,可手工录入新批号");
  257. } else {
  258. result.put("lotHint", "共查到 " + lots.size() + " 条批号档案");
  259. }
  260. return result;
  261. }
  262. @RequiresPermissions("mes:erpInStock:view")
  263. @PostMapping(value = "submitInStock")
  264. @ResponseBody
  265. public String submitInStock(@RequestBody ErpInStockSubmitRequest request) {
  266. ErpInStockResult result = erpInStockSaveService.submit(request);
  267. if (result.isSuccess()) {
  268. return renderResult(Global.TRUE, text("采购入库单保存成功,单号:{0}", result.getInStockBillNo()));
  269. }
  270. return renderResult(Global.FALSE, result.getMessage());
  271. }
  272. private List<String> parseEntryIds(String entryIds, String singleEntryId) {
  273. List<String> idList = new ArrayList<>();
  274. if (StringUtils.isNotBlank(entryIds)) {
  275. for (String part : entryIds.split(",")) {
  276. if (StringUtils.isNotBlank(part)) {
  277. idList.add(part.trim());
  278. }
  279. }
  280. }
  281. if (idList.isEmpty() && StringUtils.isNotBlank(singleEntryId)) {
  282. idList.add(singleEntryId.trim());
  283. }
  284. return idList;
  285. }
  286. }