package com.zy.asrs.service.impl;
|
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.Cools;
|
import com.zy.asrs.entity.BasCrnp;
|
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.BasCrnpService;
|
import com.zy.asrs.service.DigitalTwinService;
|
import com.zy.asrs.service.LocMastService;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.text.ParseException;
|
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) {
|
|
Date startTime = new Date();
|
Date endTime = new Date();
|
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);
|
startTime = calendar.getTime();
|
endTime = now;
|
|
} else {
|
SimpleDateFormat sdf =
|
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
|
try {
|
startTime = sdf.parse(startDate);
|
endTime = sdf.parse(endDate);
|
} catch (ParseException e) {
|
e.printStackTrace();
|
}
|
}
|
List<DtOrderVo> dbOrder = digitalTwinMapper.recentOrder(startTime, endTime);
|
// 空日期补全
|
for (DtOrderVo dtOrderVo : dbOrder) {
|
dtOrderVo.setOrderDate(dtOrderVo.getOrderDate());
|
}
|
|
return dbOrder;
|
}
|
|
/**
|
* 近期出库、入库数量,默认7天
|
*
|
* @param areaId
|
* @param startDate
|
* @param endDate
|
* @return
|
*/
|
public List<DtInAndOutBoundVo> inAndOutBound(String areaId, String startDate, String endDate) {
|
|
Date startTime = new Date();
|
Date endTime = new Date();
|
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);
|
startTime = calendar.getTime();
|
endTime = now;
|
|
} else {
|
SimpleDateFormat sdf =
|
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
|
|
try {
|
startTime = sdf.parse(startDate);
|
endTime = sdf.parse(endDate);
|
} catch (ParseException e) {
|
e.printStackTrace();
|
}
|
}
|
|
List<DtInAndOutBoundVo> dtInBoundVos = digitalTwinMapper.recentInBound(areaId, startTime, endTime);
|
List<DtInAndOutBoundVo> dtOutBoundVos = digitalTwinMapper.recentOutBound(areaId, startTime, endTime);
|
|
// 格式整理
|
List<DtInAndOutBoundVo> dtInAndOutBoundVos = new ArrayList<>(dtInBoundVos);
|
dtInAndOutBoundVos.addAll(dtOutBoundVos);
|
|
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");
|
// Date startTime = sdf.parse(start);
|
|
return digitalTwinMapper.recentDetainMat(areaId, start, pageIndex, pageSize);
|
}
|
|
@Resource
|
private LocMastService locMastService;
|
|
/**
|
* 查询库存和库位详细信息
|
*
|
* @param areaId
|
* @return
|
*/
|
public List<DtLocDetailVo> warehouseDetail(String areaId) {
|
List<LocMast> locMastList = locMastService.selectList(new EntityWrapper<>());
|
return locMastList.stream()
|
.map(loc -> {
|
DtLocDetailVo vo = new DtLocDetailVo();
|
BeanUtils.copyProperties(loc, vo);
|
return vo;
|
})
|
.collect(Collectors.toList());
|
// 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() {
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
|
String date = sdf.format(new Date());
|
|
List<LocCount> totalLoc = locCountMapper.totalLoc();
|
List<LocCount> useLoc = locCountMapper.useLoc();
|
|
LocCount locCount1 = new LocCount();
|
locCount1.setDate(Integer.valueOf(date));
|
locCount1.setLocNum(totalLoc.get(0).getLocNum());
|
locCount1.setRemainNum(locCount1.getLocNum() - useLoc.get(0).getLocNum());
|
|
locCountMapper.insertOrUpdate(locCount1);
|
}
|
|
@Resource
|
private BasCrnpService basCrnpService;
|
|
@Override
|
public DtEquipmentVo equipment(String areaId) {
|
BasCrnp crnp = basCrnpService.selectOne(new EntityWrapper<>());
|
return DtEquipmentVo.builder()
|
.equipmentId("1").equipmentName("堆垛机1").equipmentType(1)
|
.belongAreaId("C").belongAreaName("联结器库").verticalSpeed(Integer.valueOf(Cools.isEmpty(crnp.getCtlHp()) ? "0" : crnp.getCtlHp()))
|
.horizontalSpeed(Integer.valueOf( Cools.isEmpty(crnp.getCtlRest()) ? "0" : crnp.getCtlRest())).voltage(220).status(crnp.getCrnErr() == 0 ? 1 : 3).operateMethod(crnp.getCrnSts() == 3 ? 1 : 3).build();
|
}
|
|
|
// region 数字孪生
|
|
// 数字孪生整合
|
|
// 机器状态整合
|
|
// endregion
|
|
|
|
// region 立库调度
|
|
// 堆垛机存取
|
|
// 输送线拍照、称重
|
|
// endregion
|
|
}
|