diff --git a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java index 8da8c0f7..462f2876 100644 --- a/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java +++ b/ic/src/private/nccloud/api/impl/ic/onhand/APIOnhandQueryIpml.java @@ -56,6 +56,29 @@ public class APIOnhandQueryIpml implements IAPIOnhandQuery { return onhandVOs; } + public OnhandVO[] queryOnhandVOByDimsNoTrans(List> paramMapList) throws BusinessException { + + + //必输项检查 + 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; + } + } @Override public OnhandVO[] queryOnhandVOByDims(List> paramMapList) throws Exception { // 必输项检查 diff --git a/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java index 3f822958..e94d4a22 100644 --- a/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java +++ b/ic/src/public/nccloud/api/ic/onhand/IAPIOnhandQuery.java @@ -26,6 +26,8 @@ public interface IAPIOnhandQuery { */ OnhandVO[] queryOnhandVOByDims(Map paramMap) throws BusinessException; + OnhandVO[] queryOnhandVOByDimsNoTrans(List> paramMapList) throws BusinessException; + /** * 根据多个维度查询现存量信息 * 此方法接收一个参数映射列表,每个映射包含一组查询条件,用于批量查询 diff --git a/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java index 6c843bba..dee41af1 100644 --- a/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java +++ b/ic/src/public/nccloud/openapi/ic/onhand/OnhandResource.java @@ -17,6 +17,8 @@ import nc.vo.pubapp.pattern.pub.SqlBuilder; import nc.ws.opm.pub.utils.result.APIErrCodeEnum; import nccloud.api.ic.onhand.IAPIOnhandQuery; import nccloud.api.rest.utils.ResultMessageUtil; +import nccloud.openapi.ic.onhand.mapping.OnhandMapping; +import nccloud.openapi.scmpub.pub.TransferCodeToPKTool; import org.json.JSONString; import javax.ws.rs.Consumes; @@ -319,4 +321,439 @@ public class OnhandResource { Map map = (Map) new BaseDAO().executeQuery(sql, new MapProcessor()); return map; } + + + /** + * 现存量查询 WMS富勒 + * 支持库存组织+仓库+批次+辅助属性+项目+供应商+生产厂商+客户等条件查询 + * + * @param paramMap 查询参数 + * - pk_org: 库存组织 + * - cwarehouseid: 仓库 + * - vbatchcode: 批次号 + * - cmaterialoid: 物料 + * - cprojectid: 项目 + * - cvendorid: 供应商 + * - cproductorid: 生产厂商 + * - casscustid: 客户 + */ + @POST + @Path("onhandWmsQuery") + @Consumes("application/json") + @Produces("application/json") + public JSONString onhandQueryWms(Map paramMap) { + if (paramMap == null) { + return ResultMessageUtil.exceptionToJSON("传入参数错误", APIErrCodeEnum.BUSINESSEXCCODE.getCode()); + } + try { + String orgCode = (String) paramMap.get("pk_org"); + // 构建动态SQL查询现存量 + paramMap = TransferCodeToPKTool.doTranslateFields(new OnhandMapping(), this.deleteUnNessaryField(paramMap)); + String sql = buildOnhandQuerySql(paramMap); + + // 执行SQL查询 + List> onhandList = (List>) new BaseDAO() + .executeQuery(sql, new nc.jdbc.framework.processor.MapListProcessor()); + + if (onhandList != null && !onhandList.isEmpty()) { + // 收集所有相关ID用于批量查询 + Set materialIds = new HashSet<>(); + Set warehouseIds = new HashSet<>(); + Set projectIds = new HashSet<>(); + Set vendorIds = new HashSet<>(); + Set producerIds = new HashSet<>(); + Set customerIds = new HashSet<>(); + + for (Map onhandData : onhandList) { + if (onhandData.get("cmaterialvid") != null) { + materialIds.add(onhandData.get("cmaterialvid").toString()); + } + if (onhandData.get("cwarehouseid") != null) { + warehouseIds.add(onhandData.get("cwarehouseid").toString()); + } + if (onhandData.get("cprojectid") != null) { + projectIds.add(onhandData.get("cprojectid").toString()); + } + if (onhandData.get("cvendorid") != null) { + vendorIds.add(onhandData.get("cvendorid").toString()); + } + if (onhandData.get("cproductorid") != null) { + producerIds.add(onhandData.get("cproductorid").toString()); + } + if (onhandData.get("casscustid") != null) { + customerIds.add(onhandData.get("casscustid").toString()); + } + } + + // 批量查询相关信息 + Map> materialInfoMap = new HashMap<>(); + Map> warehouseInfoMap = new HashMap<>(); + Map> projectInfoMap = new HashMap<>(); + Map> vendorInfoMap = new HashMap<>(); + Map> producerInfoMap = new HashMap<>(); + Map> customerInfoMap = new HashMap<>(); + + // 物料信息 + for (String materialId : materialIds) { + Map materialMap = this.getMaterialInfo(materialId); + materialInfoMap.put(materialId, materialMap != null ? materialMap : new HashMap<>()); + } + + // 仓库信息 + String warehouseSelectFields = StordocVO.CODE + "," + StordocVO.NAME; + for (String warehouseId : warehouseIds) { + Map warehouseMap = this.transferFields( + StordocVO.getDefaultTableName(), warehouseSelectFields, StordocVO.PK_STORDOC, warehouseId); + warehouseInfoMap.put(warehouseId, warehouseMap != null ? warehouseMap : new HashMap<>()); + } + + // 项目信息 + for (String projectId : projectIds) { + Map projectMap = this.transferFields( + "bd_project", "project_code,project_name", "pk_project", projectId); + projectInfoMap.put(projectId, projectMap != null ? projectMap : new HashMap<>()); + } + + // 供应商信息 + for (String vendorId : vendorIds) { + Map vendorMap = this.transferFields( + "bd_supplier", "code,name", "pk_supplier", vendorId); + vendorInfoMap.put(vendorId, vendorMap != null ? vendorMap : new HashMap<>()); + } + + // 生产厂商信息 + for (String producerId : producerIds) { + Map producerMap = this.transferFields( + "bd_defdoc", "code,name", "pk_defdoc", producerId); + producerInfoMap.put(producerId, producerMap != null ? producerMap : new HashMap<>()); + } + + // 客户信息 + for (String customerId : customerIds) { + Map customerMap = this.transferFields( + "bd_customer", "code,name", "pk_customer", customerId); + customerInfoMap.put(customerId, customerMap != null ? customerMap : new HashMap<>()); + } + + JSONArray reArray = new JSONArray(); + for (Map onhandData : onhandList) { + JSONObject jsonObject = new JSONObject(); + + // 基本信息 + JSONObject baseInfo = new JSONObject(); + baseInfo.put("pk_org", onhandData.get("pk_org")); + baseInfo.put("onhandnum", onhandData.get("nonhandnum")); + baseInfo.put("vbatchcode", onhandData.get("vbatchcode")); + baseInfo.put("orgcode", orgCode); + jsonObject.put("baseInfo", baseInfo); + + // 物料信息 + JSONObject materialInfoDetail = new JSONObject(); + String cmaterialvid = onhandData.get("cmaterialvid") != null ? onhandData.get("cmaterialvid").toString() : null; + Map materialInfo = materialInfoMap.getOrDefault(cmaterialvid, Collections.emptyMap()); + materialInfoDetail.put("materialPk", cmaterialvid); + materialInfoDetail.put("materialCode", materialInfo.getOrDefault(MaterialVO.CODE, "")); + materialInfoDetail.put("materialName", materialInfo.getOrDefault(MaterialVO.NAME, "")); + materialInfoDetail.put("materialtype", materialInfo.getOrDefault(MaterialVO.MATERIALTYPE, "")); + materialInfoDetail.put("materialspec", materialInfo.getOrDefault(MaterialVO.MATERIALSPEC, "")); + materialInfoDetail.put("unitcode", materialInfo.getOrDefault("unitcode", "")); + materialInfoDetail.put("unitname", materialInfo.getOrDefault("unitname", "")); + jsonObject.put("materialInfo", materialInfoDetail); + + // 仓库信息 + String cwarehouseid = onhandData.get("cwarehouseid") != null ? onhandData.get("cwarehouseid").toString() : null; + JSONObject warehouseInfoDetail = new JSONObject(); + Map warehouseInfo = warehouseInfoMap.getOrDefault(cwarehouseid, Collections.emptyMap()); + warehouseInfoDetail.put("warehousePk", cwarehouseid); + warehouseInfoDetail.put("warehouseCode", warehouseInfo.getOrDefault(StordocVO.CODE, "")); + warehouseInfoDetail.put("warehouseName", warehouseInfo.getOrDefault(StordocVO.NAME, "")); + jsonObject.put("warehouseInfo", warehouseInfoDetail); + + // 项目信息 + String cprojectid = onhandData.get("cprojectid") != null ? onhandData.get("cprojectid").toString() : null; + JSONObject projectInfoDetail = new JSONObject(); + Map projectInfo = projectInfoMap.getOrDefault(cprojectid, Collections.emptyMap()); + projectInfoDetail.put("projectPk", cprojectid); + projectInfoDetail.put("projectCode", projectInfo.getOrDefault("project_code", "")); + projectInfoDetail.put("projectName", projectInfo.getOrDefault("project_name", "")); + jsonObject.put("projectInfo", projectInfoDetail); + + // 供应商信息 + String cvendorid = onhandData.get("cvendorid") != null ? onhandData.get("cvendorid").toString() : null; + JSONObject venderInfoDetail = new JSONObject(); + Map vendorInfo = vendorInfoMap.getOrDefault(cvendorid, Collections.emptyMap()); + venderInfoDetail.put("vendorPk", cvendorid); + venderInfoDetail.put("vendorCode", vendorInfo.getOrDefault("code", "")); + venderInfoDetail.put("vendorName", vendorInfo.getOrDefault("name", "")); + jsonObject.put("venderInfo", venderInfoDetail); + + // 生产厂商信息 + String cproductorid = onhandData.get("cproductorid") != null ? onhandData.get("cproductorid").toString() : null; + JSONObject producerInfoDetail = new JSONObject(); + Map producerInfo = producerInfoMap.getOrDefault(cproductorid, Collections.emptyMap()); + producerInfoDetail.put("producerPk", cproductorid); + producerInfoDetail.put("producerCode", producerInfo.getOrDefault("code", "")); + producerInfoDetail.put("producerName", producerInfo.getOrDefault("name", "")); + jsonObject.put("producerInfo", producerInfoDetail); + + // 客户信息 + String casscustid = onhandData.get("casscustid") != null ? onhandData.get("casscustid").toString() : null; + JSONObject customerInfoDetail = new JSONObject(); + Map customerInfo = customerInfoMap.getOrDefault(casscustid, Collections.emptyMap()); + customerInfoDetail.put("customerPk", casscustid); + customerInfoDetail.put("customerCode", customerInfo.getOrDefault("code", "")); + customerInfoDetail.put("customerName", customerInfo.getOrDefault("name", "")); + jsonObject.put("customerInfo", customerInfoDetail); + + // 辅助属性信息(物料自由属性) + jsonObject.put("vfree1", onhandData.get("vfree1")); + jsonObject.put("vfree2", onhandData.get("vfree2")); + jsonObject.put("vfree3", onhandData.get("vfree3")); + jsonObject.put("vfree4", onhandData.get("vfree4")); + jsonObject.put("vfree5", onhandData.get("vfree5")); + jsonObject.put("vfree6", onhandData.get("vfree6")); + jsonObject.put("vfree7", onhandData.get("vfree7")); + jsonObject.put("vfree8", onhandData.get("vfree8")); + jsonObject.put("vfree9", onhandData.get("vfree9")); + jsonObject.put("vfree10", onhandData.get("vfree10")); + + reArray.add(jsonObject); + } + return ResultMessageUtil.toJSON(reArray, "现存量查询成功!"); + + } else { + return ResultMessageUtil.toJSON(null, "现存量查询成功,无数据!"); + } + } catch (Exception e) { + return ResultMessageUtil.exceptionToJSON(e); + } + } + + + private Map deleteUnNessaryField(Map paramMap) { + Map newParamMap = new HashMap<>(); + // 然后校验如果非必填项有传递空或者null 手动删除属性 + for (String field : paramMap.keySet()) { + Object keyValue = paramMap.get(field); + if (null == keyValue || "".equals(keyValue)) { + continue; + } + newParamMap.put(field, keyValue); + } + + return newParamMap; + } + + /** + * 构建现存量查询SQL + * + * @param paramMap 查询参数 + * @return 动态构建的SQL语句 + */ + private String buildOnhandQuerySql(Map paramMap) { + StringBuilder sql = new StringBuilder(); + + // 基础SQL结构 + sql.append("select onhand.pk_org pk_org, "); + sql.append("onhand.cmaterialoid cmaterialoid, "); + sql.append("meta.pk_material cmaterialvid, "); + sql.append("meta.pk_measdoc cunitid, "); + sql.append("sum(onhand.nonhandnum) nonhandnum, "); + sql.append("sum(onhand.nonhandastnum) nonhandastnum, "); + sql.append("sum(onhand.ngrossnum) ngrossnum, "); + sql.append("sum(onhand.nnum1) nnum1, "); + sql.append("sum(onhand.nastnum1) nastnum1, "); + sql.append("sum(onhand.ngrossnum1) ngrossnum1, "); + sql.append("sum(onhand.nnum2) nnum2, "); + sql.append("sum(onhand.nastnum2) nastnum2, "); + sql.append("sum(onhand.ngrossnum2) ngrossnum2, "); + sql.append("sum(onhand.nlocknum) nlocknum, "); + sql.append("sum(onhand.nlockastnum) nlockastnum, "); + sql.append("sum(onhand.nlockgrossnum) nlockgrossnum, "); + sql.append("sum(onhand.nrsnum) nrsnum, "); + sql.append("sum(onhand.nrsastnum) nrsastnum, "); + sql.append("sum(onhand.nrsgrossnum) nrsgrossnum, "); + sql.append("sum(onhand.nonhandnumrpt) nonhandnumrpt, "); + sql.append("sum(onhand.nonhandastnumrpt) nonhandastnumrpt, "); + sql.append("sum(onhand.ngrossnumrpt) ngrossnumrpt, "); + sql.append("sum(onhand.nlocknumrpt) nlocknumrpt, "); + sql.append("sum(onhand.nlockastnumrpt) nlockastnumrpt, "); + sql.append("sum(onhand.nlockgrossnumrpt) nlockgrossnumrpt, "); + sql.append("sum(onhand.nvmionhandnum) nvmionhandnum, "); + sql.append("sum(onhand.nvmionhandastnum) nvmionhandastnum, "); + sql.append("sum(onhand.nvmilocknum) nvmilocknum, "); + sql.append("sum(onhand.nvmilockastnum) nvmilockastnum, "); + sql.append("sum(onhand.ntplonhandnum) ntplonhandnum, "); + sql.append("sum(onhand.ntplonhandastnum) ntplonhandastnum, "); + sql.append("sum(onhand.ntpllocknum) ntpllocknum, "); + sql.append("sum(onhand.ntpllockastnum) ntpllockastnum, "); + sql.append("onhand.cwarehouseid, "); + sql.append("onhand.vbatchcode, "); + sql.append("onhand.cvendorid, "); + sql.append("onhand.cprojectid, "); + sql.append("onhand.casscustid, "); + sql.append("onhand.cproductorid, "); + sql.append("onhand.vfree1, "); + sql.append("onhand.vfree2, "); + sql.append("onhand.vfree3, "); + sql.append("onhand.vfree4, "); + sql.append("onhand.vfree5, "); + sql.append("onhand.vfree6, "); + sql.append("onhand.vfree7, "); + sql.append("onhand.vfree8, "); + sql.append("onhand.vfree9, "); + sql.append("onhand.vfree10 "); + + sql.append("from (select hand.nonhandnum nonhandnumrpt, "); + sql.append("hand.nonhandastnum nonhandastnumrpt, "); + sql.append("hand.ngrossnum ngrossnumrpt, "); + sql.append("hand.nlocknum nlocknumrpt, "); + sql.append("hand.nlockastnum nlockastnumrpt, "); + sql.append("hand.nlockgrossnum nlockgrossnumrpt, "); + sql.append("CASE WHEN nvl(hand.cvmivenderid, '~') = '~' THEN 0.0 ELSE hand.nonhandnum END nvmionhandnum, "); + sql.append("CASE WHEN nvl(hand.ctplcustomerid, '~') = '~' THEN 0.0 ELSE hand.nonhandnum END ntplonhandnum, "); + sql.append("CASE WHEN nvl(hand.cvmivenderid, '~') = '~' THEN 0.0 ELSE hand.nlocknum END nvmilocknum, "); + sql.append("CASE WHEN nvl(hand.ctplcustomerid, '~') = '~' THEN 0.0 ELSE hand.nlocknum END ntpllocknum, "); + sql.append("CASE WHEN nvl(hand.cvmivenderid, '~') = '~' THEN 0.0 ELSE hand.nonhandastnum END nvmionhandastnum, "); + sql.append("CASE WHEN nvl(hand.ctplcustomerid, '~') = '~' THEN 0.0 ELSE hand.nonhandastnum END ntplonhandastnum, "); + sql.append("CASE WHEN nvl(hand.cvmivenderid, '~') = '~' THEN 0.0 ELSE hand.nlockastnum END nvmilockastnum, "); + sql.append("CASE WHEN nvl(hand.ctplcustomerid, '~') = '~' THEN 0.0 ELSE hand.nlockastnum END ntpllockastnum, "); + sql.append("hand.pk_group, hand.pk_org, hand.cwarehouseid, hand.cmaterialvid, hand.cmaterialoid, "); + sql.append("hand.castunitid, hand.clocationid, hand.pk_batchcode, hand.vbatchcode, hand.vchangerate, "); + sql.append("hand.cvmivenderid, hand.ctplcustomerid, hand.cstateid, hand.cvendorid, hand.cprojectid, "); + sql.append("hand.casscustid, hand.cproductorid, hand.cffileid, hand.vfree1, hand.vfree2, hand.vfree3, "); + sql.append("hand.vfree4, hand.vfree5, hand.vfree6, hand.vfree7, hand.vfree8, hand.vfree9, hand.vfree10, "); + sql.append("'~' pk_marbasclass, hand.nonhandnum, hand.nonhandastnum, hand.ngrossnum, hand.nnum1, "); + sql.append("hand.nastnum1, hand.ngrossnum1, hand.nnum2, hand.nastnum2, hand.ngrossnum2, hand.nlocknum, "); + sql.append("hand.nlockastnum, hand.nlockgrossnum, hand.nrsnum, hand.nrsastnum, hand.nrsgrossnum "); + + sql.append("from (select handdim.pk_group, handdim.pk_org, handdim.cwarehouseid, handdim.cmaterialvid, "); + sql.append("handdim.cmaterialoid, handdim.castunitid, handdim.clocationid, handdim.pk_batchcode, "); + sql.append("handdim.vbatchcode, handdim.vchangerate, handdim.cvmivenderid, handdim.ctplcustomerid, "); + sql.append("handdim.cstateid, handdim.cvendorid, handdim.cprojectid, handdim.casscustid, "); + sql.append("handdim.cproductorid, handdim.cffileid, handdim.vfree1, handdim.vfree2, handdim.vfree3, "); + sql.append("handdim.vfree4, handdim.vfree5, handdim.vfree6, handdim.vfree7, handdim.vfree8, "); + sql.append("handdim.vfree9, handdim.vfree10, ic_onhandnum.nonhandnum, ic_onhandnum.nonhandastnum, "); + sql.append("ic_onhandnum.ngrossnum, ic_onhandnum.nnum1, ic_onhandnum.nastnum1, ic_onhandnum.ngrossnum1, "); + sql.append("ic_onhandnum.nnum2, ic_onhandnum.nastnum2, ic_onhandnum.ngrossnum2, ic_onhandnum.nlocknum, "); + sql.append("ic_onhandnum.nlockastnum, ic_onhandnum.nlockgrossnum, ic_onhandnum.nrsnum, "); + sql.append("ic_onhandnum.nrsastnum, ic_onhandnum.nrsgrossnum "); + + sql.append("from ic_onhandnum ic_onhandnum "); + sql.append("INNER JOIN ic_onhanddim handdim ON (ic_onhandnum.pk_onhanddim = handdim.pk_onhanddim) "); + sql.append("LEFT outer JOIN scm_batchcode scm_batchcode ON (handdim.pk_batchcode = scm_batchcode.pk_batchcode) "); + sql.append("INNER JOIN bd_stordoc bd_stordoc ON (handdim.cwarehouseid = bd_stordoc.pk_stordoc) "); + + sql.append("where 1 = 1 AND ic_onhandnum.dr = 0 "); + + // 动态添加查询条件 + sql.append("AND handdim.pk_group = '").append("0001A110000000000677").append("' "); + + // 组织条件(必输)- 处理可能是数组的情况 + String pk_org = getStringValue(paramMap.get("pk_org")); + if (pk_org != null && !pk_org.trim().isEmpty()) { + sql.append("AND handdim.pk_org = '").append(pk_org).append("' "); + } + + // 仓库条件 + String cwarehouseid = getStringValue(paramMap.get("cwarehouseid")); + if (cwarehouseid != null && !cwarehouseid.trim().isEmpty()) { + sql.append("AND handdim.cwarehouseid = '").append(cwarehouseid).append("' "); + } + + // 批次条件 + String vbatchcode = getStringValue(paramMap.get("vbatchcode")); + if (vbatchcode != null && !vbatchcode.trim().isEmpty()) { + sql.append("AND handdim.vbatchcode = '").append(vbatchcode).append("' "); + } + + // 物料条件 + String cmaterialoid = getStringValue(paramMap.get("cmaterialoid")); + if (cmaterialoid != null && !cmaterialoid.trim().isEmpty()) { + sql.append("AND handdim.cmaterialoid = '").append(cmaterialoid).append("' "); + } + + // 项目条件 + String cprojectid = getStringValue(paramMap.get("cprojectid")); + if (cprojectid != null && !cprojectid.trim().isEmpty()) { + sql.append("AND handdim.cprojectid = '").append(cprojectid).append("' "); + } + + // 供应商条件 + String cvendorid = getStringValue(paramMap.get("cvendorid")); + if (cvendorid != null && !cvendorid.trim().isEmpty()) { + sql.append("AND handdim.cvendorid = '").append(cvendorid).append("' "); + } + + // 生产厂商条件 + String cproductorid = getStringValue(paramMap.get("cproductorid")); + if (cproductorid != null && !cproductorid.trim().isEmpty()) { + sql.append("AND handdim.cproductorid = '").append(cproductorid).append("' "); + } + + // 客户条件 + String casscustid = getStringValue(paramMap.get("casscustid")); + if (casscustid != null && !casscustid.trim().isEmpty()) { + sql.append("AND handdim.casscustid = '").append(casscustid).append("' "); + } + + // 仓库相关条件 + sql.append("AND bd_stordoc.gubflag = 'N' "); + // 不差虚拟仓 + sql.append("AND (bd_stordoc.def1 = '~' or bd_stordoc.def1 = 'Y' or bd_stordoc.def1 IS NULL) "); + sql.append("AND (nvl(ic_onhandnum.nonhandnum, 0) <> 0 OR nvl(ic_onhandnum.nonhandastnum, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.ngrossnum, 0) <> 0 OR nvl(ic_onhandnum.nnum1, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.nastnum1, 0) <> 0 OR nvl(ic_onhandnum.ngrossnum1, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.nnum2, 0) <> 0 OR nvl(ic_onhandnum.nastnum2, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.ngrossnum2, 0) <> 0 OR nvl(ic_onhandnum.nlocknum, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.nlockastnum, 0) <> 0 OR nvl(ic_onhandnum.nlockgrossnum, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.nrsnum, 0) <> 0 OR nvl(ic_onhandnum.nrsastnum, 0) <> 0 OR "); + sql.append("nvl(ic_onhandnum.nrsgrossnum, 0) <> 0)) hand) onhand "); + + sql.append("LEFT outer JOIN bd_material_v meta ON onhand.cmaterialoid = meta.pk_source "); + sql.append("LEFT outer JOIN org_stockorg meta_1 ON onhand.pk_org = meta_1.pk_stockorg "); + sql.append("LEFT outer JOIN bd_material meta_2 ON onhand.cmaterialvid = meta_2.pk_material "); + + sql.append("where 1 = 1 "); + // 如果有组织条件,添加到最终查询条件中 + if (pk_org != null && !pk_org.trim().isEmpty()) { + sql.append("AND onhand.pk_org = '").append(pk_org).append("' "); + } + + sql.append("GROUP BY onhand.pk_org, onhand.cmaterialoid, meta.pk_material, meta.pk_measdoc, "); + sql.append("onhand.cwarehouseid, onhand.vbatchcode, onhand.cvendorid, onhand.cprojectid, "); + sql.append("onhand.casscustid, onhand.cproductorid, onhand.vfree1, onhand.vfree2, onhand.vfree3, "); + sql.append("onhand.vfree4, onhand.vfree5, onhand.vfree6, onhand.vfree7, onhand.vfree8, "); + sql.append("onhand.vfree9, onhand.vfree10"); + + return sql.toString(); + } + + /** + * 获取字符串值,处理可能的数组情况 + * + * @param value 参数值,可能是字符串或数组 + * @return 字符串值,如果是数组则取第一个元素 + */ + private String getStringValue(Object value) { + if (value == null) { + return null; + } + + if (value instanceof String) { + return (String) value; + } + + if (value instanceof String[]) { + String[] arr = (String[]) value; + return arr.length > 0 ? arr[0] : null; + } + + if (value instanceof List) { + List list = (List) value; + return list.size() > 0 && list.get(0) != null ? list.get(0).toString() : null; + } + + return value.toString(); + } }