Commit 56ea7cc8 hc

Merge remote-tracking branch 'origin/smf-core-21088' into smf-core-21088

2 个父辈 6a02a894 3f381586
...@@ -239,6 +239,7 @@ public class DataInitManager { ...@@ -239,6 +239,7 @@ public class DataInitManager {
addNewFunctionMenu(7, wip, "handMovementOut", "手动出箱", "handMovementOut", "SemiFinishProducts/handMovement/out/index", "handMovementOut", functionMenuMap); addNewFunctionMenu(7, wip, "handMovementOut", "手动出箱", "handMovementOut", "SemiFinishProducts/handMovement/out/index", "handMovementOut", functionMenuMap);
addNewFunctionMenu(8, wip, "handMovementIn", "手动入箱", "handMovementIn", "SemiFinishProducts/handMovement/in/index", "handMovementIn", functionMenuMap); addNewFunctionMenu(8, wip, "handMovementIn", "手动入箱", "handMovementIn", "SemiFinishProducts/handMovement/in/index", "handMovementIn", functionMenuMap);
addNewFunctionMenu(9, wip, "cutOrders", "ODN砍单回库", "cutOrders", "SemiFinishProducts/cutOrders/index", "cutOrders", functionMenuMap); addNewFunctionMenu(9, wip, "cutOrders", "ODN砍单回库", "cutOrders", "SemiFinishProducts/cutOrders/index", "cutOrders", functionMenuMap);
addNewFunctionMenu(10, wip, "restoreRebox", "ODN还原补箱", "restoreRebox", "SemiFinishProducts/restoreRebox/index", "restoreRebox", functionMenuMap);
//MSD管理:MSD库存.MSD追溯性.MSD设置 //MSD管理:MSD库存.MSD追溯性.MSD设置
......
...@@ -1045,6 +1045,44 @@ public class LuxsanApi extends DefaultSmfApiListener { ...@@ -1045,6 +1045,44 @@ public class LuxsanApi extends DefaultSmfApiListener {
} }
public static String unBindPallet(UnBindPalletRequest request) {
log.info("unBindPallet接口请求参数为:" + JSON.toJSONString(request) + ",地址为:" + unBindPalletUrl);
String result = "";
try {
String resultStr = HttpHelper.postJson(unBindPalletUrl, request);
log.info("unBindPallet接口返回为:" + 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;
}
public static String manualPallet(ManualPalletRequest request) {
log.info("manualPallet接口请求参数为:" + JSON.toJSONString(request) + ",地址为:" + manualPalletUrl);
String result = "";
try {
String resultStr = HttpHelper.postJson(manualPalletUrl, request);
log.info("manualPallet接口返回为:" + 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 @Override
public void outTaskStatusChange(String outNotifyUrl, DataLog task) { public void outTaskStatusChange(String outNotifyUrl, DataLog task) {
//pickingIssue(new PickingIssueRequest()); //pickingIssue(new PickingIssueRequest());
...@@ -1345,4 +1383,18 @@ public class LuxsanApi extends DefaultSmfApiListener { ...@@ -1345,4 +1383,18 @@ public class LuxsanApi extends DefaultSmfApiListener {
public void setTicketPickPostUrl(String url){ public void setTicketPickPostUrl(String url){
LuxsanApi.ticketPickPostUrl = url; LuxsanApi.ticketPickPostUrl = url;
} }
public static String unBindPalletUrl;
@Value("${api.unBindPallet}")
public void setUnBindPalletUrl(String url){
LuxsanApi.unBindPalletUrl = url;
}
public static String manualPalletUrl;
@Value("${api.manualPallet}")
public void setManualPalletUrl(String url) {
LuxsanApi.manualPalletUrl = url;
}
} }
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class ManualPalletRequest {
private String PLANT_CODE;
private String TICKET_CODE;
private String TICKET_ITEM;
private String PICKED_LABEL_ID;
private String NEW_LABEL_ID;
}
package com.neotel.smfcore.custom.luxsan.api.bean.request;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class UnBindPalletRequest {
private String plant_code;
private String ticket_code;
private String ship_pallet;
private String label_id;
}
...@@ -672,9 +672,12 @@ public class CDeviceController { ...@@ -672,9 +672,12 @@ public class CDeviceController {
String source = paramMap.get("source"); String source = paramMap.get("source");
String needBinCodeStr = paramMap.get("needBinCodeStr"); String needBinCodeStr = paramMap.get("needBinCodeStr");
String ignoreWorkStr = paramMap.get("ignoreWorkBox"); boolean ignoreWorkBox = false;
boolean ignoreWorkBox = Boolean.valueOf(ignoreWorkStr); String ignoreWorkStr = paramMap.get("ignoreWorkBox");
if (StringUtils.isNotEmpty(ignoreWorkStr)){
ignoreWorkBox = Boolean.valueOf(ignoreWorkStr);
}
List<String> validBinList = new ArrayList<String>(); List<String> validBinList = new ArrayList<String>();
......
package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller; package com.neotel.smfcore.custom.luxsan.factory_c.rawstor.controller;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils; import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.barcode.service.manager.IComponentManager; import com.neotel.smfcore.core.barcode.service.manager.IComponentManager;
...@@ -153,6 +154,8 @@ public class GrPutInController { ...@@ -153,6 +154,8 @@ public class GrPutInController {
String materialStr = info.getMaterialStr(); String materialStr = info.getMaterialStr();
log.info(materialStr+"开始绑定GR信息为:"+ JSON.toJSONString(info));
if (StringUtils.isEmpty(materialStr)) { if (StringUtils.isEmpty(materialStr)) {
return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料串信息"});
} }
......
...@@ -166,7 +166,7 @@ public class BinCacheUtil { ...@@ -166,7 +166,7 @@ public class BinCacheUtil {
List<String> emptyBoxList = new ArrayList<>(); List<String> emptyBoxList = new ArrayList<>();
if (ignoreWorkBox) { if (!ignoreWorkBox) {
List<DataLog> allTasks = taskService.getAllTasks(); List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog dataLog : allTasks) { for (DataLog dataLog : allTasks) {
if (dataLog.isCheckOutTask() && !dataLog.isCancel() && !dataLog.isFinished()) { if (dataLog.isCheckOutTask() && !dataLog.isCancel() && !dataLog.isFinished()) {
......
...@@ -229,6 +229,16 @@ public class AgvDeviceController { ...@@ -229,6 +229,16 @@ public class AgvDeviceController {
Barcode barcode = barcodeManager.findByBarcode(queueTask.getBarcode()); Barcode barcode = barcodeManager.findByBarcode(queueTask.getBarcode());
//通知WMS
PalletUpdateRequest palletUpdateRequest = new PalletUpdateRequest();
palletUpdateRequest.setREQUEST_ID(System.currentTimeMillis()+"");
palletUpdateRequest.setPALLET_LIST(Lists.newArrayList(barcode.getPalletId()));
//上架是SWC, 下架是SWCT
palletUpdateRequest.setBIN_CODE("SWC");
palletUpdateRequest.setBIZ_TYPE("M");
palletUpdateRequest.setPLANT_CODE(CommonUtil.plantCode);
LuxsanApi.palletUpdate(palletUpdateRequest);
//已完成,加入库存,并且从完成队列中清除 //已完成,加入库存,并且从完成队列中清除
StoragePos storagePos = storagePosManager.get(queueTask.getPosId()); StoragePos storagePos = storagePosManager.get(queueTask.getPosId());
if (barcode != null) { if (barcode != null) {
......
...@@ -58,7 +58,7 @@ public class CancelRestockController { ...@@ -58,7 +58,7 @@ public class CancelRestockController {
boolean cancelTask = taskService.cancelTask(dataLog.getId()); boolean cancelTask = taskService.cancelTask(dataLog.getId());
log.info(dataLog.getBarcode() + "取消任务,结果为:" + cancelTask + ",odn为:" + ticketCode); log.info(dataLog.getBarcode() + "取消任务,结果为:" + cancelTask + ",odn为:" + ticketCode);
} else { } else {
dataLog.setLoc(TaskLocUtil.NG); dataLog.setLoc(TaskLocUtil.MW);
if (dataLog.isOutFromPos()) { if (dataLog.isOutFromPos()) {
taskService.updateFinishedTask(dataLog); taskService.updateFinishedTask(dataLog);
} }
......
package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller; package com.neotel.smfcore.custom.luxsan.factory_c.wipstor.controller;
import cn.hutool.core.util.ObjectUtil;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.StringUtils; 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.service.po.Barcode;
import com.neotel.smfcore.core.barcode.utils.CodeResolve; 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.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao; import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager; import com.neotel.smfcore.core.storage.service.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.service.manager.IDataLogManager;
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.ManualPalletRequest;
import com.neotel.smfcore.custom.luxsan.api.bean.request.UnBindPalletRequest;
import com.neotel.smfcore.custom.luxsan.factory_c.common.util.CommonUtil;
import com.neotel.smfcore.custom.luxsan.factory_c.wipstor.util.TaskLocUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess; import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
...@@ -20,6 +35,8 @@ import org.springframework.data.mongodb.core.query.Query; ...@@ -20,6 +35,8 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@Slf4j @Slf4j
@Api(tags = "odn还原补箱") @Api(tags = "odn还原补箱")
@RestController @RestController
...@@ -38,43 +55,175 @@ public class RestoreReplaceController { ...@@ -38,43 +55,175 @@ public class RestoreReplaceController {
@Autowired @Autowired
private IStoragePosDao storagePosDao; private IStoragePosDao storagePosDao;
@Autowired
private TaskService taskService;
@Autowired
private IDataLogManager dataLogManager;
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private DataCache dataCache;
@Autowired
private IBarcodeManager barcodeManager;
@ApiOperation("还原补箱") @ApiOperation("还原补箱")
@RequestMapping("/scanBox") @RequestMapping("/scanBox")
@AnonymousAccess @AnonymousAccess
public ResultBean scanBox(String boxStr) { public ResultBean scanBox(String boxStr,boolean replaceBox) {
if (StringUtils.isEmpty(boxStr)) { if (StringUtils.isEmpty(boxStr)) {
throw new ValidateException("smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"}); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"料箱信息"});
} }
log.info("还原补箱,料箱号为:" + boxStr); log.info("还原补箱,料箱号为:" + boxStr);
//1.解析条码 //1.解析条码
Barcode barcode = codeResolve.resolveOneValideBarcode("=2x2=" + boxStr); Barcode barcode = codeResolve.resolveOneValideBarcode("=2x2=" + boxStr);
if (barcode == null) { if (barcode == null) {
throw new ValidateException("smfcore.error.barcode.invalid", "条码无效"); return ResultBean.newErrorResult(-1,"smfcore.error.barcode.invalid", "条码无效");
} }
//2.找一个料号相同,数量相同的箱子 String palletId = barcode.getPalletId();
String partNumber = barcode.getPartNumber(); if (StringUtils.isEmpty(palletId)){
int amount = barcode.getAmount(); return ResultBean.newErrorResult(-1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"栈板id"});
}
//2.找到当前正在执行的任务
DataLog dataLog = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.getBarcode().equals(barcode.getBarcode())){
if (task.isCheckOutTask() && !task.isFinished() && !task.isCancel()){
dataLog = task;
break;
}
}
}
if (dataLog == null){
DataLog dbDatalog = dataLogManager.findOne(new Query(Criteria.where("barcode").is(barcode.getBarcode())).with(Sort.by(Sort.Direction.DESC,"createDate")));
if (dbDatalog.isCheckOutTask() && dbDatalog.isOdn()){
dataLog = dbDatalog;
}
}
if (dataLog == null || StringUtils.isEmpty(dataLog.getSubSourceId())){
return ResultBean.newErrorResult(-1,"",boxStr+"未找到对应的odn出货任务");
}
String subSourceId = dataLog.getSubSourceId();
LiteOrderItem orderItem = liteOrderItemManager.get(subSourceId);
if (orderItem == null) {
return ResultBean.newErrorResult(-1, "", boxStr + "未找到对应的odn出货任务");
}
String ticketCode = orderItem.getTicketCode();
//如果不是完成的任务,则改成FINISHED
if (dataLog.isFinished()){
dataLog.setStatus(OP_STATUS.FINISHED.name());
dataLog.setOperator("还原补箱");
taskService.updateFinishedTask(dataLog);
}
Criteria c = Criteria.where("barcode.partNumber").is(partNumber) //如果不是补箱作业
.and("id").nin(liteOrderCache.excludeOutPosIds()) StoragePos pos = null;
.and("enabled").is(true) if (!replaceBox){
.and("barcode.lockId").is(null)
.and("barcode.amount").is(amount); } else {
Sort s = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.putInDate"); //找一个料号相同,数量相同的箱子
StoragePos pos = storagePosDao.findOne(new Query(c).with(s)); String partNumber = barcode.getPartNumber();
if (pos == null) { int amount = barcode.getAmount();
return ResultBean.newErrorResult(-1, "", "未找到对应的料箱"); Criteria c = Criteria.where("barcode.partNumber").is(partNumber)
.and("id").nin(liteOrderCache.excludeOutPosIds())
.and("enabled").is(true)
.and("barcode.lockId").is(null)
.and("barcode.amount").is(amount);
Sort s = Sort.by(Sort.Direction.ASC, "barcode.amount", "barcode.putInDate");
pos = storagePosDao.findOne(new Query(c).with(s));
if (pos == null) {
return ResultBean.newErrorResult(-1, "", boxStr+"未找到对应的可补的料箱");
}
} }
//3.生成出库任务,到流水线
//3.先调用解绑信息
String unBindPalletResult = LuxsanApi.unBindPallet(new UnBindPalletRequest(CommonUtil.plantCode, ticketCode, "", palletId));
if (StringUtils.isNotEmpty(unBindPalletResult)){
return ResultBean.newErrorResult(-1, "", boxStr + "解绑失败,原因为:"+unBindPalletResult);
}
if (pos != null){
Storage storage = dataCache.getStorageById(pos.getStorageId());
taskService.addPutInTaskToExecute(storage,pos.getBarcode(),pos, TaskLocUtil.MW);
}
return ResultBean.newOkResult(""); return ResultBean.newOkResult("");
} }
@ApiOperation("手动绑定栈板信息")
@RequestMapping("/manualBindPallet")
@AnonymousAccess
public ResultBean manualBindPallet(String oldPalletId, String newPalletId) {
if (StringUtils.isEmpty(oldPalletId)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"原栈板Id"});
}
if (StringUtils.isEmpty(newPalletId)) {
return ResultBean.newErrorResult(1, "smfcore.valueCanotNull", "{0}不能为空", new String[]{"新栈板Id"});
}
Barcode oldBarcode = barcodeManager.findOne(new Query(Criteria.where("palletId").is(oldPalletId)));
if (oldBarcode == null){
return ResultBean.newErrorResult(-1,"","原栈板Id:"+oldPalletId+",对应的料箱信息不存在");
}
Barcode newBarcode = barcodeManager.findOne(new Query(Criteria.where("palletId").is(newPalletId)));
if (newBarcode == null){
return ResultBean.newErrorResult(-1,"","新栈板Id:"+oldPalletId+",对应的料箱信息不存在");
}
//获取原栈板id的任务
DataLog dataLog = null;
List<DataLog> allTasks = taskService.getAllTasks();
for (DataLog task : allTasks) {
if (task.getBarcode().equals(oldBarcode.getBarcode())){
if (task.isCheckOutTask() && !task.isFinished() && !task.isCancel()){
dataLog = task;
break;
}
}
}
if (dataLog == null){
DataLog dbDatalog = dataLogManager.findOne(new Query(Criteria.where("barcode").is(oldBarcode.getBarcode())).with(Sort.by(Sort.Direction.DESC,"createDate")));
if (dbDatalog.isCheckOutTask() && dbDatalog.isOdn()){
dataLog = dbDatalog;
}
}
if (dataLog == null || StringUtils.isEmpty(dataLog.getSubSourceId())){
return ResultBean.newErrorResult(-1,"","原栈板Id"+oldPalletId+"未找到对应的odn出货任务");
}
String subSourceId = dataLog.getSubSourceId();
LiteOrderItem orderItem = liteOrderItemManager.get(subSourceId);
if (orderItem == null) {
return ResultBean.newErrorResult(-1, "", "原栈板Id"+oldPalletId+"未找到对应的odn出货任务");
}
String ticketCode = orderItem.getTicketCode();
String ticketItem = orderItem.getTicketItem();
String result = LuxsanApi.manualPallet(new ManualPalletRequest(CommonUtil.plantCode, ticketCode, ticketItem, oldPalletId, newPalletId));
if (StringUtils.isNotEmpty(result)) {
return ResultBean.newErrorResult(-1, "", "原PalletId为:" + oldPalletId + ",新PalletIdId为:" + newPalletId + ",绑定失败,原因为:" + result);
}
return ResultBean.newOkResult("");
}
} }
...@@ -103,7 +103,7 @@ api: ...@@ -103,7 +103,7 @@ api:
bindPalletBulk: bindPalletBulk:
#取消绑定栈板 #取消绑定栈板
unBindPallet: unBindPallet: http://10.68.30.22:8082/api/mlb/UnBindPallet
#拉取转库单据 #拉取转库单据
fetchMoveTicket: http://10.68.30.22:8082/api/wcs/FetchMoveTicket fetchMoveTicket: http://10.68.30.22:8082/api/wcs/FetchMoveTicket
...@@ -173,3 +173,6 @@ api: ...@@ -173,3 +173,6 @@ api:
#GB单据转库过账 #GB单据转库过账
ticketPickPost: http://10.68.30.22:8082/api/mlb/TicketPickPost ticketPickPost: http://10.68.30.22:8082/api/mlb/TicketPickPost
#自动仓手动绑定栈板
manualPallet: http://10.68.30.22:8082/api/mlb/manualPallet
...@@ -103,7 +103,7 @@ api: ...@@ -103,7 +103,7 @@ api:
bindPalletBulk: bindPalletBulk:
#取消绑定栈板 #取消绑定栈板
unBindPallet: unBindPallet: http://10.42.220.171:8082/api/mlb/UnBindPallet
#拉取转库单据 #拉取转库单据
fetchMoveTicket: http://10.42.220.171:8082/api/wcs/FetchMoveTicket fetchMoveTicket: http://10.42.220.171:8082/api/wcs/FetchMoveTicket
...@@ -173,3 +173,6 @@ api: ...@@ -173,3 +173,6 @@ api:
#GB单据转库过账 #GB单据转库过账
ticketPickPost: http://10.42.220.171:8082/api/mlb/TicketPickPost ticketPickPost: http://10.42.220.171:8082/api/mlb/TicketPickPost
#自动仓手动绑定栈板
manualPallet: http://10.42.220.171:8082/api/mlb/manualPallet
\ No newline at end of file \ No newline at end of file
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!