package com.jeesite.modules.mes.web; import com.jeesite.common.config.Global; import com.jeesite.common.entity.Page; import com.jeesite.common.lang.StringUtils; import com.jeesite.common.web.BaseController; import com.jeesite.modules.mes.erp.ErpInStock; import com.jeesite.modules.mes.erp.ErpInStockService; import com.jeesite.modules.mes.erp.ErpInStockSaveService; import com.jeesite.modules.mes.erp.ErpInStockResult; import com.jeesite.modules.mes.erp.ErpInStockSubmitRequest; import com.jeesite.modules.mes.erp.ErpPurchaseOrder; import com.jeesite.modules.mes.erp.ErpPurchaseOrderService; import com.jeesite.modules.mes.erp.ErpLotMasterService; import com.jeesite.modules.mes.erp.ErpStockService; import com.jeesite.modules.mes.erp.ErpStockOption; import com.jeesite.modules.mes.erp.ErpStockLocService; import com.jeesite.modules.mes.erp.ErpStockLocOption; import com.jeesite.modules.mes.erp.ErpInventoryLotOption; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * ERP 采购入库单查询与增加入库。 */ @Controller @RequestMapping(value = "${adminPath}/mes/erpInStock") public class ErpInStockController extends BaseController { private final ErpInStockService erpInStockService; private final ErpPurchaseOrderService erpPurchaseOrderService; private final ErpLotMasterService erpLotMasterService; private final ErpInStockSaveService erpInStockSaveService; private final ErpStockService erpStockService; private final ErpStockLocService erpStockLocService; public ErpInStockController(ErpInStockService erpInStockService, ErpPurchaseOrderService erpPurchaseOrderService, ErpLotMasterService erpLotMasterService, ErpInStockSaveService erpInStockSaveService, ErpStockService erpStockService, ErpStockLocService erpStockLocService) { this.erpInStockService = erpInStockService; this.erpPurchaseOrderService = erpPurchaseOrderService; this.erpLotMasterService = erpLotMasterService; this.erpInStockSaveService = erpInStockSaveService; this.erpStockService = erpStockService; this.erpStockLocService = erpStockLocService; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = {"list", ""}) public String list(ErpInStock erpInStock, Model model) { model.addAttribute("erpInStock", erpInStock); return "modules/mes/erpInStockList"; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "listData") @ResponseBody public Page listData(ErpInStock erpInStock, HttpServletRequest request, HttpServletResponse response) { Page page = new Page<>(request, response); int pageSize = page.getPageSize() > 0 ? page.getPageSize() : 20; int pageNo = page.getPageNo() > 0 ? page.getPageNo() : 1; int startRow = (pageNo - 1) * pageSize; List list = erpInStockService.findPageList(erpInStock, startRow, pageSize); page.setList(list); page.setCount(startRow + list.size() + (list.size() == pageSize ? 1 : 0)); return page; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "detail") public String detail(ErpInStock erpInStock, Model model) { model.addAttribute("erpInStock", erpInStock); return "modules/mes/erpInStockDetail"; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "detailData") @ResponseBody public Page detailData(ErpInStock erpInStock, HttpServletRequest request, HttpServletResponse response) { Page page = new Page<>(request, response); List list = erpInStockService.findDetailList(erpInStock.getBillNo()); page.setList(list); page.setCount(list.size()); return page; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "selectOrder") public String selectOrder(ErpPurchaseOrder erpPurchaseOrder, Model model) { if (erpPurchaseOrder == null) { erpPurchaseOrder = new ErpPurchaseOrder(); } String docStatus = erpPurchaseOrder.getDocumentStatusQuery(); if (StringUtils.isBlank(docStatus)) { docStatus = "C"; erpPurchaseOrder.setDocumentStatusQuery(docStatus); } model.addAttribute("erpPurchaseOrder", erpPurchaseOrder); model.addAttribute("docStatus", docStatus); return "modules/mes/erpInStockSelectOrder"; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "selectOrderData") @ResponseBody public Page selectOrderData(ErpPurchaseOrder erpPurchaseOrder, HttpServletRequest request, HttpServletResponse response) { Page page = new Page<>(request, response); int pageSize = page.getPageSize() > 0 ? page.getPageSize() : 20; int pageNo = page.getPageNo() > 0 ? page.getPageNo() : 1; int startRow = (pageNo - 1) * pageSize; List list = erpPurchaseOrderService.findPageList(erpPurchaseOrder, startRow, pageSize); page.setList(list); page.setCount(startRow + list.size() + (list.size() == pageSize ? 1 : 0)); return page; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "selectDetail") public String selectDetail(ErpPurchaseOrder erpPurchaseOrder, Model model) { model.addAttribute("erpPurchaseOrder", erpPurchaseOrder); return "modules/mes/erpInStockSelectDetail"; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "selectDetailData") @ResponseBody public Page selectDetailData(ErpPurchaseOrder erpPurchaseOrder, HttpServletRequest request, HttpServletResponse response) { Page page = new Page<>(request, response); List list = erpInStockService.findPendingPoDetailList(erpPurchaseOrder.getBillNo()); page.setList(list); page.setCount(list.size()); return page; } @RequiresPermissions("mes:erpInStock:view") @RequestMapping(value = "inspect") public String inspect(ErpPurchaseOrder erpPurchaseOrder, String entryIds, Model model) { String billNo = erpPurchaseOrder == null ? "" : erpPurchaseOrder.getBillNo(); List idList = parseEntryIds(entryIds, erpPurchaseOrder == null ? "" : erpPurchaseOrder.getEntryId()); List detailList = erpInStockService.findPendingPoDetails(billNo, idList); if (detailList.isEmpty()) { model.addAttribute("message", "所选分录已无剩余可入数量"); } else { erpInStockService.enrichInspectLotInfo(detailList); } model.addAttribute("billNo", billNo); model.addAttribute("detailList", detailList); List stockList = erpStockService.findUsableStockList(); model.addAttribute("stockList", stockList); model.addAttribute("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stockList)); return "modules/mes/erpInStockInspect"; } /** * PDA/前端:入库仓库列表(与来料检页 inspect 一致)。 */ @RequiresPermissions("mes:erpInStock:view") @GetMapping(value = "stockList") @ResponseBody public Map stockList() { List stocks = erpStockService.findUsableStockList(); Map result = new HashMap<>(4); result.put("stockList", stocks); result.put("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stocks)); if (stocks.isEmpty()) { result.put("stockHint", "未能从 ERP 加载仓库列表,请检查组织与 ERP 连接"); } else { result.put("stockHint", "共 " + stocks.size() + " 个可用仓库"); } return result; } /** * PDA/前端:来料检页初始化(勾选分录 + 仓库 + 批号信息一次返回)。 */ @RequiresPermissions("mes:erpInStock:view") @GetMapping(value = "inspectInit") @ResponseBody public Map inspectInit(String billNo, String entryIds, String entryId) { Map result = new HashMap<>(8); String poBillNo = billNo == null ? "" : billNo.trim(); result.put("billNo", poBillNo); List idList = parseEntryIds(entryIds, entryId); if (StringUtils.isBlank(poBillNo)) { result.put("result", Global.FALSE); result.put("message", "采购订单号不能为空"); result.put("lines", new ArrayList<>()); return result; } if (idList.isEmpty()) { result.put("result", Global.FALSE); result.put("message", "请至少选择一条待入分录"); result.put("lines", new ArrayList<>()); return result; } List detailList = erpInStockService.findPendingPoDetails(poBillNo, idList); if (detailList.isEmpty()) { result.put("result", Global.FALSE); result.put("message", "所选分录已无剩余可入数量"); result.put("lines", new ArrayList<>()); } else { erpInStockService.enrichInspectLotInfo(detailList); result.put("result", Global.TRUE); result.put("message", ""); result.put("lines", detailList); } List stocks = erpStockService.findUsableStockList(); result.put("stockList", stocks); result.put("defaultStockNumber", erpStockService.resolveDefaultStockNumber(stocks)); return result; } @RequiresPermissions("mes:erpInStock:view") @GetMapping(value = "stockLocOptions") @ResponseBody public Map stockLocOptions(String stockNumber) { List locations = erpStockLocService.findLocationsByStock(stockNumber); Map result = new HashMap<>(4); boolean required = !locations.isEmpty(); result.put("required", required); result.put("locations", locations); result.put("defaultLocNumber", erpStockLocService.resolveDefaultLocNumber(stockNumber, locations)); if (locations.isEmpty()) { result.put("locHint", "该仓库未启用仓位或未配置仓位值集"); } else { result.put("locHint", "共 " + locations.size() + " 个仓位,数据来自 ERP 仓位值集"); if (StringUtils.isNotBlank(locations.get(0).getLocKey())) { result.put("locKey", locations.get(0).getLocKey()); } } return result; } @RequiresPermissions("mes:erpInStock:view") @GetMapping(value = "lotOptions") @ResponseBody public Map lotOptions(String materialNumber) { List lots = erpLotMasterService.findLotsByMaterial(materialNumber, null); String suggested = lots.isEmpty() ? "" : lots.get(0).getLotNumber(); Map result = new HashMap<>(4); result.put("lots", lots); result.put("suggestedLotNumber", suggested); result.put("lotHint", erpLotMasterService.buildInStockLotHint(lots, suggested)); return result; } @RequiresPermissions("mes:erpInStock:view") @GetMapping(value = "lotSearch") @ResponseBody public Map lotSearch(String materialNumber, String lotKeyword) { List lots = erpLotMasterService.findLotsByMaterial(materialNumber, lotKeyword); Map result = new HashMap<>(3); result.put("lots", lots); if (lots.isEmpty()) { result.put("lotHint", "未查到符合条件的 ERP 批号档案,可手工录入新批号"); } else { result.put("lotHint", "共查到 " + lots.size() + " 条批号档案"); } return result; } @RequiresPermissions("mes:erpInStock:view") @PostMapping(value = "submitInStock") @ResponseBody public String submitInStock(@RequestBody ErpInStockSubmitRequest request) { ErpInStockResult result = erpInStockSaveService.submit(request); if (result.isSuccess()) { return renderResult(Global.TRUE, text("采购入库单保存成功,单号:{0}", result.getInStockBillNo())); } return renderResult(Global.FALSE, result.getMessage()); } private List parseEntryIds(String entryIds, String singleEntryId) { List idList = new ArrayList<>(); if (StringUtils.isNotBlank(entryIds)) { for (String part : entryIds.split(",")) { if (StringUtils.isNotBlank(part)) { idList.add(part.trim()); } } } if (idList.isEmpty() && StringUtils.isNotBlank(singleEntryId)) { idList.add(singleEntryId.trim()); } return idList; } }