package com.zy.asrs.service.impl;
|
|
import com.zy.asrs.entity.LocCount;
|
import com.zy.asrs.entity.LocDetl;
|
import com.zy.asrs.entity.LocMast;
|
import com.zy.asrs.entity.digitaltwin.*;
|
import com.zy.asrs.mapper.DigitalTwinMapper;
|
import com.zy.asrs.mapper.LocCountMapper;
|
import com.zy.asrs.service.DigitalTwinService;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class DigitalTwinServiceImpl implements DigitalTwinService {
|
|
@Resource
|
private DigitalTwinMapper digitalTwinMapper;
|
@Resource
|
private LocCountMapper locCountMapper;
|
|
/**
|
* 总览:总库位、已用库位、剩余库位、今日出库、今日入库、剩余库位
|
*
|
* @param areaId
|
* @return
|
*/
|
public DtOverviewVo overview(String areaId) {
|
|
List<Double> dbOverview = digitalTwinMapper.overview(areaId);
|
if (dbOverview != null && !dbOverview.isEmpty()){
|
DtOverviewVo dtOverviewVo = DtOverviewVo.builder()
|
.totalLoc((int)Math.round(dbOverview.get(0)))
|
.useLoc((int)Math.round(dbOverview.get(1)))
|
.remainingStock((int)Math.round(dbOverview.get(2)))
|
.todayWarehousing((int)Math.round(dbOverview.get(3)))
|
.todayOutbound((int)Math.round(dbOverview.get(4)))
|
.build();
|
dtOverviewVo.setIdleLoc(dtOverviewVo.getTotalLoc() - dtOverviewVo.getUseLoc());
|
return dtOverviewVo;
|
}
|
return DtOverviewVo.builder().build();
|
}
|
|
/**
|
* 近期订单,默认7天
|
*
|
* @param startDate
|
* @param endDate
|
* @return
|
*/
|
public List<DtOrderVo> order(String startDate, String endDate) {
|
|
String startTime;
|
String endTime;
|
if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
|
Date now = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(now);
|
calendar.add(Calendar.DAY_OF_MONTH, -7);
|
Date start = calendar.getTime();
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
endDate = sdf.format(now);
|
startDate = sdf.format(start);
|
}
|
startTime = startDate.substring(0, 4) + "-" + startDate.substring(4, 6) + "-" + startDate.substring(6, 8) + "00:00:00";
|
endTime = endDate.substring(0, 4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8) + "00:00:00";
|
List<DtOrderVo> dbOrder = digitalTwinMapper.recentOrder(startTime, endTime);
|
// 空日期补全
|
|
|
return dbOrder;
|
}
|
|
/**
|
* 近期出库、入库数量,默认7天
|
*
|
* @param areaId
|
* @param startDate
|
* @param endDate
|
* @return
|
*/
|
public List<DtInAndOutBoundVo> inAndOutBound(String areaId, String startDate, String endDate) {
|
|
List<DtInAndOutBoundVo> dtInAndOutBoundVos = new ArrayList<>();
|
|
String startTime;
|
String endTime;
|
if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
|
Date now = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(now);
|
calendar.add(Calendar.DAY_OF_MONTH, -7);
|
Date start = calendar.getTime();
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
endDate = sdf.format(now);
|
startDate = sdf.format(start);
|
}
|
startTime = startDate.substring(0, 4) + "-" + startDate.substring(4, 6) + "-" + startDate.substring(6, 8) + "00:00:00";
|
endTime = endDate.substring(0, 4) + "-" + endDate.substring(4, 6) + "-" + endDate.substring(6, 8) + "00:00:00";
|
List<DtInAndOutBoundVo> dtInBoundVos = digitalTwinMapper.recentInBound(areaId, startTime, endTime);
|
List<DtInAndOutBoundVo> dtOutBoundVos = digitalTwinMapper.recentOutBound(areaId, startTime, endTime);
|
|
// 格式整理
|
|
return dtInAndOutBoundVos;
|
}
|
|
/**
|
* 近期近期呆滞品信息,默认超过30天为呆滞品
|
*
|
* @param areaId
|
* @param overDayNum
|
* @param pageIndex
|
* @param pageSize
|
* @return
|
*/
|
public List<DtDetainMatVo> recentDetainMat(String areaId, Integer overDayNum, Integer pageIndex, Integer pageSize) {
|
|
overDayNum = overDayNum == null ? 30 : overDayNum;
|
pageIndex = pageIndex == null ? 1 : pageIndex;
|
pageSize = pageSize == null ? 1000000 : pageSize;
|
|
Date now = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(now);
|
calendar.add(Calendar.DAY_OF_MONTH, -overDayNum);
|
Date start = calendar.getTime();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
String startTime = sdf.format(start);
|
|
List<DtDetainMatVo> dbDetainMats = digitalTwinMapper.recentDetainMat(areaId, startTime, pageIndex, pageSize);
|
|
return dbDetainMats;
|
}
|
|
/**
|
* 查询库存和库位详细信息
|
*
|
* @param areaId
|
* @return
|
*/
|
public List<DtLocDetailVo> warehouseDetail(String areaId) {
|
List<DtLocDetailVo> locDetailVos = new ArrayList<>();
|
|
List<LocMast> locMasts = new ArrayList<>();
|
List<LocDetl> locDetls = new ArrayList<>();
|
|
for (LocMast locMast : locMasts) {
|
DtLocDetailVo dtLocDetailVo = new DtLocDetailVo();
|
dtLocDetailVo.setLocMast(locMast);
|
dtLocDetailVo.setLocNo(locMast.getLocNo());
|
dtLocDetailVo.setLocSts(locMast.getLocSts());
|
dtLocDetailVo.setRow1(locMast.getRow1());
|
dtLocDetailVo.setBay1(locMast.getBay1());
|
dtLocDetailVo.setLev1(locMast.getLev1());
|
for (LocDetl locDetl : locDetls) {
|
List<LocDetl> locDetl1 = locDetls.parallelStream().filter(a -> a.getLocNo().equals(locDetl.getLocNo())).collect(Collectors.toList());
|
if (locDetl1 != null && locDetl1.size() == 1) {
|
dtLocDetailVo.setLocDetl(locDetl1.get(0));
|
dtLocDetailVo.setAreaId(locDetl.getAreaId());
|
dtLocDetailVo.setAreaName(locDetl.getAreaName());
|
}
|
}
|
locDetailVos.add(dtLocDetailVo);
|
}
|
|
return locDetailVos;
|
}
|
|
/**
|
* 近期剩余库位数量,默认7天
|
*
|
* @param areaId
|
* @param startDate
|
* @param endDate
|
* @return
|
*/
|
public List<DtLocVo> recentLoc(String areaId, String startDate, String endDate) {
|
|
List<DtLocVo> locVos = new ArrayList<>();
|
|
if (startDate == null || endDate == null || startDate.isEmpty() || endDate.isEmpty()){
|
Date now = new Date();
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(now);
|
calendar.add(Calendar.DAY_OF_MONTH, -7);
|
Date start = calendar.getTime();
|
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
endDate = sdf.format(now);
|
startDate = sdf.format(start);
|
}
|
|
List<LocCount> locCounts;
|
if(areaId.isEmpty()){
|
locCounts = locCountMapper.getByDate(Integer.parseInt(startDate), Integer.parseInt(endDate));
|
} else {
|
locCounts = locCountMapper.getByAreaAndDate(areaId, Integer.parseInt(startDate), Integer.parseInt(endDate));
|
}
|
|
for (LocCount locCount : locCounts) {
|
String date = locCount.getDate().toString();
|
String locDate = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
|
DtLocVo dtLocVo = DtLocVo.builder()
|
.locDate(locDate)
|
.idleNum(locCount.getRemainNum())
|
.build();
|
locVos.add(dtLocVo);
|
}
|
|
return locVos;
|
}
|
|
/**
|
* 定期统计剩余库存
|
*
|
*/
|
public void locNumCount() {
|
|
List<LocCount> result = new ArrayList<>();
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
String date = sdf.format(new Date());
|
|
List<LocCount> totalLoc = locCountMapper.totalLoc();
|
List<LocCount> useLoc = locCountMapper.useLoc();
|
for (LocCount locCount : totalLoc) {
|
LocCount locCount1 = new LocCount();
|
locCount1.setDate(Integer.valueOf(date));
|
locCount1.setAreaId(locCount.getAreaId());
|
locCount1.setLocNum(locCount1.getLocNum());
|
for (LocCount locCount2 : useLoc) {
|
if(locCount1.getAreaId().equals(locCount2.getAreaId())){
|
locCount1.setRemainNum(locCount1.getLocNum() - locCount2.getLocNum());
|
}
|
}
|
result.add(locCount1);
|
}
|
|
for (LocCount locCount : result) {
|
locCountMapper.insertOrUpdate(locCount);
|
}
|
}
|
|
|
// region 数字孪生
|
|
// 数字孪生整合
|
|
// 机器状态整合
|
|
// endregion
|
|
|
|
// region 立库调度
|
|
// 堆垛机存取
|
|
// 输送线拍照、称重
|
|
// endregion
|
|
}
|