| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543 |
- 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<ErpInStock> listData(ErpInStock erpInStock,
- HttpServletRequest request, HttpServletResponse response) {
- Page<ErpInStock> 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<ErpInStock> 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<ErpInStock> detailData(ErpInStock erpInStock,
- HttpServletRequest request, HttpServletResponse response) {
- Page<ErpInStock> page = new Page<>(request, response);
- List<ErpInStock> 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<ErpPurchaseOrder> selectOrderData(ErpPurchaseOrder erpPurchaseOrder,
- HttpServletRequest request, HttpServletResponse response) {
- Page<ErpPurchaseOrder> 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<ErpPurchaseOrder> 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<ErpPurchaseOrder> selectDetailData(ErpPurchaseOrder erpPurchaseOrder,
- HttpServletRequest request, HttpServletResponse response) {
- Page<ErpPurchaseOrder> page = new Page<>(request, response);
- List<ErpPurchaseOrder> 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<String> idList = parseEntryIds(entryIds, erpPurchaseOrder == null ? "" : erpPurchaseOrder.getEntryId());
- List<ErpPurchaseOrder> detailList = erpInStockService.findPendingPoDetails(billNo, idList);
- if (detailList.isEmpty()) {
- model.addAttribute("message", "所选分录已无剩余可入数量");
- } else {
- erpInStockService.enrichInspectLotInfo(detailList);
- }
- model.addAttribute("billNo", billNo);
- model.addAttribute("detailList", detailList);
- List<ErpStockOption> 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<String, Object> stockList() {
- List<ErpStockOption> stocks = erpStockService.findUsableStockList();
- Map<String, Object> 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<String, Object> inspectInit(String billNo, String entryIds, String entryId) {
- Map<String, Object> result = new HashMap<>(8);
- String poBillNo = billNo == null ? "" : billNo.trim();
- result.put("billNo", poBillNo);
- List<String> 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<ErpPurchaseOrder> 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<ErpStockOption> 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<String, Object> stockLocOptions(String stockNumber) {
- List<ErpStockLocOption> locations = erpStockLocService.findLocationsByStock(stockNumber);
- Map<String, Object> 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<String, Object> lotOptions(String materialNumber) {
- List<ErpInventoryLotOption> lots = erpLotMasterService.findLotsByMaterial(materialNumber, null);
- String suggested = lots.isEmpty() ? "" : lots.get(0).getLotNumber();
- Map<String, Object> 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<String, Object> lotSearch(String materialNumber, String lotKeyword) {
- List<ErpInventoryLotOption> lots = erpLotMasterService.findLotsByMaterial(materialNumber, lotKeyword);
- Map<String, Object> 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<String> parseEntryIds(String entryIds, String singleEntryId) {
- List<String> 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;
- }
- }
|