From 206adc44438e732a6e3ce59923481bd8cfbc2736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E6=AD=A3=40=E7=94=A8=E5=8F=8B?= Date: Wed, 21 May 2025 18:12:10 +0800 Subject: [PATCH] =?UTF-8?q?ic=5F=E7=8E=B0=E5=AD=98=E9=87=8F=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/ic/onhand/APIOnhandQueryIpml.java | 91 +++++++++++ .../api/ic/onhand/IAPIOnhandQuery.java | 22 +++ .../openapi/ic/onhand/OnhandResource.java | 152 ++++++++++++++++++ 3 files changed, 265 insertions(+) create mode 100644 ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java create mode 100644 ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java create mode 100644 ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java diff --git a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java new file mode 100644 index 0000000..d89ad72 --- /dev/null +++ b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java @@ -0,0 +1,91 @@ +package nccloud.api.impl.ic.onhand; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import nc.bs.framework.common.NCLocator; +import nc.itf.ic.onhand.OnhandResService; +import nc.vo.ic.onhand.entity.OnhandDimVO; +import nc.vo.ic.onhand.entity.OnhandVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.exception.ExceptionUtils; +import nccloud.api.ic.onhand.IAPIOnhandQuery; +import nccloud.api.ic.onhand.OnhandDataSupplement; +import nccloud.openapi.ic.onhand.mapping.OnhandMapping; +import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; +import nccloud.openapi.scmpub.pubitf.IJsonParamMapping; + +/** + * 现存量查询操作实现类 + * + * @version NCC1909 + * @Description: + * @author: shijkb + * @date: 2019年11月14日 上午9:55:49 + */ +public class APIOnhandQueryIpml implements IAPIOnhandQuery { + + String[] requiredField = new String[]{ + "pk_org", "cmaterialoid" + }; + + private IJsonParamMapping jsonParamMapping = new OnhandMapping(); + + @Override + public OnhandVO[] queryOnhandVOByDims(Map paramMap) throws BusinessException { + + + //必输项检查 + this.requiredFieldCheck(requiredField, paramMap); + // 翻译 + paramMap = TransferCodeToPKTool.doTranslateFields(jsonParamMapping, paramMap); + + OnhandDataSupplement dataSupplement = new OnhandDataSupplement(); + OnhandDimVO onhandDimVO = new OnhandDimVO(); + try { + onhandDimVO = dataSupplement.process(paramMap); + } catch (Exception e) { + // TODO Auto-generated catch block + ExceptionUtils.marsh(e); + } + + OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(OnhandResService.class) + .queryOnhandVOByDims(new OnhandDimVO[]{onhandDimVO}); + return onhandVOs; + } + + @Override + public OnhandVO[] queryOnhandVOByDims(List> paramMapList) throws Exception { + //必输项检查 + try { + List onhandDimVOS = new ArrayList<>(); + for (Map paramMap : paramMapList) { + this.requiredFieldCheck(requiredField, paramMap); + // 翻译 + paramMap = TransferCodeToPKTool.doTranslateFields(jsonParamMapping, paramMap); + OnhandDataSupplement dataSupplement = new OnhandDataSupplement(); + OnhandDimVO onhandDimVO = new OnhandDimVO(); + onhandDimVO = dataSupplement.process(paramMap); + onhandDimVOS.add(onhandDimVO); + } + OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(OnhandResService.class) + .queryOnhandVOByDims(onhandDimVOS.toArray(new OnhandDimVO[0])); + return onhandVOs; + } catch (Exception e) { + ExceptionUtils.marsh(e); + return null; + } + } + + //必输项校验 + private void requiredFieldCheck(String[] requiredField, Map paramMap) { + for (String field : requiredField) { + Object keyValue = paramMap.get(field); + if (null == keyValue) { + ExceptionUtils.wrappBusinessException("字段:" + field + "为必输项!"); + } + } + } + +} diff --git a/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java new file mode 100644 index 0000000..727c564 --- /dev/null +++ b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java @@ -0,0 +1,22 @@ +package nccloud.api.ic.onhand; + +import java.util.List; +import java.util.Map; + +import nc.vo.ic.onhand.entity.OnhandVO; +import nc.vo.pub.BusinessException; + +/** + * 现存量查询操作接口 + * @Description: + * + * @author: shijkb + * @date: 2019年11月8日 下午2:49:51 + * @version NCC1909 + */ +public interface IAPIOnhandQuery { + + OnhandVO[] queryOnhandVOByDims(Map paramMap) throws BusinessException; + + OnhandVO[] queryOnhandVOByDims(List> paramMap)throws Exception; +} diff --git a/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java new file mode 100644 index 0000000..3ed56e3 --- /dev/null +++ b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java @@ -0,0 +1,152 @@ +package nccloud.openapi.ic.onhand; + +import java.util.*; +import java.util.stream.Collectors; + +import javax.ws.rs.Consumes; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import nc.bs.dao.BaseDAO; +import nc.bs.dao.DAOException; +import nc.impl.pubapp.pattern.database.SqlBuilderUtil; +import nc.vo.bd.material.MaterialVO; +import nc.vo.bd.stordoc.StordocVO; +import nc.vo.pub.BusinessException; +import nc.vo.pubapp.pattern.pub.SqlBuilder; +import org.json.JSONString; + +import nc.bs.framework.common.NCLocator; +import nc.vo.ic.onhand.entity.OnhandVO; +import nc.vo.pub.lang.UFDouble; +import nc.ws.opm.pub.utils.result.APIErrCodeEnum; +import nccloud.api.ic.onhand.IAPIOnhandQuery; +import nccloud.api.rest.utils.ResultMessageUtil; + +/** + * 现存量信息查询资源类 + * @Description: + * + * @author: shijkb + * @date: 2019年11月8日 下午2:42:47 + * @version NCC1909 + */ +@Path("ic/onhand") +public class OnhandResource { + + + /** + * 现存量查询 + */ + @POST + @Path("onhandQuery") + @Consumes("application/json") + @Produces("application/json") + public JSONString onhandQuery(Map paramMap){ + if (paramMap == null) { + return ResultMessageUtil.exceptionToJSON("传入参数错误,组织、单据日期条件必输", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + try { + OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(IAPIOnhandQuery.class) + .queryOnhandVOByDims(paramMap) ; + //对数据进行整合组装,返回数量 + UFDouble onhandNum = UFDouble.ZERO_DBL; + if(null != onhandVOs && onhandVOs.length > 0){ + for (OnhandVO onhandVO : onhandVOs) { + onhandNum = onhandNum.add(onhandVO.getNonhandnum()); + } + } + return ResultMessageUtil.toJSON(onhandNum, "现存量查询成功!"); + }catch(Exception e){ + return ResultMessageUtil.exceptionToJSON(e); + } + } + + /** + * 现存量查询 + */ + @POST + @Path("onhandsQuery") + @Consumes("application/json") + @Produces("application/json") + public JSONString onhandsQuery(List> paramMapList){ + if (paramMapList == null) { + return ResultMessageUtil.exceptionToJSON("传入参数错误,组织、单据日期条件必输", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + try { + OnhandVO[] onhandVOs = NCLocator.getInstance().lookup(IAPIOnhandQuery.class) + .queryOnhandVOByDims(paramMapList) ; + //对数据进行整合组装,返回物料+仓库+数量 + + if(null != onhandVOs && onhandVOs.length > 0){ + //提炼出onhandVOs里的物料和仓库 + Set materialPkSet = Arrays.stream(onhandVOs) + .map(onhandVO -> onhandVO.getCmaterialvid()) + .collect(Collectors.toSet()); + Set warehousePkSet = Arrays.stream(onhandVOs) + .map(onhandVO -> onhandVO.getCwarehouseid()) + .collect(Collectors.toSet()); + Map materialPKCodeMap=queryPK2CodeMap("pk_material",materialPkSet,"bd_material"); + Map warehousePKCodeMap=queryPK2CodeMap("pk_stordoc",warehousePkSet,"bd_stordoc"); + if(materialPKCodeMap==null ||materialPKCodeMap.isEmpty()){ + throw new BusinessException("queryOnhand end : materialPKCodeMap is null"); + } + if(warehousePKCodeMap==null ||warehousePKCodeMap.isEmpty()){ + throw new BusinessException("queryOnhand end : warehousePKCodeMap is null"); + } + // 根据物料和仓库分组 + Map> groupedOnhand = Arrays.stream(onhandVOs) + .collect(Collectors.groupingBy(onhandVO -> onhandVO.getPk_org()+"_"+onhandVO.getCmaterialvid() + "_" + onhandVO.getCwarehouseid())); + Set keys = groupedOnhand.keySet(); + JSONArray reArray = new JSONArray(); + for (String dimkey : keys){ + List onhandVOList = groupedOnhand.get(dimkey); + JSONObject jsonObject = new JSONObject(); + UFDouble onhandNum = UFDouble.ZERO_DBL; + + jsonObject.put("materialpk", onhandVOList.get(0).getCmaterialvid()); + jsonObject.put("materialCode", materialPKCodeMap.getOrDefault(onhandVOList.get(0).getCmaterialvid(), "")); + jsonObject.put("warehousepk", onhandVOList.get(0).getCwarehouseid()); + jsonObject.put("warehouseCOde", warehousePKCodeMap.getOrDefault(onhandVOList.get(0).getCwarehouseid(), "")); + for(OnhandVO onhandVO:onhandVOList){ + onhandNum = onhandNum.add(onhandVO.getNonhandnum()); + } + jsonObject.put("onhandnum", onhandNum); + reArray.add(jsonObject); + } + return ResultMessageUtil.toJSON(reArray, "现存量查询成功!"); + + }else{ + return ResultMessageUtil.toJSON(null, "现存量查询成功,无数据!"); + } + }catch(Exception e){ + return ResultMessageUtil.exceptionToJSON(e); + } + } + + private Map queryPK2CodeMap(String pkname, Set pks,String tablename) throws DAOException { + SqlBuilderUtil SqlBuilderUtil = new SqlBuilderUtil(); + SqlBuilder sql =new SqlBuilder(); + sql.append(" select code,"+pkname +" from "+tablename+" where "); + sql.append(pkname,pks.toArray(new String[0])); + List> remain = (List>) new BaseDAO().executeQuery(sql.toString(), new nc.jdbc.framework.processor.MapListProcessor()); + if (remain == null || remain.isEmpty()) { + return null; + } + // 转换为 pk 和 code 的映射 + Map pkCodeMap = new HashMap<>(); + for (Map row : remain) { + if (row != null) { + String pk = row.get(pkname) != null ? row.get(pkname).toString() : null; + String code = row.get("code") != null ? row.get("code").toString() : null; + if (pk != null && code != null) { + pkCodeMap.put(pk, code); + } + } + } + return pkCodeMap; + } +}