package com.mes.downglassinfo.service.impl; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.common.config.Const; import com.mes.common.utils.RedisUtil; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.entity.request.DownGlassInfoRequest; import com.mes.downglassinfo.mapper.DownGlassInfoMapper; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downstorage.entity.DownStorageCageDetails; import com.mes.downstorage.service.DownStorageCageDetailsService; import com.mes.downworkstation.entity.DownWorkstation; import com.mes.downworkstation.entity.dto.DownGlassInfoDTO; import com.mes.downworkstation.service.DownWorkstationService; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import com.mes.job.DownLoadCacheGlassTask; import com.mes.pp.service.FlowCardService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @Slf4j @Service public class DownGlassInfoServiceImpl extends ServiceImpl implements DownGlassInfoService { @Autowired DownLoadCacheGlassTask downLoadCacheGlassTask; @Autowired DownStorageCageDetailsService downStorageCageDetailsService; @Autowired DownWorkstationService downWorkstationService; @Autowired RedisUtil redisUtil; @Autowired FlowCardService flowCardService; @Autowired GlassInfoService glassInfoService; /** * 根据流程卡号查询最大序号 */ @Override public Integer getMaxSequenceByFlowCardId(String flowCardId, int layer) { LambdaQueryWrapper lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(DownGlassInfo::getFlowCardId, flowCardId) .eq(DownGlassInfo::getLayer, layer) .select(DownGlassInfo::getSequence) .orderByDesc(DownGlassInfo::getSequence) .last("LIMIT 1"); DownGlassInfo downGlassInfo = baseMapper.selectOne(lambdaQueryWrapper); return downGlassInfo != null ? downGlassInfo.getSequence() : 0; } @Override public void insertDownGlassInfo(DownGlassInfo downGlassInfo) { baseMapper.insert(downGlassInfo); } @Override public DownGlassInfoDTO queryDownGlassMaxLayer(String flowCardId) { return baseMapper.queryDownGlassMaxLayer(flowCardId); } @Override public Integer queryMaxSequence(String flowCardId, int layer) { return baseMapper.queryMaxSequence(flowCardId, layer); } @Override public List queryWorkStationIsIn(List workList, Boolean isDownload) { //按照要求获取已落架/未落架的玻璃信息 return baseMapper.queryWorkStationIsIn(workList, isDownload); } @Override public List queryWorkStationFlowCard(List workList) { //获取已绑定流程卡的架子未落玻璃的数据信息 return baseMapper.queryWorkStationFlowCard(workList); } @Override public boolean generateOutGlassTask(String glassId) { //更新卧式理片笼内玻璃状态 downStorageCageDetailsService.update(new LambdaUpdateWrapper() .set(DownStorageCageDetails::getState, Const.GLASS_STATE_OUT).eq(DownStorageCageDetails::getGlassId, glassId)); DownStorageCageDetails details = downStorageCageDetailsService.getOne(new LambdaQueryWrapper() .eq(DownStorageCageDetails::getGlassId, glassId)); //生成下片信息 DownGlassInfo downGlassInfo = new DownGlassInfo(); BeanUtils.copyProperties(details, downGlassInfo); //获取当前流程卡最大片序 downGlassInfo.setSequence(this.getMaxSequenceByFlowCardId(details.getFlowCardId(), details.getLayer()) + 1); downGlassInfo.setWorkStationId(Const.G13_WORK_STATION); this.save(downGlassInfo); //生成任务信息 并向plc发送出片任务 GlassInfo glassInfo = new GlassInfo(); BeanUtils.copyProperties(details, glassInfo); return downLoadCacheGlassTask.initDownGlassTask(glassInfo, details.getSlot(), Const.G13_WORK_STATION, 2); } @Override public String setDownGlassInfoRequest(DownGlassInfoRequest request) { if (request == null) { redisUtil.deleteObject("downGlassRequest"); } else { redisUtil.setCacheObject("downGlassRequest", request); } return "success"; } @Override public List queryWorkStationIsFull() { //查询可以落架的玻璃信息且已绑定流程卡的工位信息 // List list = downWorkstationService.list(new LambdaQueryWrapper().eq(DownWorkstation::getEnableState, Const.SLOT_ON) // .isNotNull(DownWorkstation::getFlowCardId).ne(DownWorkstation::getFlowCardId, "")); // List workstationFull = new ArrayList<>(); // if (CollectionUtils.isNotEmpty(list)) { // //都有玻璃的工位信息(包括绑定流程卡) // List workstationList = list.stream().map(DownWorkstation::getWorkstationId).collect(Collectors.toList()); // //按照符合条件的工位获取未落架的流程卡玻璃,如果返回为空,则表明所有都已落架完成 // List downGlassInfoDTOList = queryWorkStationIsIn(workstationList, Boolean.FALSE); // //获取工位上的未满的流程卡及层数 // List flowCardIdList = downGlassInfoDTOList.stream().map(item -> item.getFlowCardId() + ":" + item.getLayer()).collect(Collectors.toList()); // //可以落架的玻璃信息且已绑定流程卡的所有的工位 - 玻璃未满流程卡及层数的工位 = 已满工位 // workstationFull = list.stream().filter(item -> !flowCardIdList.contains(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList()); // //是否需要将已满的工位置为不可落架 //// if (CollectionUtils.isNotEmpty(workstationFull)) { //// List workstationIds = workstationFull.stream().map(DownWorkstation::getWorkstationId).collect(Collectors.toList()); //// downWorkstationService.update(new LambdaUpdateWrapper().set(DownWorkstation::getEnableState, Const.SLOT_OFF) //// .in(DownWorkstation::getWorkstationId, workstationIds)); //// } // } List workstationFull = downWorkstationService.list(new LambdaQueryWrapper() .eq(DownWorkstation::getEnableState, Const.SLOT_ON) .isNotNull(DownWorkstation::getFlowCardId) .ne(DownWorkstation::getFlowCardId, "") .apply("total_quantity = racks_number + other_number")); return workstationFull; } @Override public List>>> downGlassPrint(DownGlassInfo downGlassInfo) { log.info("打印参数:{}", downGlassInfo); QueryWrapper queryWrapper = Wrappers.query(); queryWrapper.eq("flow_card_id", downGlassInfo.getFlowCardId()) .orderByAsc("id"); int printLayer = 1; if (downGlassInfo.getLayer() != 0) { queryWrapper.select("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "COUNT(*) AS quantity"); queryWrapper.groupBy("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "id"); queryWrapper.eq("layer", downGlassInfo.getLayer()); printLayer = downGlassInfo.getLayer(); } else { queryWrapper.select("flow_card_id", "width", "height", "filmsid", "thickness", "glass_type", "COUNT(*) AS quantity"); queryWrapper.groupBy("flow_card_id", "width", "height", "filmsid", "thickness", "glass_type", "id"); } List> resultList = baseMapper.selectMaps(queryWrapper); log.info("MES落架数据:{}", resultList); List> projectInfo = flowCardService.selectProject(downGlassInfo.getFlowCardId(), printLayer); log.info("流程卡头部数据:{}", projectInfo); List> flowCardInfo = flowCardService.selectFlowCard(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer()); log.info("流程卡玻璃数据:{}", flowCardInfo); for (Map row : flowCardInfo) { int order_number = (int) row.get("order_number"); int quantity1 = 0; for (Map row1 : resultList) { int glass_type = (int) row1.get("glass_type"); if (downGlassInfo.getLayer() != 0) { int layer = (int) row1.get("layer"); int technology_number = (int) row.get("technology_number"); if (order_number == glass_type && technology_number == layer) { quantity1 += 1; } } else { if (order_number == glass_type) { quantity1 += 1; } } } row.put("quantity1", quantity1); } log.info("流程卡玻璃数据2:{}", flowCardInfo); List>>> listMap = new ArrayList<>(); Map>> result = new HashMap<>(); result.put("detail", projectInfo); result.put("detailList", flowCardInfo); for (Map row : projectInfo) { String order_number = (String) row.get("process"); String[] processes = order_number.split("->"); List> processList = new ArrayList<>(); for (int i = 0; i < processes.length; i++) { Map processMap = new JSONObject(); processMap.put("process", processes[i]); processMap.put("id", i); processList.add(processMap); } result.put("processList", processList); } listMap.add(result); return listMap; } @Override public List> downGlassLabelPrint(DownGlassInfo downGlassInfo) { List> resultList = null; if (downGlassInfo.getGlassId() != null) { resultList = glassInfoService.listMaps( new LambdaQueryWrapper() .eq(GlassInfo::getGlassId, downGlassInfo.getGlassId()) ); } else { resultList = baseMapper.downGlassLabelPrint(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer()); } log.info("MES落架数据:{}", resultList); //获取ERP标签所需的信息 List> labelInfo; if (downGlassInfo.getLayer() != 0) { labelInfo = flowCardService.selectLabel(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer()); } else { labelInfo = flowCardService.selectLabel(downGlassInfo.getFlowCardId(), 1); } log.info("标签数据:{}", labelInfo); for (Map row : resultList) { int glass_type = (int) row.get("glass_type"); int layer = (int) row.get("layer"); for (Map row1 : labelInfo) { int orderNumber = (int) row1.get("orderNumber"); int technologyNumber = (int) row1.get("technologyNumber"); if (downGlassInfo.getLayer() != 0) { if (orderNumber == glass_type && technologyNumber == layer) { String order_id = (String) row1.get("order_id"); String project = (String) row1.get("project"); Long customer_id = (Long) row1.get("customer_id"); BigDecimal width = (BigDecimal) row1.get("width"); BigDecimal height = (BigDecimal) row1.get("height"); Long quantity = (Long) row1.get("quantity"); String glass_child = (String) row1.get("glass_child"); String process = (String) row1.get("process"); String customer_name = (String) row1.get("customer_name"); String processing_note = (String) row1.get("processing_note"); String other_colunmns = (String) row1.get("other_colunmns"); String building_number = (String) row1.get("building_number"); String bend_radius = (String) row1.get("bend_radius"); row.put("orderNumber", orderNumber); row.put("technology_number", technologyNumber); row.put("order_id", order_id); row.put("project", project); row.put("customer_id", customer_id); row.put("width", width); row.put("height", height); row.put("quantity", quantity); row.put("glass_child", glass_child); row.put("process", process); row.put("customer_name", customer_name); row.put("processing_note", processing_note); row.put("other_colunmns", other_colunmns); row.put("building_number", building_number); row.put("bend_radius", bend_radius); } } else { if (orderNumber == glass_type) { String order_id = (String) row1.get("order_id"); String project = (String) row1.get("project"); Long customer_id = (Long) row1.get("customer_id"); BigDecimal width = (BigDecimal) row1.get("width"); BigDecimal height = (BigDecimal) row1.get("height"); Long quantity = (Long) row1.get("quantity"); String glass_child = (String) row1.get("glass_child"); String process = (String) row1.get("process"); String customer_name = (String) row1.get("customer_name"); String processing_note = (String) row1.get("processing_note"); String other_colunmns = (String) row1.get("other_colunmns"); String building_number = (String) row1.get("building_number"); String bend_radius = (String) row1.get("bend_radius"); row.put("orderNumber", orderNumber); row.put("technology_number", technologyNumber); row.put("order_id", order_id); row.put("project", project); row.put("customer_id", customer_id); row.put("width", width); row.put("height", height); row.put("quantity", quantity); row.put("glass_child", glass_child); row.put("process", process); row.put("customer_name", customer_name); row.put("processing_note", processing_note); row.put("other_colunmns", other_colunmns); row.put("building_number", building_number); row.put("bend_radius", bend_radius); } } } } return resultList; } }