Commit 8ee550e4 LN

增加出入库报表功能

1 个父辈 4bf3e266
package com.neotel.smfcore.core.report;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.report.rest.dto.ChartItemDto;
import com.neotel.smfcore.core.report.rest.dto.InoutDataDto;
import com.neotel.smfcore.core.report.rest.mapstruct.ChartItemMapper;
import com.neotel.smfcore.core.report.rest.query.ReportQuery;
import com.neotel.smfcore.core.storage.service.manager.IStorageManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@Slf4j
@RestController
@RequiredArgsConstructor
@Api(tags = "报表:出入库、库存")
@RequestMapping("api/report")
public class ReportController {
@Autowired
private IStorageManager storageManager;
@Autowired
private ChartItemMapper chartItemMapper;
@ApiOperation("获取出入库数据")
@GetMapping(value = "/inOutData")
@PreAuthorize("@el.check('inOutData')")
public InoutDataDto showChart(ReportQuery query) {
Date startDay = query.getUpdateDate().getFrom();
Date endDay = query.getUpdateDate().getTo();
if (startDay == null) {
Calendar c = Calendar.getInstance();
//过去七天
c.setTime(new Date());
c.add(Calendar.DATE, -7);
startDay = c.getTime();
}
if (endDay == null) {
endDay = new Date();
}
String pn = query.getPn();
List<ChartItem> chartItemList = storageManager.getRunStatusData(startDay, endDay, pn);
InoutDataDto dto = new InoutDataDto();
for (ChartItem item :
chartItemList) {
dto.getLabelList().add(item.getLabel());
dto.getPutInValueList().add(item.getPutInValue());
dto.getCheckOutValueList().add(item.getCheckOutValue());
}
return dto;
}
}
package com.neotel.smfcore.core.report.bean;
import lombok.Data;
import java.io.Serializable;
@Data
public class ChartItem implements Serializable {
/**
* label为时间标签 value 为入库量,value2为出库量,value3为报警次数,value4为报警持续时间
*/
private String label;
private int putInValue;
private int checkOutValue;
private int value;
// private int value3;
//
// private int value4;
//
// private int value5;
}
package com.neotel.smfcore.core.report.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
public class ChartItemDto implements Serializable {
/**
* label为时间标签 value 为入库量,value2为出库量,value3为报警次数,value4为报警持续时间
*/
@ApiModelProperty("日期")
private String label;
@ApiModelProperty("入库量")
private int putInValue;
@ApiModelProperty("出库量")
private int checkOutValue;
// @ApiModelProperty("报警次数")
// private int value3;
//
// @ApiModelProperty("报警持续时间")
// private int value4;
//
// private int value5;
}
\ No newline at end of file \ No newline at end of file
package com.neotel.smfcore.core.report.rest.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
@Data
public class InoutDataDto implements Serializable {
public InoutDataDto() {
labelList = new ArrayList<>();
putInValueList = new ArrayList<>();
checkOutValueList = new ArrayList<>();
}
@ApiModelProperty("日期")
private List<String> labelList;
@ApiModelProperty("入库量")
private List<Integer> putInValueList;
@ApiModelProperty("出库量")
private List<Integer> checkOutValueList;
}
package com.neotel.smfcore.core.report.rest.mapstruct;
import com.neotel.smfcore.common.base.BaseMapper;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.report.rest.dto.ChartItemDto;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring" ,unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ChartItemMapper extends BaseMapper<ChartItemDto, ChartItem> {
}
package com.neotel.smfcore.core.report.rest.query;
import cn.hutool.core.date.DateTime;
import com.neotel.smfcore.common.bean.BetweenData;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
public class ReportQuery implements Serializable {
@DateTimeFormat(pattern = "yyyy-MM-dd")
private BetweenData<Date> updateDate;
private String pn;
}
package com.neotel.smfcore.core.storage.service.manager; package com.neotel.smfcore.core.storage.service.manager;
import com.neotel.smfcore.common.base.IBaseManager; import com.neotel.smfcore.common.base.IBaseManager;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set;
public interface IStorageManager extends IBaseManager<Storage> { public interface IStorageManager extends IBaseManager<Storage> {
List<Storage> findAll(); List<Storage> findAll();
...@@ -12,4 +13,6 @@ public interface IStorageManager extends IBaseManager<Storage> { ...@@ -12,4 +13,6 @@ public interface IStorageManager extends IBaseManager<Storage> {
void updateStorageGroup(String storageId, String groupId); void updateStorageGroup(String storageId, String groupId);
void clearStorageGroup(String groupId); void clearStorageGroup(String groupId);
List<ChartItem> getRunStatusData(Date fromDate, Date toDate, String partNumber);
} }
...@@ -2,13 +2,13 @@ package com.neotel.smfcore.core.storage.service.manager.impl; ...@@ -2,13 +2,13 @@ package com.neotel.smfcore.core.storage.service.manager.impl;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.core.device.util.DataCache; import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.order.service.dao.ILiteOrderDao;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.storage.service.dao.IStorageDao; import com.neotel.smfcore.core.storage.service.dao.IStorageDao;
import com.neotel.smfcore.core.storage.service.dao.IStoragePosDao;
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.manager.IStoragePosManager;
import com.neotel.smfcore.core.storage.service.po.Storage; import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos; import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
...@@ -17,16 +17,19 @@ import org.springframework.data.mongodb.core.query.Query; ...@@ -17,16 +17,19 @@ import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
@Service @Service
public class StorageManagerImpl implements IStorageManager { public class StorageManagerImpl implements IStorageManager {
@Autowired @Autowired
private IStorageDao storageDao; private IStorageDao storageDao;
@Autowired
private IDataLogDao dataLogDao;
@Autowired
private ILiteOrderDao liteOrderDao;
@Override @Override
...@@ -73,4 +76,73 @@ public class StorageManagerImpl implements IStorageManager { ...@@ -73,4 +76,73 @@ public class StorageManagerImpl implements IStorageManager {
} }
/**
* 获取某个时间段的统计信息ChartItem 的 value 为入库量,value2为出库量,value3为报警次数,value4为报警持续时间
*/
@Override
public List<ChartItem> getRunStatusData(Date fromDate, Date toDate, String partNumber){
if(fromDate == null || toDate == null){
return new ArrayList<>();
}
LinkedHashMap<String,ChartItem> inOutDataMap = new LinkedHashMap<>();
Date startDay = DateUtil.getMinDate(fromDate, toDate);
Date endDay = DateUtil.getMaxDate(fromDate,toDate);
/**
* 结束时间+1天,包含结束那一天
*/
long endTime = endDay.getTime();
Calendar c = Calendar.getInstance();
c.setTime(startDay);
do{
int dayOfYear = c.get(Calendar.DAY_OF_YEAR);
String dayStr = DateUtil.toDateString(c.getTime());
ChartItem item = new ChartItem();
item.setLabel(dayStr);
inOutDataMap.put(String.valueOf(dayOfYear), item);
c.add(Calendar.DAY_OF_YEAR,1);
}while (c.getTimeInMillis() <= endTime);
List<ChartItem> putInData = dataLogDao.putInChart(startDay, endDay,partNumber);
for (ChartItem putInItem : putInData){
String dayOfYear = putInItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
if(item != null){
item.setPutInValue(putInItem.getValue());
}
}
List<ChartItem> checkOutData = dataLogDao.checkOutChart(startDay, endDay,partNumber);
for (ChartItem checkOutItem : checkOutData){
String dayOfYear = checkOutItem.getLabel();
ChartItem item = inOutDataMap.get(dayOfYear);
if(item != null){
item.setCheckOutValue(checkOutItem.getValue());
}
}
// List<ChartItem> alarmData = alarmInfoDao.alarmChart(startDay, endDay);
// for (ChartItem alarmItem : alarmData){
// String dayOfYear = alarmItem.getLabel();
// ChartItem item = inOutDataMap.get(dayOfYear);
// if(item != null){
// item.setValue3(alarmItem.getValue());
// item.setValue4(alarmItem.getValue2());
// }
// }
// List<ChartItem> orderData = liteOrderDao.orderChart(startDay, endDay);
// for (ChartItem orderItem : orderData){
// String dayOfYear = orderItem.getLabel();
// ChartItem item = inOutDataMap.get(dayOfYear);
// if(item != null){
// item.setValue5(orderItem.getValue());
// }
// }
//alarmInfoDao.alarmChartByType(startDay,endDay);
//alarmInfoDao.alarmChartByBox(startDay,endDay);
return new ArrayList<>(inOutDataMap.values());
}
} }
package com.neotel.smfcore.core.system.service.dao; package com.neotel.smfcore.core.system.service.dao;
import com.neotel.smfcore.common.base.IBaseDao; import com.neotel.smfcore.common.base.IBaseDao;
import com.neotel.smfcore.core.report.bean.ChartItem;
import java.util.Date;
import java.util.List;
public interface IDataLogDao extends IBaseDao { public interface IDataLogDao extends IBaseDao {
List<ChartItem> putInChart(Date startDay, Date endDay, String partNumber);
List<ChartItem> checkOutChart(Date startDay, Date endDay, String partNumber);
} }
package com.neotel.smfcore.core.system.service.dao.impl; package com.neotel.smfcore.core.system.service.dao.impl;
import com.neotel.smfcore.common.base.AbstractBaseDao; import com.neotel.smfcore.common.base.AbstractBaseDao;
import com.neotel.smfcore.common.utils.DateUtil;
import com.neotel.smfcore.core.device.enums.OP;
import com.neotel.smfcore.core.device.enums.OP_STATUS;
import com.neotel.smfcore.core.report.bean.ChartItem;
import com.neotel.smfcore.core.system.service.dao.IDataLogDao; import com.neotel.smfcore.core.system.service.dao.IDataLogDao;
import com.neotel.smfcore.core.system.service.po.DataLog; import com.neotel.smfcore.core.system.service.po.DataLog;
import org.apache.logging.log4j.util.Strings;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
@Service @Service
public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao { public class DataLogDaoImpl extends AbstractBaseDao implements IDataLogDao {
@Override @Override
public Class getEntityClass() { public Class getEntityClass() {
return DataLog.class; return DataLog.class;
} }
@Override
public List<ChartItem> putInChart(Date fromTime, Date toTime,String partNumber){
return chart(fromTime, toTime, OP.PUT_IN,partNumber);
}
@Override
public List<ChartItem> checkOutChart(Date fromTime, Date toTime,String partNumber){
return chart(fromTime, toTime, OP.CHECKOUT,partNumber);
}
private List<ChartItem> chart(Date fromTime, Date toTime, int type, String partNumber){
Date addOneDayToTime = DateUtil.addOneDayNoTime(toTime);
Criteria c = new Criteria().andOperator(Criteria.where("updateDate").gte(fromTime),
Criteria.where("updateDate").lt(addOneDayToTime)).and("type").is(type);
c.and("status").in(OP_STATUS.END.name(),OP_STATUS.FINISHED.name());
if(Strings.isNotBlank(partNumber)){
c.and("partNumber").is(partNumber);
}
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(c),
Aggregation.project().and("updateDate").extractDayOfYear().as("label"),
Aggregation.group("label").count().as("value"),
Aggregation.project("value").and("label").previousOperation()
);
AggregationResults<ChartItem> results = getMongoTemplate().aggregate(agg, getEntityClass(), ChartItem.class);
return results.getMappedResults();
}
} }
...@@ -81,7 +81,7 @@ smfcore.role=Authority ...@@ -81,7 +81,7 @@ smfcore.role=Authority
smfcore.menuNotExist=Menu{0} does not exist smfcore.menuNotExist=Menu{0} does not exist
smfcore.noValidStorage=No available bin found in bin list smfcore.noValidStorage=No available bin found in bin list
smfcore.error.barcode.exist=[{0}}] is already in {1}}[{2}}] smfcore.error.barcode.exist=[{0}}] is already in {1}}[{2}}]
smfcore.barcodeSetting=Material ID smfcore.barcodeSetting=MA.ID Setting
smfcore.posNotExist=Positions do not exist smfcore.posNotExist=Positions do not exist
smfcore.error=Error{0} smfcore.error=Error{0}
smfcore.userManager=Users smfcore.userManager=Users
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!