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);
}
最新发布