From 197dc87e5f75d9a9de903db7d2c4ed62013533af Mon Sep 17 00:00:00 2001 From: mzr Date: Mon, 13 Oct 2025 09:16:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=94=9F=E4=BA=A7=E8=AE=A2?= =?UTF-8?q?=E5=8D=95-=E6=97=A0=E5=A4=87=E6=96=99=E9=A2=86=E6=96=99API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../META-INF/pmoUnpickmDeliveryReources.rest | 5 + .../pickm/PmoUnpickmDeliveryReources.java | 264 ++++++++++++++++++ 2 files changed, 269 insertions(+) create mode 100644 mmpac/META-INF/pmoUnpickmDeliveryReources.rest create mode 100644 mmpac/src/public/nccloud/openapi/mmpac/pickm/PmoUnpickmDeliveryReources.java diff --git a/mmpac/META-INF/pmoUnpickmDeliveryReources.rest b/mmpac/META-INF/pmoUnpickmDeliveryReources.rest new file mode 100644 index 00000000..8852c4f7 --- /dev/null +++ b/mmpac/META-INF/pmoUnpickmDeliveryReources.rest @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/mmpac/src/public/nccloud/openapi/mmpac/pickm/PmoUnpickmDeliveryReources.java b/mmpac/src/public/nccloud/openapi/mmpac/pickm/PmoUnpickmDeliveryReources.java new file mode 100644 index 00000000..329a65db --- /dev/null +++ b/mmpac/src/public/nccloud/openapi/mmpac/pickm/PmoUnpickmDeliveryReources.java @@ -0,0 +1,264 @@ +package nccloud.openapi.mmpac.pickm; + +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.bs.framework.common.NCLocator; +import nc.bs.logging.Log; +import nc.bs.uapbd.util.MyHelper; +import nc.itf.mmpac.pickm.IPickmBusinessService; +import nc.itf.mmpac.pmo.pac0002.IPMOQueryService; +import nc.itf.mmpac.pmo.pac0002.IPMOTransTypeQueryService; +import nc.itf.uap.IUAPQueryBS; +import nc.jdbc.framework.processor.ColumnProcessor; +import nc.jdbc.framework.processor.MapProcessor; +import nc.pubitf.mmpac.pickm.mo.IPickmQueryServiceForMO; +import nc.util.mmf.framework.base.MMArrayUtil; +import nc.util.mmf.framework.base.MMValueCheck; +import nc.vo.bd.stordoc.StordocVO; +import nc.vo.ml.NCLangRes4VoTransl; +import nc.vo.mmpac.pickm.entity.AggPickmVO; +import nc.vo.mmpac.pickm.entity.PickmHeadVO; +import nc.vo.mmpac.pickm.entity.PickmItemVO; +import nc.vo.mmpac.pickm.enumeration.FbillstatusEnum; +import nc.vo.mmpac.pickm.param.PickmTransParam; +import nc.vo.mmpac.pmo.pac0002.constant.PMOConstLang; +import nc.vo.mmpac.pmo.pac0002.entity.PMOAggVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOHeadVO; +import nc.vo.mmpac.pmo.pac0002.entity.PMOItemVO; +import nc.vo.mmpac.pmo.pac0002.enumeration.PMOFBillstatusEnum; +import nc.vo.mmpac.pmo.pac0002.enumeration.PMOFItemStatusEnum; +import nc.vo.org.OrgVO; +import nc.vo.pub.BusinessException; +import nc.vo.pub.VOStatus; +import nc.vo.pub.lang.UFBoolean; +import nc.vo.pub.lang.UFDate; +import nc.vo.pub.lang.UFDouble; +import nc.vo.pubapp.pattern.pub.SqlBuilder; +import nc.ws.opm.pub.utils.result.APIErrCodeEnum; +import nccloud.api.rest.utils.ResultMessageUtil; +import nccloud.framework.core.exception.ExceptionUtils; +import nccloud.ws.rest.resource.AbstractNCCRestResource; +import org.json.JSONString; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * 流程生产订单-无备料领料API + * + * @author mzr + * @date 2025/10/13 + */ +@Path("mmpac/unpickm") +public class PmoUnpickmDeliveryReources extends AbstractNCCRestResource { + private static final Log logger = Log.getInstance("qyMesLog"); + public BaseDAO dao; + + public BaseDAO getDao() { + if (dao == null) { + dao = new BaseDAO(); + } + return dao; + } + + @POST + @Path("unPickmDelivery") + @Consumes({"application/json"}) + @Produces({"application/json"}) + public JSONString unPickmDelivery(Map paramMap) { + // 参数校验 + String[] fields = new String[]{"mobid", "pk_org", "item"}; + for (String field : fields) { + Object keyValue = paramMap.get(field); + if (null == keyValue || "".equals(keyValue)) { + return ResultMessageUtil.exceptionToJSON("传入数据异常,参数要包含" + field, APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + } + try { + // 流程生产订单明细id + String mobid = (String) paramMap.get("mobid"); + // 组织编码 + String orgCode = (String) paramMap.get("pk_org"); + // 材料明细信息 + List> itemList = (List) paramMap.get("item"); + for (Map objectMap : itemList) { + Object cbmaterialvid = objectMap.get("cbmaterialvid"); + if (null == cbmaterialvid || "".equals(cbmaterialvid)) { + return ResultMessageUtil.exceptionToJSON("传入数据异常,物料编码参数不能为空", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + Object nplanoutastnum = objectMap.get("nplanoutastnum"); + if (null == nplanoutastnum || "".equals(nplanoutastnum) || "0".equals(nplanoutastnum)) { + return ResultMessageUtil.exceptionToJSON("计划出库数量传入数据异常", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + } + // 查询流程生产订单 + IPMOQueryService pmoQuery = NCLocator.getInstance().lookup(IPMOQueryService.class); + PMOAggVO[] pmoAggVOS = pmoQuery.queryPMOAggVOByBid(new String[]{mobid}); + if (MMValueCheck.isEmpty(pmoAggVOS)) { + ExceptionUtils.wrapBusinessException("查询不到流程生产订单"); + } + PMOAggVO aggvo = pmoAggVOS[0]; + List cmoidList = new ArrayList<>(); + PMOHeadVO headvo = aggvo.getParentVO(); + if (PMOFBillstatusEnum.AUDIT.equalsValue(headvo.getFbillstatus())) { + Map trantypeMap = null; + + try { + trantypeMap = NCLocator.getInstance().lookup(IPMOTransTypeQueryService.class).getBunplannpickingByTranTypeIDs(new String[]{headvo.getCtrantypeid()}); + } catch (BusinessException e) { + nc.vo.pubapp.pattern.exception.ExceptionUtils.wrappException(e); + } + + if (trantypeMap == null || UFBoolean.FALSE.equals(trantypeMap.get(headvo.getCtrantypeid()))) { + ExceptionUtils.wrapBusinessException(PMOConstLang.getUnPickmDeliverTransTypeInfo()); + } + + PMOItemVO[] items = aggvo.getChildrenVO(); + if (!MMArrayUtil.isEmpty(items)) { + if (items.length > 1) { + ExceptionUtils.wrapBusinessException(PMOConstLang.getSingleRowSelectedInfo()); + } + + for (PMOItemVO item : items) { + if (!PMOFItemStatusEnum.PLAN.equalsValue(item.getFitemstatus())) { + cmoidList.add(item.getCmoid()); + } + } + } + } + if (cmoidList.isEmpty()) { + ExceptionUtils.wrapBusinessException(PMOConstLang.getMSG_RULE_NO_ROWDATA()); + } + // 领料前校验流程生产订单 + // 根据流程生产订单明细id查询备料计划 + PickmTransParam param = new PickmTransParam(); + param.setSourceBillRowID(mobid); + IPickmQueryServiceForMO pickmQueryServiceForMO = NCLocator.getInstance().lookup(IPickmQueryServiceForMO.class); + AggPickmVO[] vos = pickmQueryServiceForMO.queryPickmByMO(new PickmTransParam[]{param}); + // 领料前校验流程备料计划 + if (MMValueCheck.isEmpty(vos)) { + ExceptionUtils.wrapBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0014")); + } + if (vos.length > 1) { + ExceptionUtils.wrapBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0015")); + } + if (FbillstatusEnum.PLAN_STATE.equalsValue(vos[0].getParentVO().getFbillstatus())) { + // 只有审核态或完成态的备料计划才能进行无备料领料! + ExceptionUtils.wrapBusinessException(NCLangRes4VoTransl.getNCLangRes().getStrByID("5008100_0", "05008100-0016")); + } + AggPickmVO pickmVO = vos[0]; + PickmHeadVO pickmHeadVO = pickmVO.getParentVO(); + String cpickmid = pickmHeadVO.getCpickmid(); + List itemVOS = new ArrayList<>(); + String pkOrg = MyHelper.getStrValByCondition(OrgVO.getDefaultTableName(), OrgVO.PK_ORG, OrgVO.CODE + " = '" + orgCode + "'" + " and ISBUSINESSUNIT = 'Y'"); + if (MMValueCheck.isEmpty(pkOrg) || "~".equals(pkOrg)) { + return ResultMessageUtil.exceptionToJSON("组织编码不存在,未能在系统查询到该组织", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + String warehouseId = getWarehouseInfo(pkOrg); + if (MMValueCheck.isEmpty(warehouseId) || "~".equals(warehouseId)) { + return ResultMessageUtil.exceptionToJSON("请检查仓库编码是否配置正确", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + for (int i = 0; i < itemList.size(); i++) { + Map objectMap = itemList.get(i); + String cbmaterialvid = objectMap.getOrDefault("cbmaterialvid", "") + ""; + Map materialMap = getMaterialInfo(cbmaterialvid); + if (materialMap == null || materialMap.isEmpty()) { + throw new BusinessException("传入数据异常,物料编码不存在"); + } + String pkMaterial = materialMap.get("pk_material") + ""; + String pkMeasdoc = materialMap.get("pk_measdoc") + ""; + PickmItemVO itemVO = new PickmItemVO(); + itemVO.setCpickmid(cpickmid); + itemVO.setPk_group("00"); + itemVO.setPk_org(pkOrg); + itemVO.setPk_org_v(pkOrg); + itemVO.setCdeliverorgvid(pkOrg);// 发料组织 + itemVO.setCdeliverorgid(pkOrg);// 发料组织 + itemVO.setVrowno((i * 10) + "");// 行号 + itemVO.setCbmaterialid(pkMaterial); + itemVO.setCbmaterialvid(pkMaterial); + itemVO.setCbastunitid(pkMeasdoc); + itemVO.setCbunitid(pkMeasdoc); + itemVO.setVbchangerate("1/1"); + itemVO.setCoutstockid(warehouseId);// 发料仓库 + // 需用日期 + if (MMValueCheck.isNotEmpty(objectMap.get("drequiredate"))) { + itemVO.setDrequiredate(new UFDate(objectMap.get("drequiredate").toString())); + } else { + itemVO.setDrequiredate(new UFDate()); + } + // 计划出库数量 + if (MMValueCheck.isNotEmpty(objectMap.get("nplanoutastnum"))) { + UFDouble nplanoutastnum = new UFDouble(objectMap.get("nplanoutastnum").toString()); + itemVO.setNplanoutastnum(nplanoutastnum);// 计划出库数量 + itemVO.setNplanoutnum(nplanoutastnum);// 计划出库主数量 + itemVO.setNunitastnum(nplanoutastnum);// 单位定额 + itemVO.setNunitnum(nplanoutastnum);// 主单位定额 + itemVO.setNunituseastnum(nplanoutastnum);// 单位用量 + itemVO.setNunitusenum(nplanoutastnum);// 单位主用量 + // itemVO.setAttributeValue("nastnum", nplanoutastnum); + itemVO.setAttributeValue("nquotastnum", nplanoutastnum);// 定额用量 + itemVO.setAttributeValue("nquotnum", nplanoutastnum);// 主定额用量 + // itemVO.setAttributeValue("ndissipationum", nplanoutastnum); + } else { + itemVO.setNplanoutnum(UFDouble.ONE_DBL); + } + itemVO.setFsupplytype(1);// 供应方式 一般发料=0,定量发料=1 + if (MMValueCheck.isNotEmpty(objectMap.get("vnote"))) { + itemVO.setVbnote(objectMap.get("vnote").toString());// 备注 + } + itemVO.setStatus(VOStatus.NEW); + itemVOS.add(itemVO); + } + // 调用无备料领料的标准业务方法 + IPickmBusinessService service = NCLocator.getInstance().lookup(IPickmBusinessService.class); + service.noItemsDeliverMaterial(itemVOS.toArray(new PickmItemVO[0])); + return ResultMessageUtil.toJSON(true, "操作成功"); + } catch (Exception e) { + logger.error("未备料领料操作异常", e); + return ResultMessageUtil.exceptionToJSON(e); + } + } + + private String getWarehouseInfo(String pk_org) throws DAOException { + Map configParams = MyHelper.getConfigParams("jm-config", null); + String warehouseCode = configParams.get("warehouseCode"); + SqlBuilder sqlBuilder = new SqlBuilder(); + sqlBuilder.append(" select " + StordocVO.PK_STORDOC); + sqlBuilder.append(" from " + StordocVO.getDefaultTableName()); + sqlBuilder.append(" where dr = 0"); + sqlBuilder.append(" and "); + sqlBuilder.append(StordocVO.CODE, warehouseCode); + sqlBuilder.append(" and "); + sqlBuilder.append(StordocVO.PK_ORG, pk_org); + String warehouseId = (String) getDao().executeQuery(sqlBuilder.toString(), new ColumnProcessor()); + return warehouseId; + } + + /** + * 获取物料的信息 + * + * @param cbmaterialvid + * @return + * @throws BusinessException + */ + private Map getMaterialInfo(String cbmaterialvid) throws BusinessException { + if (cbmaterialvid == null || cbmaterialvid.isEmpty()) { + return null; + } + IUAPQueryBS queryBS = NCLocator.getInstance().lookup(IUAPQueryBS.class); + String sql = " select pk_material,pk_measdoc" + + " from bd_material" + + " where code = '" + cbmaterialvid + "' "; + return (Map) queryBS.executeQuery(sql, new MapProcessor()); + } + + public String getModule() { + return "mmpac"; + } +}