Commit 0b369dc3 zshaohui

半成品311转库修改

1 个父辈 9bad5eb5
......@@ -1490,11 +1490,123 @@ public class LiteOrderCache {
}
public synchronized void ticketTransferOut(String orderNo, List<StoragePos> storagePosList) {
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
cacheOrder = liteOrderManager.findByOrderNo(orderNo);
}
if (cacheOrder == null) {
log.info("未找到单据:" + orderNo + "的信息");
throw new ValidateException("", "未找到单据");
}
if (cacheOrder.isClosed()) {
log.info("单据:" + orderNo + "已经关闭");
throw new ValidateException("", "单据已关闭");
}
if (!cacheOrder.isTaskFinished() && !cacheOrder.isNew()) {
log.info("单据:" + orderNo + "正在执行中");
throw new ValidateException("", "单据正在执行");
}
log.info("开始执行工单:" + orderNo);
cacheOrder.setTaskReelCount(0);
cacheOrder.setFinishedReelCount(0);
cacheOrder.setStatus(LITEORDER_STATUS.TAILS);
CHECKOUT_TYPE checkoutType = dataCache.getCheckOutType();
List<String> storageIdList = new ArrayList<>();
for (Storage storage : dataCache.getAllStorage().values()) {
storageIdList.add(storage.getId());
}
int taskReelCount = 0;
int taskNum = 0;
List<String> holdPosIdList = getHoldPosIdList(cacheOrder);
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
int remainNum = orderItem.getNeedNum() - orderItem.getTotalOutNum();
if (remainNum <= 0) {
continue;
}
Collection<String> excludePosIds = excludeOutPosIds();
//找到hold的
if (holdPosIdList != null && !holdPosIdList.isEmpty()) {
excludePosIds.addAll(holdPosIdList);
}
String pn = orderItem.getPn();
String warehouseCode = orderItem.getSrcWarehouse();
while (taskNum < remainNum) {
StoragePos pos = null;
if (storagePosList != null && !storagePosList.isEmpty()) {
for (StoragePos storagePos : storagePosList) {
if (excludePosIds.contains(storagePos.getId())) {
continue;
}
Barcode barcode = storagePos.getBarcode();
if (barcode.getPartNumber().equals(pn) || barcode.getPn().equals(pn)) {
if (warehouseCode.equals(barcode.getWarehouseCode())) {
pos = storagePos;
break;
}
}
}
}
if (pos == null) {
pos = storagePosManager.findPartNumberInStorages(storageIdList, pn, excludePosIds, checkoutType, orderItem.getBrand(), orderItem.getWarehouseCode());
}
if (pos == null) {
break;
} else {
Barcode barcode = pos.getBarcode();
log.info(barcode.getBarcode() + "需要生成出库任务,工单号为:" + orderNo);
taskNum = taskNum + barcode.getQty();
taskReelCount = taskReelCount + 1;
DataLog task = newTask(pos);
task.setSourceId(cacheOrder.getId());
task.setSourceName(cacheOrder.getOrderNo());
task.setSubSourceId(orderItem.getId());
task.setSubSourceInfo(orderItem.getFeederInfo());
task.setType(OP.CHECKOUT);
task.setStatus(OP_STATUS.WAIT.name());
task.setLoc(TaskLocUtil.MW);
task.setTicketCode(orderItem.getTicketCode());
task.setTicketItem(orderItem.getTicketItem());
task.setSourceType(LiteorderCheckType.TICKET_TRANSFER_CHECKOUT+"");
if (StringUtils.isNotEmpty(barcode.getCartonId())) {
task.setCartonId(barcode.getCartonId());
}
taskService.addTaskToExecute(task);
}
}
}
if (taskReelCount <= 0) {
log.info("工单:" + orderNo + "单据找到对应的任务");
finishedOrderTasks(cacheOrder);
throw new ValidateException("", "单据无可执行的任务");
}
cacheOrder.setTaskReelCount(taskReelCount);
liteOrderManager.save(cacheOrder);
liteOrderMap.put(cacheOrder.getOrderNo(), cacheOrder);
log.info("生成工单" + orderNo + "任务结束,数量为:" + taskReelCount);
}
private List<String> getHoldPosIdList(LiteOrder cacheOrder) {
//如果是hold的,判断有没有符合的条件
List<String> holdPosIdList = new ArrayList<>();
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
List<FetchHoldInfoResult> resultList = LuxsanApi.fetchHoldInfo(new FetchHoldInfoRequest(CommonUtil.plantCode, orderItem.getSrcWarehouse(), orderItem.getPn()));
String warehouseCode = StringUtils.isNotEmpty(orderItem.getSrcWarehouse()) ? orderItem.getSrcWarehouse() : orderItem.getWarehouseCode();
List<FetchHoldInfoResult> resultList = LuxsanApi.fetchHoldInfo(new FetchHoldInfoRequest(CommonUtil.plantCode, warehouseCode, orderItem.getPn()));
if (resultList != null && !resultList.isEmpty()) {
List<String> palletIdList = resultList.stream().map(FetchHoldInfoResult::getPALLET_ID).collect(Collectors.toList());
List<Criteria> orCriterialList = Lists.newArrayList();
......@@ -1511,5 +1623,4 @@ public class LiteOrderCache {
}
return holdPosIdList;
}
}
......@@ -595,8 +595,9 @@ public class StoragePosController {
}
if (hasOutReel) {
Barcode barcode = pos.getBarcode();
Storage storage = dataCache.getStorageById(pos.getStorageId());
DataLog task = new DataLog(storage, pos.getBarcode(), pos);
DataLog task = new DataLog(storage,barcode , pos);
task.setType(OP.CHECKOUT);
task.setPutInDate(pos.getBarcode().getPutInDate());
task.setStatus(OP_STATUS.WAIT.name());
......@@ -612,7 +613,7 @@ public class StoragePosController {
} else {
task.setExtendType(ExtendType.STORAGE_CHECKOUT);
}
//task.setPosId(pos.getId());
task.setCartonId(barcode.getCartonId());
taskService.updateQueueTask(task);
}
}
......
......@@ -386,6 +386,16 @@ public class DataLog extends BasePo implements Serializable {
private String cartonId;
/**
* 出货单号
*/
private String ticketCode;
/**
* 单据行号
*/
private String ticketItem;
public String getBarcode() {
if(barcode == null){
return "";
......
......@@ -213,6 +213,7 @@ public class TaskService {
if (extendType != -1) {
task.setExtendType(extendType);
}
task.setCartonId(barcode.getCartonId());
addTaskToExecute(task);
//}
return "";
......
......@@ -2,7 +2,6 @@ package com.neotel.smfcore.custom.luxsan.api;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.neotel.smfcore.common.exception.ApiException;
import com.neotel.smfcore.common.exception.ValidateException;
......@@ -1027,6 +1026,25 @@ public class LuxsanApi extends DefaultSmfApiListener {
}
public static String ticketPickPost(TicketPickPostRequest request) {
log.info("ticketPickPost接口请求参数为:" + JSON.toJSONString(request) + ",地址为:" + ticketPickPostUrl);
String result = "";
try {
String resultStr = HttpHelper.postJson(ticketPickPostUrl, request);
log.info("ticketPickPost接口返回为:" + resultStr);
LuxsanApiResult apiResult = JSONObject.parseObject(resultStr, LuxsanApiResult.class);
if (LuxsanApiEnum.ERROR.equals(apiResult.getMSGTY())) {
result = apiResult.getMSGTY();
}
} catch (ApiException e) {
e.printStackTrace();
result = e.getMessage();
}
return result;
}
@Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
//pickingIssue(new PickingIssueRequest());
......@@ -1320,4 +1338,11 @@ public class LuxsanApi extends DefaultSmfApiListener {
public void setTicketPickUrl(String url){
LuxsanApi.ticketPickUrl = url;
}
public static String ticketPickPostUrl;
@Value("${api.ticketPickPost}")
public void setTicketPickPostUrl(String url){
LuxsanApi.ticketPickPostUrl = url;
}
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.List;
@Data
@AllArgsConstructor
public class TicketPickPostData {
private String TICKET_CODE;
private String TICKET_ITEM;
private List<String> LABEL_LIST;
private String BIN_CODE;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class TicketPickPostRequest {
private String PLANT_CODE;
private String TICKET_CODE;
private TicketPickPostData DATA;
}
......@@ -5,4 +5,6 @@ public class LiteorderCheckType {
public static final int PICKING_CHECKOUT = 1;
public static final int TICKET_CHECKOUT = 2;
public static final int TICKET_TRANSFER_CHECKOUT = 3;
}
......@@ -14,7 +14,10 @@ import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.PalletUpdateRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.TicketPickPostData;
import com.neotel.smfcore.custom.luxsan.api.bean.request.TicketPickPostRequest;
import com.neotel.smfcore.custom.luxsan.factory_c.common.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.TaskLocUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
......@@ -141,6 +144,11 @@ public class AgvDeviceController {
if (!task.isOdn()) {
task.setStatus(statusStr);
taskService.updateFinishedTask(task);
String checkType = LiteorderCheckType.TICKET_TRANSFER_CHECKOUT + "";
if (checkType.equals(task.getSourceType())){
TicketPickPostData data = new TicketPickPostData(task.getTicketCode(),task.getTicketItem(),Arrays.asList(task.getCartonId()),"SWC");
LuxsanApi.ticketPickPost(new TicketPickPostRequest(CommonUtil.plantCode,task.getTicketCode(),data));
}
}
} else {
task.setStatus(statusStr);
......
......@@ -12,6 +12,7 @@ import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchMoveTicketRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.FetchMoveTicketDto;
import com.neotel.smfcore.custom.luxsan.factory_c.common.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.TicketUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
......@@ -50,12 +51,12 @@ public class TakeOutController {
@ApiOperation("单据出库")
@RequestMapping("/ticketOut")
@AnonymousAccess
public ResultBean ticketOut(String ticket,boolean isHold) {
public ResultBean ticketOut(String ticket, boolean isHold) {
log.info("半成品仓单据出库:" + ticket);
if (StringUtils.isNotEmpty(liteOrderCache.hasExecutingOrder())) {
//throw new ValidateException("","有正在执行的工单,不允许恢复");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单"+liteOrderCache.hasExecutingOrder()+",请确认");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单" + liteOrderCache.hasExecutingOrder() + ",请确认");
}
if (StringUtils.isEmpty(ticket)) {
......@@ -65,36 +66,11 @@ public class TakeOutController {
LiteOrder liteOrder = liteOrderCache.getOrderSortItems(ticket);
if (liteOrder == null) {
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
ticketToLiteOrder(ticket,ticketList);
}
liteOrderCache.wipTicketOut(ticket,isHold);
return ResultBean.newOkResult("");
}
public LiteOrder ticketToLiteOrder(String ticket, List<FetchMoveTicketResult> ticketList) {
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(ticket);
List<LiteOrderItem> itemList = new ArrayList<>();
for (FetchMoveTicketResult ticketResult : ticketList) {
LiteOrderItem item = new LiteOrderItem();
item.setTicketItem(ticketResult.getTICKET_ITEM());
item.setPn(ticketResult.getMATERIAL_CODE());
item.setSrcPlant(ticketResult.getSRC_PLANT());
item.setDstPlant(ticketResult.getDST_PLANT());
item.setSrcWarehouse(ticketResult.getSRC_WAREHOUSE());
item.setDstWarehouse(ticketResult.getDST_WAREHOUSE());
item.setSrcBatch(ticketResult.getSRC_BATCH());
item.setDstBatch(ticketResult.getDST_BATCH());
item.setNeedNum(ticketResult.getQTY());
item.setMoveType(ticketResult.getMOVE_TYPE());
itemList.add(item);
}
liteOrder.setOrderItems(itemList);
liteOrder = TicketUtil.ticketToLiteOrder(ticket, ticketList);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
return liteOrder;
}
liteOrderCache.wipTicketOut(ticket, isHold);
return ResultBean.newOkResult("");
}
}
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.po.Barcode;
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.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.luxsan.api.LuxsanApi;
import com.neotel.smfcore.custom.luxsan.api.bean.request.FetchMoveTicketRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import com.neotel.smfcore.custom.luxsan.factory_c.common.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.bean.dto.FetchMoveTicketDto;
import com.neotel.smfcore.custom.luxsan.factory_c.rawstor.enums.LiteorderCheckType;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.TicketUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
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;
import java.util.Map;
@Slf4j
@Api(tags = "311转库")
@RestController
@RequestMapping("/transfer")
public class TransferController {
@Autowired
private LiteOrderCache liteOrderCache;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private TaskService taskService;
//1.获取单据
@ApiOperation("拉取单据信息")
@RequestMapping("/fetchTicket")
@AnonymousAccess
public ResultBean fetchTicket(String ticket) {
if (StringUtils.isEmpty(ticket)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"单据号"});
}
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
return ResultBean.newOkResult(FetchMoveTicketDto.convertFetchMoveTicketDto(ticketList));
}
@ApiOperation("单据转库")
@RequestMapping("/ticketTransfer")
@AnonymousAccess
public ResultBean ticketTransfer(@RequestBody Map<String, String> paramMap) {
log.info("半成品仓单据转库:" + JSON.toJSONString(paramMap));
String ticket = paramMap.get("ticket");
if (StringUtils.isNotEmpty(liteOrderCache.hasExecutingOrder())) {
//throw new ValidateException("","有正在执行的工单,不允许恢复");
return ResultBean.newErrorResult(-1, "", "有正在执行的工单" + liteOrderCache.hasExecutingOrder() + ",请确认");
}
if (StringUtils.isEmpty(ticket)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"单据号"});
}
//1.判断单据是否存在
LiteOrder liteOrder = liteOrderCache.getOrderSortItems(ticket);
if (liteOrder == null) {
List<FetchMoveTicketResult> ticketList = LuxsanApi.fetchMoveTicket(new FetchMoveTicketRequest(CommonUtil.plantCode, ticket));
liteOrder = TicketUtil.ticketToLiteOrder(ticket, ticketList);
liteOrder.setCheckType(LiteorderCheckType.TICKET_TRANSFER_CHECKOUT);
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
}
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
String pallteIdListStr = paramMap.get("pallteIdList");
List<String> pallteIdList = JSONArray.parseArray(pallteIdListStr, String.class);
//判断是否在库,有没有出库任务
List<StoragePos> storagePosList = new ArrayList<>();
if (pallteIdList != null && !pallteIdList.isEmpty()) {
for (String box : pallteIdList) {
if (StringUtils.isBlank(box)) {
return ResultBean.newErrorResult(-1, "", "请核实传入的栈板id是否为空");
}
StoragePos pos = storagePosManager.findOne(new Query(Criteria.where("barcode.palletId").is(box)));
if (pos == null) {
return ResultBean.newErrorResult(-1, "", box + "不在库位中,请核实");
}
Barcode barcode = pos.getBarcode();
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (box.startsWith(dataLog.getBarcode()) && !dataLog.isFinished() && !dataLog.isCancel()) {
return ResultBean.newErrorResult(-1, "", box + "有正在执行的任务,请核实");
}
}
//判断当前工单的料号与出库的是否相同
boolean hasSame = false;
for (LiteOrderItem orderItem : orderItems) {
if (barcode.getPartNumber().equals(orderItem.getPn()) || barcode.getPn().equals(orderItem.getPn())) {
if (StringUtils.isNotBlank(barcode.getWarehouseCode())) {
if (barcode.getWarehouseCode().equals(orderItem.getSrcWarehouse())) {
hasSame = true;
}
}
}
}
if (!hasSame) {
return ResultBean.newErrorResult(-1, "", box + "库别为" + barcode.getWarehouseCode() + "不符合当前odn的料号与库别");
}
storagePosList.add(pos);
}
}
liteOrderCache.ticketTransferOut(ticket, storagePosList);
return ResultBean.newOkResult("");
}
}
......@@ -27,6 +27,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
......@@ -150,6 +152,7 @@ public class WipStorCheckOutController {
orderItem.setTicketItem(result.getTICKET_ITEM());
orderItem.setMaterialCode(result.getMATERIAL_CODE());
orderItem.setWarehouseCode(result.getWAREHOUSE_CODE());
orderItem.setSrcWarehouse(result.getWAREHOUSE_CODE());
orderItem.setVendorCode(result.getVENDOR_CODE());
orderItem.setQty(result.getQTY());
orderItem.setUnit(result.getUNIT());
......@@ -178,14 +181,16 @@ public class WipStorCheckOutController {
for (String box : boxList) {
if (StringUtils.isBlank(box)){
return ResultBean.newErrorResult(-1, "", "请核实传入的料箱号是否为空");
return ResultBean.newErrorResult(-1, "", "请核实传入的栈板id是否为空");
}
Barcode barcode = codeResolve.resolveOneValideBarcode(box);
if (barcode == null) {
return ResultBean.newErrorResult(-1, "", box + "条码无效");
StoragePos pos = storagePosManager.findOne(new Query(Criteria.where("barcode.palletId").is(box)));
if (pos == null) {
return ResultBean.newErrorResult(-1, "", box + "不在库位中,请核实");
}
Barcode barcode = pos.getBarcode();
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (box.startsWith(dataLog.getBarcode()) && !dataLog.isFinished() && !dataLog.isCancel()) {
......@@ -209,11 +214,6 @@ public class WipStorCheckOutController {
return ResultBean.newErrorResult(-1, "", box + "不符合当前odn的料号与库别");
}
StoragePos pos = storagePosManager.getByBarcode(barcode.getBarcode());
if (pos == null) {
return ResultBean.newErrorResult(-1, "", box + "不在库位中,请核实");
}
storagePosList.add(pos);
}
}
......
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util;
import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.custom.luxsan.api.bean.result.FetchMoveTicketResult;
import java.util.ArrayList;
import java.util.List;
public class TicketUtil {
public static LiteOrder ticketToLiteOrder(String ticket, List<FetchMoveTicketResult> ticketList) {
LiteOrder liteOrder = new LiteOrder();
liteOrder.setOrderNo(ticket);
List<LiteOrderItem> itemList = new ArrayList<>();
for (FetchMoveTicketResult ticketResult : ticketList) {
LiteOrderItem item = new LiteOrderItem();
item.setTicketItem(ticketResult.getTICKET_ITEM());
item.setPn(ticketResult.getMATERIAL_CODE());
item.setSrcPlant(ticketResult.getSRC_PLANT());
item.setDstPlant(ticketResult.getDST_PLANT());
item.setSrcWarehouse(ticketResult.getSRC_WAREHOUSE());
item.setDstWarehouse(ticketResult.getDST_WAREHOUSE());
item.setSrcBatch(ticketResult.getSRC_BATCH());
item.setDstBatch(ticketResult.getDST_BATCH());
item.setNeedNum(ticketResult.getQTY());
item.setMoveType(ticketResult.getMOVE_TYPE());
itemList.add(item);
}
liteOrder.setOrderItems(itemList);
return liteOrder;
}
}
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!