Commit b36b4b80 张少辉

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

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