Commit 6f3952a0 sunke

更新紧急料出库不会更新需求单发料数量问题

报警允许按条码查询
1 个父辈 7c15fb15
package com.myproject.util;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.myproject.bean.qisda.AppendInfo;
import com.myproject.bean.qisda.DiffInfo;
import com.myproject.bean.update.Barcode;
import com.myproject.bean.update.DataLog;
import com.myproject.bean.update.qisda.DNInfo;
import com.myproject.bean.update.qisda.DNItem;
import com.myproject.bean.update.qisda.OutItem;
import com.myproject.exception.ApiException;
import com.myproject.exception.ValidateException;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Created by sunke on 2020/4/14.
*/
public class QisdaApi {
protected final static Logger log = LogManager.getLogger(QisdaApi.class);
private static String USER_NAME = "SMD-BOX";
/**
* 获取库存进行比对
*/
public static Map<String,DiffInfo> getInventory() throws ApiException {
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIStcok";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("area","4D");
Map<String,DiffInfo> diffInfoMap = new HashMap<>();
String result = HttpHelper.postParam(url,paramMap);
log.info("Qisda获取库存信息进行比对返回:" + result);
Map<String, Object> resultMap = JsonUtil.toMap(result);
String code = resultMap.get("code").toString();
if(code.equals("200")){
List<Map<String,Object>> data = (List<Map<String, Object>>) resultMap.get("data");
for (Map<String, Object> itemMap : data) {
DiffInfo diffInfo = new DiffInfo();
String partno = itemMap.get("partno").toString();
String facility = itemMap.get("facility").toString();
String location = itemMap.get("location").toString();
String reelid = itemMap.get("reelid").toString();
String qty = itemMap.get("qty").toString();
diffInfo.setPn(partno);
diffInfo.setReelId(reelid);
diffInfo.setLocation(location);
diffInfo.setQty(qty);
diffInfo.setFacility(facility);
diffInfoMap.put(reelid,diffInfo);
}
}else{
String errorMsg = " Qisda获取库存信息进行比对转换出错:" + resultMap.get("msg");
log.info(errorMsg);
throw new ApiException(errorMsg);
}
return diffInfoMap;
}
/**
*
* 缺料反馈接口 (出完工单时调用),绑定首盘不管是否缺料都调用,其他类型的只在所有出库完成时调用一次
*
* 只有首盘会反馈多次缺料信息,若首盘反馈第一次缺料后,料自动匹配齐了,第二次反馈时料号传N/A
*
* @param outItemList
* @param lessBind 是否是绑定缺料反馈
*/
public static void VMILocationOutFeedback(List<OutItem> outItemList, boolean lessBind){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMILocationOutFeedback";
List<Map<String,Object>> materialInfoList = new ArrayList<>();
for (OutItem outItem : outItemList) {
Map<String,Object> materialInfoMap = new HashMap<String,Object>();
materialInfoMap.put("so",outItem.getSo());//DN单号或者是厂别
materialInfoMap.put("partNum",outItem.getPn());//料号
int lossqty = outItem.outLessQty();
if(lessBind){
//绑定缺料反馈
lossqty = outItem.preBindLessQty();
}
materialInfoMap.put("lossqty",lossqty + "");//缺料数量
materialInfoMap.put("slot",outItem.getSlotStr());//料站
materialInfoMap.put("serial",outItem.gethSerial());//需求单号
materialInfoList.add(materialInfoMap);
}
if(materialInfoList.isEmpty()){
log.info("需求单不缺料,不进行缺料反馈");
}else{
String lackOfMaterial = JsonUtil.toJsonStr(materialInfoList);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("lackOfMaterial",lackOfMaterial);
log.info("缺料反馈接口(VMILocationOutFeedback)参数lackOfMaterial="+lackOfMaterial);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("收到缺料反馈接口(VMILocationOutFeedback)返回:" + result);
} catch (ApiException e) {
log.error("缺料反馈接口(VMILocationOutFeedback)接口出错",e);
}
}
}
/**
* 获取DN单详情
* @param dnNo
* @param isCheck
* @return
* @throws ApiException
*/
public static List<DNItem> GetDNDetails(String dnNo, boolean isCheck) throws ApiException {
String url = "http://10.85.17.43:8080/WMSWeb.asmx/GetDNDetailsJson";
Map<String,Object> paramMap = new HashMap<String,Object>();
//paramMap.put("DHNO","DNMISW1911197845");
paramMap.put("DHNO",dnNo);
String isCheckStr = "N";
if(isCheck){
isCheckStr = "Y";
}
paramMap.put("ISCheck",isCheckStr);
paramMap.put("isBack","Y");
String errorMsg = "";
Map<String,DNItem> itemMap = new HashMap<>();
try {
String returnResult = HttpHelper.postParam(url,paramMap);
log.info("获取DN单详情结果:" + returnResult);
String resultStr = XmlUtil.getNodeBody("string", returnResult);
if(resultStr.startsWith("[")){
List<Map<String,Object>> items = JsonUtil.toObj(resultStr, List.class);
for (Map<String,Object> map : items) {
DNItem item = new DNItem();
String no = map.get("DLNO").toString();
item.setDnNo(no);
String dnDateStr = map.get("DLCRDTE").toString()+ " " + map.get("DLCRTIME").toString();
item.setDnDateStr(dnDateStr);
int dnQty = Float.valueOf(map.get("WACTQTY").toString()).intValue();
item.setDnQty(dnQty);
String facility = map.get("WPORD").toString();
item.setFacility(facility);
String company = map.get("DSN").toString();
item.setCompany(company);
String pn = map.get("WPROD").toString();
item.setPn(pn);
DNItem dnItem = itemMap.get(pn);
if(dnItem != null){
int totalDNQty = dnItem.getDnQty() + item.getDnQty();
log.info("PN["+pn+"]有重复,合并数量[" + dnItem.getDnQty() +" + " + item.getDnQty() + " = " + totalDNQty);
dnItem.setDnQty(totalDNQty);
}else{
dnItem = item;
}
itemMap.put(pn, dnItem);
}
}else{
//返回错训误了
errorMsg = resultStr;
}
} catch (Exception e) {
errorMsg = e.getMessage();
log.error("获取DN单详情接口出错",e);
}
if(!Strings.isNullOrEmpty(errorMsg)){
throw new ApiException(errorMsg);
}
List<DNItem> dnItems = Lists.newArrayList();
if(!itemMap.isEmpty()){
dnItems.addAll(itemMap.values());
}
return dnItems;
}
/**
* 6. CIS收料判定接口(绑过料串的条码扫码入库时判断)
*/
public static void VMIMateriaReceiveJudge(DNInfo dnInfo, Barcode barcode) throws ValidateException {
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIMateriaReceiveJudge";
Map<String,Object> materialInfoMap = new HashMap<String,Object>();
String dnOrFacility = dnInfo.getDnNo();
if(dnInfo.isFacilityIn()){
dnOrFacility = dnInfo.getFacility();
}
materialInfoMap.put("dnOrFacility",dnOrFacility);//DN单号或者是厂别
materialInfoMap.put("reelID",barcode.getBarcode());//料卷ID
materialInfoMap.put("partNum",barcode.getPartNumber());//料号
materialInfoMap.put("qty",barcode.getAmount());//数量
materialInfoMap.put("lifeCycle",barcode.getLifeCycle());//生命周期
String productCode = DateUtil.toDateString(barcode.getProduceDate(),"yyyyMMdd");
materialInfoMap.put("productCode",productCode);//生产日期
materialInfoMap.put("lot", barcode.getBatch());//生产批次(批次号)
materialInfoMap.put("vendor",barcode.getProvider());//供应商
materialInfoMap.put("location","");//location
materialInfoMap.put("qrCodeInfo",barcode.getFullCodeStr());//完整的二维码信息
String materialInfo = JsonUtil.toJsonStr(materialInfoMap);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("materialInfo",materialInfo);
log.info("DN单Facility收料判断参数:materialInfo=" + materialInfo);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("DN单Facility收料判定接口返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
//0+提示信息/1/-1 0为NG,1为OK,-1为系统内部异常
if(resultStr.startsWith("1")){
log.info(barcode.getBarcode() + " ["+dnOrFacility+"]收料判定: OK");
}else{
log.info(barcode.getBarcode() + " ["+dnOrFacility+"]收料判定: NG" + resultStr);
if(resultStr.startsWith("0")){
throw new ValidateException(" ["+dnOrFacility+"]收料判定NG:" + resultStr);
}else{
throw new ValidateException(" ["+dnOrFacility+"]收料判定NG:" + resultStr);
}
}
} catch (ApiException e) {
log.error(" ["+dnOrFacility+"]收料判定接口",e);
throw new ValidateException(" ["+dnOrFacility+"]收料接口处理异常:" + e.getMessage());
}
}
/**
* 3. CIS入库判定接口 (没绑过料串的条码调用此接口)
*/
public static Barcode VMILocationInCheck(Barcode barcode) throws ValidateException{
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMILocationInCheck";
String reelid = barcode.getBarcode();
String partNum = barcode.getPartNumber();
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("reelid",reelid);
paramMap.put("partNum",partNum);
log.info("纯入库判断参数:reelid=" + reelid);
try {
//0+提示信息/1+工单 0:为NG ;1:为OK 工单号码则表示该料卷被绑定在此工单上;-1为内部异常
String result = HttpHelper.postParam(url,paramMap);
//String result = "<?xml version=\"1.0\" encoding=\"utf-8\"?><string xmlns=\"http://tempuri.org/\">{\"state\":\"1\",\"msg\":\"入库判定OK\",\"info\":{\"so\":\"2388518\",\"facility\":\"ST\",\"company\":\"BACHS\",\"qty\":\"1\",\"soseq\":\"2092475\",\"slot\":\"5-4\"}}</string>";
log.info("收到纯入库判定接口返回:" + result);
String resultStr = XmlUtil.getNodeBody("string", result);
//0+提示信息/1/-1 0为NG,1为OK,-1为系统内部异常
Map<String, Object> resultMap = JsonUtil.toMap(resultStr);
String state = resultMap.get("state").toString();
if(state.equals("1")){
log.info(reelid + " CIS入库判定: OK");
AppendInfo appendInfo = barcode.getAppendInfo();
Object infoObj = resultMap.get("info");
if(infoObj != null){
log.info("写入条码工单数量信息,并清空分盘数据");
Map infoMap = (Map)infoObj;
String so = infoMap.get("so").toString();
//有工单信息,需要绑定工单
String soseq = infoMap.get("soseq").toString();
String facility = infoMap.get("facility").toString();
String company = infoMap.get("company").toString();
String qty = infoMap.get("qty").toString();
String slot = infoMap.get("slot").toString();
Object slotlocation = infoMap.get("slotserial");
if(so.equals("0")){
so = null;
slot = null;
}
appendInfo.setCutMap(null);
appendInfo.setSo(so);
appendInfo.setSoseq(soseq);
appendInfo.setSlotStr(slot);
if(slotlocation == null || slotlocation.equals("0")){
appendInfo.setBindSlot(null);
appendInfo.setPreBindSlot(null);
appendInfo.setSlotIndex(-1);
}else{
String location = slotlocation.toString();
log.info(reelid + "数量:"+ qty + "绑定工单"+ so + "["+location+"]");
appendInfo.setBindSlot(location);
appendInfo.setPreBindSlot(location);
try{
int slotIndex = Integer.valueOf(location);
appendInfo.setSlotIndex(slotIndex);
//TODO:需要重新绑定
}catch (Exception e){
}
}
appendInfo.setFacility(facility);
appendInfo.setCompany(company);
int amount = Integer.valueOf(qty);
barcode.setAmount(amount);
barcode.setInitialAmount(amount);
//绑定工单
// appendInfo.sethSerial(outItem.gethSerial());
// appendInfo.setRefno(outItem.getRefno());
// appendInfo.setSlotIndex(outItem.getSlotlocation());
// barcode.setAppendInfo(appendInfo);
// int realLockQty = outItem.getRealLockQty() + barcode.getAmount();
// outItem.setRealLockQty(realLockQty);
barcode.setAppendInfo(appendInfo);
}
}else{
log.info(reelid + " 纯入库判定: NG" + resultStr);
String ngMsg = resultMap.get("msg").toString();
throw new ValidateException("纯入库判定NG:["+state+"]" + ngMsg);
}
} catch (Exception e) {
log.error("纯入库判定接口出错"+e.getMessage());
throw new ValidateException("纯入库判定接口处理异常:" + e.getMessage());
}
return barcode;
}
/**
* 纯入库操作完成时通知Qisda
*/
public static void VMILocationIn(String reelID, String location){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMILocationIn";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("reelID",reelID);
paramMap.put("location",location);
paramMap.put("userName",USER_NAME);
log.info("纯入库操作完成时通知Qisda接口(VMILocationIn):reelID=" + reelID + "&location="+location);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("纯入库操作完成时通知Qisda接口(VMILocationIn)返回:" + result);
} catch (ApiException e) {
log.error("纯入库操作完成时通知Qisda接口(VMILocationIn)出错",e);
}
}
/**
* CIS收料入库接口
*/
public static void VMIMateriaReceive(Barcode barcode, DataLog task){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIMateriaReceive";
Map<String,Object> materialInfoMap = new HashMap<String,Object>();
materialInfoMap.put("dnOrFacility",barcode.getAppendInfo().getDnOrFacility());//DN单号或者是厂别
materialInfoMap.put("reelID",barcode.getBarcode());//料卷ID
materialInfoMap.put("partNum",barcode.getPartNumber());//料号
materialInfoMap.put("qty",barcode.getAmount() + "");//数量
materialInfoMap.put("lifeCycle",barcode.getLifeCycle());//生命周期
String productCode = DateUtil.toDateString(barcode.getProduceDate(),"yyyyMMdd");
materialInfoMap.put("productCode",productCode);//生产日期
materialInfoMap.put("lot", barcode.getBatch());//生产批次(批次号)
materialInfoMap.put("vendor",barcode.getProvider());//供应商
materialInfoMap.put("location",task.getPosName());//location
materialInfoMap.put("qrCodeInfo",barcode.getFullCodeStr());//完整的二维码信息
materialInfoMap.put("reelType","0");//料卷类型
String materialInfo = JsonUtil.toJsonStr(materialInfoMap);
//materialInfo = "{\"dnOrFacility\":\"DNMIST1901002587\",\"reelID\":\"R000002014042300013\",\"reelType\":\"0\",\"partNum\":\"6H.15010.204\",\"qty\":\"3\",\"lifeCycle\":\"240\",\"productCode\":\"20191102\",\"lot\":\"L00000000IA9617JL1D81\",\"vendor\":\"82012\",\"location\":\"1-1\",\"qrCodeInfo\":\"L00000000IA9617JL1D81;E20190101 0730;B8C.00501.010503562019010103000;R000002014042300013\"}";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("materialInfo",materialInfo);
paramMap.put("userName",USER_NAME);
log.info("DN单收料或Facility收料通知Qisda接口(VMIMateriaReceive)返回:" + materialInfo);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("DN单收料或Facility收料接口返回:" + result);
} catch (ApiException e) {
log.error("DN单收料或Facility收料接口出错",e);
}
}
/**
* 出仓完成时通知
* @param materialInfoMap
*/
public static void VMILocationOut(Map<String, Object> materialInfoMap){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMILocationOut";
String materialInfo = JsonUtil.toJsonStr(materialInfoMap);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("materialInfo",materialInfo);
paramMap.put("userName",USER_NAME);
log.info("出仓完成时通知Qisda:materialInfo=" + materialInfo);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("出仓完成时通知Qisda(VMILocationOut)返回:" + result);
} catch (ApiException e) {
log.error("出仓完成时通知Qisda(VMILocationOut)接口出错",e);
}
}
/**
* 物料放上小车时调用
* @param task 任务信息
* @param barcode 条码信息
* @param latest 本次工单第几盘料(F 第一次,L 最后一次, M 中间)
*/
public static void VMIMateriaRecAss(DataLog task, Barcode barcode, String latest){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/VMIMateriaRecAss";
Map<String,Object> materialInfoMap = new HashMap<String,Object>();
AppendInfo appendInfo = task.getAppendInfo();
materialInfoMap.put("action",appendInfo.getAction());
materialInfoMap.put("facility",appendInfo.getFacility());
materialInfoMap.put("so",appendInfo.getSo());
materialInfoMap.put("partNum",task.getPartNumber());
materialInfoMap.put("reelID",task.getBarcode());
materialInfoMap.put("slot", appendInfo.getSlotStr());
materialInfoMap.put("slotserial", appendInfo.getSlotIndex());
materialInfoMap.put("qty",task.getNum() +"");
materialInfoMap.put("latest",latest);//本次工单第几盘料(F 第一次,L 最后一次, M 中间, E是错误)
materialInfoMap.put("cloudLocation",task.getPosName());//云料仓的库位
materialInfoMap.put("location","");//料架库位
materialInfoMap.put("vehicleID",appendInfo.getRfid());//料车编号
if(latest.equals("E")){
//错误状态不发料车编号
materialInfoMap.put("vehicleID","");//料车编号
}
materialInfoMap.put("vehicleLocation",appendInfo.getRfidLoc());//料车架位号
materialInfoMap.put("lot", barcode.getBatch());//生产批次(批次号)
String productCode = DateUtil.toDateString(barcode.getProduceDate(),"yyyyMMdd");
materialInfoMap.put("productCode",productCode);//生产日期
materialInfoMap.put("vendorCode",barcode.getProvider());//供应商
materialInfoMap.put("hSerial",appendInfo.gethSerial());
materialInfoMap.put("flag", "");//子盘或母盘(L:子盘,M:母盘,其他'')
String idte = DateUtil.toDateString(task.getUpdateDate(), "yyyyMMdd");
String idme = DateUtil.toDateString(task.getUpdateDate(), "HHmmss");
materialInfoMap.put("idte",idte);//发料日期
materialInfoMap.put("itme",idme);//发料时间
materialInfoMap.put("soseq",appendInfo.getSoseq());//工单序号
String materialInfo = JsonUtil.toJsonStr(materialInfoMap);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("materialInfo",materialInfo);
paramMap.put("userName",USER_NAME);
log.info("物料放上小车时通知Qisda:materialInfo=" + materialInfo);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("物料放上小车时通知Qisda(VMIMateriaRecAss)返回:" + result);
} catch (ApiException e) {
log.error("物料放上小车时通知Qisda(VMIMateriaRecAss)接口出错",e);
}
}
/**
* 移远料号转换
*/
public static String PartNoMapping(String vdPartNum) throws ApiException{
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/PartNoMapping";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("vdPartNum",vdPartNum);
log.info("从Qisda获取料号转换:vdPartNum=" + vdPartNum);
String result = HttpHelper.postParam(url,paramMap);
log.info("从Qisda获取料号转换:(PartNoMapping)返回:" + result);
Map<String, Object> resultMap = JsonUtil.toMap(result);
String msg = resultMap.get("msg").toString();
if(msg.startsWith("0")){
String errorMsg = "从Qisda获取料号["+vdPartNum+"]转换出错:" + msg;
log.info(errorMsg);
throw new ApiException(errorMsg);
}
return msg;
}
public static PLATE_SIZE PartNoRule(String partNum, String vendorCode){
String url = "http://10.85.17.233/ESMTCommonInterface/CommonService.asmx/PartNoRule";
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("partNum",partNum);
paramMap.put("vendorCode",vendorCode);
try {
String result = HttpHelper.postParam(url,paramMap);
log.info("从Qisda获取料号"+partNum+"["+vendorCode+"]尺寸(PartNoRule)返回:" + result);
Map<String, Object> resultMap = JsonUtil.toMap(result);
String code = resultMap.get("code").toString();
if(code.equals("200")){
List<Map<String,Object>> data = (List<Map<String, Object>>) resultMap.get("data");
for (Map<String, Object> itemMap : data) {
String w = itemMap.get("specifications").toString();
String h = itemMap.get("widthSize").toString();
return new PLATE_SIZE(Integer.valueOf(w),Integer.valueOf(h));
}
}
} catch (ApiException e) {
log.error("从Qisda获取料号["+partNum+"["+vendorCode+"]尺寸(PartNoRule)接口出错",e);
}
return null;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!