取校验可用量

本文介绍了一个用于查询库存数量的API调用示例,展示了如何通过设置不同的参数来获取特定条件下的库存数据,包括是否启用批号控制、序列号控制等。

inv_quantity_tree_pub.query_quantities(p_api_version_number => 1.0

,p_init_msg_lst => fnd_api.g_false

,x_return_status => l_return_status

,x_msg_count => l_msg_count

,x_msg_data => l_msg_data

,p_organization_id => p_organization_id

,p_inventory_item_id => p_inventory_item_id

,p_tree_mode => 1

, --inv_quantity_tree_pub.g_loose_only_mode

p_is_revision_control => FALSE

,p_is_lot_control => TRUE

,p_is_serial_control => TRUE

,p_revision => NULL

,p_lot_number => NULL

,p_subinventory_code => p_subinventory_code

,p_locator_id => NULL

,x_qoh => l_onhand_qty

,x_rqoh => l_rqoh

,x_qr => l_qr

,x_qs => l_qs

,x_att => l_available_qty

,x_atr => l_atr);

public Result transferMaterialFromSAP(String data){ log.error("物料转移接口,收到data:{}", data); //初始化 //模拟登录,使用集团账号admin loginService.login(ifmnConfig.getGroupAdmin(), companyService.getCompanyByCode(ifmnConfig.getCompanyGroup()).getId()); //成功计数 int successCount = 0; //失败计数 int errorCount = 0; //查询可用量sql String sql = "SELECT * FROM STB_KYL WHERE CID = ? AND CKBM = ? AND WLBM = ? AND WLPH = ?;"; //建立map判断是否属于BCD栋 Map<String, String> plantToUserMap = new HashMap<>(); //B栋 plantToUserMap.put(ifmnConfig.getbFactoryCode(), ifmnConfig.getbAdmin()); //C栋 plantToUserMap.put(ifmnConfig.getcFactoryCode(), ifmnConfig.getcAdmin()); //D栋 plantToUserMap.put(ifmnConfig.getdFactoryCode(), ifmnConfig.getDAdmin()); //转对象 ObjectMapper objectMapper = new ObjectMapper(); //忽略未知字段 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //忽略大小写 objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); List<TransferMaterialDataDto> transferMaterialDataList = new ArrayList<>(); try { transferMaterialDataList = objectMapper.readValue(data, new TypeReference<List<TransferMaterialDataDto>>() { }); } catch (IOException e) { log.error("301、302、201、202、551物料转移数据格式转换失败:{}", e.getMessage()); e.printStackTrace(); } if(transferMaterialDataList.isEmpty()){ log.error("物料转移数据转换异常,数据为空!"); return Result.success("操作成功;接口 'SAP物料转移' :物料转移数据未获数据,修改数据" + successCount + "条;"); } //2.遍历列表,调用接口 for(TransferMaterialDataDto item : transferMaterialDataList){ log.error("物料凭证:{}", item.getMaterialDocu()); //校验旗标,代表通过校验 //允许生成不代表一定生成出库单与入库单,具体生成决于item的outPlantFlag与inPlantFlag boolean allowFlag; //物料id Long materialId = 0L; //物料名称 String materialName = ""; //可用量 BigDecimal kyl = new BigDecimal(BigInteger.ZERO); //生成转料记录 createTransMaterial(item); //判断入库、出库工厂是否属于BCD checkPlant(item, plantToUserMap); if(item.getOutPlantFlag()) { //判定为bcd出库,需要计算可用量 //查询出库仓库可用量(工厂id,仓库编码,物料编码,批号) List<Map<String, Object>> kylList = jdbcTemplate.queryForList(sql, wmsDealUtils.obtainCompanyId(item.getOutPlant()), item.getOutWare(), item.getMaterialCode(), item.getBatch()); if(kylList.isEmpty()){ log.error("物料凭证 {} 出库单未查到可用量数据!", item.getMaterialDocu()); allowFlag = false; //记录错误信息 createErrRecord(item, null, null, "出库未查到可用量数据!", null); errorCount++; }else if (kylList.size() > 1) { //可用量查到多条 log.error("物料凭证 {} 出库单查到多条可用量数据!", item.getMaterialDocu()); allowFlag = false; //记录错误信息 createErrRecord(item, null, null, "出库查到多条可用量数据!", null); errorCount++; } else { //查到数据,对物料名称、物料id、可用量进行改写 kyl = (BigDecimal) kylList.get(0).get("KYL"); materialId = (Long) kylList.get(0).get("GOOD"); materialName = kylList.get(0).get("WLMC").toString(); if (kyl.compareTo(item.getTransNum()) < 0) { //当前仓库可用量不足 log.error("出库仓库可用量不足!"); log.error("物料凭证 {} 当前出库可用量不足!", item.getMaterialDocu()); allowFlag = false; //记录错误信息 createErrRecord(item, materialId, materialName, "物料可用量不足,出库失败!", kyl); errorCount++; }else{ allowFlag = true; } } }else{ //非bcd出库,允许出库 allowFlag = true; } //判定为bcd入库,不需要校验 // if(item.getInPlantFlag()){ // //do noting // } boolean successOut = true; boolean successIn = true; if(allowFlag){ log.error("校验通过,可以进行出库入库"); if(item.getOutPlantFlag()){ log.error("开始生成出库单"); String outData = outWareData(item); log.error("出库单data:{}", outData); Result outResult = otherOutSingle(outData, item.getMaterialDocu(), "SAP物料转移", wmsDealUtils.obtainCompanyId(item.getOutPlant())); if(outResult.getCode() != 200){ log.error("调用出库单接口失败!具体信息:{}", outResult); //todo 记录错误信息 createErrRecord(item, materialId, materialName, "物料【" + materialName + "】可用量不足,出库失败!", kyl); successOut = false; } } if(item.getInPlantFlag()){ log.error("开始生成入库单"); String inData = inWareData(item); log.error("入库单data:{}", inData); Result inResult = otherInSingle(inData, item.getMaterialDocu(), "SAP物料转移", wmsDealUtils.obtainCompanyId(item.getInPlant())); if(inResult.getCode() != 200){ log.error("调用入库单接口失败!具体信息:{}", inResult); //todo 记录错误信息 successIn = false; } } if(successOut && successIn){ successCount++; }else{ errorCount++; } } } //为保证对方系统正常运行,任何情况都返回success return Result.success("操作成功;接口 'SAP同步物料给MES' :成功数据 " + successCount + " 条,失败 " + errorCount + "条。"); } /** * 生成转料记录 * @param item */ private void createTransMaterial(TransferMaterialDataDto item){ log.error("开始生成转料记录"); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //生成转料记录 IFMNTransMaterial transMaterial = new IFMNTransMaterial(); transMaterial.setBatch(item.getBatch()); transMaterial.setDocumentItem(item.getDocumentItem()); transMaterial.setInPlant(item.getInPlant()); transMaterial.setInWare(item.getInWare()); transMaterial.setMaterialCode(item.getMaterialCode()); transMaterial.setMaterialDocu(item.getMaterialDocu()); transMaterial.setObtainDate(new Date()); transMaterial.setOutPlant(item.getOutPlant()); transMaterial.setOutWare(item.getOutWare()); Date postDate = new Date(); try{ postDate = sdf.parse(item.getPostDate()); }catch (Exception e) { //do nothing } transMaterial.setPostDate(postDate); transMaterial.setTransNum(item.getTransNum()); transMaterial.setTransType(new SystemCode("IFMN_TransType/" + item.getTransType())); transMaterialDao.save(transMaterial); } /** * 判断工厂是否属于bcd * @param item * @param plantToUserMap */ private void checkPlant(TransferMaterialDataDto item, Map<String, String> plantToUserMap){ //判断入库工厂,工厂属于bcd栋则设定入库管理员code if(plantToUserMap.containsKey(item.getInPlant())){ log.error("入库属于bcd栋"); item.setInPlantFlag(true); item.setInPlantAdmin(plantToUserMap.get(item.getInPlant())); } //判断出库工厂,工厂属于bcd栋则设定出库管理员code if(plantToUserMap.containsKey(item.getOutPlant())){ log.error("出库属于bcd栋"); item.setOutPlantFlag(true); item.setOutPlantAdmin(plantToUserMap.get(item.getOutPlant())); } } /** * 生成出库单data * @param item * @return */ private String outWareData(TransferMaterialDataDto item){ log.error("开始生成出库单data..."); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //生成同步仓库的detail List<Map<String, Object>> detailList = new ArrayList<>(); //warehouse细节 Map<String, Object> detail = new HashMap<>(); //物料编码 detail.put("goodCode", item.getMaterialCode()); //数量 detail.put("quantity", item.getTransNum()); //出库批号 detail.put("batchText", item.getBatch()); detailList.add(detail); Staff staff = staffService.getStaffByCode(item.getOutPlantAdmin()); Map<String, Object> outMap = new HashMap<>(); //用户名 outMap.put("userName", item.getOutPlantAdmin()); //公司编码 outMap.put("companyCode", item.getOutPlant()); //红蓝字 redBlue outMap.put("redBlue", "blue"); //部门编码 outMap.put("deptCode", staff.getMainPosition().getDepartment().getCode()); //人员编码 outMap.put("staffCode", item.getOutPlantAdmin()); //出库原因 outMap.put("comeType", "generalGoodOut"); //工作流编码 outMap.put("workflowStateSetCode", "otherOut"); //备注 outMap.put("handRemarks", "物料转移,物料凭证【" + item.getMaterialDocu() + "】"); //出库日期 outMap.put("storageDate", sdf.format(new Date())); //仓库编码 outMap.put("wareCode", item.getOutWare()); //detailList outMap.put("detailList", detailList); return JSONObject.toJSONString(outMap); } /** * 生成入库单data * @param item * @return */ private String inWareData(TransferMaterialDataDto item){ log.error("开始生成入库单data..."); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //生成同步仓库的detail List<Map<String, Object>> detailList = new ArrayList<>(); //warehouse细节 Map<String, Object> detail = new HashMap<>(); //物料编码 detail.put("goodCode", item.getMaterialCode()); //数量 detail.put("quantity", item.getTransNum()); //入库批号 detail.put("batchText", item.getBatch()); detailList.add(detail); Staff staff = staffService.getStaffByCode(item.getInPlantAdmin()); //生成同步仓库的map Map<String, Object> outMap = new HashMap<>(); //用户名 outMap.put("userName", item.getInPlantAdmin()); //公司编码 outMap.put("companyCode", item.getInPlant()); //红蓝字 redBlue outMap.put("redBlue", "blue"); //部门编码 outMap.put("deptCode", staff.getMainPosition().getDepartment().getCode()); //人员编码 outMap.put("staffCode", item.getInPlantAdmin()); //入库原因 outMap.put("comeType", "cgylrk"); //工作流编码 outMap.put("workflowStateSetCode", "otherInFlw"); //备注 outMap.put("handRemarks", "物料转移,物料凭证【" + item.getMaterialDocu() + "】"); //入库日期 outMap.put("storageDate", sdf.format(new Date())); //仓库编码 outMap.put("wareCode", item.getInWare()); //detailList outMap.put("detailList", detailList); return JSONObject.toJSONString(outMap); }代码是否有语法错误或逻辑错误?忽略所有null相关校验 /** * 生成错误记录 * @param item * @param materialId * @param materialName */ private void createErrRecord(TransferMaterialDataDto item, Long materialId, String materialName, String errMsg, BigDecimal mesNum){ IFMNTransErrorData errorData = new IFMNTransErrorData(); errorData.setMaterialDocu(item.getMaterialDocu()); errorData.setDocumentItem(item.getDocumentItem()); errorData.setTransType(new SystemCode("IFMN_TransType/" + item.getTransType())); errorData.setOutPlant(item.getOutPlant()); errorData.setOutWare(item.getOutWare()); errorData.setInPlant(item.getInPlant()); errorData.setInWare(item.getInWare()); errorData.setMaterialCode(item.getMaterialCode()); if(Objects.nonNull(materialId)){ errorData.setMaterialId(materialId.toString()); } errorData.setMaterialName(materialName); errorData.setBatch(item.getBatch()); errorData.setSapTransNum(item.getTransNum()); errorData.setMesNum(mesNum); errorData.setErrorMsg(errMsg); errorData.setIsClose(false); transErrorDataDao.save(errorData); }
最新发布
11-07
public Result transferMaterialFromSAP(String data){ //todo 0.初始化 //模拟登录,使用集团账号admin loginService.login(ifmnConfig.getGroupAdmin(), companyService.getCompanyByCode(ifmnConfig.getCompanyGroup()).getId()); //成功计数 int successCount = 0; //失败计数 int errorCount = 0; //查询可用量sql String sql = "SELECT KYL FROM STB_KYL WHERE CID = ? AND CKBM = ? AND WLBM = ? AND WLPH = ?;"; //建立map判断是否属于BCD栋 Map<String, String> plantToUserMap = new HashMap<>(); //B栋 plantToUserMap.put(ifmnConfig.getbFactoryCode(), ifmnConfig.getbAdmin()); //C栋 plantToUserMap.put(ifmnConfig.getcFactoryCode(), ifmnConfig.getcAdmin()); //D栋 plantToUserMap.put(ifmnConfig.getdFactoryCode(), ifmnConfig.getDAdmin()); //建立map记录BCD栋的cid Map<String, Long> plantIdMap = new HashMap<>(); String sqlForCompany = "SELECT CODE, ID FROM BASE_COMPANY WHERE VALID = 1 AND CODE IN (?, ?, ?);"; List<Map<String, Object>> companyList = jdbcTemplate.queryForList(sqlForCompany, ifmnConfig.getbFactoryCode(), ifmnConfig.getcFactoryCode(), ifmnConfig.getdFactoryCode()); for(Map<String, Object> item : companyList){ plantIdMap.put((String)item.get("CODE"), (Long)item.get("ID")); } //todo 1.转对象 ObjectMapper objectMapper = new ObjectMapper(); //忽略未知字段 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //忽略大小写 objectMapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true); List<TransferMaterialDataDto> transferMaterialDataList = new ArrayList<>(); try { transferMaterialDataList = objectMapper.readValue(data, new TypeReference<List<TransferMaterialDataDto>>() { }); } catch (IOException e) { log.error("301、302、201、202、551物料转移数据格式转换失败:{}", e.getMessage()); e.printStackTrace(); } if(transferMaterialDataList.isEmpty()){ log.error("物料转移数据转换异常,数据为空!"); return Result.success("操作成功;接口 'SAP物料转移' :物料转移数据未获数据,修改数据" + successCount + "条;"); } //todo 2.第一次遍历列表,整理数据 for(TransferMaterialDataDto item : transferMaterialDataList){ //校验旗标,代表通过校验 //允许生成不代表一定生成出库单与入库单,具体生成决于item的outPlantFlag与inPlantFlag boolean allowFlag = false; //生成转料记录 createTransMaterial(item); //判断入库、出库工厂是否属于BCD checkPlant(item, plantToUserMap); if(item.getOutPlantFlag()){ //判定为bcd出库,需要计算可用量 //查询出库仓库可用量(工厂id,仓库编码,物料编码,批号) List<BigDecimal> kylList = jdbcTemplate.queryForList(sql, BigDecimal.class, plantIdMap.get(item.getOutPlant()), item.getOutWare(), item.getMaterialCode(), item.getBatch()); if(kylList.size() != 1){ //可用量查到多条 log.error("物料凭证 {} 出库单查到多条可用量数据!", item.getMaterialDocu()); //todo 记录错误信息 }else if(kylList.get(0).compareTo(item.getTransNum()) < 0){ //当前仓库可用量不足 log.error("物料凭证 {} 当前出库可用量不足!", item.getMaterialDocu()); //todo 记录错误信息 }else{ allowFlag = true; } }else{ //非bcd出库,允许出库 allowFlag = true; } if(item.getInPlantFlag()){ //判定为bcd入库,不需要校验 //do noting } if(allowFlag){ //todo 生成出库单 //todo 生成入库单 } } //为保证对方系统正常运行,任何情况都返回success return Result.success("success"); } private void createTransMaterial(TransferMaterialDataDto item){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); //生成转料记录 IFMNTransMaterial transMaterial = new IFMNTransMaterial(); transMaterial.setBatch(item.getBatch()); transMaterial.setDocumentItem(item.getDocumentItem()); transMaterial.setInPlant(item.getInPlant()); transMaterial.setInWare(item.getInWare()); transMaterial.setMaterialCode(item.getMaterialCode()); transMaterial.setMaterialDocu(item.getMaterialDocu()); transMaterial.setObtainDate(new Date()); transMaterial.setOutPlant(item.getOutPlant()); transMaterial.setOutWare(item.getOutWare()); Date postDate = new Date(); try{ postDate = sdf.parse(item.getPostDate()); }catch (Exception e) { //do nothing } transMaterial.setPostDate(postDate); transMaterial.setTransNum(item.getTransNum()); transMaterial.setTransType(new SystemCode("IFMN_TransType/" + item.getTransType())); transMaterialDao.save(transMaterial); } private void checkPlant(TransferMaterialDataDto item, Map<String, String> plantToUserMap){ //判断入库工厂,工厂属于bcd栋则设定入库管理员code if(plantToUserMap.containsKey(item.getInPlant())){ item.setInPlantFlag(true); item.setInPlantAdmin(plantToUserMap.get(item.getInPlant())); } //判断出库工厂,工厂属于bcd栋则设定出库管理员code if(plantToUserMap.containsKey(item.getOutPlant())){ item.setOutPlantFlag(true); item.setOutPlantAdmin(plantToUserMap.get(item.getOutPlant())); } }这是部分未完成的代码,分析是否有逻辑问题与语法问题,忽略所有可能为null的情况
11-06
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼鱼章

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值