Commit b36b4b80 张少辉

1.增加工单出库 补料出库功能

1 个父辈 9ebd8d7e
......@@ -165,7 +165,7 @@ public class LiteOrderCache {
Date curr = new Date();
if (order.getSDate().before(curr)) {
//开始自动出库
String result = checkOutLiteOrder(order.getOrderNo(), false);
String result = checkOutLiteOrder(order.getOrderNo(), false,new HashMap<>());
if (!ObjectUtil.isEmpty(result)) {
String msg = MessageUtils.getText(result, MessageUtils.getDefaultLocal(), "");
log.info("自动执行工单 【" + order.getOrderNo() + "】 失败:" + msg);
......@@ -435,23 +435,23 @@ public class LiteOrderCache {
/**
* 执行工单出库,批量料仓默认出库到料串上
*/
public String checkOutLiteOrder(String orderNo, boolean outBom) {
public String checkOutLiteOrder(String orderNo, boolean outBom, Map<String, Integer> orderItemCheckOutMap) {
boolean singleOut = false;
return checkOutLiteOrder(orderNo, outBom, singleOut);
return checkOutLiteOrder(orderNo, outBom, singleOut, orderItemCheckOutMap);
}
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut) {
return checkOutLiteOrder(orderNo, outBom, singleOut, false);
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut, Map<String, Integer> orderItemCheckOutMap) {
return checkOutLiteOrder(orderNo, outBom, singleOut, false, orderItemCheckOutMap);
}
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut, boolean needCheck) {
return checkOutLiteOrder(orderNo, outBom, singleOut, needCheck, new ArrayList<>());
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut, boolean needCheck, Map<String, Integer> orderItemCheckOutMap) {
return checkOutLiteOrder(orderNo, outBom, singleOut, needCheck, new ArrayList<>(), orderItemCheckOutMap);
}
/**
* 执行工单出库
*/
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut, boolean needCheck, List<String> cidList){
public synchronized String checkOutLiteOrder(String orderNo, boolean outBom, boolean singleOut, boolean needCheck, List<String> cidList, Map<String, Integer> orderItemCheckOutMap){
//判断工单是否存在
LiteOrder cacheOrder = liteOrderMap.get(orderNo);
if (cacheOrder == null) {
......@@ -498,15 +498,34 @@ public class LiteOrderCache {
List<String> availableStorageIds = dataCache.getAvailableStorageIds(cidList);
boolean shortage = false;
List<String> needOutPosId = new ArrayList<>();
//开始循环处理数据
for (LiteOrderItem orderItem : cacheOrder.getOrderItems()) {
//判断在不在所勾选的里边
Integer needCheckNum = null;
if (orderItemCheckOutMap != null && !orderItemCheckOutMap.isEmpty()) {
needCheckNum = orderItemCheckOutMap.get(orderItem.getId());
if (needCheckNum == null) {
continue;
}
}
//当前已出数量置为空
orderItem.setOutNum(0);
orderItem.setOutReelCount(0);
liteOrderItemManager.save(orderItem);
//剩余未出数量
Float totalNum = orderItem.getNeedNum() * cacheOrder.getOrderTimes();
int remainNum = totalNum.intValue() - orderItem.getTotalOutNum();
//判断数量
if (needCheckNum != null) {
if (needCheckNum < remainNum) {
remainNum = needCheckNum;
}
}
//剩余未出盘数
int remainReelCount = orderItem.getNeedReelCount() - orderItem.getTotalOutReelCount();
if (remainNum > 0 || remainReelCount > 0) {
......
......@@ -2,6 +2,8 @@
package com.neotel.smfcore.core.order.rest;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean;
......@@ -21,6 +23,7 @@ import com.neotel.smfcore.core.language.util.MessageUtils;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.enums.LITEORDER_STATUS;
import com.neotel.smfcore.core.order.enums.LITEORDER_STYPE;
import com.neotel.smfcore.core.order.rest.bean.OrderItemCheckDetail;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderItemDto;
import com.neotel.smfcore.core.order.rest.bean.dto.OrderKanbanDto;
......@@ -156,8 +159,25 @@ public class OrderController {
@PostMapping(value = "/out")
@PreAuthorize("@el.check('workOrder')")
public ResultBean checkOut(@RequestBody Map<String, String> mapValues) {
String orderNo = mapValues.get("orderNo");
String id = mapValues.get("id");
String orderItems = mapValues.get("orderItems");
//转化为map
Map<String, Integer> orderItemCheckOutMap = new HashMap<>();
if (StringUtils.isNotEmpty(orderItems)) {
List<OrderItemCheckDetail> detailList = JSONObject.parseArray(orderItems, OrderItemCheckDetail.class);
for (OrderItemCheckDetail detail : detailList) {
int needNum = detail.getNeedNum();
if (needNum <= 0) {
return ResultBean.newErrorResult(-1, "", "需求数量不能为0");
}
String itemId = detail.getId();
orderItemCheckOutMap.put(itemId, needNum);
}
}
LiteOrder liteOrder = null;
if (!ObjectUtils.isEmpty(id)) {
liteOrder = liteOrderManager.get(id);
......@@ -170,7 +190,7 @@ public class OrderController {
if (liteOrder == null) {
throw new ValidateException("smfcore.valueNotFind", "未找到{0}[{1}]", new String[]{"orderNo", orderNo});
}
String result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false);
String result = liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false,orderItemCheckOutMap);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
} else {
......@@ -187,7 +207,7 @@ public class OrderController {
if (orderNo == null) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result = liteOrderCache.checkOutLiteOrder(orderNo, true);
String result = liteOrderCache.checkOutLiteOrder(orderNo, true,new HashMap<>());
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
} else {
......@@ -205,7 +225,7 @@ public class OrderController {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"orderNo"});
}
String result = liteOrderCache.checkOutLiteOrder(orderNo, false);
String result = liteOrderCache.checkOutLiteOrder(orderNo, false,new HashMap<>());
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result);
} else {
......
package com.neotel.smfcore.core.order.rest.bean;
import lombok.Data;
@Data
public class OrderItemCheckDetail {
private String id;
private int needNum;
}
......@@ -235,7 +235,7 @@ public class MaterialBoxController {
boolean isDocking = dataCache.isElectronicWarehouseDocking();
if (isDocking) {
//通知momo,退库接口
StockReturnResponse response = momoApi.stockReturn(barcode);
StockReturnResponse response = momoApi.stockReturn(barcode,"LDHJ_J");
if (!response.getIsSuccess()){
return ResultBean.newErrorResult(-1, "smfcore.momo.stockOutError", response.getErrorMessage(), new String[]{});
}
......
......@@ -425,11 +425,11 @@ public class StoragePosManagerImpl implements IStoragePosManager {
//判断有没有限高
if(heightLimited){
// 限高:匹配仓位编码最后以-03结尾(请确认字段名是posCode,若不是请替换)
Pattern pattern = Pattern.compile("-03$");
Pattern pattern = Pattern.compile("-3$");
c = c.and("posName").regex(pattern);
} else {
// 不限高:匹配仓位编码最后不是-03结尾
Pattern pattern = Pattern.compile("^(.*(?<!-03))$");
// 不限高:匹配仓位编码最后不是-3结尾
Pattern pattern = Pattern.compile("^(.*(?<!-3))$");
c = c.and("posName").regex(pattern);
}
Query query = new Query(c);
......
......@@ -15,8 +15,8 @@ public enum PutAwayLocEnum {
inPos1("inPos1", false),
inPos2("inPos2", false),
inPos3("inPos3", false),
inPos4("inPos4", false),
inPos5("inPos5", true);
inPos4("inPos4", true),
inPos5("inPos5", false);
// 实际位置(默认和枚举名一致,可自定义)
private final String actualPosition;
......
......@@ -81,16 +81,21 @@ public class MomoApi extends BaseSmfApiListener {
) {
String receiptOrder = barcode.getReceiptOrder();
if (StringUtils.isNotEmpty(receiptOrder)) {
stockIn(barcode);
//如果是电子仓的,则传LDHJ,如果是结构仓的则传LDHJ_J
String warehouseLocation = "LDHJ";
if (storage.getCorrespondingWarehouse() == CORRESPONDING_WAREHOUSE.STRUCTURAL_WAREHOUSE){
warehouseLocation = "LDHJ_J";
}
stockIn(barcode,warehouseLocation);
} else {
if (storage.getCorrespondingWarehouse() == CORRESPONDING_WAREHOUSE.ELECTRONIC_WAREHOUSE) {
if (StringUtils.isNotEmpty(task.getStockoutNo())){
stockReturn(barcode);
stockReturn(barcode,"LDHJ");
}
}
}
}else if (storage.getCorrespondingWarehouse() == CORRESPONDING_WAREHOUSE.FINISHED_GOODS_WAREHOUSE) {
fgStockIn(barcode);
fgStockIn(barcode,task.getPosName());
}
}
}
......@@ -121,9 +126,11 @@ public class MomoApi extends BaseSmfApiListener {
}
}
public void stockIn(Barcode barcode) {
public void stockIn(Barcode barcode,String warehouseLocation) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("StockinNo", barcode.getReceiptOrder());
paramMap.put("WarehouseLocation",warehouseLocation);
Map<String, Object> itemMap = new HashMap<>();
itemMap.put("StockinNoline", barcode.getRowNumber());
if (StringUtils.isNotEmpty(barcode.getPidBarcode())) {
......@@ -144,10 +151,11 @@ public class MomoApi extends BaseSmfApiListener {
}
}
public StockReturnResponse stockReturn(Barcode barcode) {
public StockReturnResponse stockReturn(Barcode barcode,String warehouseLocation) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("ReturnDate", DateUtil.toDateString(new Date(), "yyyy/MM/dd HH:mm:ss"));
paramMap.put("StockReturn", "SMF" + System.currentTimeMillis());
paramMap.put("WarehouseLocation",warehouseLocation);
List<Map<String, Object>> Details = new ArrayList<>();
Map<String, Object> detailMap = new HashMap<>();
detailMap.put("ProductName", barcode.getDescription());
......@@ -349,10 +357,10 @@ public class MomoApi extends BaseSmfApiListener {
* @param barcode
*/
public void fgStockIn(Barcode barcode) {
public void fgStockIn(Barcode barcode,String posName) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("Account", "SMF");
paramMap.put("WarehouseLocation", "");
paramMap.put("WarehouseLocation", posName);
List<Map<String, Object>> palletInfoModels = new ArrayList<>();
List<Barcode> subCodeList = barcode.getSubCodeList();
for (Barcode subCode : subCodeList) {
......
......@@ -34,6 +34,7 @@ import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Service
......@@ -188,7 +189,7 @@ public class TMSUtil {
liteOrderCache.addOrderToMap(liteOrder);
if (autoOut) {
try {
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false, false, true, rackList);
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(), false, false, true, rackList,new HashMap<>());
liteOrder = liteOrderCache.getLiteOrder(liteOrder.getOrderNo());
} catch (ValidateException ex) {
log.error(requestCmd + " 自动执行工单[" + liteOrder.getOrderNo() + "] error:" + ex.toString());
......@@ -432,7 +433,7 @@ public class TMSUtil {
tmsParts = GetReserveList("ProcessOrder", order,lockPosList,order.getCidList());
} else { //工单出库
String result = liteOrderCache.checkOutLiteOrder(order.getOrderNo(), false, false, true);
String result = liteOrderCache.checkOutLiteOrder(order.getOrderNo(), false, false, true,new HashMap<>());
tmsReserve.setResultCode(TMS_Code.CODE_2011);
//查找工单的所有任务
Criteria c = Criteria.where("sourceName").is(order.getOrderNo()).and("type").is(2);
......
......@@ -114,7 +114,7 @@ public class NeotelController {
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
if(execute){
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false, singleOut);
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false, singleOut,new HashMap<>());
}
}
return ResultBean.newOkResult("");
......
......@@ -137,7 +137,7 @@ public class TianTongController {
liteOrder = liteOrderManager.createWithItems(liteOrder);
liteOrderCache.addOrderToMap(liteOrder);
if(execute){
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false, singleOut);
liteOrderCache.checkOutLiteOrder(liteOrder.getOrderNo(),false, singleOut,new HashMap<>());
}
return ResultBean.newOkResult("");
}
......
......@@ -520,8 +520,14 @@ public class ZhongCheDeviceController {
log.info(barcodeStr + "获取目的地信息");
Barcode barcode = codeResolve.resolveOneValideBarcode(barcodeStr);
resultMap.put("locInfo", "Manaul-"+ ZhongCheOrderLoc.BELTLINE);
if (barcode != null) {
log.info("解析到的条码信息为:" + barcode.getBarcode());
resultMap.put("height", barcode.getHeight());
resultMap.put("plateSize", barcode.getPlateSize());
resultMap.put("barcode", barcode.getBarcode());
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && !dataLog.isFinished() && !dataLog.isCancel()) {
......@@ -542,6 +548,7 @@ public class ZhongCheDeviceController {
resultMap.put("orderNo",dataLog.getSourceName());
}
}
}
log.info(barcodeStr + "获取目的地,返回的内容为:" + JSON.toJSONString(resultMap));
return resultMap;
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!