Commit b1cd5c35 sunke

中英文,料仓状态页面放入缓存

1 个父辈 3d5aabd7
正在显示 27 个修改的文件 包含 344 行增加182 行删除
To get started, please complete the following steps:
1. Download and install a MySQL 5.x database from
http://dev.mysql.com/downloads/mysql/5.0.html#downloads.
## 阳光电源:
2. Install maven 3.x, and configure it.
与扫码贴标batch连接:
3. Modify the jdbc property in the pom.xml of myproject, make sure the
jdbc url, username and password is correct.
> URL: http://IP:port/myproject/rest/api/v2/mes/barcode
> 参数:
4. Run "mvn install" to install the parent pom.xml to your local repository.
>> codeStr 条码字符串
>> batch 批次字符串
5. Run "mvn jetty:run" under myproject, and view the application at http://localhost:8080.
It takes long time to download jars at the first time, so be patient.
By the way, there wasn't data in your database, so you need run "mvn dbunit:operation"
to insert the basic data to your DB. Use admin/admin to login the system.
6. If you want to make a war file, just run "mvn package -DskipTests" under myproject,
it will generate a war file under myproject/target.
More information please contact Lu xiaojun.
C:\Windows\system32>mongod --storageEngine=mmapv1 --logappend --directoryperdb --serviceName MongoDB --install
打印机静默打印: Chrome快捷方式增加:--kiosk-printing
......
......@@ -70,7 +70,7 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
private String batchId;
/**
* 指定批次显示内容
* 批次显示内容
*/
private String batchInfo;
......
package com.myproject.bean.update;
import com.myproject.bean.BaseMongoBean;
import com.myproject.bean.json.PlateSizeBean;
import com.myproject.bean.json.UsageItem;
import com.myproject.util.PLATE_SIZE;
import com.myproject.util.StorageConstants;
import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.data.annotation.Transient;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by kangmor on 2015/12/3.
......@@ -42,27 +46,19 @@ public class Storage extends BaseMongoBean {
}
/**
* 禁止出入库的 box
* 使用情况
*/
private List<Integer> disableBoxes;
private Map<String, UsageItem> usageMap = new ConcurrentHashMap<>();
/**
* 允许放入的料盘尺寸信息
* 禁止出入库的 box
*/
@Transient
private List<PLATE_SIZE> plateSizes;
private List<Integer> disableBoxes;
public List<Integer> getDisableBoxes() {
return disableBoxes;
}
public List<PLATE_SIZE> getPlateSizes() {
return plateSizes;
}
public void setPlateSizes(List<PLATE_SIZE> plateSizes) {
this.plateSizes = plateSizes;
}
/**
* 判断 box 是否可用
*/
......@@ -214,9 +210,9 @@ public class Storage extends BaseMongoBean {
* 判断料盘是否能够放入该仓库: 0=完全匹配,1=完全兼容,2=同尺寸兼容
*/
public boolean canPutIn(int w, int h){
if(plateSizes != null){
for (PLATE_SIZE plateSize : plateSizes) {
if(canPutInPos(w,h, plateSize.getW(), plateSize.getH())){
if(usageMap != null){
for (UsageItem usageItem : usageMap.values()) {
if(canPutInPos(w,h, usageItem.getW(), usageItem.getH())){
return true;
}
}
......@@ -239,4 +235,69 @@ public class Storage extends BaseMongoBean {
public void setCompatibleType(StorageConstants.COMPATIBLE_TYPE compatibleType) {
this.compatibleType = compatibleType;
}
public Map<String, UsageItem> getUsageMap() {
return usageMap;
}
public void setUsageMap(Map<String, UsageItem> usageMap) {
this.usageMap = usageMap;
}
/**
* 使用一个仓位,更新使用情况
*/
public void useOnePos(StoragePos pos){
if(usageMap != null){
String sizeStr = pos.getSizeStr();
UsageItem usageItem = usageMap.get(sizeStr);
if(usageItem != null){
this.emptySlots = this.emptySlots - 1;
int usedCount = usageItem.getUsedCount();
usageItem.setUsedCount(usedCount + 1);
usageMap.put(sizeStr, usageItem);
}
}
}
public void emptyOnePos(StoragePos pos){
if(usageMap != null){
String sizeStr = pos.getSizeStr();
UsageItem usageItem = usageMap.get(sizeStr);
if(usageItem != null){
this.emptySlots = this.emptySlots + 1;
int usedCount = usageItem.getUsedCount();
usageItem.setUsedCount(usedCount - 1);
usageMap.put(sizeStr, usageItem);
}
}
}
public void initUsage(List<PlateSizeBean> plateSizeBeanList){
usageMap = new ConcurrentHashMap<>();
int totalPosCount = 0;
int emptyPosCount = 0;
for (PlateSizeBean plateSizeBean : plateSizeBeanList) {
String sizeStr = plateSizeBean.getSizeStr();
UsageItem usageItem = usageMap.get(sizeStr);
if(usageItem == null){
usageItem = new UsageItem();
usageItem.setW(plateSizeBean.getPlateSize().getW());
usageItem.setH(plateSizeBean.getPlateSize().getH());
}
if(plateSizeBean.getPlateSize().isUsed()){
int usedCount = plateSizeBean.getCount();
usageItem.setUsedCount(usedCount);
usageItem.setTotalCount(usedCount + usageItem.getTotalCount());
}else{
//未使用的数量
int idleCount = plateSizeBean.getCount();
usageItem.setTotalCount(idleCount + usageItem.getTotalCount());
emptyPosCount = emptyPosCount + idleCount;
}
totalPosCount = totalPosCount + plateSizeBean.getCount();
usageMap.put(sizeStr, usageItem);
}
this.setEmptySlots(emptyPosCount);
this.setTotalSlots(totalPosCount);
}
}
......@@ -200,4 +200,8 @@ public class StoragePos extends BaseMongoBean {
public void setMergePosList(List<String> mergePosList) {
this.mergePosList = mergePosList;
}
public String getSizeStr(){
return w + "x" + h;
}
}
......@@ -544,12 +544,13 @@ public class BarcodeRule {
codeStr = ")》@06@120S002@P8908018028@1PBLM18PG121SH1D@31PBLM18PG121SH1D@12V690588124@10VJPN-AM@2P@20P@6D192400@14D210205@30PY@Z1@K0@16K0@V97294419@3SS191908055X1Z@Q4000NAR000@20T1@1TAM961458E@2T@1Z@@";
// codeStr = "=1+0x0-0x0=A0002";
//阳光电源
//[RI]_PN_PRODATEyyMMdd_QTYxxxx
rule = "[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]";
codeStr = "4500065747_CS000069_180101_0300000041";
rule = "[RI]_PN_PRODATEyyMMdd_QTYxxxx";
//rule = "[RI]_PN_PRODATEyyMMdd_QTY[0:5:4]";
codeStr = "4500065747_CS000069_180101_030000041";
codeStr = "4500089600_DC000045_190528_003000006";
//佳世达
rule ="BATCH;PRODATEyyyyMMdd[1:8:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI";
codeStr = "L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
//rule ="BATCH;PRODATEyyyyMMdd[1:8:-1]EXPD[-1:-4:-1];PN[1:12:-1]SP[13:5:-1]QTY[-1:-5:-1];RI";
//codeStr = "L00002019090199951797;E20190901 0365;B8C.R2003.V81506072019090103000;R506072019102200356";
BarcodeRule br = BarcodeRule.newRule(rule);
Barcode b = br.toCodeBean(codeStr).getBarcode();
if(b != null){
......
......@@ -392,7 +392,7 @@ public class FileUploadController extends BaseFormController {
storagePosManager.save(storagePos);
}
}
dataCache.updateStorage(storage);
dataCache.reloadStorage(storage);
String msg = "读取到["+list.size()+"]个位置信息:新增【"+newRowCount+"】更新【" +updateRowCount +"】";
log.info(msg);
......
......@@ -85,13 +85,13 @@ public class StorageCloudUpdateController extends BaseUpdateController {
} else {
try {
Storage storage = storageUpdateForm.getStorage();
storage = dataCache.updateStorage(storage);
storage = dataCache.reloadStorage(storage);
fileUpload.setParam(storage.getId());
saveMessage(request, getText("storage.saveSuccess", request.getLocale()));
return "redirect:storageUpdate.html?id="+storage.getId();
} catch (ValidateException e) {
} catch (Exception e) {
log.error(e);
String errormsg = getText(e.getMessage(), e.getParams(), request.getLocale());
String errormsg = getText(e.getMessage(), request.getLocale());
log.error(errormsg);
saveError(request, errormsg);
}
......
......@@ -173,6 +173,12 @@ public class AccShelfController extends BaseController {
if(storage.isAccShelf()){
Barcode barcode = codeBean.getBarcode();
try {
if(barcode.getPlateSize() == 1){
//长宽为1的需要弹框设置尺寸
throw new ValidateException("error.barcode.errorSize","条码未设置尺寸");
}
long now = System.currentTimeMillis();
//5秒内同一个条码忽略
Date usedDate = barcode.getUsedDate();
......@@ -216,7 +222,7 @@ public class AccShelfController extends BaseController {
}
} catch (ValidateException e) {
log.error("Error:"+e.getMessage());
return e.getMessage();
return getText(e.getMessage(), e.getParams(),request.getLocale(),e.getMessage());
}
}
}else{
......
......@@ -121,6 +121,13 @@ public class StoragePosFindController extends BaseSearchController {
request.setAttribute("lockId",lockId);
}
String batch = request.getParameter("batch");
if(!Strings.isNullOrEmpty(batch)){
Pattern pattern = Pattern.compile(batch, Pattern.CASE_INSENSITIVE);
baseCriteria.and("barcode.batch").regex(pattern);
request.setAttribute("batch",batch);
}
addLikeParam(baseCriteria, request, "otherField1");
addLikeParam(baseCriteria, request, "otherField2");
addLikeParam(baseCriteria, request, "otherField3");
......
......@@ -66,13 +66,13 @@ public class StorageUpdateController extends BaseUpdateController {
return getSuccessView();
} else {
try {
dataCache.updateStorage(storage);
dataCache.reloadStorage(storage);
//fileUpload.setParam(storage.getId());
saveMessage(request, getText("storage.saveSuccess", request.getLocale()));
//return "redirect:storageUpdate.html?id="+storage.getId();
} catch (ValidateException e) {
} catch (Exception e) {
log.error(e);
String errormsg = getText(e.getMessage(), e.getParams(), request.getLocale());
String errormsg = getText(e.getMessage(), request.getLocale());
log.error(errormsg);
saveError(request, errormsg);
}
......
......@@ -204,7 +204,7 @@ public class VirtualBoxController extends BaseController{
}
storagePosManager.insertAll(posList);
dataCache.updateStorage(virtualStorage);
dataCache.reloadStorage(virtualStorage);
return "保存成功";
......
......@@ -70,10 +70,11 @@ public class DataLogSearchController extends BaseSearchController {
criteria.and("subSourceId").is(pid);
}
String bid = request.getParameter("bid");
String batch = request.getParameter("batch");
if(!Strings.isNullOrEmpty(bid)){
criteria.and("batchId").is(bid);
if(!Strings.isNullOrEmpty(batch)){
Pattern pattern = Pattern.compile(batch, Pattern.CASE_INSENSITIVE);
criteria.and("batchInfo").regex(pattern);
}
if(taskSource != null){
......
......@@ -7,6 +7,7 @@ import com.google.common.collect.Maps;
import com.google.common.collect.Multiset;
import com.myproject.bean.CodeBean;
import com.myproject.bean.json.InventoryItem;
import com.myproject.bean.json.PlateSizeBean;
import com.myproject.bean.update.*;
import com.myproject.dao.mongo.*;
import com.myproject.exception.ValidateException;
......@@ -505,9 +506,13 @@ public class DataCache{
if(all != null){
Map<String, Storage> map = new ConcurrentHashMap<>();
for(Storage storage : all){
List<PLATE_SIZE> plateSizes = storagePosManager.distinctPlateSize(storage.getId());
storage.setPlateSizes(plateSizes);
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList);
map.put(storage.getCid(), storage);
}
allStorage = map;
log.info("加载所有料仓["+all.size()+"]信息到缓存");
......@@ -552,24 +557,10 @@ public class DataCache{
return null;
}
/**
* 更新料仓信息
*/
public Storage updateStorage(String cid) throws ValidateException {
Storage storage = getStorage(cid);
return updateStorage(storage);
}
/**
* 更新料仓信息
*/
public Storage updateStorage(Storage storage) throws ValidateException {
storage.setTotalSlots(storagePosManager.countTotalStorageSize(storage.getId()));
storage.setEmptySlots(storagePosManager.countEmptyStorageSize(storage.getId()));
storageManager.save(storage);
List<PLATE_SIZE> plateSizes = storagePosManager.distinctPlateSize(storage.getId());
storage.setPlateSizes(plateSizes);
getAllStorage().put(storage.getCid(), storage);
public Storage reloadStorage(Storage storage){
List<PlateSizeBean> plateSizeBeanList = storagePosManager.getStoragePosUsage(storage.getId());
storage.initUsage(plateSizeBeanList);
allStorage.put(storage.getCid(), storage);
return storage;
}
......@@ -677,7 +668,24 @@ public class DataCache{
/**
* 修改库存,出库为负,入库为正
*/
public int updateInventory(String cid, String partNumber, int amount){
public int updateInventory(StoragePos pos, Barcode barcode){
Storage storage = getStorageById(pos.getStorageId());
String cid = storage.getCid();
String partNumber = barcode.getPartNumber();
int amount = 0;
String sizeStr = pos.getSizeStr();
if(pos.getBarcode() == null){
//出库
amount = - barcode.getAmount();
storage.emptyOnePos(pos);
}else{
//入库
amount = barcode.getAmount();
storage.useOnePos(pos);
}
allStorage.put(cid, storage);
if(amount != 0){
InventoryItem inventoryItem = getStorageInventoryByPartNumber(cid,partNumber);
if(inventoryItem == null){
......
......@@ -4,6 +4,7 @@ import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import com.myproject.bean.CodeBean;
import com.myproject.bean.update.*;
import com.myproject.dao.mongo.IDataLogDao;
import com.myproject.exception.ValidateException;
......@@ -89,6 +90,32 @@ public class MesApiController extends BaseController {
return value;
}
@RequestMapping(value = "/barcode")
@ResponseBody
public String barcode(HttpServletRequest request) {
try{
String codeStr = checkParameter(request,"codeStr");
String batch = checkParameter(request,"batch");
log.info("收到MES接口条码更新指令:codeStr="+codeStr + " batch="+batch);
String sizeCodeStr = "=1x1=" + codeStr;
CodeBean codeBean = dataCache.resolveSingleCode(sizeCodeStr);
if(codeBean.isValid()){
Barcode barcode = codeBean.getBarcode();
barcode.setBatch(batch);
barcodeManager.save(barcode);
return "OK";
}else{
return "Error:" + codeBean.getError();
}
}catch (ValidateException ve) {
return "Error:" + ve.getMessage();
}catch (Exception e){
return "Error:" + e.getMessage();
}
}
@RequestMapping(value = "/codeUpdate")
@ResponseBody
public String codeUpdate(HttpServletRequest request) {
......
......@@ -45,12 +45,11 @@ public class StatusController extends BaseController{
if(Strings.isNullOrEmpty(cid)){
cid = dataCache.defaultStorageCid();
}
return getStatus(cid,request);
}
private StatusBean getStatus(String cid, HttpServletRequest request){
StatusBean statusBean = taskService.getStatus(cid);
// if(!Strings.isNullOrEmpty(statusBean.getMsgCode())){
// //String localeMsg = getText("client."+statusBean.getMsgCode(),statusBean.getMsgParam(),request.getLocale(),statusBean.msg);
// statusBean.setMsg(localeMsg);
// statusBean.setMsgEn();
// }
Exception e = taskService.getServerException(cid);
if(e != null){
......@@ -68,6 +67,27 @@ public class StatusController extends BaseController{
return statusBean;
}
@RequestMapping(value = "/statusList")
@ResponseBody
public List<StatusBean> statusList(HttpServletRequest request){
String cids = request.getParameter("cids");
Collection<String> cidList;
if(Strings.isNullOrEmpty(cids)){
cidList = dataCache.getAllStorage().keySet();
}else{
cidList = Lists.newArrayList(cids.split(","));
}
List<StatusBean> statusList = Lists.newArrayList();
for (String cid : cidList) {
if(cid.isEmpty()){
continue;
}
StatusBean statusBean = getStatus(cid, request);
statusList.add(statusBean);
}
return statusList;
}
@RequestMapping(value = "/latestStatus")
@ResponseBody
......
......@@ -533,7 +533,7 @@ public class StorageDataController extends BaseController {
/**
* 流水线提示消息
*/
private static String lineMsg = "";
private static ValidateException lineMsgParams;
/**
* 保存界面的一些操作
......@@ -541,7 +541,10 @@ public class StorageDataController extends BaseController {
@RequestMapping(value = "/getLineMsg")
@ResponseBody
public String getLineMsg(HttpServletRequest request) {
return lineMsg;
if(lineMsgParams != null){
return "";
}
return getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
}
......@@ -553,7 +556,7 @@ public class StorageDataController extends BaseController {
public Map<String,Object> emptyPosForPutin(HttpServletRequest request) {
String code = request.getParameter("code");
String cids = request.getParameter("cids");
lineMsg = "";
lineMsgParams = null;
Map<String,Object> resultMap = Maps.newHashMap();
if(Strings.isNullOrEmpty(cids)){
resultMap.put("result","101");
......@@ -568,8 +571,9 @@ public class StorageDataController extends BaseController {
}
if(storageList.isEmpty()){
resultMap.put("result","102");
lineMsg = "无可用的料仓";
resultMap.put("msg",lineMsg);
lineMsgParams = new ValidateException("error.storage.noStorage","无可用的料仓");
String msg = getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
resultMap.put("msg",msg);
}else{
Collection<CodeBean> codeBeans = dataCache.resolveCodeStr(code);
Barcode barcode = null;
......@@ -581,8 +585,9 @@ public class StorageDataController extends BaseController {
}
if(barcode == null){
resultMap.put("result","103");
lineMsg = "无效的条码";
resultMap.put("msg",lineMsg);
lineMsgParams = new ValidateException("error.barcode.invalid",new String[]{code}, "无效的条码");
String msg = getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
resultMap.put("msg",msg);
}else {
StoragePos pos = null;
try {
......@@ -594,17 +599,20 @@ public class StorageDataController extends BaseController {
resultMap.put("barcode",barcode.getBarcode());
Storage theStorage = dataCache.getStorageById(pos.getStorageId());
resultMap.put("cid",theStorage.getCid());
lineMsg = "["+barcode.getBarcode()+"]准备入库到["+pos.getPosName()+"]";
String lineMsg = "["+barcode.getBarcode()+"]准备入库到["+pos.getPosName()+"]";
lineMsgParams = new ValidateException("msg.line.putIn",new String[]{code}, lineMsg);
}else{
resultMap.put("result","104");
lineMsg = "未找到可用的仓位";
resultMap.put("msg",lineMsg);
lineMsgParams = new ValidateException("error.storage.noPosFind",new String[]{code}, "未找到可用的仓位");
String msg = getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
resultMap.put("msg",msg);
}
} catch (ValidateException e) {
lineMsg = e.getMessage();
log.info("查找空库位失败:" + lineMsg);
lineMsgParams = e;
resultMap.put("result","105");
resultMap.put("msg",lineMsg);
String msg = getText(lineMsgParams.getMessage(),lineMsgParams.getParams(), request.getLocale(),lineMsgParams.getDefaultMsg());
log.info("查找空库位失败:" + msg);
resultMap.put("msg",msg);
}
}
}
......@@ -640,16 +648,32 @@ public class StorageDataController extends BaseController {
return componentList.getList();
}
@RequestMapping("/getStorageUseage")
@RequestMapping("/getStorage")
@ResponseBody
public List<PlateSizeBean> getStorageUseage(HttpServletRequest request, HttpServletResponse response){
public Storage getStorageUseage(HttpServletRequest request, HttpServletResponse response){
String cid = request.getParameter("cid");
Storage storage = dataCache.getStorage(cid);
if(storage == null){
return null;
return dataCache.getStorage(cid);
}
@RequestMapping("/storageList")
@ResponseBody
public Collection<Storage> usageMap(HttpServletRequest request, HttpServletResponse response){
String cids = request.getParameter("cids");
Collection<Storage> storageList = null;
if(Strings.isNullOrEmpty(cids)){
storageList = dataCache.getAllStorage().values();
}else{
storageList = new ArrayList<>();
for (String cid : Lists.newArrayList(cids.split(","))) {
Storage storage = dataCache.getStorage(cid);
if(storage == null){
continue;
}
storageList.add(storage);
}
}
String storageId = storage.getId();
return storagePosManager.getStoragePosUsage(storageId);
return storageList;
}
......
......@@ -1321,8 +1321,8 @@ public class TaskService implements ITaskService {
task.setNum(barcode.getAmount());
task.setMemo(barcode.getMemo());
dataCache.updateInventory(task.getCid(), barcode.getPartNumber(),barcode.getAmount());
dataCache.updateStorage(task.getCid());
dataCache.updateInventory(pos,barcode);
//dataCache.updateStorage(task.getCid());
}else{
barcode = pos.getBarcode();
......@@ -1339,9 +1339,8 @@ public class TaskService implements ITaskService {
pos.setUsed(false);
storagePosManager.save(pos);
dataCache.updateInventory(task.getCid(), barcode.getPartNumber(), - barcode.getAmount());
dataCache.updateStorage(task.getCid());
dataCache.updateInventory(pos, barcode);
//dataCache.updateStorage(task.getCid());
}
......@@ -1476,9 +1475,9 @@ public class TaskService implements ITaskService {
//更新缓存中的库存信息
int stockReel = dataCache.updateInventory(task.getCid(), componentBarcode.getPartNumber(),componentBarcode.getAmount());
int stockReel = dataCache.updateInventory(storagePos,componentBarcode);
dataCache.updateStorage(task.getCid());
//dataCache.updateStorage(task.getCid());
log.info("入库"+componentBarcode.getPartNumber()+"["+componentBarcode.getBarcode()+"]当前库存:"+stockReel+"到"+componentPos.getPosName()+"可出库时间:"+new Date(canCheckOutTime));
componentPos.setBarcode(componentBarcode);
......@@ -1511,9 +1510,9 @@ public class TaskService implements ITaskService {
storagePosManager.save(storagePos);
//更新缓存中的库存信息
dataCache.updateInventory(task.getCid(), task.getPartNumber(),barcode.getAmount());
dataCache.updateInventory(storagePos,barcode);
dataCache.updateStorage(task.getCid());
//dataCache.updateStorage(task.getCid());
Storage storage = dataCache.getStorage(task.getCid());
if(storage != null){
......@@ -1523,6 +1522,7 @@ public class TaskService implements ITaskService {
//记录日志,完成 task
task.setBatchInfo(barcode.getBatch());
task.setNum(barcode.getAmount());
task.setStatus(StorageConstants.OP_STATUS.FINISHED.name());
dataLogDao.save(task);
......@@ -1605,11 +1605,12 @@ public class TaskService implements ITaskService {
barcode.setPosName("");
barcodeManager.save(barcode);
String specifiedBatchId = barcode.getLockId();
if(!Strings.isNullOrEmpty(specifiedBatchId)){
task.setBatchId(specifiedBatchId);
task.setBatchInfo(barcode.getLockName());
}
// String specifiedBatchId = barcode.getLockId();
// if(!Strings.isNullOrEmpty(specifiedBatchId)){
// task.setBatchId(specifiedBatchId);
// task.setBatchInfo(barcode.getLockName());
// }
task.setBatchInfo(barcode.getBatch());
}
storagePos.setBarcode(null);
......@@ -1617,9 +1618,9 @@ public class TaskService implements ITaskService {
storagePosManager.save(storagePos);
log.info("出库完成,清空仓位: " + storagePos.getId() + "[" + storagePos.getPosName() + "]");
dataCache.updateStorage(task.getCid());
//更新缓存中的库存信息
dataCache.updateInventory(task.getCid(), task.getPartNumber(),0-task.getNum());
dataCache.updateInventory(storagePos,barcode);
//通知消息
......@@ -1636,7 +1637,7 @@ public class TaskService implements ITaskService {
finishedTaskMap.put(task.getBarcode(),task);
//notifyTask(task);
dataCache.updateStorage(task.getCid());
//dataCache.updateStorage(task.getCid());
finishedOrderTask(task);
//checkTaskSetFinished(task);
......
......@@ -412,6 +412,7 @@ error.pos.inQueue=Failed\: The location [{0}] is in queue.
error.barcode.empty=No barcode is scanned.
error.barcode.many=more than one valid barcodes were found.
error.storage.unavailable=The storage is unavailable.
error.storage.noStorage=There is no storage can use.
error.storage.noPos=There is no availble position of [{0}]
error.barcode.wrongSize=The reel has wrong size [{0}]
error.barcode.executing=The task of barcode [{0}] is executing.
......@@ -427,4 +428,7 @@ error.barcode.noRule=There is no rule of the barcode is setted.
error.barcode.wrongLength=The code string [{0}] has wrong length.
error.barcode.noField=There is no {0} field in the code string.
error.barcode.wrongPn=The partnumber is wrong
error.barcode.pnNotExist=x Component {0} does not exist
\ No newline at end of file
error.barcode.pnNotExist=x Component {0} does not exist
error.barcode.errorSize=x The reel has no size.
error.storage.noPosFind=No availble position is found.
msg.line.putIn=Put [{0}] into [{1}]
\ No newline at end of file
......@@ -423,4 +423,8 @@ error.barcode.noRule=There is no rule of the barcode is setted.
error.barcode.wrongLength=The code string [{0}] has wrong length.
error.barcode.noField=There is no {0} field in the code string.
error.barcode.wrongPn=The partnumber is wrong
error.barcode.pnNotExist=x Component {0} does not exist
\ No newline at end of file
error.barcode.pnNotExist=x Component {0} does not exist
error.barcode.errorSize=x The reel has no size.
error.storage.noStorage=There is no storage can use.
error.storage.noPosFind=No availble position is found.
msg.line.putIn=Put [{0}] into [{1}]
\ No newline at end of file
......@@ -405,6 +405,7 @@ error.barcode.empty=\u672A\u626B\u63CF\u5230\u6761\u7801
error.barcode.many=\u53D1\u73B0\u591A\u4E2A\u6709\u6548\u6761\u7801
error.storage.unavailable=\u6599\u4ED3[{0}]\u4E0D\u53EF\u7528
error.storage.noPos=\u65E0\u53EF\u7528\u7684\u6599\u683C[{0}],\u65E0\u6CD5\u7EE7\u7EED\u653E\u5165
error.storage.noPosFind=\u672A\u627E\u5230\u53EF\u7528\u7684\u4ED3\u4F4D
error.barcode.wrongSize=\u6599\u76D8\u5C3A\u5BF8[{0}]\u4E0D\u7B26
error.barcode.executing=\u6761\u7801[{0}]\u7684\u4EFB\u52A1\u6B63\u5728\u6267\u884C
error.pos.notExist=\u5E93\u4F4D\u3010{0}\u3011\u4E0D\u5B58\u5728,\u65E0\u6CD5\u5165\u5E93
......@@ -413,10 +414,13 @@ error.pos.wrong=\u5E93\u4F4D\u3010{0}\u3011\u4E0E\u6599\u4ED3[{1}]\u4E0D\u5339\u
error.pos.sizeNotMatch=\u6599\u76D8\u5C3A\u5BF8[{0}]\u4E0E\u5E93\u4F4D{1}\u5C3A\u5BF8[{2}]\u4E0D\u7B26,\u65E0\u6CD5\u5165\u5E93
error.barcode.invalid={0} \u4E0D\u662F\u6709\u6548\u7684\u6761\u7801
error.barcode.expired=\u7269\u6599\u5DF2\u8FC7\u671F,\u65E0\u6CD5\u5165\u5E93.
error.barcode.wrongQty=\u6599\u76D8[0]\u6570\u91CF[{1}]\u9519\u8BEF.
error.barcode.wrongQty=\u6599\u76D8[{0}]\u6570\u91CF[{1}]\u9519\u8BEF.
error.barcode.inStorage=\u6599\u76D8[0]\u5DF2\u5728\u6599\u4ED3[1]\u7684\u5E93\u4F4D[2]\u4E2D
error.barcode.noRule=\u6761\u7801\u89E3\u6790\u89C4\u5219\u672A\u5B9A\u4E49
error.barcode.wrongLength=\u6761\u7801[{0}]\u957F\u5EA6\u9519\u8BEF
error.barcode.noField=\u6761\u7801\u89E3\u6790\u5931\u8D25,\u672A\u627E\u5230{0}\u5B57\u6BB5
error.barcode.wrongPn=PartNumber\u4E0D\u4E00\u81F4
error.barcode.pnNotExist=x\u6863\u6848 {0} \u4E0D\u5B58\u5728
\ No newline at end of file
error.barcode.pnNotExist=x\u6863\u6848 {0} \u4E0D\u5B58\u5728
error.barcode.errorSize=x \u6599\u76D8\u672A\u8BBE\u7F6E\u5C3A\u5BF8
error.storage.noStorage=\u65E0\u53EF\u7528\u7684\u6599\u4ED3
msg.line.putIn=[{0}]\u51C6\u5907\u5165\u5E93\u5230[{1}]
\ No newline at end of file
......@@ -68,6 +68,7 @@
<a href="${ctx}/barcode/barcodeUpdate.html?id=${barcode.id}">${barcode.barcode}</a>
</display:column>
<display:column property="partNumber" sortProperty="partNumber" sortable="true" titleKey="barcode.partNumber"/>
<display:column property="batch" escapeXml="true" titleKey="barcode.batch" sortable="true" sortProperty="batch"/>
<!-- 成都凯天-->
<c:if test='<%=DataCache.isProductionFor("ChengDuKaiTian") %>'>
<display:column property="otherField2" sortProperty="otherField2" sortable="true" titleKey="产品型号"/>
......
......@@ -59,7 +59,7 @@
</div>
<label class="control-label col-md-1"><fmt:message key="dataLog.date"/></label>
<div class="col-md-3">
<div class="col-md-3" style="padding-left:0px;">
<div class="input-group input-large date-picker input-daterange" data-date="2017-05-10" data-date-format="${datePatten}">
<input type="text" class="form-control" name="startDay" value="${startDay}">
<span class="input-group-addon">
......@@ -70,6 +70,10 @@
<span class="help-block"> </span>
</div>
<div class="col-md-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message key="button.search"/> </button>
</div>
</div>
<div class="form-group">
......@@ -102,10 +106,13 @@
</div>
</div>
<label class="control-label col-md-1"><fmt:message key="barcode.batch"/></label>
<div class="col-md-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message key="button.search"/> </button>
<div style="text-align:left">
<input id="batch" name="batch" class="form-control" value="${batch}"/>
</div>
</div>
</div>
</form:form>
......@@ -165,10 +172,11 @@
<c:if test="${pos.barcode.type == 4}"><fmt:message key="inOutList.type.fixture"/></c:if>
</display:column>
<display:column property="barcode.barcode" titleKey="barcode.barcode"/>
<display:column property="barcode.inFixture" titleKey="storagePosFind.inFixture"/>
<%--<display:column property="barcode.inFixture" titleKey="storagePosFind.inFixture"/>--%>
<display:column property="barcode.batch" titleKey="barcode.batch" sortable="true" sortProperty="barcode.batch"/>
<%--<display:column property="barcode.providerNumber" titleKey="component.providerNumber"/>--%>
<%--<display:column property="barcode.amount" titleKey="数量"/>--%>
<display:column property="barcode.lockName" titleKey="menu.inRule"/>
<%--<display:column property="barcode.lockName" titleKey="menu.inRule"/>--%>
<display:column property="posName" titleKey="checkOut.pos" sortProperty="posName" sortable="true"/>
<display:column titleKey="barcode.inStoreRemainTime" sortProperty="barcode.putInTime" sortable="true">
......
......@@ -53,10 +53,6 @@
</div>
<div class="col-md-2 col-xs-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message
key="button.search"/></button>
</div>
</div>
<div class="form-group">
......@@ -100,6 +96,22 @@
</div>
<div class="col-md-2 col-xs-2">
<button class="btn purple" type="submit"><i class="fa fa-search"></i><fmt:message
key="button.search"/></button>
</div>
</div>
<div class="form-group">
<label class="control-label col-md-1 col-xs-2"><fmt:message key="barcode.batch"/></label>
<div class="col-md-2 col-xs-4">
<div style="text-align:left" class="input-group">
<input type="text" name="batch" class="form-control" value="${batch}"/>
</div>
</div>
<label class="control-label col-md-1 col-xs-2"><fmt:message key="dataLog.orderSource"/></label>
<div class="col-md-2 col-xs-4">
......@@ -108,6 +120,8 @@
</div>
</div>
</div>
</form:form>
......@@ -142,7 +156,7 @@
<display:column titleKey="dataLog.orderSource" sortable="true" sortProperty="sourceName">
${dataLog.sourceStr}
</display:column>
<display:column titleKey="dataLog.batch" sortable="true" sortProperty="batchInfo" property="batchInfo"/>
<display:column titleKey="barcode.batch" sortable="true" sortProperty="batchInfo" property="batchInfo"/>
<display:column property="operator" titleKey="dataLog.operator" sortable="true" sortProperty="operator"/>
<display:column titleKey="dataLog.date" sortable="true" sortProperty="updateDate">
<fmt:formatDate value="${dataLog.updateDate}" pattern="yyyy-MM-dd HH:mm"/>
......
......@@ -130,9 +130,9 @@
</div>
<div class="modal-body">
<div class="row">
<c:forEach items="${storage.plateSizes}" var="psize">
<c:forEach items="${storage.usageMap}" var="usageEntry">
<div class="col-lg-3 col-md-3 col-sm-3 col-xs-3">
<div class="bg-blue-madison partnumber-box psizeBox">${psize.sizeStr}</div>
<div class="bg-blue-madison partnumber-box psizeBox">${usageEntry.value.sizeStr}</div>
</div>
</c:forEach>
</div>
......
......@@ -587,32 +587,16 @@
}
function flushUsageItem(){
$.post("${ctx}/service/store/getStorageUseage", {cid: '${show}'}, function (data) {
if(!isLimitOpt(data)){
var sizeData = {};
for(var i in data){
var itemData = data[i];
var sizeItem = sizeData[itemData.sizeStr];
if(!sizeItem){
sizeItem = {};
sizeItem["w"] = itemData.plateSize.w;
sizeItem["h"] = itemData.plateSize.h;
sizeItem["usedCount"] = 0;
sizeItem["idleCount"] = 0;
}
if(itemData.plateSize.used){
sizeItem["usedCount"] = itemData.count;
}else{
sizeItem["idleCount"] = itemData.count;
}
sizeData[itemData.sizeStr] = sizeItem;
}
$.post("${ctx}/service/store/getStorage", {cid: '${show}'}, function (storage) {
if(!isLimitOpt(storage)){
var sizeData = storage.usageMap;
var totalCount = 0;
var cid = storage.cid;
var totalCount = storage.totalSlots;
for(var sizeStr in sizeData){
sizeItem = sizeData[sizeStr];
totalCount = totalCount + sizeItem["usedCount"] + sizeItem["idleCount"];
var html = getItemBar(sizeItem["w"],sizeItem["h"],sizeItem["usedCount"],sizeItem["idleCount"]);
var sizeItem = sizeData[sizeStr];
var idleCount = sizeItem.totalCount - sizeItem.usedCount;
var html = getItemBar(sizeItem["w"],sizeItem["h"],sizeItem["usedCount"],idleCount);
var sizeDom = $("#"+sizeStr);
if(sizeDom.length == 0){
......
......@@ -3,8 +3,7 @@
<%@ page language="java" pageEncoding="UTF-8" %>
<style type="text/css">
.kabanTitle{
.kabanTitle{
padding: 10px;
font-size: 30px;
margin-bottom: 10px;
......@@ -58,15 +57,16 @@
background-color: #FFFFFF;
margin: 0px 10px;
padding: 10px;
height: 200px;
text-align: center;
}
#clientMsg{
margin-left: 30px;
font-size: 30px;
font-size: 18px;
color: #ff5500;
text-align: center;
}
#smdstatus{
line-height: 200px;
line-height: 80px;
font-size: 30px;
}
.barheight{
......@@ -100,6 +100,13 @@
border-color: #c8c8c8 !important;
text-decoration:line-through;
}
.red{
color:red;
}
.green{
color:green;
}
</style>
<link href="${ctx}/scripts/lobibox/css/lobibox.min.css?id=2" rel="stylesheet" type="text/css"/>
......@@ -127,7 +134,8 @@
</div>
<div class="statusMsg">
<span id="smdstatus"></span><span id="clientMsg"></span>
<div id="smdstatus"></div>
<div id="clientMsg"></div>
</div>
</div>
......@@ -474,32 +482,16 @@
}
function flushUsageItem(){
$.post("${ctx}/service/store/getStorageUseage", {cid: '${show}'}, function (data) {
if(!isLimitOpt(data)){
var sizeData = {};
for(var i in data){
var itemData = data[i];
var sizeItem = sizeData[itemData.sizeStr];
if(!sizeItem){
sizeItem = {};
sizeItem["w"] = itemData.plateSize.w;
sizeItem["h"] = itemData.plateSize.h;
sizeItem["usedCount"] = 0;
sizeItem["idleCount"] = 0;
}
if(itemData.plateSize.used){
sizeItem["usedCount"] = itemData.count;
}else{
sizeItem["idleCount"] = itemData.count;
}
sizeData[itemData.sizeStr] = sizeItem;
}
$.post("${ctx}/service/store/getStorage", {cid: '${show}'}, function (storage) {
if(!isLimitOpt(storage)){
var sizeData = storage.usageMap;
var totalCount = 0;
var cid = storage.cid;
var totalCount = storage.totalSlots;
for(var sizeStr in sizeData){
sizeItem = sizeData[sizeStr];
totalCount = totalCount + sizeItem["usedCount"] + sizeItem["idleCount"];
var html = getItemBar(sizeItem["w"],sizeItem["h"],sizeItem["usedCount"],sizeItem["idleCount"]);
var sizeItem = sizeData[sizeStr];
var idleCount = sizeItem.totalCount - sizeItem.usedCount;
var html = getItemBar(sizeItem["w"],sizeItem["h"],sizeItem["usedCount"],idleCount);
var sizeDom = $("#"+sizeStr);
if(sizeDom.length == 0){
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!