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 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 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 dbOrder = digitalTwinMapper.recentOrder(startTime, endTime); // 空日期补全 return dbOrder; } /** * 近期出库、入库数量,默认7天 * * @param areaId * @param startDate * @param endDate * @return */ public List inAndOutBound(String areaId, String startDate, String endDate) { List 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 dtInBoundVos = digitalTwinMapper.recentInBound(areaId, startTime, endTime); List dtOutBoundVos = digitalTwinMapper.recentOutBound(areaId, startTime, endTime); // 格式整理 return dtInAndOutBoundVos; } /** * 近期近期呆滞品信息,默认超过30天为呆滞品 * * @param areaId * @param overDayNum * @param pageIndex * @param pageSize * @return */ public List 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 dbDetainMats = digitalTwinMapper.recentDetainMat(areaId, startTime, pageIndex, pageSize); return dbDetainMats; } /** * 查询库存和库位详细信息 * * @param areaId * @return */ public List warehouseDetail(String areaId) { List locDetailVos = new ArrayList<>(); List locMasts = new ArrayList<>(); List 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 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 recentLoc(String areaId, String startDate, String endDate) { List 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 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 result = new ArrayList<>(); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String date = sdf.format(new Date()); List totalLoc = locCountMapper.totalLoc(); List 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 }