Commit 1c0d8da7 LN

1.Datalog增加执行时间和在库时长.

2.库位上传优化.
1 个父辈 ebb0f334
......@@ -20,6 +20,9 @@
*/
package com.csvreader;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
......@@ -38,6 +41,32 @@ import java.util.HashMap;
* stream.
*/
public class CsvReader {
protected static transient Logger log = LogManager.getLogger(CsvReader.class);
public static CsvReader newReader(String fileURL, String... headerNameAlias) throws IOException {
String reloadEncodeing="UTF-8";
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true);
csvRead.readHeaders();
int index = csvRead.getIndex(headerNameAlias);
//未找到列,重新读取
if (index == -1) {
String logName="";
for (String str: headerNameAlias
) {
logName+=str+",";
}
log.info("文件未包含列[" + logName + "] ,改为" + reloadEncodeing + "重新读取");
csvRead = new CsvReader(fileURL, CsvReader.Letters.COMMA, Charset.forName(reloadEncodeing));
csvRead.setSkipEmptyRecords(true);
csvRead.setTrimWhitespace(true);
csvRead.readHeaders();
}
return csvRead;
}
private Reader inputStream = null;
private String fileName = null;
......@@ -1454,7 +1483,20 @@ public class CsvReader {
return -1;
}
}
public int getIndex(String... headerNameAlias){
for (String headName: headerNameAlias) {
try{
int index = getIndex(headName);
if(index != -1){
return index;
}
}catch (Exception e){
}
}
return -1;
}
/**
* Skips the next record of data by parsing each column. Does not
* increment
......
......@@ -278,10 +278,13 @@ public class OrderFileWatch {
private LiteOrder readCsv(File csvFile){
List<LiteOrderItem> items = Lists.newArrayList();
try {
CsvReader csvRead = new CsvReader(csvFile.getAbsolutePath());
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
// CsvReader csvRead = new CsvReader(csvFile.getAbsolutePath());
// csvRead.setSkipEmptyRecords(true);//忽略空行
// csvRead.setTrimWhitespace(true);//去除空格
// csvRead.readHeaders();
CsvReader csvRead = CsvReader.newReader(csvFile.getAbsolutePath(),"PN");
int partNumberIndex = csvRead.getIndex("PN");
if (partNumberIndex == -1){
log.info("未包含PN列");
......
......@@ -160,6 +160,32 @@ public class DataLog extends BaseMongoBean /*implements Comparable<DataLog>*/ {
*/
private int outOrder = 0;
/**
* 出入库执行时间,秒
*/
private int executeTime=0;
/**
* 出库时记录此料在库时长 ,分钟
*/
private long inStoreTime=0l;
public long getInStoreTime() {
return inStoreTime;
}
public void setInStoreTime(long inStoreTime) {
this.inStoreTime = inStoreTime;
}
public int getExecuteTime() {
return executeTime;
}
public void setExecuteTime(int executeTime) {
this.executeTime = executeTime;
}
public String getStorageName() {
return storageName;
}
......
......@@ -126,4 +126,14 @@ public class BoxStatusBean {
public String getPosId(){
return data.get("posId");
}
/**
* 获取客户端发送上来的出入库完成的库位信息
*/
public int getExecuteTime (){
if(data!=null&&data.containsKey("executeTime")){
return Integer.parseInt(data.get("executeTime"));
}
return -1;
}
}
......@@ -20,6 +20,7 @@ import java.util.Map;
* Created by kangmor on 2015/12/4.
*/
public interface IStoragePosManager extends IManager<StoragePos> {
List<StoragePos> findByStorage(String storageId);
StoragePos findByStorage(String storageId, String storagePosName);
StoragePos findOneLockPos(String partNumber, String lockId, Collection<String> excludePosIds);
......
......@@ -48,6 +48,10 @@ public class StoragePosManagerImpl implements IStoragePosManager {
public StoragePos findByStorage(String storageId, String storagePosName) {
return storagePosDao.findOneByCondition(new String[]{"storageId", "posName"}, new String[]{storageId, storagePosName});
}
@Override
public List<StoragePos> findByStorage(String storageId) {
return storagePosDao.findListByCondition(new String[]{"storageId" }, new String[]{storageId });
}
@Override
public StoragePos get(String id) {
......
......@@ -218,10 +218,14 @@ public class FileUploadController extends BaseFormController {
// }
// return StorageConstants.BARCODE_SEARCH_VIEW;
log.info("开始更新条码信息");
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
// CsvReader csvRead = new CsvReader(fileURL);
// csvRead.setSkipEmptyRecords(true);//忽略空行
// csvRead.setTrimWhitespace(true);//去除空格
// csvRead.readHeaders();
CsvReader csvRead = CsvReader.newReader(fileURL,"PN");
int reelIdIndex = csvRead.getIndex("RI");
int partNumberIndex = csvRead.getIndex("PN");
if (partNumberIndex == -1){
......@@ -301,10 +305,13 @@ public class FileUploadController extends BaseFormController {
log.error("Storage id is not exist");
throw new ValidateException("storage.error.notExist");
}
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
// CsvReader csvRead = new CsvReader(fileURL);
// csvRead.setSkipEmptyRecords(true);//忽略空行
// csvRead.setTrimWhitespace(true);//去除空格
// csvRead.readHeaders();
CsvReader csvRead = CsvReader.newReader(fileURL,"位置","pos");
int posIndex = csvRead.getIndex("位置");
if(posIndex == -1){
posIndex = csvRead.getIndex("pos");
......@@ -356,32 +363,83 @@ public class FileUploadController extends BaseFormController {
}
}
int newRowCount = 0;
int existRowCount=0;
int updateRowCount = 0;
List<StoragePos> storagePosList=storagePosManager.findByStorage(storage.getId());
List<StoragePos> newList=new ArrayList<>();
if (list != null && list.size() > 0) {
for (StoragePosExcel storagePosExcel : list) {
StoragePos storagePos = storagePosManager.findByStorage(storage.getId(), storagePosExcel.getPosName());
// StoragePos storagePos = storagePosManager.findByStorage(storage.getId(), storagePosExcel.getPosName());
StoragePos storagePos =findFormList(storagePosList,storage.getId(),storagePosExcel.getPosName());
if (storagePos == null) {
storagePos = new StoragePos();
newRowCount ++;
storagePos.setPosName(storagePosExcel.getPosName());
storagePos.setPriority(storagePosExcel.getPriority());
storagePos.setW(storagePosExcel.getW());
storagePos.setH(storagePosExcel.getH());
storagePos.setStorageId(storage.getId());
Point point= PointUtil.getPosPoint(storagePos.getPosName());
storagePos.setCoordinate(new double[]{point.getX(),point.getY()});
newList.add(storagePos);
}else{
updateRowCount ++;
boolean needUpdate=false;
if(!storagePos.getPosName().equals(storagePosExcel.getPosName())){
needUpdate=true;
storagePos.setPosName(storagePosExcel.getPosName());
}
if(storagePos.getPriority()!=storagePosExcel.getPriority()) {
needUpdate=true;
storagePos.setPriority(storagePosExcel.getPriority());
}
if(storagePos.getW()!=storagePosExcel.getW()) {
needUpdate=true;
storagePos.setW(storagePosExcel.getW());
}
if(storagePos.getH()!=storagePosExcel.getH()) {
needUpdate=true;
storagePos.setH(storagePosExcel.getH());
}
if(!storagePos.getStorageId().equals(storage.getId())){
needUpdate=true;
storagePos.setStorageId(storage.getId());
}
Point point= PointUtil.getPosPoint(storagePos.getPosName());
if(storagePos.getCoordinate()==null||storagePos.getCoordinate().length!=2||
(storagePos.getCoordinate()[0]!=point.getX()) ||(storagePos.getCoordinate()[1]!=point.getY())){
needUpdate=true;
storagePos.setCoordinate(new double[]{point.getX(),point.getY()});
}
if(needUpdate){
updateRowCount ++;
storagePosManager.save(storagePos);
}else{
existRowCount++;
}
}
storagePos.setPosName(storagePosExcel.getPosName());
storagePos.setPriority(storagePosExcel.getPriority());
storagePos.setW(storagePosExcel.getW());
storagePos.setH(storagePosExcel.getH());
storagePos.setStorageId(storage.getId());
Point point= PointUtil.getPosPoint(storagePos.getPosName());
storagePos.setCoordinate(new double[]{point.getX(),point.getY()});
storagePosManager.save(storagePos);
}
if(newList.size()>0){
storagePosManager.insertAll(newList);
}
}
dataCache.reloadStorage(storage);
String msg = "读取到["+list.size()+"]个位置信息:新增【"+newRowCount+"】更新【" +updateRowCount +"】";
String msg = "读取到["+list.size()+"]个位置信息:新增【"+newRowCount+"】,已存在【"+existRowCount+"】,更新【" +updateRowCount +"】";
log.info(msg);
return msg;
}
private StoragePos findFormList(List<StoragePos> list,String storageId,String posName)
{
for (StoragePos pos :
list) {
if(pos.getStorageId().equals(storageId)&&pos.getPosName().equals(posName)){
return pos;
}
}
return null;
}
/*protected String handleStoragePos(String fileURL, String params) throws ExcelParseException, IOException, ValidateException, IllegalAccessException, InvocationTargetException {
if (StringUtils.isEmpty(params)) {
log.error("Storage id is null");
......
......@@ -137,10 +137,14 @@ public class DifferentInventoryController extends BaseController {
private Map<String,DiffInfo> readQisda(String filePath){
Map<String,DiffInfo> itemMap = Maps.newHashMap();
try {
CsvReader csvRead = new CsvReader(filePath);
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
// CsvReader csvRead = new CsvReader(filePath);
// csvRead.setSkipEmptyRecords(true);//忽略空行
// csvRead.setTrimWhitespace(true);//去除空格
// csvRead.readHeaders();
CsvReader csvRead = CsvReader.newReader(filePath,"ReelId");
int reelIDIndex = csvRead.getIndex("ReelID");
int facilityIndex = csvRead.getIndex("Facility");
int locationIndex = csvRead.getIndex("Location");
......
......@@ -27,8 +27,10 @@ import com.myproject.model.User;
import com.myproject.service.UserManager;
import com.myproject.util.QisdaApi;
import com.myproject.util.StorageConstants;
import com.myproject.util.StringHelper;
import com.myproject.webapp.controller.qisda.util.OutInfoCache;
import com.myproject.webapp.controller.qisda.util.SoseqCache;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
......@@ -1232,8 +1234,9 @@ public class TaskService implements ITaskService {
if(!Strings.isNullOrEmpty(posName)){//客户端发一次完成之后,会发空的 posName,不需要处理
if (StorageConstants.BOX_STATUS.IN_FINISHED == status) {//入仓完成
DataLog task = findExecutingTask(statusBeanToSave.getCid(), boxStatus.getPosId(), StorageConstants.OP.PUT_IN);
int exTime=boxStatus.getExecuteTime();
if (task != null && task.isPutInTask()) {
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成");
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间["+exTime+"]");
QisdaCache.removeReelLockPosInfo(task.getBarcode());
DataLog cancelTask = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if(cancelTask != null && cancelTask.isCancel()){
......@@ -1241,13 +1244,22 @@ public class TaskService implements ITaskService {
finishedTaskMap.remove(cancelTask.getBarcode());
log.info("从已完成的任务列表中删除之前取消的任务:"+cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
if(exTime>0){
task.setExecuteTime(exTime);
updatePosExecuteTime(boxStatus.getPosId(),exTime);
}
putInFinished(task);
} else {
//从已完成列表中找,如果还找不到就忽略
task = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if (task != null) {
if(task.isCancel()){//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成");
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成,执行时间["+exTime+"]");
if(exTime>0){
task.setExecuteTime(exTime);
updatePosExecuteTime(boxStatus.getPosId(),exTime);
}
putInFinished(task);
}
}else {
......@@ -1259,14 +1271,18 @@ public class TaskService implements ITaskService {
//暂不处理
} else if (StorageConstants.BOX_STATUS.OUT_FINISHED == status) {//出仓完成
DataLog task = findExecutingTask(statusBeanToSave.getCid(), boxStatus.getPosId(), StorageConstants.OP.CHECKOUT);
int exTime=boxStatus.getExecuteTime();
if (task != null) {
log.info("任务["+task.getId()+"]"+task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,当前状态:" + task.getStatus());
log.info("任务["+task.getId()+"]"+task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,当前状态:" + task.getStatus()+",执行时间["+exTime+"]");
DataLog cancelTask = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if(cancelTask != null && cancelTask.isCancel()){
//将相同库位已经取消的任务从完成队列里删除
finishedTaskMap.remove(cancelTask.getBarcode());
log.info("从已完成的任务列表中删除之前取消的任务:"+cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
if(exTime>0){
task.setExecuteTime(exTime);
}
//dataCache.unLockOneReel(task.getCid(),task.getPartNumber());
checkoutFinished(task);
}else{
......@@ -1275,7 +1291,10 @@ public class TaskService implements ITaskService {
task = findFinishedTask(statusBeanToSave.getCid(), boxStatus.getPosId());
if (task != null) {
if(task.isCancel()){//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成");
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成,执行时间["+exTime+"]");
if(exTime>0){
task.setExecuteTime(exTime);
}
checkoutFinished(task);
}
}else {
......@@ -1298,6 +1317,30 @@ public class TaskService implements ITaskService {
return statusBean;
}
/**
* 入库完成时,更新库位的最小入库时间
* @param posId
* @param exTime
*/
private void updatePosExecuteTime(String posId, double exTime) {
if (posId == null || exTime <= 0) {
return;
}
StoragePos pos = storagePosManager.getByPosName(posId);
if (pos != null) {
if (pos.getPriority() <= 0 || pos.getPriority() > exTime) {
pos.setPriority(exTime);
log.info("更改库位[" + posId + "]的最小入库时间=[" + exTime + "]秒");
try {
storagePosManager.save(pos);
} catch (ValidateException e) {
log.error("更改库位[" + posId + "]的最小入库时间=[" + exTime + "]秒 出错: " + e.toString());
}
}
}
}
private DataLog findFinishedTask(String cid, String posName){
Collection<DataLog> areaFinishedTasks = getFinishedTasks();
for (DataLog task : areaFinishedTasks) {
......@@ -1745,6 +1788,8 @@ public class TaskService implements ITaskService {
log.warn("任务:"+task.getBarcode() +" 仓位:"+task.getPosName()+" 的 Barcode 为null, 之前可能处理过直接返回");
return;
}
//记录在库时长
task.setInStoreTime(barcode.getInStoreMiniute());
barcode = barcodeManager.get(barcode.getId());
if(barcode != null){
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!