zhoushihao
2025-01-17 5d1bb80afb4c4db35eec39577c3e47b2d5e91dbb
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java
@@ -7,23 +7,33 @@
import com.mes.common.config.Const;
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.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.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 javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -42,9 +52,15 @@
    HollowBigStorageCageDetailsService hollowBigStorageCageDetailsService;
    @Resource
    HollowGlassQueueInfoService hollowGlassQueueInfoService;
    @Resource
    HollowFormulaDetailsService hollowFormulaDetailsService;
    @Resource
    HollowGlassRelationInfoService hollowGlassRelationInfoService;
    @Resource
    RedisUtil redisUtil;
    private static final int ID_RATIO = 10;
    @Override
    public HollowGlassOutRelationInfo receiveTask(HollowTaskRequest request) {
@@ -91,6 +107,14 @@
    @Override
    public Boolean startTask(String flowCardId, int cell) {
        log.info("查看该流程卡是否由正在执行的任务,流程卡:{}", flowCardId);
        int taskCount = this.count(new LambdaQueryWrapper<HollowGlassOutRelationInfo>()
                .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<HollowGlassOutRelationInfo>()
                .set(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START)
@@ -135,6 +159,146 @@
        return Boolean.TRUE;
    }
    @Override
    public String generateHollowLisecFile(String flowCardId, int cell, int isForce, int isOut) throws IOException {
        List<HollowGlassOutRelationInfo> outRelationList = this.list(new LambdaQueryWrapper<HollowGlassOutRelationInfo>()
                .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<HollowGlassRelationInfo> hollowGlassRelationInfos = hollowGlassRelationInfoService.list(new LambdaQueryWrapper<HollowGlassRelationInfo>()
//                .eq(HollowGlassRelationInfo::getFlowCardId, flowCardId).orderByAsc(HollowGlassRelationInfo::getHollowSequence));
        List<HollowBigStorageCageDetails> hollowGlassRelationInfos = hollowBigStorageCageDetailsService.queryPairGlassList(flowCardId, relationInfo.getTotalLayer(), relationInfo.getTotalPairQuantity(), isOut);
        Map<Integer, List<HollowBigStorageCageDetails>> listMap = hollowGlassRelationInfos.stream().collect(Collectors.groupingBy(HollowBigStorageCageDetails::getHollowSequence));
        //设置间隔板数据共所有配对玻璃使用
        List<LisecHollowGlassAndFrameDetails> glassAndFrameList = new ArrayList<>();
        listMap.forEach((e, v) -> {
            LisecHollowGlassAndFrameDetails glassAndFrame = new LisecHollowGlassAndFrameDetails();
            List<LisecHollowGlassDetails> glassList = new ArrayList<>();
            List<LisecHollowFrameDetails> frameList = new ArrayList<>();
            for (int i = 1; i <= v.size(); i++) {
                LisecHollowGlassDetails hollowGlassDetails = new LisecHollowGlassDetails();
                HollowBigStorageCageDetails glassInfo = v.get(i - 1);
                hollowGlassDetails.setRecType("<GL" + i + ">");
                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("<FR1>", 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("<FR2>", 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("<FR2>", formulaDetails.getIntervalFrameTypeTwo(), formulaDetails.getIntervalFrameWidthTwo(), formulaDetails.getIntervalFrameHeightTwo()));
                glassAndFrame.setGasCode2(formulaDetails.getCasTwo());
                glassAndFrame.setGlass3(e * ID_RATIO + 3 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameThree());
                frameList.add(new LisecHollowFrameDetails("<FR3>", 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("<FR2>", formulaDetails.getIntervalFrameTypeTwo(), formulaDetails.getIntervalFrameWidthTwo(), formulaDetails.getIntervalFrameHeightTwo()));
                glassAndFrame.setGasCode2(formulaDetails.getCasTwo());
                glassAndFrame.setGlass3(e * ID_RATIO + 3 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameThree());
                frameList.add(new LisecHollowFrameDetails("<FR3>", formulaDetails.getIntervalFrameTypeThree(), formulaDetails.getIntervalFrameWidthThree(), formulaDetails.getIntervalFrameHeightThree()));
                glassAndFrame.setGasCode3(formulaDetails.getCasThree());
                glassAndFrame.setGlass4(e * ID_RATIO + 4 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameFour());
                frameList.add(new LisecHollowFrameDetails("<FR4>", 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<String, Object> 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";
    }
    private HollowGlassOutRelationInfo childrenTask(HollowTaskRequest request, int isForce) {
        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getFlowCardId, request.getFlowCardId()).last("limit 1"));
@@ -144,11 +308,10 @@
            return info;
        }
        List<HollowGlassOutRelationInfo> outRelationInfos = this.list(new LambdaQueryWrapper<HollowGlassOutRelationInfo>()
                .eq(HollowGlassOutRelationInfo::getCell, request.getCell())
                .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("当前流程卡在本条线有未完成的任务");
            log.info("当前流程卡有未完成的任务");
            return null;
        }
        //保存任务关系主表
@@ -183,6 +346,13 @@
            }
        }
        hollowGlassQueueInfoService.saveBatch(hollowQueues);
        try {
            if (request.getCell() == 930) {
                generateHollowLisecFile(request.getFlowCardId(), 930, isForce, 0);
            }
        } catch (Exception e) {
            log.info("生成李赛克文件时发生异常,流程卡号为{}", request.getFlowCardId());
        }
        return info;
    }
}