Commit e2502472 zshaohui

1.锁定库位修改为concurrentMap

2.增加通知迈证工单取消接口
3.虚拟仓入出库和智能仓入库,修改盘点状态
1 个父辈 ebd78d69
正在显示 18 个修改的文件 包含 284 行增加62 行删除
......@@ -32,9 +32,9 @@ public class ReelLockPosUtil {
@PostConstruct
public void init() {
dataCache = autodataCache;
reelLocKPosMap=dataCache.getCache(REEL_LOCK_POS_MAP_KEY);
if(reelLocKPosMap==null){
reelLocKPosMap= Maps.newConcurrentMap();
Map<String, ReelLockPosInfo> cacheReelLocKPosMap = dataCache.getCache(REEL_LOCK_POS_MAP_KEY);
if (cacheReelLocKPosMap != null) {
reelLocKPosMap.putAll(cacheReelLocKPosMap);
}
}
......
......@@ -27,6 +27,7 @@ import com.neotel.smfcore.core.system.util.DevicesStatusUtil;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.LizhenApi;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.virtual.service.manager.IVirInventoryManager;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.device.handler.IDeviceHandler;
......@@ -74,6 +75,9 @@ public class DeviceController {
@Autowired
private IBarcodeManager barcodeManager;
@Autowired
private IVirInventoryManager virInventoryManager;
private Map<String, IDeviceHandler> handlerMap = new HashMap<>();
public DeviceController(List<IDeviceHandler> deviceHandlerList) {
......@@ -201,6 +205,7 @@ public class DeviceController {
storagePos.setUsed(false);
storagePosManager.save(storagePos);
dataCache.updateInventory(storagePos, barcode);
virInventoryManager.updateStatus(dataLog);
}
}
//校验是否可以入库
......
......@@ -173,17 +173,21 @@ public class LiteOrderCache {
for (LiteOrder order :
liteOrders) {
if (order.isNew() || order.isTaskFinished()) {
//判断是否到达时间
Date curr = new Date();
if (order.getSDate().before(curr)) {
//开始自动出库
String result = checkOutLiteOrder(order.getOrderNo(), false);
if (!ObjectUtil.isEmpty(result)) {
String msg = MessageUtils.getText(result, MessageUtils.getDefaultLocal(), "");
//log.info("自动执行工单 【" + order.getOrderNo() + "】 失败:" + msg);
} else {
//log.info("自动执行工单 【" + order.getOrderNo() + "】 成功");
break;
if (order.isTaskFinished() && order.isMaiZheng()){
} else {
//判断是否到达时间
Date curr = new Date();
if (order.getSDate().before(curr)) {
//开始自动出库
String result = checkOutLiteOrder(order.getOrderNo(), false);
if (!ObjectUtil.isEmpty(result)) {
String msg = MessageUtils.getText(result, MessageUtils.getDefaultLocal(), "");
//log.info("自动执行工单 【" + order.getOrderNo() + "】 失败:" + msg);
} else {
//log.info("自动执行工单 【" + order.getOrderNo() + "】 成功");
break;
}
}
}
}
......
......@@ -33,6 +33,7 @@ import com.neotel.smfcore.core.order.util.OrderFileWatch;
import com.neotel.smfcore.core.system.bean.MSDAppendInfo;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.third.maicheng.util.MaiZhengUtil;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.service.manager.IGroupManager;
......@@ -119,6 +120,9 @@ public class OrderController {
@Autowired
DataCache dataCache;
@Autowired
private MaiZhengUtil maiZhengUtil;
Map<String,Long> onClickWorkOrderOut = Maps.newConcurrentMap();
// @ApiOperation("导出用户数据")
......@@ -451,8 +455,14 @@ public class OrderController {
throw new ValidateException("smfcore.error.permissionPassword", "权限密码错误");
}
}
//如果手动关闭工单,则通知迈征
maiZhengUtil.workIdCancel(orderNo);
String result = liteOrderCache.closeOrder(orderNo);
if (ObjectUtil.isEmpty(result)) {
return ResultBean.newOkResult(result, result, result);
} else {
return ResultBean.newErrorResult(-1, result, result);
......
......@@ -113,4 +113,7 @@ public class OrderDto implements Serializable {
@ApiModelProperty("出口位置")
private String export = "";
@ApiModelProperty("是否迈征")
private boolean maiZheng = false;
}
......@@ -162,6 +162,8 @@ public class LiteOrder extends BasePo implements Serializable {
*/
private boolean maiZheng = false;
private boolean transReelBox = false;
//迈征额外参数
private String guid;
......
......@@ -220,9 +220,6 @@ public class TaskService {
private void tiggerTaskChangeListener(DataLog task) {
liteOrderCache.onTaskStatusChange(task);
smfApi.onTaskStatusChange(task);
//修改盘点状态
virInventoryManager.updateStatus(task);
}
/**
......
......@@ -21,13 +21,15 @@ public class MaiZhengApi {
@Value("${maizheng.stationStatusApi}")
private String stationStatusApi = "";
@Value("${maizheng.transReelBoxApi}")
private String transReelBoxApi = "";
@Value("${maizheng.prepareReelBoxApi}")
private String prepareReelBoxApi = "";
@Value("${maizheng.workIdCancleApi}")
private String workIdCancleApi = "";
/**
* 获取站位状态接口
*
......@@ -47,7 +49,7 @@ public class MaiZhengApi {
String dataStr = resultJson.getString("Datas");
return JSONObject.parseArray(dataStr, StationStatus.class);
} catch (Exception e) {
log.error("解析站位状态出错:"+e.getMessage());
log.error("解析站位状态出错:" + e.getMessage());
e.printStackTrace();
}
return null;
......@@ -70,7 +72,7 @@ public class MaiZhengApi {
for (LiteOrderItem orderItem : orderItemList) {
List<String> outReelList = orderItem.getOutReelList();
if (outReelList != null && !outReelList.isEmpty()){
if (outReelList != null && !outReelList.isEmpty()) {
for (int i = 0; i < outReelList.size(); i++) {
Map<String, Object> itemMap = new HashMap<>();
itemMap.put("Position", orderItem.getPositionList().get(i));
......@@ -91,7 +93,7 @@ public class MaiZhengApi {
log.info("智能仓储备料完成后请求发料返回为:" + result);
JSONObject jsonObject = JSONObject.parseObject(result);
return jsonObject.getString("Result");
} catch (ApiException e) {
} catch (Exception e) {
log.error("智能仓储备料完成后请求发料报错:" + e.getMessage());
return e.getMessage();
}
......@@ -99,16 +101,28 @@ public class MaiZhengApi {
public void prepareReelBox(String guid, String result) {
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("GUID",guid);
paramMap.put("Result",result);
log.info("仓储回复可以开始备料入参为:"+ JSON.toJSONString(paramMap));
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("GUID", guid);
paramMap.put("Result", result);
log.info("仓储回复可以开始备料入参为:" + JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(prepareReelBoxApi, paramMap);
log.info("仓储回复可以开始备料返回为:"+resultStr);
log.info("仓储回复可以开始备料返回为:" + resultStr);
} catch (ApiException e) {
log.error("仓储回复可以开始备料报错:" + e.getMessage());
}
}
public void workIdCancelApi(String guid) {
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("GUID", guid);
log.info("仓储请求取消工单入参为:" + JSON.toJSONString(paramMap));
try {
String resultStr = HttpHelper.postJson(workIdCancleApi, paramMap);
log.info("仓储请求取消工单返回为:" + resultStr);
} catch (ApiException e) {
log.error("仓储请求取消工单报错:" + e.getMessage());
}
}
}
package com.neotel.smfcore.custom.lizhen.third.maicheng.bean;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
@ApiModel("迈征服务器请求指定Reel的位置")
@Data
public class AskReelIDStateRequest {
private String Guid;
private String Count;
private List<String> List;
}
package com.neotel.smfcore.custom.lizhen.third.maicheng.bean;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
@ApiModel("迈征服务器请求指定Reel的位置返回结果")
@Data
public class AskReelIDStateResponse {
@JSONField(name = "Guid")
private String Guid;
@JSONField(name = "Count")
private String Count;
@JSONField(name = "List")
private List<AskReelIDStateResponseList> List;
}
package com.neotel.smfcore.custom.lizhen.third.maicheng.bean;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
@Data
public class AskReelIDStateResponseList {
@JSONField(name = "ReelID")
private String ReelID;
@JSONField(name = "State")
private String State;
@JSONField(name = "WorkID")
private String WorkID;
}
......@@ -6,21 +6,28 @@ import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Maps;
import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.utils.StringUtils;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.order.LiteOrderCache;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
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.manager.IDataLogManager;
import com.neotel.smfcore.core.system.service.po.DataLog;
import com.neotel.smfcore.custom.lizhen.innerBox.util.StorageExportUtil;
import com.neotel.smfcore.custom.lizhen.third.maicheng.api.MaiZhengApi;
import com.neotel.smfcore.custom.lizhen.third.maicheng.bean.AskReelBox;
import com.neotel.smfcore.custom.lizhen.third.maicheng.bean.AskReelBoxList;
import com.neotel.smfcore.custom.lizhen.third.maicheng.bean.StationStatus;
import com.neotel.smfcore.custom.lizhen.third.maicheng.bean.*;
import com.neotel.smfcore.custom.lizhen.third.maicheng.util.StationStatusCache;
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.data.domain.Sort;
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;
......@@ -54,10 +61,16 @@ public class MaiZhengController {
@Autowired
private ILiteOrderItemManager liteOrderItemManager;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IDataLogManager dataLogManager;
@ApiOperation("修改站位状态信息")
@RequestMapping("/updateStationStatus")
@AnonymousAccess
public ResultBean updateStationStatus(@RequestBody Map<String,String> paramMap) {
public ResultBean updateStationStatus(@RequestBody Map<String, String> paramMap) {
log.info("修改站位状态信息:" + JSON.toJSONString(paramMap));
String dataStr = paramMap.get("Datas");
List<StationStatus> stationStatusList = JSONObject.parseArray(dataStr, StationStatus.class);
......@@ -69,7 +82,7 @@ public class MaiZhengController {
@ApiOperation("获取站位信息")
@RequestMapping("/getStationStatus")
@AnonymousAccess
public ResultBean getStationStatus(){
public ResultBean getStationStatus() {
maiZhengApi.StationStatus();
return ResultBean.newOkResult("");
}
......@@ -81,28 +94,6 @@ public class MaiZhengController {
public Map<String, String> askReelBox(@RequestBody AskReelBox askReelBox) {
log.error("收到迈征请求数据为:" + JSON.toJSONString(askReelBox));
String result = "OK";
/* //获取到唯一id,当做工单号
String guid = askReelBox.getGUID();
if (askReelBoxMap.get(guid) != null){
log.info("当前guid已存在:"+guid);
} else {
LiteOrder liteOrder = liteOrderManager.findByOrderNo(guid);
if (liteOrder == null) {
List<AskReelBoxList> boxList = askReelBox.getList();
if (boxList == null || boxList.isEmpty()) {
log.info(guid+"List为空");
result = "List不能为空";
}
} else {
if (liteOrder.getOrderItems() != null && !liteOrder.getOrderItems().isEmpty()) {
log.info(guid+"已经存在");
result = guid + "已经存在";
}
}
}
if ("OK".equals(result)){
askReelBoxMap.put(guid,askReelBox);
}*/
askReelBoxMap.put(askReelBox.getGUID(), askReelBox);
Map<String, String> resultMap = new HashMap<>();
resultMap.put("GUID", askReelBox.getGUID());
......@@ -111,21 +102,22 @@ public class MaiZhengController {
}
Map<String,AskReelBox> askReelBoxMap = Maps.newConcurrentMap();
Map<String, AskReelBox> askReelBoxMap = Maps.newConcurrentMap();
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(1);
@PostConstruct
void init(){
void init() {
scheduledThreadPool.scheduleAtFixedRate(() -> {
if (askReelBoxMap != null && !askReelBoxMap.isEmpty()){
if (askReelBoxMap != null && !askReelBoxMap.isEmpty()) {
for (Map.Entry<String, AskReelBox> entry : askReelBoxMap.entrySet()) {
log.info("开始处理:"+entry.getKey()+"的数据");
log.info("开始处理:" + entry.getKey() + "的数据");
String result = createMaiZhengOrder(entry.getKey(), entry.getValue());
maiZhengApi.prepareReelBox(entry.getKey(),result);
log.info("处理结束:"+entry.getKey()+"的数据,结果为:"+result);
maiZhengApi.prepareReelBox(entry.getKey(), result);
log.info("处理结束:" + entry.getKey() + "的数据,结果为:" + result);
}
}
},10,5, TimeUnit.SECONDS);
}, 10, 5, TimeUnit.SECONDS);
}
......@@ -201,4 +193,51 @@ public class MaiZhengController {
askReelBoxMap.remove(guid);
return "OK";
}
@ApiOperation("迈征服务器请求指定Reel的位置 AskReelIDState")
@RequestMapping("/askReelIDState")
@AnonymousAccess
public AskReelIDStateResponse askReelIDState(@RequestBody AskReelIDStateRequest request) {
log.info("收到迈征请求指定Reel的位置:" + JSON.toJSONString(request));
String guid = request.getGuid();
String count = request.getCount();
List<AskReelIDStateResponseList> responseList = new ArrayList<>();
List<String> reelIdList = request.getList();
for (String reelId : reelIdList) {
AskReelIDStateResponseList reelIDResponse = new AskReelIDStateResponseList();
reelIDResponse.setState("0");
reelIDResponse.setReelID(reelId);
reelIDResponse.setWorkID("");
//判断是否在库存中
StoragePos storagePos = storagePosManager.getByBarcode(reelId);
if (storagePos != null) {
log.info(reelId+":存在库位中:"+storagePos.getPosName());
reelIDResponse.setState("1");
} else {
//判断是否绑定工单发出
DataLog dataLog = dataLogManager.findOne(new Query(Criteria.where("barcode").is(reelId)
.and("sourceId").exists(true).ne(null)
.and("status").is(OP_STATUS.FINISHED.name())
.and("type").is(OP.CHECKOUT)).with(Sort.by(Sort.Direction.DESC, "updateDate")));
if (dataLog != null) {
log.info(reelId+":已经绑定工单发出,工单号为:"+dataLog.getSourceName());
reelIDResponse.setState("3");
reelIDResponse.setWorkID(dataLog.getSourceName());
}
}
responseList.add(reelIDResponse);
}
AskReelIDStateResponse response = new AskReelIDStateResponse();
response.setGuid(guid);
response.setCount(count);
response.setList(responseList);
log.info(JSON.toJSONString(response));
return response;
}
}
......@@ -73,6 +73,8 @@ public class MaiZhengDeviceController {
//请求迈征的接口,是否可以放入
String resultStr = maiZhengApi.transReelBox(liteOrder);
if ("OK".equalsIgnoreCase(resultStr)) {
liteOrder.setTransReelBox(true);
liteOrderManager.save(liteOrder);
return ResultBean.newOkResult("");
} else {
return ResultBean.newErrorResult(-1, "smf.maizheng.error", "transReelBox返回异常:" + resultStr);
......
package com.neotel.smfcore.custom.lizhen.third.maicheng.util;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.device.enums.OP;
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.system.service.po.DataLog;
import com.neotel.smfcore.core.system.util.TaskService;
import com.neotel.smfcore.custom.lizhen.third.maicheng.api.MaiZhengApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Slf4j
@Service
public class MaiZhengUtil {
@Autowired
private MaiZhengApi maiZhengApi;
@Autowired
private ILiteOrderManager liteOrderManager;
@Autowired
private TaskService taskService;
public void workIdCancel(String orderNo) {
//判断是否已经通知
LiteOrder liteOrder = liteOrderManager.findByOrderNo(orderNo);
if (liteOrder.isMaiZheng()){
//有任务的工单不能关闭
List<DataLog> allTask=taskService.getAllTasks();
for (DataLog task:allTask
) {
if (OP.CHECKOUT == task.getType()) {
if (!task.isEnd() && !task.isFinished() && !task.isCancel()) {
//更新工单状态
String taskSourceName = task.getSourceName();
if (!Strings.isNullOrEmpty(taskSourceName) && orderNo.equals(taskSourceName)) {
log.info("关闭工单[" + orderNo + "]失败,有未完成的出库任务:" + task.getPosName());
throw new ValidateException("smfcore.order.close.taskNotEnd", "工单还有未完成的任务");
}
}
}
}
//判断是否一盘没出
boolean hasOut = false;
List<LiteOrderItem> orderItems = liteOrder.getOrderItems();
for (LiteOrderItem orderItem : orderItems) {
if (orderItem.getTotalOutReelCount() > 0){
hasOut = true;
break;
}
}
if (!hasOut){
maiZhengApi.workIdCancelApi(orderNo);
} else {
if (liteOrder.isTransReelBox()){
maiZhengApi.workIdCancelApi(orderNo);
} else {
throw new ValidateException("", "工单:"+orderNo+"当前料串未拉走,不允许关闭");
}
}
}
}
}
......@@ -19,4 +19,7 @@ public class VirInventoryQuery {
@QueryCondition(blurry = "workerNo")
private String workerNo;
@QueryCondition(blurry = "batch")
private String batch;
}
......@@ -28,6 +28,7 @@ import com.neotel.smfcore.custom.lizhen.innerBox.bean.VirImportLog;
import com.neotel.smfcore.custom.lizhen.innerBox.enums.ExtendType;
import com.neotel.smfcore.custom.lizhen.innerBox.service.manager.IVirImportLogManager;
import com.neotel.smfcore.custom.lizhen.setting.util.ExpireDateUtil;
import com.neotel.smfcore.custom.lizhen.virtual.service.manager.IVirInventoryManager;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
......@@ -82,6 +83,9 @@ public class VirtualRestController {
@Autowired
private IVirImportLogManager virImportLogManager;
@Autowired
private IVirInventoryManager virInventoryManager;
@ApiOperation("虚拟入库")
@RequestMapping("/virtual/putIn")
......@@ -245,6 +249,7 @@ public class VirtualRestController {
pos.setUsed(false);
storagePosManager.save(pos);
dataCache.updateInventory(pos,barcode);
virInventoryManager.updateStatus(dataLog);
} else {
DataLog dataLog = new DataLog();
dataLog.setStatus(OP_STATUS.FINISHED.name());
......@@ -264,6 +269,7 @@ public class VirtualRestController {
dataLog.setCreator(SecurityUtils.getCurrentUsername());
taskService.updateFinishedTask(dataLog);
taskService.removeFinishedTask(dataLog);
virInventoryManager.updateStatus(dataLog);
}
return ResultBean.newOkResult("");
}
......@@ -445,6 +451,7 @@ public class VirtualRestController {
taskService.removeFinishedTask(dataLog);
//更改缓存信息
dataCache.updateInventory(pos, barcode);
virInventoryManager.updateStatus(dataLog);
}
......
package com.neotel.smfcore.custom.lizhen.virtual.service.manager.impl;
import com.alibaba.fastjson.JSON;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants;
......@@ -11,6 +12,7 @@ import com.neotel.smfcore.custom.lizhen.virtual.bean.VirInventory;
import com.neotel.smfcore.custom.lizhen.virtual.service.dao.IVirInventoryDao;
import com.neotel.smfcore.custom.lizhen.virtual.service.manager.IVirInventoryManager;
import com.neotel.smfcore.custom.lizhen.virtual.util.VirInventoryUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.core.query.Criteria;
......@@ -20,6 +22,7 @@ import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
public class VirInventoryManagerImpl implements IVirInventoryManager {
......@@ -76,7 +79,8 @@ public class VirInventoryManagerImpl implements IVirInventoryManager {
@Override
public void updateStatus(DataLog task) {
/*if (task.isFinished()) {
if (task.isFinished()) {
log.info("任务完成,修改盘点状态:"+ JSON.toJSONString(task));
String batch = dataCache.getCache(VirInventoryUtil.VIRINVENTORY_CACHE_BATCH);
if (StringUtils.isNotBlank(batch)) {
VirInventory virInventory = getByBatchAndBarcode(batch, task.getBarcode());
......@@ -87,6 +91,6 @@ public class VirInventoryManagerImpl implements IVirInventoryManager {
}
}
}
}*/
}
}
}
......@@ -79,4 +79,5 @@ maizheng:
export: MU3_1
transReelBoxApi: http://10.190.196.124:52232/API/TransReelBoxAuto
prepareReelBoxApi: http://10.190.196.124:52232/API/PrepareReelBoxAuto
workIdCancleApi: http://10.190.196.124:52232/API/workIDCancle
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!