Commit e145d11a 张少辉

1.结构仓-拆包功能开发

1 个父辈 c947da15
正在显示 32 个修改的文件 包含 843 行增加19 行删除
......@@ -100,7 +100,17 @@ public class DateUtil {
} catch (Exception pe) {
log.error("Parse ["+strDate+"] to date Exception: " + pe.getMessage());
//throw new ParseException(pe.getMessage(), pe.getErrorOffset());
return null;
date = null;
}
if (date == null){
try {
df.setLenient(true);
date = df.parse(strDate);
} catch (Exception pe) {
log.error("Parse ["+strDate+"] to date Exception: " + pe.getMessage());
//throw new ParseException(pe.getMessage(), pe.getErrorOffset());
date = null;
}
}
return (date);
......
......@@ -153,6 +153,8 @@ public class Barcode extends BasePo implements Serializable {
*/
private Date checkOutDate;
private String pidBarcode;
/**
* 关联条码,夹具时关联相关的物料,用于入库完成时插入相关物料
*/
......@@ -235,6 +237,8 @@ public class Barcode extends BasePo implements Serializable {
private boolean isPoint = false;
private String dateCode;
/**
* 自定义的附加信息
*/
......
......@@ -178,6 +178,11 @@ public class Component extends BasePo implements Serializable {
private int validDay = 0;
/**
* 最小包装数量
*/
private int minimumPackagingQuantity = 0;
/**
* 自定义的附加信息
*/
private Map<String,String> appendData = new HashMap<>();
......
......@@ -123,8 +123,8 @@ public class CodeResolve {
if (!barcode.getPartNumber().equals(codeBeanFromRule.getBarcode().getPartNumber())) {
try {
log.warn("[" + barcode.getBarcode() + "]重新设置PN[" + barcode.getPartNumber() + "]为[" + codeBeanFromRule.getBarcode().getPartNumber() + "]");
barcode.setPartNumber(codeBeanFromRule.getBarcode().getPartNumber());
barcode = barcodeManager.save(barcode);
//barcode.setPartNumber(codeBeanFromRule.getBarcode().getPartNumber());
//barcode = barcodeManager.save(barcode);
} catch (Exception ve) {
log.error("重新设置PN出错", ve);
}
......@@ -154,7 +154,7 @@ public class CodeResolve {
codeBeanFromRule.setShowImg(component.getShowImg());
//如果已经确认尺寸,使用确认的尺寸
if ((component.isSizeConfirmed() && useSizeConfirm) || ((component.hasSizeInfo()) && (!codeBeanFromRule.hasReelSizeInfo()))) {
if ((component.isSizeConfirmed() && useSizeConfirm) /*|| ((component.hasSizeInfo()) && (!codeBeanFromRule.hasReelSizeInfo()))*/) {
codeBeanFromRule.setReelWidth(component.getPlateSize());
codeBeanFromRule.setReelHeight(component.getHeight());
......@@ -252,7 +252,9 @@ public class CodeResolve {
Component com = componentManager.findByPartNumberAndProvider(barcode.getPartNumber(), barcode.getProvider());
if (com != null){
if (com.isSizeConfirmed()){
barcode.setPlateSize(com.getPlateSize());
barcode.setHeight(com.getHeight());
log.info(barcode.getBarcode()+"对应的partNumber为:"+barcode.getPartNumber()+",尺寸已经确认:"+com.getPlateSize()+"x"+com.getHeight());
needUpdate = true;
}
}
......@@ -367,7 +369,9 @@ public class CodeResolve {
Component com = componentManager.findByPartNumberAndProvider(barcodeFromRule.getPartNumber(), barcodeFromRule.getProvider());
if (com != null){
if (com.isSizeConfirmed()){
barcodeFromRule.setPlateSize(com.getPlateSize());
barcodeFromRule.setHeight(com.getHeight());
log.info(barcodeFromRule.getBarcode()+"对应的partNumber为:"+barcodeFromRule.getPartNumber()+",尺寸已经确认:"+com.getPlateSize()+"x"+com.getHeight());
}
}
......
......@@ -817,7 +817,7 @@ public class DataCache {
for (Storage storage : getAllStorage().values()) {
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
//continue;
}
availableStorageIds.add(storage.getId());
}
......@@ -830,11 +830,11 @@ public class DataCache {
List<String> availableStorageIds = new ArrayList<>();
for (Storage storage : getAllStorage().values()) {
if(!cidList.contains(storage.getCid())){
continue;
//continue;
}
StatusBean bean = DevicesStatusUtil.getStatusBean(storage.getCid());
if (bean == null || bean.timeOut() || !bean.isAvailable()) {
continue;
//continue;
}
availableStorageIds.add(storage.getId());
}
......
......@@ -35,4 +35,22 @@ public class InList extends BasePo implements Serializable {
* 超时未完成,已发送邮件通知
*/
private boolean sendEmail=false;
//momo系统对接字段
private String BillType;
private String CreateTime;
private String Creator;
private String IsInspectfree;
private String ReceiptOrder;
private String ReceiptStatus;
private String ReceiptType;
private String SupplierCode;
public InList(String name, int status, List<InListItem> inListItems, long startTime, boolean sendEmail) {
this.name = name;
this.status = status;
this.inListItems = inListItems;
this.startTime = startTime;
this.sendEmail = sendEmail;
}
}
......@@ -38,6 +38,14 @@ public class InListItem extends BasePo implements Serializable {
*/
private String ri;
private String DateCode;
private String LotNo;
private String ReceiveFlag;
/**
* 目标入库数量
*/
......
......@@ -17,10 +17,7 @@ import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@Service
......@@ -175,4 +172,8 @@ public class InListCache {
log.error("inListValidate 验证失败: 入库单["+inListName+"]没有物料 PN["+pn+"]入库需求 ");
return ResultBean.newErrorResult(1,"smfcore.inlist.noPn","入库单[{0}]没有物料[{1}]入库需求",new String[]{inListName,pn} );
}
public Collection<InList> getALlInList() {
return inListMap.values();
}
}
......@@ -529,6 +529,9 @@ public class LiteOrderCache {
if(!Strings.isNullOrEmpty(reelId)){
//RI
pos=storagePosManager.getByBarcode(reelId);
if (pos == null){
pos = storagePosManager.getByPidBarcode(reelId);
}
if(pos != null){
if(excludePosIds.contains(pos.getId())) {
log.info("工单[" + orderNo + "]RI出库,任务数[" + taskReelCount + "]出库位置仓位【" + pos.getPosName() + "】RI=[" + pos.getBarcode().getBarcode() + "]已在操作队列中,跳过不处理");
......@@ -621,6 +624,10 @@ public class LiteOrderCache {
task.setLocInfo(locInfo);
task.setSo(cacheOrder.getSo());
task.setSoltNum(orderItem.getSlotNum());
task.setStockoutNo(orderNo);
task.setContainer(pos.getBarcode().getPidBarcode());
task.setProductName("");
task.setStockreturnNoLine(orderItem.getStockoutNoLine());
// task = dataLogDao.save(task);
taskService.addTaskToExecute(task);
}
......
......@@ -104,6 +104,13 @@ public class LiteOrderItem extends BasePo implements Serializable ,Comparable<Li
private String orderType = "";
private String StockoutNoLine;
private String ProductName;
private String Equipment;
private String SubRegion;
private String StationNo;
private String PickLocation;
private List<TaskDetail> taskDetailList;
/**
......
......@@ -81,7 +81,7 @@ public class MaterialBoxController {
//此处需要判断是否是料盒
Component component=componentManager.findOneByPN(barcode.getPartNumber() );
if(component==null||(component.getType()!=COMPONENT_TYPE.FIXTURE)){
if(component==null/*||(component.getType()!=COMPONENT_TYPE.FIXTURE)*/){
throw new ValidateException("smfcore.materialBox.invalid", "未找到料盒信息{0}", new String[]{code});
}
......
......@@ -537,6 +537,42 @@ public class StoragePosController {
data.add(dateFormat.format(pos.getBarcode().getPutInDate()));
data.add(pos.getBarcode().getFullCode());
dataList.add(data);
//开始处理料箱中的barcode
List<Barcode> subCodeList = pos.getBarcode().getSubCodeList();
if (subCodeList != null && !subCodeList.isEmpty()){
for (Barcode barcode : subCodeList) {
String subProDate = barcode.getProduceDate() == null ? "" : dateFormat.format(barcode.getProduceDate());
String subExpireDate = barcode.getExpireDate() == null ? "" : dateFormat.format(barcode.getExpireDate());
String subPutInTime = (barcode.getPutInTime() == -1) ? "" : dateFormat.format(new Date(barcode.getPutInTime()));
if(ObjectUtil.isNotEmpty(subPutInTime)){
subPutInTime=dateFormat.format(barcode.getPutInTime());
}
List<Object> subData = new ArrayList<>();
subData.add(barcode.getBarcode());
subData.add(barcode.getPartNumber());
subData.add(subProDate);
subData.add(subExpireDate);
subData.add(barcode.getBatch());
subData.add(pos.getPosName());
subData.add(barcode.getLockName());
subData.add(barcode.getAmount());
subData.add(barcode.getPlateSize()+"X"+barcode.getHeight());
subData.add(pos.getW());
subData.add(pos.getH());
subData.add(subPutInTime);
if (barcode.getPutInDate() != null) {
subData.add(dateFormat.format(barcode.getPutInDate()));
} else {
subData.add(subPutInTime);
}
subData.add(barcode.getFullCode());
dataList.add(subData);
}
}
}
return dataList;
}
......
......@@ -100,4 +100,6 @@ public interface IStoragePosManager extends IBaseManager<StoragePos> {
Sort getSortByCheckOutType(CHECKOUT_TYPE checkoutType);
int getRemainPosCountByStorage(Storage storage, Barcode barcode, Collection<String> excludePosIds, String s, String f);
StoragePos getByPidBarcode(String reelId);
}
......@@ -393,6 +393,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
}
@Override
public StoragePos getByPidBarcode(String barcode) {
return storagePosDao.findOneByCondition(new String[]{"barcode.pidBarcode"}, new String[]{barcode});
}
@Override
public PageData<StoragePos> findByPage(Query query, Pageable pageable) {
int totalCount = storagePosDao.countByQuery(query);
List<StoragePos> list = storagePosDao.findByQuery(query, pageable);
......
......@@ -255,6 +255,8 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
private boolean outFromPos = false;
private boolean notifyMomo = false;
private Integer soltNum;
private String so;
......@@ -265,6 +267,20 @@ public class DataLog extends BasePo implements Serializable ,Comparable<DataLog>
private String currentLoc;
//退库增加的参数
private String productName;
private int qty;
private String stockreturnNoLine;
private String stockReturn;
//出库增加的参数
private String StockoutNo;
private String StockoutNoLine;
private String container;
public String getBarcode() {
if(barcode == null){
return "";
......
......@@ -791,14 +791,14 @@ public class TaskService {
, new String[]{barcode.getPlateSize() + "x" + barcode.getHeight(), barcode.getBarcode()});
}
availbleStorageList.sort(new Comparator<Storage>() {
/*availbleStorageList.sort(new Comparator<Storage>() {
@Override
public int compare(Storage o1, Storage o2) {
Integer taskCount1 = storageTaskCountMap.get(o1.getId());
Integer taskCount2 = storageTaskCountMap.get(o2.getId());
return taskCount1.compareTo(taskCount2);
}
});
});*/
return findEmptyPosInStorages(barcode, availbleStorageList, hasOutTaskStorageIds, lastPosId);
}
......@@ -937,7 +937,7 @@ public class TaskService {
}
try {
Collection<String> operatingPosIds = excludePosIds();
log.debug("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
log.info("尝试从[" + storage.getCid() + "]中为[" + barcode.getBarcode() + "]查找空位");
StoragePos pos = storagePosManager.getEmptyPosByStorage(storage, barcode, operatingPosIds, lastPosId,needMovePosName,endStr);
if (pos != null) {
return pos;
......
......@@ -6,10 +6,14 @@ import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.ReelLockPosUtil;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IBarcodeManager;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.inList.service.po.InListItem;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
......@@ -18,6 +22,9 @@ import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.aiqingzhiyin1643.bean.CtuCheckOutTask;
import com.neotel.smfcore.custom.aiqingzhiyin1643.bean.CtuPutInTask;
import com.neotel.smfcore.custom.aiqingzhiyin1643.bean.Station;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.MomoApi;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request.SplitContainerRequest;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response.SplitContainerResponse;
import com.neotel.smfcore.custom.aiqingzhiyin1643.util.BoxUtil;
import com.neotel.smfcore.custom.aiqingzhiyin1643.util.StationCacheUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
......@@ -49,6 +56,15 @@ public class AgvDeviceController {
@Autowired
private DataCache dataCache;
@Autowired
private MomoApi momoApi;
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private InListCache inListCache;
@ApiOperation("获取库位号(1.如果有入库任务,直接返回库位号 2.如果没有入库任务,则生成一个入库任务,返回库位号)")
@RequestMapping("/service/store/agvBox/generatePutInTask")
@AnonymousAccess
......@@ -98,6 +114,7 @@ public class AgvDeviceController {
storageList.add(storage);
cidList.add(storage.getCid());
}
ReelLockPosUtil.removeReelLockPosInfo(barcode.getBarcode());
StoragePos pos = taskService.findEmptyPosForPutIn(storageList, barcode, "", "");
if (pos == null) {
return ResultBean.newErrorResult(-1, "smfcore.noValidStorage", "[{0}]料仓列表中未找到可用的料仓", new String[]{barcode.getBarcode()});
......@@ -119,7 +136,41 @@ public class AgvDeviceController {
if (reelLocInfo == null) {
return ResultBean.newErrorResult(-1, "", "[" + barcode.getBarcode() + "]库位[" + reelLocInfo.getLockPosName() + "]已被锁定,暂停入库", new String[]{});
}
//通知momo系统拆包数据
InListItem item = null;
String pidBarcode = barcode.getPidBarcode();
if (StringUtils.isNotEmpty(pidBarcode)){
Barcode splitBarcode = barcodeManager.findByBarcode(pidBarcode);
/*SplitContainerRequest splitContainerRequest = new SplitContainerRequest();
splitContainerRequest.setContainerNo(splitBarcode.getBarcode());
splitContainerRequest.setSplitContainerNo(pidBarcode);
splitContainerRequest.setSplitQuantity(barcode.getAmount()+"");
SplitContainerResponse splitContainerResponse = momoApi.splitContainer(splitContainerRequest);
if (!"200".equals(splitContainerResponse.getResult())){
return ResultBean.newErrorResult(-1,"smfcore.splitContainer.error","拆包通知失败[{0}]",new String[]{splitContainerResponse.getMessage()});
}*/
//判断有没有对应的入库单
Collection<InList> aLlInList = inListCache.getALlInList();
if (aLlInList != null && !aLlInList.isEmpty()){
for (InList inList : aLlInList) {
List<InListItem> inListItems = inList.getInListItems();
for (InListItem inListItem : inListItems) {
if (splitBarcode.getBarcode().equals(inListItem.getRi())){
item = inListItem;
break;
}
}
}
}
}
DataLog inTask = BoxUtil.generateInTask(pos, barcode, currentLoc);
if (item != null){
inTask.setStockReturn(item.getName());
inTask.setProductName("");
inTask.setQty(item.getNum());
inTask.setStockreturnNoLine(item.getReceiveFlag());
}
taskService.addTaskToExecute(inTask);
resultMap.put("boxStr", barcode.getBarcode());
resultMap.put("posName", inTask.getPosName());
......@@ -203,6 +254,10 @@ public class AgvDeviceController {
opTask.setOutFromPos(true);
}
taskService.updateFinishedTask(opTask);
if (!opTask.isNotifyMomo()) {
opTask.setNotifyMomo(true);
taskService.updateFinishedTask(opTask);
}
if (OP_STATUS.FINISHED.name().equals(statusStr)) {
//已完成,从完成缓存中清除
taskService.removeFinishedTask(opTask);
......
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.common.utils.HttpHelper;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.api.listener.BaseSmfApiListener;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request.GetNewContainerNoRequest;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request.SplitContainerRequest;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response.GetNewContainerNoResponse;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response.SplitContainerResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MomoApi extends BaseSmfApiListener {
@Value("${api.getNewContainerNoUrl}")
private String getNewContainerNoUrl;
@Value("${api.splitContainerUrl}")
private String splitContainerUrl;
/**
* 接口6:MOM接收WMS的退库结果
* @param inNotifyUrl
* @param task
*/
@Override
public void inTaskStatusChange(String inNotifyUrl, DataLog task) {
if (task.isFinished()){
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("ReturnDate", DateUtil.toDateString(task.getUpdateDate(),"yyyy/MM/dd HH:mm:ss"));
paramMap.put("StockReturn",task.getStockReturn());
List<Map<String,Object>> Details = new ArrayList<>();
Map<String,Object> detailMap = new HashMap<>();
detailMap.put("ProductName",task.getProductName());
detailMap.put("ProductNo",task.getPartNumber());
detailMap.put("Qty",task.getQty());
List<Map<String,Object>> RKContainer = new ArrayList<>();
Map<String,Object> rkContainerMap = new HashMap<>();
rkContainerMap.put("CQty",task.getNum());
rkContainerMap.put("Container",task.getBarcode());
RKContainer.add(rkContainerMap);
detailMap.put("RKContainer",RKContainer);
detailMap.put("StockreturnNoLine",task.getStockreturnNoLine());
Details.add(detailMap);
paramMap.put("Details",Details);
log.info("接口6:MOM接收WMS的退库结果,请求参数为:"+ JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(inNotifyUrl,paramMap);
log.info("接口6:MOM接收WMS的退库结果,返回参数为:"+ resultStr);
} catch (ApiException e) {
log.error("接口6:MOM接收WMS的退库结果,请求异常:",e);
}
}
}
/**
* 接口5:MOM接收WMS的出库结果
* @param outNotifyUrl
* @param task
*/
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
if (!task.isNotifyMomo()) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("StockoutNo", task.getStockoutNo());
List<Map<String, Object>> DetailItems = new ArrayList<>();
Map<String, Object> itemMap = new HashMap<>();
if (StringUtils.isNotEmpty(task.getContainer())) {
itemMap.put("Container", task.getContainer());
} else {
itemMap.put("Container", task.getBarcode());
}
//itemMap.put("Container", task.getBarcode());
itemMap.put("ProductName", task.getProductName());
itemMap.put("ProductNo", task.getPartNumber());
itemMap.put("QuantityOnHand", task.getNum());
itemMap.put("StockoutNoLine", task.getStockoutNoLine());
DetailItems.add(itemMap);
paramMap.put("DetailItems", DetailItems);
log.info("接口5:MOM接收WMS的出库结果,请求参数为:" + JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(outNotifyUrl, paramMap);
log.info("接口5:MOM接收WMS的出库结果,返回参数为:" + resultStr);
} catch (ApiException e) {
log.error("接口5:MOM接收WMS的出库结果,请求异常:", e);
}
}
}
/**
* 接口10:WMS从MOM获取新包装条码
* @param request
* @return
*/
public GetNewContainerNoResponse getNewContainerNo(GetNewContainerNoRequest request) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("VendorCode", request.getVendorCode());
paramMap.put("Creator", "WMS");
log.info("接口10:WMS从MOM获取新包装条码,请求参数为:" + JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(getNewContainerNoUrl,paramMap);
log.info("接口10:WMS从MOM获取新包装条码,返回参数为:" + resultStr);
return JSON.parseObject(resultStr, GetNewContainerNoResponse.class);
} catch (Exception e) {
log.error("接口10:WMS从MOM获取新包装条码,请求异常:", e);
GetNewContainerNoResponse response = new GetNewContainerNoResponse();
response.setResult("403");
response.setMessage(e.getMessage());
return response;
}
}
/**
* 接口11:WMS将拆包装信息传给MOM
* @param request
* @return
*/
public SplitContainerResponse splitContainer(SplitContainerRequest request){
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("ContainerNo", request.getContainerNo());
paramMap.put("SplitContainerNo", request.getSplitContainerNo());
paramMap.put("SplitQuantity", request.getSplitQuantity());
paramMap.put("Creator", "WMS");
log.info("接口11:WMS将拆包装信息传给MOM,请求参数为:"+ JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(splitContainerUrl, paramMap);
log.info("接口11:WMS将拆包装信息传给MOM,返回参数为:"+ resultStr);
return JSON.parseObject(resultStr, SplitContainerResponse.class);
} catch (ApiException e) {
log.error("接口11:WMS将拆包装信息传给MOM,请求异常:", e);
SplitContainerResponse response = new SplitContainerResponse();
response.setResult("403");
response.setMessage(e.getMessage());
return response;
}
}
@Override
public boolean isForThisApi(String apiName) {
return apiName != null && apiName.equalsIgnoreCase("1643");
}
}
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import lombok.Data;
import java.util.List;
@Data
public class DeliveryOrder {
private List<DeliveryOrderItem> DetailItems;
private String StockoutNo;
}
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import lombok.Data;
@Data
public class DeliveryOrderItem {
private String Container;
private String ProductName;
private String ProductNo;
private int QuantityOnHand;
private String StockoutNoLine;
private String Equipment;
private String SubRegion;
private String StationNo;
private String PickLocation;
}
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetNewContainerNoRequest {
public String VendorCode;
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import java.util.List;
public class ReceiptOrder {
private String BillType;
private String CreateTime;
private String Creator;
private String IsInspectfree;
private String ReceiptOrder;
private String ReceiptStatus;
private String ReceiptType;
private String SupplierCode;
private List<ReceiptOrderMaterial> ReceiptOrderMaterial;
// 构造函数
public ReceiptOrder() {
}
// Getter和Setter方法
public String getBillType() {
return BillType;
}
public void setBillType(String billType) {
BillType = billType;
}
public String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getCreator() {
return Creator;
}
public void setCreator(String creator) {
Creator = creator;
}
public String getIsInspectfree() {
return IsInspectfree;
}
public void setIsInspectfree(String isInspectfree) {
IsInspectfree = isInspectfree;
}
public String getReceiptOrder() {
return ReceiptOrder;
}
public void setReceiptOrder(String receiptOrder) {
ReceiptOrder = receiptOrder;
}
public String getReceiptStatus() {
return ReceiptStatus;
}
public void setReceiptStatus(String receiptStatus) {
ReceiptStatus = receiptStatus;
}
public String getReceiptType() {
return ReceiptType;
}
public void setReceiptType(String receiptType) {
ReceiptType = receiptType;
}
public String getSupplierCode() {
return SupplierCode;
}
public void setSupplierCode(String supplierCode) {
SupplierCode = supplierCode;
}
public List<ReceiptOrderMaterial> getReceiptOrderMaterial() {
return ReceiptOrderMaterial;
}
public void setReceiptOrderMaterial(List<ReceiptOrderMaterial> receiptOrderMaterial) {
ReceiptOrderMaterial = receiptOrderMaterial;
}
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
public class ReceiptOrderDetail {
private String DateCode;
private String LotNo;
private String Qty;
private String ReceiveFlag;
private String SerialNumber;
// 构造函数
public ReceiptOrderDetail() {
}
// Getter和Setter方法
public String getDateCode() {
return DateCode;
}
public void setDateCode(String dateCode) {
DateCode = dateCode;
}
public String getLotNo() {
return LotNo;
}
public void setLotNo(String lotNo) {
LotNo = lotNo;
}
public String getQty() {
return Qty;
}
public void setQty(String qty) {
Qty = qty;
}
public String getReceiveFlag() {
return ReceiveFlag;
}
public void setReceiveFlag(String receiveFlag) {
ReceiveFlag = receiveFlag;
}
public String getSerialNumber() {
return SerialNumber;
}
public void setSerialNumber(String serialNumber) {
SerialNumber = serialNumber;
}
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import java.util.List;
public class ReceiptOrderMaterial {
private String MaterialCode;
private String MaterialCodeQty;
private String RowNumber;
private List<ReceiptOrderDetail> ReceiptOrderDetail;
// 构造函数
public ReceiptOrderMaterial() {
}
// Getter和Setter方法
public String getMaterialCode() {
return MaterialCode;
}
public void setMaterialCode(String materialCode) {
MaterialCode = materialCode;
}
public String getMaterialCodeQty() {
return MaterialCodeQty;
}
public void setMaterialCodeQty(String materialCodeQty) {
MaterialCodeQty = materialCodeQty;
}
public String getRowNumber() {
return RowNumber;
}
public void setRowNumber(String rowNumber) {
RowNumber = rowNumber;
}
public List<ReceiptOrderDetail> getReceiptOrderDetail() {
return ReceiptOrderDetail;
}
public void setReceiptOrderDetail(List<ReceiptOrderDetail> receiptOrderDetail) {
ReceiptOrderDetail = receiptOrderDetail;
}
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SplitContainerRequest {
private String ContainerNo;
private String SplitContainerNo;
private String SplitQuantity;
private String Creator;
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response;
public class ApiResponse {
private String message;
private Object resultdata;
private String type;
// 构造函数
public ApiResponse() {
}
public ApiResponse(String message, Object resultdata, String type) {
this.message = message;
this.resultdata = resultdata;
this.type = type;
}
// Getter和Setter方法
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getResultdata() {
return resultdata;
}
public void setResultdata(Object resultdata) {
this.resultdata = resultdata;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "ApiResponse{" +
"message='" + message + '\'' +
", resultdata=" + resultdata +
", type='" + type + '\'' +
'}';
}
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class GetNewContainerNoResponse {
private String Data;
private String DebugInfo;
private String ErrorCode;
private Boolean IsSuccess;
private String Message;
private String Result;
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response;
import lombok.Data;
@Data
public class SplitContainerResponse {
private Object Data;
private String DebugInfo;
private String ErrorCode;
private Boolean IsSuccess;
private String Message;
private String Result;
}
\ No newline at end of file
package com.neotel.smfcore.custom.aiqingzhiyin1643.momo.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.core.inList.service.manager.IInListManager;
import com.neotel.smfcore.core.inList.service.po.InList;
import com.neotel.smfcore.core.inList.service.po.InListItem;
import com.neotel.smfcore.core.inList.util.InListCache;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.request.*;
import com.neotel.smfcore.custom.aiqingzhiyin1643.momo.bean.response.ApiResponse;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 接收momo系统的
*/
@Slf4j
@RestController
public class MomoController {
@Autowired
private IInListManager inListManager;
@Autowired
private InListCache inListCache;
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@ApiOperation("接口1:MOMO传递入库任务给WMS")
@RequestMapping("/PDAAPI/ReceiptOrder/InsertReceiptOrder")
@AnonymousAccess
public ApiResponse insertReceiptOrder(@RequestBody ReceiptOrder receiptOrder){
log.info("收到入库单详情信息:"+ JSON.toJSONString(receiptOrder));
//判断入库单是否存在
String name = receiptOrder.getReceiptOrder();
InList inList = inListCache.getInList(name);
if (inList == null){
inList = inListManager.findByName(name);
}
if (inList != null){
return new ApiResponse("入库任务:"+name+"已经存在",null,"error");
}
//转成smf的入库单
inList = createInList(receiptOrder);
inList = inListManager.createWithItems(inList);
inListCache.addInListToMap(inList);
return new ApiResponse("接收:"+name+"成功",null,"success");
}
@ApiOperation("接口4:MOM传递出库任务给WMS")
@RequestMapping("/PDAAPI/DeliveryOrder/InsertDeliveryOrder")
@AnonymousAccess
public ApiResponse insertDeliveryOrder(@RequestBody DeliveryOrder deliveryOrder){
log.info("MOM传递出库任务给WMS:"+ JSON.toJSONString(deliveryOrder));
//判断存不存在
String orderNo = deliveryOrder.getStockoutNo();
LiteOrder liteOrder = liteOrderCache.getLiteOrder(orderNo);
if (liteOrder == null){
liteOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (liteOrder != null){
return new ApiResponse("出库任务:"+orderNo+"已经存在",null,"error");
}
liteOrder = createLiteorder(deliveryOrder);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return new ApiResponse("接收:"+orderNo+"成功",null,"success");
}
private LiteOrder createLiteorder(DeliveryOrder deliveryOrder) {
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(deliveryOrder.getStockoutNo());
List<LiteOrderItem> itemList = new ArrayList<>();
for (DeliveryOrderItem detailItem : deliveryOrder.getDetailItems()) {
LiteOrderItem item = new LiteOrderItem();
item.setRi(detailItem.getContainer());
item.setPn(detailItem.getProductNo());
item.setNeedNum(detailItem.getQuantityOnHand());
item.setStockoutNoLine(detailItem.getStockoutNoLine());
item.setProductName(detailItem.getProductName());
item.setEquipment(detailItem.getEquipment());
item.setSubRegion(detailItem.getSubRegion());
item.setStationNo(detailItem.getStationNo());
item.setPickLocation(detailItem.getPickLocation());
itemList.add(item);
}
liteOrder.setOrderItems(itemList);
return liteOrder;
}
private InList createInList(ReceiptOrder receiptOrder) {
InList inList = new InList();
inList.setName(receiptOrder.getReceiptOrder());
inList.setBillType(receiptOrder.getBillType());
inList.setCreateTime(receiptOrder.getCreateTime());
inList.setCreator(receiptOrder.getCreator());
inList.setIsInspectfree(receiptOrder.getIsInspectfree());
inList.setReceiptOrder(receiptOrder.getReceiptOrder());
inList.setSupplierCode(receiptOrder.getSupplierCode());
List<InListItem> inListItem = new ArrayList<>();
List<ReceiptOrderMaterial> receiptOrderMaterialList = receiptOrder.getReceiptOrderMaterial();
for (ReceiptOrderMaterial material : receiptOrderMaterialList) {
List<ReceiptOrderDetail> detailList = material.getReceiptOrderDetail();
for (ReceiptOrderDetail detail : detailList) {
InListItem item = new InListItem();
item.setName(receiptOrder.getReceiptOrder());
item.setRi(detail.getSerialNumber());
item.setPN(material.getMaterialCode());
item.setDateCode(detail.getDateCode());
item.setLotNo(detail.getLotNo());
item.setNum((int) Double.parseDouble(detail.getQty()));
item.setReceiveFlag(detail.getReceiveFlag());
inListItem.add(item);
}
}
inList.setInListItems(inListItem);
return inList;
}
}
......@@ -4,14 +4,21 @@ server:
api:
name: 1643
inCheckUrl: #入库验证
outNotifyUrl: #出库通知
inNotifyUrl: #入库通知
fetchOrderUrl: #获取工单
materialCountUrl: #是否点料
postCountDataUrl: #点料结果上传
shelfFullNotificationUrl: #货架放满通知
orderNotifyUrl:
#接口5:MOM接收WMS的出库结果
outNotifyUrl: #${ServerIP}/Apriso/HttpServices/api/extensions/1/Storage/StockOut
#接口6:MOM接收WMS的退库结果
inNotifyUrl: #${ServerIP}/Apriso/HttpServices/api/extensions/1/Storage/StockReturn
#接口10:WMS从MOM获取新包装条码
getNewContainerNoUrl: http://10.42.49.150/apriso/HttpServices/api/extensions/1/Storage/GetNewContainerNo
#接口11:WMS将拆包装信息传给MOM
splitContainerUrl: http://10.42.49.150/apriso/HttpServices/api/extensions/1/Storage/SplitContainer
......@@ -53,7 +60,7 @@ app:
type: ""
menu:
show:
show: inList
hide:
smd:
......
......@@ -431,4 +431,11 @@ smfcore.barcode.noSizeStorage=\u6599\u4ED3\u5217\u8868\u4E2D\u672A\u627E\u5230\u
smfcore.nlp.materialCountNull=\u8BF7\u5148\u70B9\u6599\u518D\u8FDB\u884C\u5165\u5E93
smfcore.nlp.materialCountTypeErroe=\u70B9\u6599\u7C7B\u578B\u4E3A[{0}],\u4E0D\u5141\u8BB8\u5165\u5E93
smfcore.barcode.fullCode=\u5B8C\u6574\u6761\u7801
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
\ No newline at end of file
smfcore.agvShelf.noLoc=\u672A\u627E\u5230\u6599\u67B6{0}\u76EE\u6807\u4F4D\u7F6E
smfcore.receiptOrder.notexist=\u4EFB\u52A1\u5355[{0}]\u4E0D\u5B58\u5728
smfcore.receiptOrder.noCode=\u6761\u7801[{0}]\u4E0D\u5728\u4EFB\u52A1\u5355[{1}]\u4E2D
smfcore.receiptOrder.hasFinish=\u4EFB\u52A1\u5355[{0}]\u5BF9\u5E94\u6761\u7801[{1}]\u5DF2\u5B8C\u6210
smfcore.component.setMinimumPackagingQuantity=\u8BF7\u8BBE\u7F6E\u6700\u5C0F\u5305\u88C5\u6570\u91CF
smfcore.component.minimumPackagingQuantityError=\u6700\u5C0F\u5305\u88C5\u6570\u91CF[{0}]\u8F93\u5165\u9519\u8BEF
smfcore.momo.newBarcodeContentError=\u83B7\u53D6\u65B0\u7684\u6761\u7801\u5185\u5BB9\u5931\u8D25[{0}]
smfcore.splitContainer.error=\u62C6\u5305\u901A\u77E5\u5931\u8D25[{0}]
\ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!