Commit 6f69995c sunke

方仓

1 个父辈 815c4faf
......@@ -9,6 +9,11 @@ import java.util.List;
public class Settings extends BaseMongoBean {
/**
* 脱机调试
*/
private boolean debugTest = false;
/**
* 指定软件是为哪个客户单独定制的
*/
private String productCustom = "";
......@@ -387,5 +392,13 @@ public class Settings extends BaseMongoBean {
public void setInactionDay(int inactionDay) {
this.inactionDay = inactionDay;
}
public boolean isDebugTest() {
return debugTest;
}
public void setDebugTest(boolean debugTest) {
this.debugTest = debugTest;
}
}
......@@ -210,6 +210,13 @@ public class Storage extends BaseMongoBean {
return StorageConstants.TYPE.CABINET.name().equals(type);
}
/**
* 是否是方仓
*/
public boolean isSmdXl() {
return StorageConstants.TYPE.SMD_XL.name().equals(type);
}
public boolean canPutInPos(int w, int h, int PosW, int posH){
......
......@@ -291,7 +291,13 @@ public class StorageConstants {
/**
* 11 垂直货柜
*/
VERTICALBOX("storage.type.verticalBox")
VERTICALBOX("storage.type.smdVl"),
/**
* 12 SMD-XL(方仓)
*/
SMD_XL("storage.type.smdXl")
;
......
......@@ -28,7 +28,7 @@ import java.util.*;
/**
* 锡膏料仓
* 垂直货柜
*/
@Controller
public class VerticalBoxController extends BaseController{
......@@ -207,6 +207,7 @@ public class VerticalBoxController extends BaseController{
StoragePos posToPut = getOrCreateNewPos(hostPos, barcode.getId());
posToPut.setBarcode(barcode);
posToPut.setUsed(true);
storagePosManager.save(posToPut);
finishTask(posToPut,currentTask,barcode, opQty);
......@@ -248,6 +249,7 @@ public class VerticalBoxController extends BaseController{
if(currentTask.isPutInTask()){
StoragePos posToPut = getOrCreateNewPos(hostPos, barcode.getId());
posToPut.setUsed(true);
posToPut.setBarcode(barcode);
storagePosManager.save(posToPut);
finishTask(posToPut,currentTask, barcode, barcode.getAmount());
......@@ -289,17 +291,22 @@ public class VerticalBoxController extends BaseController{
public VerticalBoxOperateBean currentTask(HttpServletRequest request) {
String cid = request.getParameter("cid");
DataLog currentTask = verticalBoxHandler.getCurrentTask(cid);
if(currentTask == null){
//测试使用
Collection<DataLog> queueTasks = taskService.getQueueTasks(cid);
for (DataLog queueTask : queueTasks) {
queueTask.setStatus(StorageConstants.OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(queueTask);
verticalBoxHandler.updateCurrentTask(queueTask.getCid(), queueTask);
break;
if(dataCache.getSettings().isDebugTest()){
if(currentTask == null){
//测试使用
Collection<DataLog> queueTasks = taskService.getQueueTasks(cid);
for (DataLog queueTask : queueTasks) {
if(queueTask.isWait()){
queueTask.setStatus(StorageConstants.OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(queueTask);
verticalBoxHandler.updateCurrentTask(queueTask.getCid(), queueTask);
break;
}
}
currentTask = verticalBoxHandler.getCurrentTask(cid);
}
currentTask = verticalBoxHandler.getCurrentTask(cid);
}
if(currentTask != null){
VerticalBoxOperateBean operateBean = new VerticalBoxOperateBean();
operateBean.setCurrentTask(currentTask);
......
......@@ -41,6 +41,13 @@ public class SettingsController extends BaseUpdateController {
settings.setProductCustom(product);
settings = dataCache.updateSettings(settings);
}
String debugStr = request.getParameter("debug");
if(!Strings.isNullOrEmpty(debugStr)){
boolean debugTest = Boolean.valueOf(debugStr);
settings.setDebugTest(debugTest);
settings = dataCache.updateSettings(settings);
}
model.addAttribute("settings", settings);
return new ModelAndView(updateView(), model.asMap());
}
......
......@@ -270,7 +270,7 @@ public class StorageDataController extends BaseController {
@RequestMapping(value = "/checkout.html")
@ResponseBody
public String checkPos(HttpServletRequest request) {
public String checkout(HttpServletRequest request) {
String cid = request.getParameter("cid");
String partnumber = request.getParameter("pn");
......@@ -537,6 +537,9 @@ public class StorageDataController extends BaseController {
* @param opValue
*/
public static void addOp(String cid, String opKey, String opValue){
if(opValue == null){
return;
}
Map<String, String> opMap = storageOpMap.get(cid);
if(opMap == null){
opMap = new ConcurrentHashMap<>();
......
......@@ -17,6 +17,7 @@ import com.myproject.manager.IHumitureManager;
import com.myproject.manager.IStoragePosManager;
import com.myproject.model.User;
import com.myproject.service.UserManager;
import com.myproject.webapp.controller.webService.boxHandler.SmdXlBoxHandler;
import com.myproject.webapp.controller.webService.boxHandler.VerticalBoxHandler;
import com.myproject.util.HttpHelper;
import com.myproject.util.StorageConstants;
......@@ -110,6 +111,9 @@ public class TaskService implements ITaskService {
@Autowired
private VerticalBoxHandler verticalBoxHandler;
@Autowired
private SmdXlBoxHandler smdXlBoxHandler;
/**
* 更新客户端发上来的消息(设备故障等消息)
*/
......@@ -690,7 +694,8 @@ public class TaskService implements ITaskService {
String posName = task.getPosName();
int index = posName.indexOf("#");
if(index>0){
String boxId = posName.substring(0,index);
//String boxId = posName.substring(0,index);
String boxId = "1";
excuteBoxIds.add(Integer.valueOf(boxId));
}
}
......@@ -970,28 +975,31 @@ public class TaskService implements ITaskService {
synchronized (storage){
//log.info("reqseq:"+statusBean.getSeq());
StatusBean resultStatus = saveStatus(statusBean);
statusBean = saveStatus(statusBean);
if(storage.isVerticalBox()){
//垂直货柜
return verticalBoxHandler.handleClientStatusBean(statusBean);
}
statusBean = handleClientStatusBean(statusBean);
if(storage.isSmdXl()){
statusBean = smdXlBoxHandler.handleClientStatusBean(statusBean);
}
statusBean = handleClientStatusBean(statusBean);
if(statusBean.getOp() == StorageConstants.OP.ALARM_DATA){
log.info("获取温湿度报警值");
statusBean.setTemperature(dataCache.getSettings().getMaxTemperature());
statusBean.setHumidity(dataCache.getSettings().getMaxHumidity());
resultStatus = statusBean;
return resultStatus;
//resultStatus = statusBean;
return statusBean;
}else if(dataCache.needUpdateHumidiy(cid)){
log.info("发送温湿度报警值");
statusBean.setTemperature(dataCache.getSettings().getMaxTemperature());
statusBean.setHumidity(dataCache.getSettings().getMaxHumidity());
resultStatus = statusBean;
return resultStatus;
//resultStatus = statusBean;
return statusBean;
}
if(storage.isCabinet() || storage.isShelf() || storage.isAccShelf() || storage.isCodeShelf()){
......@@ -1006,15 +1014,18 @@ public class TaskService implements ITaskService {
}
}
if(statusBean.getOp() == StorageConstants.OP.PUT_IN){
log.debug("入库:"+mapper.writeValueAsString(statusBean));
resultStatus = putInLine(storage, statusBean);
}else {
//查看是否有要出库的操作
resultStatus = checkOut(storage, resultStatus);
if(!storage.isSmdXl()){
if(statusBean.getOp() == StorageConstants.OP.PUT_IN){
log.debug("入库:"+mapper.writeValueAsString(statusBean));
statusBean = putInLine(storage, statusBean);
}else {
//查看是否有要出库的操作
statusBean = checkOut(storage, statusBean);
}
}
//log.info(mapper.writeValueAsString(resultStatus));
return resultStatus;
return statusBean;
}
} catch (Exception e) {
log.error("", e);
......@@ -1702,28 +1713,31 @@ public class TaskService implements ITaskService {
StoragePos storagePos = storagePosManager.get(task.getPosId());
//二维码状态
Barcode barcode = barcodeManager.findByBarcode(task.getBarcode());
barcode.setUsedCount(barcode.getUsedCount() + 1);
//barcode.setUsedDate(new Date());
barcode.setPutInTime(System.currentTimeMillis());
barcode.setInOpor(task.getOperator());
barcode.setCheckOutDate(null,"");
barcode.setPosName(task.getPosName());
if(barcode.isSolder()){
if(storagePos.isWarmPos()){
//回温仓位
barcode.setSolderStatus(StorageConstants.SOLDER_STATUS.RETREAT_STORAGE);
}else{
barcode.setSolderStatus(StorageConstants.SOLDER_STATUS.UNDER_REFRIGERATION);
if(barcode != null){
barcode.setUsedCount(barcode.getUsedCount() + 1);
//barcode.setUsedDate(new Date());
barcode.setPutInTime(System.currentTimeMillis());
barcode.setInOpor(task.getOperator());
barcode.setCheckOutDate(null,"");
barcode.setPosName(task.getPosName());
if(barcode.isSolder()){
if(storagePos.isWarmPos()){
//回温仓位
barcode.setSolderStatus(StorageConstants.SOLDER_STATUS.RETREAT_STORAGE);
}else{
barcode.setSolderStatus(StorageConstants.SOLDER_STATUS.UNDER_REFRIGERATION);
}
barcode.setNeedOutDate(null);
}
barcode.setNeedOutDate(null);
}
// if(Strings.isNullOrEmpty(barcode.getProviderNumber())){//补上供应商编号
// Component component = componentManager.findByPartNumber(barcode.getPartNumber());
// if(component != null){
// barcode.setProviderNumber(component.getProviderNumber());
// }
// }
barcodeManager.save(barcode);
barcodeManager.save(barcode);
}
/**
......@@ -1734,20 +1748,23 @@ public class TaskService implements ITaskService {
storagePos.setCanCheckOutTime(System.currentTimeMillis());
storagePosManager.save(storagePos);
//更新缓存中的库存信息
dataCache.updateInventory(storagePos,barcode);
if(barcode != null){
dataCache.updateInventory(storagePos,barcode);
//dataCache.updateStorage(task.getCid());
//dataCache.updateStorage(task.getCid());
Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){
postInNotification(dataCache.getSettings().getInNotifyApi(), task.getBarcode(), task.getStorageId());
}
Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){
postInNotification(dataCache.getSettings().getInNotifyApi(), task.getBarcode(), task.getStorageId());
}
//记录日志,完成 task
task.setBatchInfo(barcode.getBatch());
task.setNum(barcode.getAmount());
//记录日志,完成 task
task.setBatchInfo(barcode.getBatch());
task.setNum(barcode.getAmount());
}
//更新缓存中的库存信息
task.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
dataLogDao.save(task);
......
package com.myproject.webapp.controller.webService.boxHandler;
import com.google.common.base.Strings;
import com.myproject.bean.update.DataLog;
import com.myproject.bean.update.StoragePos;
import com.myproject.bean.utils.BoxStatusBean;
import com.myproject.bean.utils.StatusBean;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.manager.IStoragePosManager;
import com.myproject.util.StorageConstants;
import com.myproject.webapp.controller.webService.TaskService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 垂直货柜处理类
*/
@Service
public class SmdXlBoxHandler {
protected final transient Logger log = LogManager.getLogger(getClass());
@Autowired
protected TaskService taskService;
@Autowired
private IStoragePosManager storagePosManager;
@Autowired
private IDataLogDao dataLogDao;
/**
* 当前出入库操作的库位(key为cid, value为当前执行的任务)
*/
private Map<String,DataLog> operateTaskMap = new ConcurrentHashMap<>();
/**
* 获取当前正在执行的任务
*/
public DataLog getCurrentTask(String cid){
return operateTaskMap.get(cid);
}
/**
* 更新或清理(task为null)当前正在执行的任务
*/
public void updateCurrentTask(String cid, DataLog task){
if(task == null){
operateTaskMap.remove(cid);
}else{
operateTaskMap.put(cid, task);
}
}
public StatusBean handleClientStatusBean(StatusBean statusBean){
String cid = statusBean.getCid();
Collection<DataLog> queueTasks = taskService.getQueueTasks(cid);
Map<Integer, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus();
if (statusOfBoxes != null) {
for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
try {
//出库入库动作完成处理
int status = boxStatus.getStatus();
String posName = boxStatus.getPosId();
if(!Strings.isNullOrEmpty(posName)){//客户端发一次完成之后,会发空的 posName,不需要处理
if (StorageConstants.BOX_STATUS.OUT_FINISHED == status) {//出仓完成,设置当前任务
DataLog currentTask = null;
for (DataLog queueTask : queueTasks) {
if(queueTask.isExecuting() && queueTask.getPosName().equals(posName)){
currentTask = queueTask;
String doorInfo = statusBean.getFromData("door");
if(doorInfo == null){
doorInfo = "1";
}
currentTask.setSubSourceId(doorInfo);
taskService.updateQueueTask(currentTask);
break;
}
}
DataLog cacheTask = operateTaskMap.get(cid);
if(currentTask != null){
if(cacheTask == null || !cacheTask.getId().equals(currentTask.getId())){
updateCurrentTask(currentTask.getCid(),currentTask);
}
}
}
}
} catch (Exception e) {
log.error("方仓到位时出错",e);
}
}
}
if(statusBean.getStatus() == StorageConstants.STATUS.READY){
DataLog currentTask = getCurrentTask(cid);
if(currentTask != null){
//当前有任务未完成,暂不执行其他任务
return statusBean;
}
for (DataLog task : queueTasks) {
if (cid.equals(task.getCid()) && task.isWait()) {
StoragePos pos = storagePosManager.getByPosName(task.getPosName());
if(pos.isExpandPos()){
continue;
}
if(task.isPutInTask()){
statusBean.setOp(StorageConstants.OP.PUT_IN);
statusBean.addData("door",task.getSubSourceId());
}else if(task.isCheckOutTask()){
statusBean.setOp(StorageConstants.OP.CHECKOUT);
}
statusBean.addPosInfo("",pos.getPosName(),pos.getW(),pos.getH(),false);
log.info("发送["+task.getType()+"]任务["+pos.getPosName()+"]到客户端door="+task.getSubSourceId());
task.setStatus(StorageConstants.OP_STATUS.EXECUTING.name());
taskService.updateQueueTask(task);
dataLogDao.save(task);
return statusBean;
}
}
}
return statusBean;
}
}
......@@ -148,6 +148,9 @@ storage.type.online=Inline System
storage.type.batch=Batch
storage.type.shelf=Shelf
storage.type.cabinet=Cabinet
storage.type.solderPaste=SMD-SP
storage.type.smdVl=SMD-VL
storage.type.smdXl=SMD-XL
storage.compatibility=Compatibility
storage.enable=Enable
storage.enable.yes=Yes
......
......@@ -433,3 +433,6 @@ order.close.notExist=The order of [{0}] is not found.
order.close=Close
order.out.failed=Can not execute task
order.out.notFound=The order info was not found
storage.type.smdXl=SMD-XL
storage.type.smdVl=SMD-VL
storage.type.solderPaste=SMD-SP
......@@ -429,4 +429,7 @@ order.close.empty=\u5DE5\u5355\u53F7\u4E0D\u80FD\u4E3A\u7A7A
order.close.notExist=\u672A\u627E\u5230\u5DE5\u5355[{0}]
order.close=\u5173\u95ED
order.out.failed=\u65E0\u6CD5\u6267\u884C\u5DE5\u5355\u8865\u6599\u4EFB\u52A1
order.out.notFound=\u672A\u627E\u5230\u5DE5\u5355\u4FE1\u606F
\ No newline at end of file
order.out.notFound=\u672A\u627E\u5230\u5DE5\u5355\u4FE1\u606F
storage.type.smdXl=SMD-XL
storage.type.smdVl=SMD-VL
storage.type.solderPaste=SMD-SP
\ No newline at end of file
......@@ -429,4 +429,7 @@ order.close.empty=\u5DE5\u5355\u53F7\u4E0D\u80FD\u4E3A\u7A7A
order.close.notExist=\u672A\u627E\u5230\u5DE5\u5355[{0}]
order.close=\u5173\u95ED
order.out.failed=\u65E0\u6CD5\u6267\u884C\u5DE5\u5355\u8865\u6599\u4EFB\u52A1
order.out.notFound=\u672A\u627E\u5230\u5DE5\u5355\u4FE1\u606F
\ No newline at end of file
order.out.notFound=\u672A\u627E\u5230\u5DE5\u5355\u4FE1\u606F
storage.type.smdXl=SMD-XL
storage.type.smdVl=SMD-VL
storage.type.solderPaste=SMD-SP
\ No newline at end of file
......@@ -175,7 +175,7 @@
${pos.barcode.partNumber}
</display:column>
<display:column property="barcode.provider" titleKey="barcode.provider"/>
<display:column property="barcode.provider" titleKey="barcode.provider" sortProperty="barcode.provider" sortable="true"/>
<%--<display:column titleKey="inOutList.type">--%>
<%--<c:if test="${pos.barcode.type == 0 || empty pos.barcode.type}"><fmt:message key="inOutList.type.component"/></c:if>--%>
......
......@@ -190,6 +190,10 @@
<c:set var="detailUrl" value="${ctx}/storage/vertical/${storage.cid}"/>
</c:if>
<c:if test="${storage.smdXl}">
<c:set var="detailUrl" value="${ctx}/storage/xl/${storage.cid}"/>
</c:if>
<div class="portlet box green-haze tasks-widget">
<c:choose>
<c:when test="${storage.shelf || storage.cabinet || storage.accShelf || storage.virtual || storage.codeShelf}">
......@@ -725,7 +729,7 @@
options['onClose']=cancelTask;
operate = '<a class="btn btn-xs default" href="#" onclick=cancelTask('+data[item].id+');><i class="fa fa-trash-o"></i> ${cancelTask_label} </a>';
}else{
options['onClose']=hideTask;
//options['onClose']=hideTask;
}
var sourceStr = "";
......
......@@ -241,7 +241,7 @@
<div class="page-footer-inner">
2016&copy; <a href="${ctx}/updateHistory.html">SMD BOX</a>
</div>
<span class="right" style="color: #a3a3a3;">Version: 2020.09.09</span>
<span class="right" style="color: #a3a3a3;">Version: 2020.09.17</span>
<div class="scroll-to-top">
<i class="icon-arrow-up"></i>
</div>
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!