package com.mes.hollow.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.smallbun.screw.core.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.common.config.Const; import com.mes.common.config.ConstSysConfig; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.service.GlassInfoService; import com.mes.hollow.controller.HollowBigStorageCageController; import com.mes.hollow.entity.HollowBigStorageCageDetails; import com.mes.hollow.entity.HollowFormulaDetails; import com.mes.hollow.entity.HollowGlassOutRelationInfo; import com.mes.hollow.entity.dto.*; import com.mes.hollow.entity.request.HollowHistoryTaskRequest; import com.mes.hollow.entity.request.HollowTaskRequest; import com.mes.hollow.mapper.HollowGlassOutRelationInfoMapper; import com.mes.hollow.service.HollowBigStorageCageDetailsService; import com.mes.hollow.service.HollowFormulaDetailsService; import com.mes.hollow.service.HollowGlassOutRelationInfoService; import com.mes.hollow.service.HollowGlassRelationInfoService; import com.mes.hollowqueue.entity.HollowGlassQueueInfo; import com.mes.hollowqueue.service.HollowGlassQueueInfoService; import com.mes.largenscreen.entity.PieChartVO; import com.mes.sysconfig.service.SysConfigService; import com.mes.tools.DateUtil; import com.mes.utils.Blank; import com.mes.utils.RedisUtil; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import freemarker.template.Version; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.io.*; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * (HollowGlassOutRelationInfo)表服务实现类 * * @author makejava * @since 2024-11-30 13:57:29 */ @Service @Slf4j public class HollowGlassOutRelationInfoServiceImpl extends ServiceImpl implements HollowGlassOutRelationInfoService { @Resource GlassInfoService glassInfoService; @Resource HollowBigStorageCageDetailsService hollowBigStorageCageDetailsService; @Resource HollowGlassQueueInfoService hollowGlassQueueInfoService; @Resource HollowFormulaDetailsService hollowFormulaDetailsService; @Resource HollowGlassRelationInfoService hollowGlassRelationInfoService; @Resource SysConfigService sysConfigService; @Resource RedisUtil redisUtil; // @Value("${mes.glassGap}") // private Integer glassGap; // // @Value("${mes.carWidth}") // private Integer carWidth; private static final int ID_RATIO = 10; @Override @Transactional public HollowGlassOutRelationInfo receiveTask(HollowTaskRequest request) { return childrenTask(request, 0); } @Override @Transactional public HollowGlassOutRelationInfo forceOutGlass(HollowTaskRequest request) { return childrenTask(request, 1); } @Override public Boolean dispatchHollowSwitch(Boolean flag) { redisUtil.setCacheObject("dispatchHollowSwitch", flag); return redisUtil.getCacheObject("dispatchHollowSwitch"); } @Override public List hollowTaskList(int cell) { //查询任务表中本条线所有未完成的任务信息 List list = this.list(new LambdaQueryWrapper() .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getCell, cell)); if (CollectionUtil.isNotEmpty(list)) { return list.stream().map(HollowGlassOutRelationInfo::getFlowCardId).collect(Collectors.toList()); } return new ArrayList(); } @Override public List appointHollowTaskDetails(String flowCardId, int cell) { //按照流程卡及路线,查找对应的任务信息 HollowGlassOutRelationInfo hollowGlassOutRelationInfo = this.getOne(new LambdaQueryWrapper() .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .eq(HollowGlassOutRelationInfo::getCell, cell).last("limit 1")); if (null == hollowGlassOutRelationInfo) { return new ArrayList(); } //按照任务id查询对列表中的队列信息 return hollowGlassQueueInfoService.list(new LambdaQueryWrapper() .eq(HollowGlassQueueInfo::getRelationId, hollowGlassOutRelationInfo.getId())); } @Override public Boolean startTask(String flowCardId, int cell) { log.info("查看该流程卡是否由正在执行的任务,流程卡:{}", flowCardId); int taskCount = this.count(new LambdaQueryWrapper() .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId)); if (taskCount == 0 || taskCount > 1) { log.info("该流程卡不存在任务或者有正在执行中,无法再次执行"); return Boolean.FALSE; } //更新任务状态为开始 return this.update(new LambdaUpdateWrapper() .set(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .ne(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_SUCCESS) .eq(HollowGlassOutRelationInfo::getCell, cell)); } @Override public Boolean pauseTask(String flowCardId, int cell) { // 更新任务状态为暂停 return this.update(new LambdaUpdateWrapper() .set(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .ne(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_SUCCESS) .eq(HollowGlassOutRelationInfo::getCell, cell)); } @Override public Boolean finishTask(String flowCardId, int cell) { //清空队列表中未完成的玻璃信息 hollowGlassQueueInfoService.remove(new LambdaQueryWrapper() .in(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW) .eq(HollowGlassQueueInfo::getFlowCardId, flowCardId) .eq(HollowGlassQueueInfo::getCell, cell)); //更新任务状态未已完成 return this.update(new LambdaUpdateWrapper() .set(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_SUCCESS) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .eq(HollowGlassOutRelationInfo::getCell, cell)); } @Override public Boolean deleteHollowTaskDetails(String flowCardId, int cell) { //按照流程卡及路线,查找对应的任务信息 this.remove(new LambdaQueryWrapper() .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .eq(HollowGlassOutRelationInfo::getCell, cell)); hollowGlassQueueInfoService.remove(new LambdaQueryWrapper() .in(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW) .eq(HollowGlassQueueInfo::getFlowCardId, flowCardId) .eq(HollowGlassQueueInfo::getCell, cell)); return Boolean.TRUE; } @Override public String generateHollowLisecFile(String flowCardId, int cell, int isForce, int isOut) throws IOException { List outRelationList = this.list(new LambdaQueryWrapper() .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE) .eq(HollowGlassOutRelationInfo::getFlowCardId, flowCardId) .eq(HollowGlassOutRelationInfo::getCell, cell)); if (CollectionUtil.isEmpty(outRelationList) || outRelationList.size() != 1) { return "本条线不存在该流程任务或者同流程卡任务数大于1"; } HollowGlassOutRelationInfo relationInfo = outRelationList.get(0); if (relationInfo.getTotalLayer() < 2) { return "任务总层数小于2,不生成李赛克文件"; } //获取订单相关信息 OrderDTO order = baseMapper.queryOrderByFlowCardId(flowCardId); if (null == order) { return "生成失败,相关订单信息不存在"; } //获取配方相关信息 HollowFormulaDetails formulaDetails = hollowFormulaDetailsService.getById(relationInfo.getFormulaId()); if (null == formulaDetails) { return "生成失败,相关配方信息不存在"; } //总层数是否与进笼关系表内层数数量相同,层数相同生成继续,不同结束 int layerCount = hollowGlassRelationInfoService.queryLayerByFlowCardId(flowCardId); if (layerCount != relationInfo.getTotalLayer() && isForce == 0) { return "生成失败,该流程卡内层数与进笼关系表内层数数量不相同"; } //设置文件的主体内容 LisecHollowDetails details = new LisecHollowDetails(); String randomNumber = "" + (int) (Math.random() * 100000 + 100000); details.setBcdStart(randomNumber); details.setBatchNo(randomNumber); details.setOrd(relationInfo.getFlowCardId().substring(4, 9) + (int) (Math.random() * 1000 + 1000)); details.setCustNum(order.getCustomerId() + ""); details.setCustNam(""); details.setProDate((new SimpleDateFormat("dd/MM/yyyy").format(new Date()))); details.setDelDate(new SimpleDateFormat("dd/MM/yyyy").format(order.getDeliveryDate())); //设置文件第一层列表数据 //暂时生成笼内所有的玻璃信息(已配对和未配对的) List hollowGlassRelationInfos = hollowBigStorageCageDetailsService.queryPairGlassList(flowCardId, relationInfo.getTotalLayer(), relationInfo.getTotalPairQuantity(), isOut); Map> listMap = hollowGlassRelationInfos.stream() .collect(Collectors.groupingBy(HollowBigStorageCageDetails::getHollowSequence, Collectors.collectingAndThen(Collectors.toList(), list -> list.stream().sorted(Comparator.comparing(HollowBigStorageCageDetails::getLayer)).collect(Collectors.toList())))); Map> sortListMap = new TreeMap<>(); sortListMap.putAll(listMap); //设置间隔板数据共所有配对玻璃使用 List glassAndFrameList = new ArrayList<>(); sortListMap.forEach((e, v) -> { LisecHollowGlassAndFrameDetails glassAndFrame = new LisecHollowGlassAndFrameDetails(); List glassList = new ArrayList<>(); List frameList = new ArrayList<>(); for (int i = 1; i <= v.size(); i++) { LisecHollowGlassDetails hollowGlassDetails = new LisecHollowGlassDetails(); HollowBigStorageCageDetails glassInfo = v.get(i - 1); hollowGlassDetails.setRecType(""); hollowGlassDetails.setThickness((int) (glassInfo.getThickness() * 10) + ""); hollowGlassDetails.setDescript(formulaDetails.getIntervalFrameWidthOne() + "-" + (int) (glassInfo.getThickness() * 10)); hollowGlassDetails.setPaneBcd(randomNumber + "" + (e * ID_RATIO + i)); glassList.add(hollowGlassDetails); } glassAndFrame.setGlassList(glassList); glassAndFrame.setItemNum(e + ""); glassAndFrame.setIdNum(e + ""); glassAndFrame.setBarcode(randomNumber.substring(randomNumber.length() - 3)); glassAndFrame.setWidth((int) (v.get(0).getWidth() * 10) + ""); glassAndFrame.setHeight((int) (v.get(0).getHeight() * 10) + ""); glassAndFrame.setGlass1(e * ID_RATIO + 1 + ""); glassAndFrame.setFrame1(formulaDetails.getFrameOne()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeOne(), formulaDetails.getIntervalFrameWidthOne(), formulaDetails.getIntervalFrameHeightOne())); glassAndFrame.setGasCode1(formulaDetails.getCasOne()); if (relationInfo.getTotalLayer() == 2) { glassAndFrame.setGlass2(e * ID_RATIO + 2 + ""); } else if (relationInfo.getTotalLayer() == 3) { glassAndFrame.setGlass2(e * ID_RATIO + 2 + ""); glassAndFrame.setFrame2(formulaDetails.getFrameTwo()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeTwo(), formulaDetails.getIntervalFrameWidthTwo(), formulaDetails.getIntervalFrameHeightTwo())); glassAndFrame.setGasCode2(formulaDetails.getCasTwo()); glassAndFrame.setGlass3(e * ID_RATIO + 3 + ""); } else if (relationInfo.getTotalLayer() == 4) { glassAndFrame.setGlass2(e * ID_RATIO + 2 + ""); glassAndFrame.setFrame2(formulaDetails.getFrameTwo()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeTwo(), formulaDetails.getIntervalFrameWidthTwo(), formulaDetails.getIntervalFrameHeightTwo())); glassAndFrame.setGasCode2(formulaDetails.getCasTwo()); glassAndFrame.setGlass3(e * ID_RATIO + 3 + ""); glassAndFrame.setFrame3(formulaDetails.getFrameThree()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeThree(), formulaDetails.getIntervalFrameWidthThree(), formulaDetails.getIntervalFrameHeightThree())); glassAndFrame.setGasCode3(formulaDetails.getCasThree()); glassAndFrame.setGlass4(e * ID_RATIO + 4 + ""); } else { glassAndFrame.setGlass2(e * ID_RATIO + 2 + ""); glassAndFrame.setFrame2(formulaDetails.getFrameTwo()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeTwo(), formulaDetails.getIntervalFrameWidthTwo(), formulaDetails.getIntervalFrameHeightTwo())); glassAndFrame.setGasCode2(formulaDetails.getCasTwo()); glassAndFrame.setGlass3(e * ID_RATIO + 3 + ""); glassAndFrame.setFrame3(formulaDetails.getFrameThree()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeThree(), formulaDetails.getIntervalFrameWidthThree(), formulaDetails.getIntervalFrameHeightThree())); glassAndFrame.setGasCode3(formulaDetails.getCasThree()); glassAndFrame.setGlass4(e * ID_RATIO + 4 + ""); glassAndFrame.setFrame3(formulaDetails.getFrameFour()); frameList.add(new LisecHollowFrameDetails("", formulaDetails.getIntervalFrameTypeFour(), formulaDetails.getIntervalFrameWidthFour(), formulaDetails.getIntervalFrameHeightFour())); glassAndFrame.setGasCode4(formulaDetails.getCasFour()); glassAndFrame.setGlass4(e * ID_RATIO + 5 + ""); } glassAndFrame.setInset(formulaDetails.getSealInsert()); glassAndFrame.setFrameList(frameList); glassAndFrameList.add(glassAndFrame); }); details.setGlassAndFrameList(glassAndFrameList); Configuration cfg = new Configuration(new Version("2.3.29")); cfg.setClassForTemplateLoading(HollowBigStorageCageController.class, "/templates/"); // 创建Calculator实例 Blank blank = new Blank(); // 创建数据模型 Map root = new HashMap<>(); root.put("blank", blank); root.put("details", details); // 获取模板 Template temp = cfg.getTemplate("hollowGlass.ftl"); // 将生成的文件存入指定路径 //计算生成李赛克需要的数据给到每个属性 StringWriter out = new StringWriter(); File file = new File(System.getProperty("user.dir") + "/lisec", relationInfo.getFlowCardId() + randomNumber.substring(randomNumber.length() - 3) + ".trf"); try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { temp.process(root, out); writer.write(out.toString()); } catch (TemplateException | IOException e) { e.printStackTrace(); } return "success"; } @Override public Page queryHollowHistoryTask(HollowHistoryTaskRequest request) { Page page = new Page<>(request.getPageNo(), request.getPageSize()); if (null == request.getBeginDate()) { request.setBeginDate(DateUtil.getBeginDate()); request.setEndDate(DateUtil.getEndDate()); } LambdaQueryWrapper wrapper = new LambdaQueryWrapper() .eq(HollowGlassOutRelationInfo::getCell, request.getCell()) .like(StringUtils.isNotBlank(request.getFlowCardId()), HollowGlassOutRelationInfo::getFlowCardId, request.getFlowCardId()) .in(CollectionUtil.isNotEmpty(request.getIsForceList()), HollowGlassOutRelationInfo::getIsForce, request.getIsForceList()) .in(CollectionUtil.isNotEmpty(request.getStateList()), HollowGlassOutRelationInfo::getState, request.getStateList()) .between(HollowGlassOutRelationInfo::getCreateTime, request.getBeginDate(), request.getEndDate()) .orderByDesc(HollowGlassOutRelationInfo::getCreateTime); return this.page(page, wrapper); } private HollowGlassOutRelationInfo childrenTask(HollowTaskRequest request, int isForce) { GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper().eq(GlassInfo::getFlowCardId, request.getFlowCardId()).last("limit 1")); HollowGlassOutRelationInfo info = new HollowGlassOutRelationInfo(); if (null == glassInfo) { log.info("该流程卡信息系统未找到"); return info; } List outRelationInfos = this.list(new LambdaQueryWrapper() .eq(HollowGlassOutRelationInfo::getFlowCardId, request.getFlowCardId()) .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_NEW, Const.HOLLOW_FLOW_CARD_START, Const.HOLLOW_FLOW_CARD_PAUSE)); if (CollectionUtil.isNotEmpty(outRelationInfos)) { log.info("当前流程卡有未完成的任务"); return null; } //保存任务关系主表 info.setFlowCardId(request.getFlowCardId()); info.setCell(request.getCell()); info.setIsForce(isForce); info.setTotalLayer(glassInfo.getTotalLayer()); info.setState(Const.HOLLOW_FLOW_CARD_NEW); info.setTotalPairQuantity(request.getTotalPairQuantity()); info.setFormulaId(request.getFormulaId()); this.save(info); // 查询出需要出玻璃的队列 List hollowBigStorageCageDetailsList = hollowBigStorageCageDetailsService .queryOutGlassList(request.getFlowCardId(), request.getCell()); int isPairCount = glassInfo.getTotalLayer() * request.getTotalPairQuantity(); List hollowQueues = new ArrayList<>(); Integer carWidth = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_CAR_WIDTH); // Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.HOLLOW_GLASS_GAP); Integer glassGap = hollowGlassRelationInfoService.getGlassGapByThickness(hollowBigStorageCageDetailsList.get(0).getThickness()); if (930 == request.getCell()) { Map> listMap = hollowBigStorageCageDetailsList.stream() .collect(Collectors.groupingBy(HollowBigStorageCageDetails::getHollowSequence)); Map> sortListMap = new TreeMap<>(); sortListMap.putAll(listMap); for (Map.Entry> entry : sortListMap.entrySet()) { //创建队列接收不满足成对情况下:一对玻璃分几次上车的次序问题 List tempList = new ArrayList<>(); //先将玻璃按照正常顺序排列,计算一车最多放几块,算好块数之后将一车的玻璃按照倒序存储 List reverse = CollectionUtil.reverse(entry.getValue()); int remainWidth = carWidth; for (HollowBigStorageCageDetails item : reverse) { remainWidth = remainWidth - (int) Math.max(item.getWidth(), item.getHeight()); if (remainWidth < 0) { hollowQueues.addAll(CollectionUtil.reverse(tempList)); tempList = new ArrayList<>(); remainWidth = carWidth - (int) Math.max(item.getWidth(), item.getHeight()); } HollowGlassQueueInfo queueInfo = HollowBDetailToQueue(item, info.getId(), request.getCell()); tempList.add(queueInfo); remainWidth = remainWidth - glassGap; } hollowQueues.addAll(CollectionUtil.reverse(tempList)); HollowBigStorageCageDetails cageDetails = entry.getValue().get(0); if (cageDetails.getIsPair() == 1) { isPairCount = isPairCount - cageDetails.getTotalLayer(); if (isPairCount == 0) { break; } } } } else { loop: for (HollowBigStorageCageDetails item : hollowBigStorageCageDetailsList) { HollowGlassQueueInfo queueInfo = HollowBDetailToQueue(item, info.getId(), request.getCell()); hollowQueues.add(queueInfo); if (item.getIsPair() == 1) { isPairCount = isPairCount - 1; if (isPairCount == 0) { break loop; } } } } hollowGlassQueueInfoService.saveBatch(hollowQueues); try { if (request.getCell() == 930) { generateHollowLisecFile(request.getFlowCardId(), 930, isForce, 0); } } catch (Exception e) { log.info("生成李赛克文件时发生异常,流程卡号为{}", request.getFlowCardId()); } return info; } private HollowGlassQueueInfo HollowBDetailToQueue(HollowBigStorageCageDetails details, Long taskId, int targetCell) { HollowGlassQueueInfo queueInfo = new HollowGlassQueueInfo(); BeanUtils.copyProperties(details, queueInfo); queueInfo.setRelationId(taskId); queueInfo.setState(Const.TEMPERING_NEW); queueInfo.setCell(targetCell); queueInfo.setCreateTime(new Date()); queueInfo.setUpdateTime(new Date()); return queueInfo; } @Override public List queryPieChart() { return baseMapper.queryPieChart(); } }