hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java
@@ -7,23 +7,34 @@
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.HollowGlassRelationInfo;
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 +53,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) {
@@ -135,6 +152,143 @@
        return Boolean.TRUE;
    }
    @Override
    public String generateHollowLisecFile(String flowCardId, int cell, int isForce) 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(2, 9));
        details.setCustNum(order.getCustomerId() + "");
        details.setCustNam(order.getCustomerName());
        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));
        Map<Integer, List<HollowGlassRelationInfo>> listMap = hollowGlassRelationInfos.stream().collect(Collectors.groupingBy(HollowGlassRelationInfo::getHollowSequence));
        //设置间隔板数据共所有配对玻璃使用
        List<LisecHollowFrameDetails> frameList = new ArrayList<>();
        for (int i = 1; i < relationInfo.getTotalLayer(); i++) {
            LisecHollowFrameDetails frameDetails = new LisecHollowFrameDetails();
            frameDetails.setRecType("<FR" + i + ">");
            frameDetails.setType(formulaDetails.getIntervalFrameType());
            frameDetails.setWidth(formulaDetails.getIntervalFrameWidth());
            frameDetails.setHeight(formulaDetails.getIntervalFrameHeight());
            frameList.add(frameDetails);
        }
        List<LisecHollowGlassAndFrameDetails> glassAndFrameList = new ArrayList<>();
        listMap.forEach((e, v) -> {
            LisecHollowGlassAndFrameDetails glassAndFrame = new LisecHollowGlassAndFrameDetails();
            List<LisecHollowGlassDetails> glassList = new ArrayList<>();
            for (int i = 1; i <= v.size(); i++) {
                LisecHollowGlassDetails hollowGlassDetails = new LisecHollowGlassDetails();
                hollowGlassDetails.setRecType("<GL" + i + ">");
                hollowGlassDetails.setThickness((int) (v.get(i - 1).getThickness() * 10) + "");
                hollowGlassDetails.setPaneBcd(randomNumber + "" + (e * ID_RATIO + i));
                glassList.add(hollowGlassDetails);
            }
            glassAndFrame.setGlassList(glassList);
            glassAndFrame.setFrameList(frameList);
            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());
            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());
                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());
                glassAndFrame.setGasCode2(formulaDetails.getCasTwo());
                glassAndFrame.setGlass3(e * ID_RATIO + 3 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameThree());
                glassAndFrame.setGasCode3(formulaDetails.getCasThree());
                glassAndFrame.setGlass4(e * ID_RATIO + 4 + "");
            } else {
                glassAndFrame.setGlass2(e * ID_RATIO + 2 + "");
                glassAndFrame.setFrame2(formulaDetails.getFrameTwo());
                glassAndFrame.setGasCode2(formulaDetails.getCasTwo());
                glassAndFrame.setGlass3(e * ID_RATIO + 3 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameThree());
                glassAndFrame.setGasCode3(formulaDetails.getCasThree());
                glassAndFrame.setGlass4(e * ID_RATIO + 4 + "");
                glassAndFrame.setFrame3(formulaDetails.getFrameFour());
                glassAndFrame.setGasCode4(formulaDetails.getCasFour());
                glassAndFrame.setGlass4(e * ID_RATIO + 5 + "");
            }
            glassAndFrame.setInset(formulaDetails.getSealInsert());
            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("D:\\temp", 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"));
@@ -183,6 +337,13 @@
            }
        }
        hollowGlassQueueInfoService.saveBatch(hollowQueues);
        try {
            if (request.getCell() == 930) {
                generateHollowLisecFile(request.getFlowCardId(), 930, isForce);
            }
        } catch (Exception e) {
            log.info("生成李赛克文件时发生异常,流程卡号为{}", request.getFlowCardId());
        }
        return info;
    }
}