Commit 24c875a9 zshaohui

1.增加xlr处理类

2.出入库统计新接口
3.每小时存储出入库数量
1 个父辈 e27b628a
...@@ -213,6 +213,7 @@ public class DataInitManager { ...@@ -213,6 +213,7 @@ public class DataInitManager {
Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null); Menu pMenuReport = Menu.CreatePMenu("报表", 7, "report", 2, "inOutData",null);
addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",functionMenuMap); addNewFunctionMenu(71, pMenuReport, "inOutData", "出入库", "inOutData", "neolight/inOutData/index", "outPut",functionMenuMap);
addNewFunctionMenu(72, pMenuReport,"inventory", "库存", "inventory", "neolight/inventory/index", "inventory",functionMenuMap); addNewFunctionMenu(72, pMenuReport,"inventory", "库存", "inventory", "neolight/inventory/index", "inventory",functionMenuMap);
addNewFunctionMenu(73, pMenuReport, "inOutDataCount", "出入库", "inOutDataCount", "neolight/inOutDataCount/index", "outPut",functionMenuMap);
//可观测性:物料追踪 //可观测性:物料追踪
Menu guanceMenu = Menu.CreatePMenu("可观测性", 8, "observability", 2, "scanKey",null); Menu guanceMenu = Menu.CreatePMenu("可观测性", 8, "observability", 2, "scanKey",null);
......
...@@ -137,4 +137,11 @@ public class BoxStatusBean { ...@@ -137,4 +137,11 @@ public class BoxStatusBean {
} }
return -1; return -1;
} }
/**
* 获取客户端发送上来的出入库完成的条码信息
*/
public String getBarcode(){
return data.get("barcode");
}
} }
...@@ -24,6 +24,8 @@ import com.neotel.smfcore.core.device.enums.OP; ...@@ -24,6 +24,8 @@ import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS; import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.device.handler.IDeviceHandler; import com.neotel.smfcore.core.device.handler.IDeviceHandler;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inout.service.manager.IInOutDataManager;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import com.neotel.smfcore.core.message.util.DeviceMessageUtil; import com.neotel.smfcore.core.message.util.DeviceMessageUtil;
import com.neotel.smfcore.core.msd.bean.MSDSettiings; import com.neotel.smfcore.core.msd.bean.MSDSettiings;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
...@@ -96,6 +98,9 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -96,6 +98,9 @@ public class BaseDeviceHandler implements IDeviceHandler {
@Autowired @Autowired
protected IComponentManager componentManager; protected IComponentManager componentManager;
@Autowired
private IInOutDataManager inOutDataManager;
/** /**
* CID的服务器消息(key 为 cid) * CID的服务器消息(key 为 cid)
*/ */
...@@ -928,6 +933,142 @@ public class BaseDeviceHandler implements IDeviceHandler { ...@@ -928,6 +933,142 @@ public class BaseDeviceHandler implements IDeviceHandler {
return false; return false;
} }
/**
* 入仓位完成处理
* @param cid
* @param posName
* @param executeTime 执行时间
* @throws ValidateException
*/
protected void finishedPutIn(String cid, String posName,String barcode,int executeTime) throws ValidateException {
DataLog task = taskService.findExecutingTask(cid, posName, barcode);
if (task != null && task.isPutInTask()) {
if (executeTime > 0) {
task.setExecuteTime(executeTime);
updatePosExecuteTime(task.getPosName(), executeTime);
updateInOutDateExecuteTime(task.getPosName(),executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,执行时间[" + executeTime + "]秒");
DataLog cancelTask = taskService.findFinishedPutInTask(cid, task.getPosName(), task.getBarcode());
if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除
taskService.removeFinishedTask(cancelTask);
log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
updatePutInData(task);
ReelLockPosUtil.removeReelLockPosInfo(task.getBarcode());
} else {
//从已完成列表中找,如果还找不到就忽略
task = taskService.findFinishedPutInTask(cid, posName, barcode);
if (task != null && task.isPutInTask()) {
if (task.isCancel()) {//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
if (executeTime > 0) {
task.setExecuteTime(executeTime);
updatePosExecuteTime(task.getPosName(), executeTime);
updateInOutDateExecuteTime(task.getPosName(),executeTime);
}
log.info(task.getBarcode() + "入仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成,执行时间[" + executeTime + "]秒");
updatePutInData(task);
}
} else {
log.error(cid + "入仓位[" + posName + "]ReelId[" + barcode + "]完成时任务不存在");
}
}
}
/**
* 出仓位完成处理
* @param cid
* @param posName
* @param executeTime 执行时间
* @throws ValidateException
*/
protected void finishedOutPos(String cid, String posName,String barcode,int executeTime,OP_STATUS outBoxStatus) throws ValidateException {
DataLog task = taskService.findExecutingTask(cid, posName,barcode);
if (task != null && task.isCheckOutTask()) {
//判断状态是否重复推送
log.info(task.getBarcode()+"状态为:"+task.getStatus()+",重新更改状态:"+outBoxStatus.name());
if (outBoxStatus.name().equals(task.getStatus())){
log.info("状态一致,不处理,返回");
return;
}
if (executeTime > 0) {
task.setExecuteTime(executeTime);
updateInOutDateExecuteTime(task.getPosName(),executeTime);
}
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,执行时间[" + executeTime + "]秒");
DataLog cancelTask = taskService.findFinishedOutTask(cid, task.getPosName(),task.getBarcode());
if (cancelTask != null && cancelTask.isCancel()) {
//将相同库位已经取消的任务从完成队列里删除
taskService.removeFinishedTask(cancelTask);
log.info("从已完成的任务列表中删除之前取消的任务:" + cancelTask.getPosName() + " ReelId:" + cancelTask.getBarcode());
}
updateCheckoutData(task,outBoxStatus);
} else {
//log.error(operationKey + "触发仓位完成时,操作队列中不存在");
//从已完成列表中找,如果还找不到就忽略
task = taskService.findFinishedOutTask(cid, posName,barcode);
if (task != null && task.isCheckOutTask()) {
//判断状态是否重复推送
log.info(task.getBarcode()+"状态为:"+task.getStatus()+",重新更改状态:"+outBoxStatus.name());
if (outBoxStatus.name().equals(task.getStatus())){
log.info("状态一致,不处理,返回");
return;
}
if (task.isCancel()) {//被取消的任务,客户端发完成信号过来,修改取消状态为已完成
if (executeTime > 0) {
task.setExecuteTime(executeTime);
updateInOutDateExecuteTime(task.getPosName(),executeTime);
}
log.info(task.getBarcode() + "出仓位[" + task.getPosName() + "]完成,但任务已被取消,修改为完成,执行时间[" + executeTime + "]秒");
updateCheckoutData(task,outBoxStatus);
}
} else if(ObjectUtil.isNotEmpty(posName)) {
StoragePos storagePos = storagePosManager.getByPosName(posName);
if (storagePos != null && storagePos.isUsed()) {
barcode = storagePos.getBarcode().getBarcode();
//查找库位是否为空,如果库位有料,调用清理手动出库的方法清理库存
if (ObjectUtil.isNotEmpty(barcode)) {
log.info(cid + "出仓位[" + posName + "]完成时任务不存在,清理库位中的库存[" + barcode + "]");
taskService.addTaskToFinished(storagePos, null, cid + "-clear");
} else {
log.info(cid + "出仓位[" + posName + "]完成时任务不存在,清理库位失败,条码为空");
}
} else {
log.warn(cid + "出仓位[" + posName + "]完成时任务不存在");
}
}else if(ObjectUtil.isNotEmpty(barcode)){
StoragePos storagePos = storagePosManager.getByBarcode(barcode);
if (storagePos != null && storagePos.isUsed()) {
posName = storagePos.getPosName();
//查找库位是否为空,如果库位有料,调用清理手动出库的方法清理库存
log.info(cid + "出仓位条码[" + barcode + "]完成时任务不存在,根据条码[" + barcode + "]找到库位[" + posName + "],清理库位中的库存 ");
taskService.addTaskToFinished(storagePos, null, cid + "-clear");
} else {
log.warn(cid + "出仓位条码[" + barcode + "]完成时任务不存在");
}
}else{
log.error(cid + "出仓位[" + posName + "]ReelId["+barcode+"]完成时任务不存在");
}
}
}
private void updateInOutDateExecuteTime(String posName, int executeTime) {
StoragePos storagePos = storagePosManager.getByPosName(posName);
if (storagePos != null){
Storage storage = dataCache.getStorageById(storagePos.getStorageId());
InOutData inOutData = dataCache.getLastSaveInOutData(storage.getCid(), storage.getId());
inOutData.setExecuteTime(inOutData.getExecuteTime() + executeTime);
inOutDataManager.save(inOutData);
}
}
@Override @Override
public DeviceType getDeviceType() { public DeviceType getDeviceType() {
return DeviceType.DEFAULT; return DeviceType.DEFAULT;
......
package com.neotel.smfcore.core.device.handler.impl;
import com.google.common.base.Strings;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.device.bean.BoxStatusBean;
import com.neotel.smfcore.core.device.bean.StatusBean;
import com.neotel.smfcore.core.device.enums.BOX_STATUS;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.storage.enums.DeviceType;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.system.service.po.DataLog;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* XLR料仓
*/
@Service
@Slf4j
public class XLRBoxHandler extends BaseDeviceHandler {
@Override
public StatusBean handleClientRequest(StatusBean statusBean, HttpServletRequest request) {
statusBean.setClientIp(request.getRemoteHost());
String cid = statusBean.getCid();
Storage storage = dataCache.getStorage(cid);
if (storage == null) {
log.error("料仓cid: [" + cid + "]不存在");
return null;
}
handleMsg(statusBean);
statusBean = saveAlarmAndHumidity(statusBean);
statusBean = handleDeviceStatus(statusBean);
StatusBean humidityResult = handleHumidity(statusBean);
if (humidityResult != null) {
return humidityResult;
}
if (statusBean.getOp() == OP.PUT_IN) {
log.debug("入库:" + statusBean.toString());
statusBean = putInLine(storage, statusBean);
} else {
//查看是否有要出库的操作
statusBean =taskService.checkOut(storage, statusBean);
}
return statusBean;
}
protected StatusBean handleDeviceStatus(StatusBean statusBean) {
Map<String, BoxStatusBean> statusOfBoxes = statusBean.getBoxStatus();
if (statusOfBoxes != null) {
for (BoxStatusBean boxStatus : statusOfBoxes.values()) {
try {
//出库入库完成处理
int status = boxStatus.getStatus();
String posName = boxStatus.getPosId();
String barcode=boxStatus.getBarcode();
int executeTime=boxStatus.getExecuteTime();
if (!Strings.isNullOrEmpty(posName)) {//客户端发一次完成之后,会发空的 posName,不需要处理
if (BOX_STATUS.IN_FINISHED == status) {//入仓完成
finishedPutIn(statusBean.getCid(),posName,barcode,executeTime);
} else if (BOX_STATUS.OUT_FINISHED == status) {//出仓完成
finishedOutPos(statusBean.getCid(),posName,barcode,executeTime,OP_STATUS.OUT_BOX);
} else if (BOX_STATUS.OUT_END == status) {//出库完成(放到仓门口
log.info(statusBean.getCid() +"将物料从库位["+posName+"]出库到门口/料串完成");
reelOnShelf(statusBean.getCid(),posName);
}
}
} catch (ValidateException e) {
log.error("更新状态时出错" + e.getMessage());
}
}
}
return statusBean;
}
protected void reelOnShelf(String cid, String posName){
DataLog task = taskService.findFinishedOutTask(cid,posName);
if(task != null){
task.setStatus(OP_STATUS.FINISHED.name());
taskService.updateFinishedTask(task);
}
}
@Override
public DeviceType getDeviceType() {
return DeviceType.SMD_XLR;
}
}
...@@ -509,11 +509,12 @@ public class DeviceController { ...@@ -509,11 +509,12 @@ public class DeviceController {
String hSerial = request.getParameter("hSerial"); String hSerial = request.getParameter("hSerial");
int outTaskCount = 0; int outTaskCount = 0;
if(!Strings.isNullOrEmpty(cid)){ if(!Strings.isNullOrEmpty(cid)){
Collection<DataLog> queueTasks = taskService.getQueueTasks(cid); Collection<DataLog> queueTasks = taskService.getAllTasksByCid(cid);
if(!Strings.isNullOrEmpty(hSerial)){ if(!Strings.isNullOrEmpty(hSerial)){
for (DataLog queueTask : queueTasks) { for (DataLog queueTask : queueTasks) {
if(queueTask.isCheckOutTask()){ if(queueTask.isCheckOutTask() && !queueTask.isFinished()){
if(queueTask.getSourceName().equals(hSerial)){ String sourceName = queueTask.getSourceName();
if(sourceName != null && queueTask.getSourceName().equals(hSerial)){
//单号相同任务数量+1 //单号相同任务数量+1
outTaskCount = outTaskCount + 1; outTaskCount = outTaskCount + 1;
} }
...@@ -521,7 +522,7 @@ public class DeviceController { ...@@ -521,7 +522,7 @@ public class DeviceController {
} }
}else{ }else{
for (DataLog queueTask : queueTasks) { for (DataLog queueTask : queueTasks) {
if (queueTask.isCheckOutTask()) { if (queueTask.isCheckOutTask() && !queueTask.isFinished()) {
outTaskCount = outTaskCount + 1; outTaskCount = outTaskCount + 1;
} }
} }
......
...@@ -625,7 +625,7 @@ public class DataCache { ...@@ -625,7 +625,7 @@ public class DataCache {
inOutDataManager.save(inOutData); inOutDataManager.save(inOutData);
} }
private InOutData getLastSaveInOutData(String cid, String storageId) { public InOutData getLastSaveInOutData(String cid, String storageId) {
InOutData inOutData = inOutDataManager.findOneByCidAndStorageId(cid,storageId); InOutData inOutData = inOutDataManager.findOneByCidAndStorageId(cid,storageId);
if (inOutData == null) { if (inOutData == null) {
inOutData = new InOutData(); inOutData = new InOutData();
......
package com.neotel.smfcore.core.inout.service.dao;
import com.neotel.smfcore.common.base.IBaseDao;
public interface IInOutDataDao extends IBaseDao {
}
package com.neotel.smfcore.core.inout.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.core.inout.service.dao.IInOutDataDao;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import org.springframework.stereotype.Service;
@Service
public class InOutDataDaoImpl extends AbstractBaseDao implements IInOutDataDao {
@Override
public Class getEntityClass() {
return InOutData.class;
}
}
package com.neotel.smfcore.core.inout.service.manager;
import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import org.springframework.data.mongodb.core.query.Query;
import java.util.Date;
import java.util.List;
public interface IInOutDataManager extends IBaseManager<InOutData> {
List<InOutData> findByDate(Date startDate, Date endDate,List<String> storageIdList);
InOutData findOne(Query query);
InOutData findOneByCidAndStorageId(String cid, String storageId);
}
package com.neotel.smfcore.core.inout.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.inout.service.dao.IInOutDataDao;
import com.neotel.smfcore.core.inout.service.manager.IInOutDataManager;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import com.neotel.smfcore.core.report.rest.dto.InoutDataDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
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.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service
public class InOutDataManagerImpl implements IInOutDataManager {
@Autowired
private IInOutDataDao inOutDataDao;
@Override
public InOutData get(String id) {
return null;
}
@Override
public InOutData save(InOutData object) throws ValidateException {
return inOutDataDao.save(object);
}
@Override
public void delete(InOutData object) throws ValidateException {
}
@Override
public PageData<InOutData> findByPage(Query query, Pageable pageable) {
return null;
}
@Override
public List<InOutData> findByQuery(Query query) {
return null;
}
@Override
public List<InOutData> findByDate(Date startDate,Date endDate,List<String> storageIdList) {
Query q = new Query();
Criteria c = Criteria.where("createDate").gte(startDate).lt(endDate);
if (storageIdList != null && !storageIdList.isEmpty()) {
c.and("storageId").in(storageIdList);
}
Sort s = Sort.by(Sort.Direction.ASC, "createDate");
return inOutDataDao.findByQuery(q.addCriteria(c).with(s));
}
@Override
public InOutData findOne(Query query) {
return inOutDataDao.findOne(query);
}
@Override
public InOutData findOneByCidAndStorageId(String cid, String storageId) {
Query query = new Query(Criteria.where("cid").is(cid).and("storageId").is(storageId)).with(Sort.by(Sort.Direction.DESC, "createDate"));
return inOutDataDao.findOne(query);
}
}
package com.neotel.smfcore.core.inout.service.po;
import com.neotel.smfcore.common.base.BasePo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document
@AllArgsConstructor
@NoArgsConstructor
public class InOutData extends BasePo {
/**
* 设备cid
*/
private String cid;
/**
* 设备id
*/
private String storageId;
/**
* 入库数量
*/
private int inCount = 0;
/**
* 出库数量
*/
private int outCount = 0;
/**
* 执行时间
*/
private int executeTime = 0;
}
package com.neotel.smfcore.core.report; package com.neotel.smfcore.core.report;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.neotel.smfcore.common.bean.BetweenData;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.core.device.util.DataCache;
import com.neotel.smfcore.core.inout.service.manager.IInOutDataManager;
import com.neotel.smfcore.core.inout.service.po.InOutData;
import com.neotel.smfcore.core.report.bean.ChartItem; import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.report.bean.dto.InOutDataDto;
import com.neotel.smfcore.core.report.rest.dto.InoutDataDto; import com.neotel.smfcore.core.report.rest.dto.InoutDataDto;
import com.neotel.smfcore.core.report.rest.dto.InventoryBoxDto; import com.neotel.smfcore.core.report.rest.dto.InventoryBoxDto;
import com.neotel.smfcore.core.report.rest.dto.InventoryGroupDto; import com.neotel.smfcore.core.report.rest.dto.InventoryGroupDto;
import com.neotel.smfcore.core.report.rest.mapstruct.ChartItemMapper; import com.neotel.smfcore.core.report.rest.mapstruct.ChartItemMapper;
import com.neotel.smfcore.core.report.rest.query.ReportExtQuery;
import com.neotel.smfcore.core.report.rest.query.ReportQuery; import com.neotel.smfcore.core.report.rest.query.ReportQuery;
import com.neotel.smfcore.core.storage.bean.UsageItem; import com.neotel.smfcore.core.storage.bean.UsageItem;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager; import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.service.manager.IGroupManager; import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.IUserManager; import com.neotel.smfcore.security.service.manager.IUserManager;
import com.neotel.smfcore.security.service.po.Group; import com.neotel.smfcore.security.service.po.Group;
...@@ -49,6 +58,9 @@ public class ReportController { ...@@ -49,6 +58,9 @@ public class ReportController {
@Autowired @Autowired
DataCache dataCache; DataCache dataCache;
@Autowired
private IInOutDataManager inOutDataManager;
@ApiOperation("获取出入库数据") @ApiOperation("获取出入库数据")
@GetMapping(value = "/inOutData") @GetMapping(value = "/inOutData")
@PreAuthorize("@el.check('inOutData')") @PreAuthorize("@el.check('inOutData')")
...@@ -123,4 +135,66 @@ public class ReportController { ...@@ -123,4 +135,66 @@ public class ReportController {
} }
return groupDtos; return groupDtos;
} }
@ApiOperation("出入库统计")
@RequestMapping("/api/report/getInOutData")
@AnonymousAccess
public InOutDataDto getInOutData(ReportExtQuery query) {
InOutDataDto dto = new InOutDataDto();
List<String> dateStrList = new ArrayList<>();
List<Integer> inDataList = new ArrayList<>();
List<Integer> outDataList = new ArrayList<>();
//开始时间与结束时间赋值
String currentDateStr = DateUtil.format(new Date(), "yyyy-MM-dd HH");
Date startDate = DateUtil.parse(currentDateStr, "yyyy-MM-dd HH");
Date endDate = DateUtil.parse(currentDateStr, "yyyy-MM-dd HH");
BetweenData<Date> updateDate = query.getUpdateDate();
if (updateDate != null && updateDate.size() > 0) {
Date from = updateDate.getFrom();
Date to = updateDate.getTo();
if (from != null) {
startDate = from;
}
if (to != null) {
endDate = to;
}
} else {
endDate = DateUtil.parse(currentDateStr, "yyyy-MM-dd");
endDate = DateUtil.offsetDay(endDate,1);
startDate = DateUtil.offsetDay(endDate, -7);
}
//判断相差小时数,是否超过48小时
long between = DateUtil.between(startDate, endDate, DateUnit.HOUR);
List<InOutData> inOutDataList = inOutDataManager.findByDate(startDate, endDate, query.getStorageIdList());
while (startDate.getTime() < endDate.getTime()) {
DateTime nextDayTime;
if (between > 48) {
dateStrList.add(DateUtil.format(startDate, "MM/dd"));
nextDayTime = DateUtil.offsetDay(startDate, 1);
} else {
dateStrList.add(DateUtil.format(startDate, "MM/dd HH"));
nextDayTime = DateUtil.offsetHour(startDate, 1);
}
int inCount = 0, outCount = 0;
for (InOutData inOutData : inOutDataList) {
if (inOutData.getCreateDate().getTime() >= startDate.getTime() && inOutData.getCreateDate().getTime() < nextDayTime.getTime()) {
inCount = inCount + inOutData.getInCount();
outCount = outCount + inOutData.getOutCount();
}
}
inDataList.add(inCount);
outDataList.add(outCount);
if (between > 48) {
startDate = DateUtil.offsetDay(startDate, 1);
} else {
startDate = DateUtil.offsetHour(startDate, 1);
}
}
dto.setDateStrList(dateStrList);
dto.setInDataList(inDataList);
dto.setOutDataList(outDataList);
return dto;
}
} }
package com.neotel.smfcore.core.report.bean.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class InOutDataDto {
@ApiModelProperty("日期集合")
private List<String> dateStrList;
@ApiModelProperty("入库数据集合")
private List<Integer> inDataList;
@ApiModelProperty("出库数据集合")
private List<Integer> outDataList;
}
package com.neotel.smfcore.core.report.rest.query;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class ReportExtQuery extends ReportQuery{
@DateTimeFormat(pattern = "yyyy-MM-dd HH")
private BetweenData<Date> updateDate;
}
package com.neotel.smfcore.core.report.rest.query; package com.neotel.smfcore.core.report.rest.query;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.BetweenData; import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date; import java.util.Date;
import java.util.List;
@Data @Data
public class ReportQuery implements Serializable { public class ReportQuery implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate; private BetweenData<Date> updateDate;
private String pn; private String pn;
@QueryCondition(type = QueryCondition.Type.IN, propName = "storageId")
private List<String> storageIdList;
} }
...@@ -220,13 +220,14 @@ public class TaskService { ...@@ -220,13 +220,14 @@ public class TaskService {
* 获取所有任务 * 获取所有任务
*/ */
public List<DataLog> getAllTasksByCid(String cid) { public List<DataLog> getAllTasksByCid(String cid) {
List<DataLog> resultTasks = new ArrayList<>();
List<DataLog> allTasks = getAllTasks(); List<DataLog> allTasks = getAllTasks();
for (DataLog task : allTasks) { for (DataLog task : allTasks) {
if(task.getCid().equals(cid)){ if(task.getCid().equals(cid)){
allTasks.add(task); resultTasks.add(task);
} }
} }
return allTasks; return resultTasks;
} }
/** /**
...@@ -990,4 +991,70 @@ public class TaskService { ...@@ -990,4 +991,70 @@ public class TaskService {
theFinishedTaskMap.put(task.getId(), task); theFinishedTaskMap.put(task.getId(), task);
tiggerTaskChangeListener(task); tiggerTaskChangeListener(task);
} }
public DataLog findFinishedOutTask(String cid, String posName){
return findFinishedTask(cid,posName,"",false);
}
/**
* 根据料仓编号和库位获取已完成/取消的任务
*
* @param cid
* @param posName
* @return
*/
private DataLog findFinishedTask(String cid, String posName,String barcode, boolean putInTask) {
Collection<DataLog> areaFinishedTasks = theFinishedTaskMap.values();
for (DataLog task : areaFinishedTasks) {
boolean isSameTask = false;
if (ObjectUtil.isNotEmpty(posName) && task.getPosName().equals(posName) && task.getCid().equals(cid)) {
isSameTask = true;
} else if (ObjectUtil.isNotEmpty(barcode) && task.getBarcode().equals(barcode) && task.getCid().equals(cid)) {
isSameTask = true;
}
if (isSameTask) {
if (putInTask) {
if (task.isPutInTask()) {
return task;
}
} else {
if (task.isCheckOutTask()) {
return task;
}
}
}
}
return null;
}
/**
* 根据cid 和 posName ,barcode 查找正在执行的任务,不存在时返回 null
*/
public DataLog findExecutingTask(String cid, String posName,String barcode) {
for (DataLog task : taskMap.values()) {
if(ObjectUtil.isNotEmpty(posName)){
if (task.getCid().equals(cid) && task.getPosName().equals(posName)) {
return task;
}
}
else if(ObjectUtil.isNotEmpty(barcode)){
if(task.getCid().equals(cid)&&task.getBarcode().equals(barcode)){
return task;
}
}
}
return null;
}
public DataLog findFinishedOutTask(String cid, String posName,String barcode){
return findFinishedTask(cid,posName,barcode,false);
}
public DataLog findFinishedPutInTask(String cid, String posName,String barcode){
return findFinishedTask(cid,posName,barcode,true);
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!