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 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) { 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 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 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 dtInBoundVos = digitalTwinMapper.recentInBound(areaId, startTime, endTime); List dtOutBoundVos = digitalTwinMapper.recentOutBound(areaId, startTime, endTime); // 格式整理 List dtInAndOutBoundVos = new ArrayList<>(dtInBoundVos); dtInAndOutBoundVos.addAll(dtOutBoundVos); 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"); // Date startTime = sdf.parse(start); return digitalTwinMapper.recentDetainMat(areaId, start, pageIndex, pageSize); } @Resource private LocMastService locMastService; /** * 查询库存和库位详细信息 * * @param areaId * @return */ public List warehouseDetail(String areaId) { List locMastList = locMastService.selectList(new EntityWrapper<>()); return locMastList.stream() .map(loc -> { DtLocDetailVo vo = new DtLocDetailVo(); BeanUtils.copyProperties(loc, vo); return vo; }) .collect(Collectors.toList()); // 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() { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String date = sdf.format(new Date()); List totalLoc = locCountMapper.totalLoc(); List 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 }