package com.zy.asrs.service.impl; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.core.common.Cools; import com.core.exception.CoolException; import com.zy.asrs.entity.LocMast; import com.zy.asrs.entity.WaitPakin; import com.zy.asrs.entity.WrkMast; import com.zy.asrs.mapper.WaitPakinMapper; import com.zy.asrs.mapper.WrkMastMapper; import com.zy.asrs.service.LocMastService; import com.zy.asrs.service.WrkDetlService; import com.zy.common.model.StartupDto; import com.zy.core.cache.MessageQueue; import com.zy.core.cache.SlaveConnection; import com.zy.core.enums.SlaveType; import com.zy.core.model.DevpSlave; import com.zy.core.model.Task; import com.zy.core.model.protocol.StaProtocol; import com.zy.core.properties.SlaveProperties; import com.zy.core.thread.BarcodeThread; import com.zy.core.thread.DevpThread; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * Created by vincent on 2020/8/6 */ @Slf4j @Service("mainService") public class MainServiceImpl { @Autowired private CommonService commonService; @Autowired private SlaveProperties slaveProperties; @Autowired private WrkMastMapper wrkMastMapper; @Autowired private WrkDetlService wrkDetlService; @Autowired private WaitPakinMapper waitPakinMapper; @Autowired private LocMastService locMastService; @Autowired private JdbcTemplate jdbcTemplate; /** * 入库站,根据条码扫描生成入库工作档,工作状态 2 */ @Transactional public void generateStoreWrkFile() { // 根据输送线plc遍历 for (DevpSlave devp : slaveProperties.getDevp()) { // 遍历入库口 for (DevpSlave.InSta inSta : devp.getInSta()) { // 获取条码 BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode()); String barcode = barcodeThread.getBarcode(); // 获取入库站信息 DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId()); StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo()); // 判断是否满足入库条件 if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInreq1() && !staProtocol.isEmptyMk() && staProtocol.isInreq1() && staProtocol.getWorkNO() ==0 && staProtocol.isPakMk() && !Cools.isEmpty(barcode)) { // 判断重复工作档 WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode); if (wrkMast != null) { log.warn("工作档中已存在该站状态为1的数据,工作号-{}", wrkMast.getWrkNo()); continue; } // 获取入库通知档 List waitPakins = waitPakinMapper.selectList(new EntityWrapper().eq("barcode", barcode)); // 工作号 int workNo = commonService.getWorkNo(0); // 检索库位 List matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList()); StartupDto startupDto = commonService.getLocNo(1, 1, inSta.getStaNo(), matNos); String locNo = startupDto.getLocNo(); if (!waitPakins.isEmpty()) { // 插入工作明细档 wrkDetlService.createWorkDetail(workNo, waitPakins, barcode); } else { log.warn("无此入库条码数据---{}", barcode); continue; } // 插入工作主档 wrkMast = new WrkMast(); wrkMast.setWrkNo(workNo); wrkMast.setIoTime(new Date()); wrkMast.setWrkSts(2L); // 工作状态:2.设备上走 wrkMast.setIoType(1); // 入出库状态:1.入库 wrkMast.setIoPri(10D); // 优先级:10 wrkMast.setCrnNo(startupDto.getCrnNo()); wrkMast.setSourceStaNo(startupDto.getSourceStaNo()); wrkMast.setStaNo(startupDto.getStaNo()); wrkMast.setLocNo(startupDto.getLocNo()); wrkMast.setBarcode(barcode); // 托盘码 wrkMast.setFullPlt("Y"); // 满板:Y wrkMast.setPicking("N"); // 拣料 wrkMast.setExitMk("N"); // 退出 wrkMast.setEmptyMk("N"); // 空板 wrkMast.setLinkMis("N"); // wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型 // 操作人员数据 wrkMast.setAppeTime(new Date()); wrkMast.setModiTime(new Date()); Integer insert = wrkMastMapper.insert(wrkMast); if (insert == 0) { throw new CoolException("保存工作档失败"); } // 更新目标库位状态 LocMast locMast = locMastService.selectById(startupDto.getLocNo()); locMast.setLocSts("S"); // S.入库预约 locMast.setModiTime(new Date()); if (!locMastService.updateById(locMast)){ throw new CoolException("改变库位状态失败"); } // 更新站点信息 且 下发plc命令 barcodeThread.setBarcode(""); staProtocol.setWorkNO(workNo); staProtocol.setStaNo(startupDto.getStaNo()); staProtocol.setPakMk(false); staProtocol.setInreq1(false); boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task<>(4, staProtocol)); if (!result) { throw new CoolException("更新plc站点信息失败"); } } } } } }