ic_现存量批量查询接口

This commit is contained in:
李正@用友 2025-05-21 18:12:10 +08:00
parent aee3473bbd
commit 206adc4443
3 changed files with 265 additions and 0 deletions

View File

@ -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<String, Object> 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<Map<String, Object>> paramMapList) throws Exception {
//必输项检查
try {
List<OnhandDimVO> onhandDimVOS = new ArrayList<>();
for (Map<String, Object> 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<String, Object> paramMap) {
for (String field : requiredField) {
Object keyValue = paramMap.get(field);
if (null == keyValue) {
ExceptionUtils.wrappBusinessException("字段:" + field + "为必输项!");
}
}
}
}

View File

@ -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<String, Object> paramMap) throws BusinessException;
OnhandVO[] queryOnhandVOByDims(List<Map<String, Object>> paramMap)throws Exception;
}

View File

@ -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<String, Object> 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<Map<String, Object>> 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<String> materialPkSet = Arrays.stream(onhandVOs)
.map(onhandVO -> onhandVO.getCmaterialvid())
.collect(Collectors.toSet());
Set<String> warehousePkSet = Arrays.stream(onhandVOs)
.map(onhandVO -> onhandVO.getCwarehouseid())
.collect(Collectors.toSet());
Map<String, String> materialPKCodeMap=queryPK2CodeMap("pk_material",materialPkSet,"bd_material");
Map<String, String> 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<String, List<OnhandVO>> groupedOnhand = Arrays.stream(onhandVOs)
.collect(Collectors.groupingBy(onhandVO -> onhandVO.getPk_org()+"_"+onhandVO.getCmaterialvid() + "_" + onhandVO.getCwarehouseid()));
Set<String> keys = groupedOnhand.keySet();
JSONArray reArray = new JSONArray();
for (String dimkey : keys){
List<OnhandVO> 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<String, String> queryPK2CodeMap(String pkname, Set<String> 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<Map<String, Object>> remain = (List<Map<String, Object>>) new BaseDAO().executeQuery(sql.toString(), new nc.jdbc.framework.processor.MapListProcessor());
if (remain == null || remain.isEmpty()) {
return null;
}
// 转换为 pk code 的映射
Map<String, String> pkCodeMap = new HashMap<>();
for (Map<String, Object> 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;
}
}