ZengTao
4 天以前 21a76af55c4da5f1999e9dd24690b2449a7a18a7
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/edgstoragecage/service/impl/EdgStorageCageDetailsServiceImpl.java
@@ -1,20 +1,36 @@
package com.mes.edgstoragecage.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.query.MPJLambdaQueryWrapper;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.damage.entity.Damage;
import com.mes.damage.entity.request.DamageRequest;
import com.mes.damage.service.DamageService;
import com.mes.edgglasstask.entity.EdgGlassTaskInfo;
import com.mes.edgglasstask.service.EdgGlassTaskInfoService;
import com.mes.edgstoragecage.entity.EdgStorageCage;
import com.mes.edgstoragecage.entity.EdgStorageCageDetails;
import com.mes.edgstoragecage.entity.vo.CutDrawingVO;
import com.mes.edgstoragecage.entity.vo.EdgSlotRemainVO;
import com.mes.edgstoragecage.mapper.EdgStorageCageDetailsMapper;
import com.mes.edgstoragecage.mapper.EdgStorageCageMapper;
import com.mes.edgstoragecage.service.EdgStorageCageDetailsService;
import com.mes.pp.entity.OptimizeDetail;
import com.mes.pp.entity.OptimizeLayout;
import com.mes.pp.mapper.OptimizeDetailMapper;
import com.mes.engineering.entity.Engineering;
import com.mes.engineering.mapper.EngineeringMapper;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.service.GlassInfoService;
import com.mes.largenscreen.entity.PieChartVO;
import com.mes.pp.entity.OptimizeHeatDetail;
import com.mes.pp.entity.OptimizeHeatLayout;
import com.mes.pp.entity.OptimizeProject;
import com.mes.pp.mapper.OptimizeHeatDetailMapper;
import com.mes.taskcache.entity.TaskCache;
import com.mes.taskcache.service.TaskCacheService;
import com.mes.uppattenusage.entity.UpPattenUsage;
@@ -24,6 +40,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -40,105 +59,146 @@
@Slf4j
public class EdgStorageCageDetailsServiceImpl extends MPJBaseServiceImpl<EdgStorageCageDetailsMapper, EdgStorageCageDetails> implements EdgStorageCageDetailsService {
    @Autowired
    UpPattenUsageMapper upPattenUsageMapper;
    @Resource
    EngineeringMapper engineeringMapper;
    @Autowired
    OptimizeDetailMapper optimizeDetailMapper;
    @Resource
    OptimizeHeatDetailMapper optimizeHeatDetailMapper;
    @Autowired
    @Resource
    EdgStorageCageMapper edgStorageCageMapper;
    @Resource
    GlassInfoService glassInfoService;
    @Autowired
    TaskCacheService taskCacheService;
    @Autowired
    DamageService damageService;
    /**
     * 识别   拿走:200/破损:201
     *
     * @param glassId
     * @param ControlsId
     * @return
     */
    @Resource
    UpPattenUsageMapper upPattenUsageMapper;
    @Autowired
    EdgGlassTaskInfoService edgGlassTaskInfoService;
    @Override
    public boolean identWorn(String glassId, int ControlsId) {
        List<EdgStorageCageDetails> edgStorageCageDetails = baseMapper.selectList(new MPJLambdaQueryWrapper<EdgStorageCageDetails>().selectAll(EdgStorageCageDetails.class).eq(EdgStorageCageDetails::getGlassId, glassId));
        if (edgStorageCageDetails.size() == 1) {
            EdgStorageCageDetails item = edgStorageCageDetails.get(0);
            item.setState(ControlsId);
            baseMapper.update(edgStorageCageDetails.get(0), new MPJLambdaWrapper<EdgStorageCageDetails>().selectAll(EdgStorageCageDetails.class).eq(EdgStorageCageDetails::getGlassId, glassId));
            return true;
    public JSONObject queryCurrentCutDrawing(int deviceId, int stationCell) {
//         获取本条线当前正在执行的工程
        Engineering engineering = engineeringMapper.selectOne(new LambdaQueryWrapper<Engineering>()
                .eq(Engineering::getState, 1).eq(Engineering::getStationCell, stationCell));
        if (null == engineering) {
            log.info("当前线路没有需要执行的工程");
            return null;
        }
//            Sql版本
//        List<EdgStorageCageDetails> edgStorageCageDetails = baseMapper.selectList(new QueryWrapper<EdgStorageCageDetails>().eq("glass_id", glassId));
//        if (edgStorageCageDetails.size() == 1) {
//            EdgStorageCageDetails item=edgStorageCageDetails.get(0);
//            item.setState(ControlsId);
//            baseMapper.update(edgStorageCageDetails.get(0), new QueryWrapper<EdgStorageCageDetails>().eq("glass_id", glassId));
//            return true;
//        }
        return false;
        List<EdgStorageCageDetails> edgStorageCageDetailsList = this.list(new LambdaQueryWrapper<EdgStorageCageDetails>()
                .eq(EdgStorageCageDetails::getDeviceId, deviceId)
                .eq(EdgStorageCageDetails::getEngineerId, engineering.getEngineerId())
                .orderByDesc(EdgStorageCageDetails::getId));
        //按照当前工程去理片笼搜最后一块玻璃 获取工程号  版图号 没有直接显示第一张版图
        int patternSequence = 0;
        if (CollectionUtil.isEmpty(edgStorageCageDetailsList)) {
            patternSequence = 1;
        } else {
            EdgStorageCageDetails lastGlass = edgStorageCageDetailsList.get(0);
            log.info("获取最后一块进笼的玻璃为:{}", lastGlass);
            List<CutDrawingVO> drawingVOList = baseMapper.queryCutDrawingByEngineerId(lastGlass.getEngineerId(), lastGlass.getPatternSequence(), 1);
            if (CollectionUtil.isEmpty(drawingVOList)) {
                //无剩余 显示当前版图加1的全量版图
                patternSequence = lastGlass.getPatternSequence() + 1;
            } else {
                //当前版图是否有剩余,有剩余显示当前版图
                patternSequence = lastGlass.getPatternSequence();
            }
        }
        JSONObject jsonObject = new JSONObject();
        List<CutDrawingVO> currentCutDrawings = baseMapper.queryCutDrawingByEngineerId(engineering.getEngineerId(), patternSequence, 0);
        jsonObject.append("currentCutTerritory", currentCutDrawings);
        if (CollectionUtil.isNotEmpty(currentCutDrawings)) {
            jsonObject.append("engineer", engineering.getEngineerId());
            jsonObject.append("sequence", patternSequence);
            UpPattenUsage upPattenUsage = upPattenUsageMapper.selectOne(new LambdaQueryWrapper<UpPattenUsage>()
                    .eq(UpPattenUsage::getEngineeringId, engineering.getEngineerId())
                    .eq(UpPattenUsage::getLayoutSequence, patternSequence));
            jsonObject.append("upPattenUsage", upPattenUsage);
        }
        return jsonObject;
    }
    /**
     * 获取 切割当前版图
     *
     * @return
     */
    @Override
    public List<Map<String, Object>> selectCutTerritory() {
        List<UpPattenUsage> upPattenUsage = upPattenUsageMapper.selectList(new MPJLambdaWrapper<UpPattenUsage>()
                .selectAll(UpPattenUsage.class)
                .eq(UpPattenUsage::getState, 1));
    public Map<String, Object> queryCutDrawingByEngineerId(String engineerId, int patternSequence) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("currentCutDrawing", baseMapper.queryCutDrawingByEngineerId(engineerId, patternSequence, 0));
        List<GlassInfo> glassInfoList = glassInfoService.list(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getEngineerId, engineerId));
        long totalPatternSequence = glassInfoList.stream().map(GlassInfo::getPatternSequence).distinct().count();
        map.put("totalPatternSequence", totalPatternSequence);
        UpPattenUsage upPattenUsage = upPattenUsageMapper.selectOne(new LambdaQueryWrapper<UpPattenUsage>().eq(UpPattenUsage::getEngineeringId, engineerId)
                .eq(UpPattenUsage::getLayoutSequence, patternSequence));
        map.put("upPattenUsage", upPattenUsage);
        return map;
        if (!upPattenUsage.isEmpty()) {
            UpPattenUsage upPattenUsage1 = upPattenUsage.get(0);
            return optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class)
                    .selectAll(OptimizeDetail.class)
                    .selectAs(OptimizeLayout::getWidth, "olWidth")
                    .selectAs(OptimizeLayout::getWidth, "olHeight")
                    .leftJoin(OptimizeLayout.class, on -> on
                            .eq(OptimizeLayout::getProjectNo, OptimizeDetail::getProjectNo)
                            .eq(OptimizeLayout::getStockId, OptimizeDetail::getStockId))
                    .eq(OptimizeDetail::getProjectNo, upPattenUsage1.getEngineeringId())
                    .eq(OptimizeDetail::getStockId, upPattenUsage1.getLayoutSequence())
            );
//            Sql版本
//            return optimizeDetailMapper.selectJoinMaps(new MPJQueryWrapper<OptimizeDetail>().selectAll(OptimizeDetail.class)
//                    .select("ol.width as olwidth","ol.height as olheight")
//                    .leftJoin("optimize_layout ol on t.project_no=ol.project_no and t.stock_id=ol.stock_id")
//                    .eq("t.project_no", upPattenUsage1.getEngineeringId())
//                    .eq("t.stock_id",upPattenUsage1.getLayoutSequence())
//            );
        }
        return null;
    }
    /**
     * 获取 工程下的当前版图
     * 获取 工程下的钢化版图
     *
     * @param current
     * @return
     */
    @Override
    public List<Map<String, Object>> selectCurrentCutTerritory(String current) {
        return optimizeDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeDetail.class)
                .selectAll(OptimizeDetail.class)
                .selectAs(OptimizeLayout::getWidth, "olWidth")
                .selectAs(OptimizeLayout::getWidth, "olHeight")
                .leftJoin(OptimizeLayout.class, on -> on
                        .eq(OptimizeLayout::getProjectNo, OptimizeDetail::getProjectNo)
                        .eq(OptimizeLayout::getStockId, OptimizeDetail::getStockId))
                .eq(OptimizeDetail::getProjectNo, current)
    public List<Map<String, Object>> selectTemperingTerritory(String current) {
        //此工程的所有优化数据
        List<Map<String, Object>> resultCutTerritory = optimizeHeatDetailMapper.selectJoinMaps(JoinWrappers.lambda(OptimizeHeatDetail.class)
                .selectAll(OptimizeHeatDetail.class)
                .selectAs(OptimizeProject::getLoadWidth, "olWidth")
                .selectAs(OptimizeProject::getLoadLength, "olHeight")
                .selectAs(OptimizeHeatLayout::getLayoutRate, "olLayoutRate")
                .leftJoin(OptimizeHeatLayout.class, on -> on
                        .eq(OptimizeHeatLayout::getProjectNo, OptimizeHeatDetail::getProjectNo)
                        .eq(OptimizeHeatLayout::getLayoutId, OptimizeHeatDetail::getLayoutId))
                .leftJoin(OptimizeProject.class, on -> on
                        .eq(OptimizeProject::getProjectNo, OptimizeHeatLayout::getProjectNo))
                .eq(OptimizeHeatDetail::getProjectNo, current)
                .gt(OptimizeHeatDetail::getLayoutId, 0)
        );
//Sql版本
//        return optimizeDetailMapper.selectJoinMaps(new MPJQueryWrapper<OptimizeDetail>().selectAll(OptimizeDetail.class)
//                .select("ol.width as olwidth","ol.height as olheight")
//                .leftJoin("optimize_layout ol on t.project_no=ol.project_no and t.stock_id=ol.stock_id")
//                .eq("t.project_no",current)
//        );
        //这里就是 按版图号分组  [{layout_id:"1",width:200,height:300...},{layout_id:"2",width:300,height:300...}]
        Map<String, List<Map<String, Object>>> groupBy = resultCutTerritory.stream().collect(Collectors.groupingBy(item -> item.get("layout_id").toString()));
        //按版图号排序
        List<Map<String, Object>> result = new ArrayList<>();//返回结果
        for (int i = 1; i <= groupBy.keySet().size(); i++) {
            String key = i + "";
            if (key != null) {
                List<Map<String, Object>> galssInfo = groupBy.get(key);//当前钢化版图内玻璃小片集合
                if (!galssInfo.isEmpty()) {
                    Map<String, Object> item = new HashMap<>();//新格式编排
                    //以下为同层  {key:"groupBy.get(key)",olLayoutRate:"小片集合"}
                    //          {key:"groupBy.get(key)",olLayoutRate:[{},{},{},{}]}
                    item.put("listGlass", groupBy.get(key));
                    item.put("LayoutId", key);
                    item.put("olWidth", galssInfo.get(0).get("olWidth").toString());
                    item.put("olHeight", galssInfo.get(0).get("olHeight").toString());
                    item.put("olLayoutRate", galssInfo.get(0).get("olLayoutRate").toString());
                    result.add(item);
                } else {
                    log.info("当前钢化版图不存在小片数据请检查,版图号:{}" + key);
                    return null;
                }
            }
        }
//        List<List<Map<String, Object>>> result = new ArrayList<>();//返回结果
//
//        for (int i = 1; i <= groupBy.keySet().size(); i++) {
//            String key = i + "";
//            if (key != null) {
//                result.add(groupBy.get(key));
//            }
//        }
        return result;
    }
    /**
@@ -229,22 +289,95 @@
        EdgStorageCageDetails outEdgStorageCageDetails = null;
//        if (queryMaxMinDiff(threshold))
            //todo:逻辑1:获取两条线已出最后一块玻璃在笼内相同尺寸所剩数量,优先走数量少的线
            //todo:需要在卧式理片笼详情表中新增状态,用来表示玻璃进出理片笼情况
            if (oldEdgStorageCageDetails != null && minTemperingLayoutId != null) {
                log.info("按照上一片已出玻璃宽度{},高度{},及版图id区间{}到{}获取出片任务玻璃信息", oldEdgStorageCageDetails.getWidth()
                        , oldEdgStorageCageDetails.getHeight(), minTemperingLayoutId.getTemperingLayoutId(), minTemperingLayoutId.getTemperingLayoutId() + threshold);
                outEdgStorageCageDetails = this.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                        .notIn(CollectionUtils.isNotEmpty(glassIds), EdgStorageCageDetails::getGlassId, glassIds)
                        .eq(EdgStorageCageDetails::getWidth, oldEdgStorageCageDetails.getWidth())
                        .eq(EdgStorageCageDetails::getHeight, oldEdgStorageCageDetails.getHeight())
                        .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId, EdgStorageCageDetails::getTemperingFeedSequence)
                        .last("limit 1"));
                log.info("出片任务的玻璃信息:{}", outEdgStorageCageDetails);
            }
        //todo:逻辑1:获取两条线已出最后一块玻璃在笼内相同尺寸所剩数量,优先走数量少的线
        //todo:需要在卧式理片笼详情表中新增状态,用来表示玻璃进出理片笼情况
        if (oldEdgStorageCageDetails != null && minTemperingLayoutId != null) {
            log.info("按照上一片已出玻璃宽度{},高度{},及版图id区间{}到{}获取出片任务玻璃信息", oldEdgStorageCageDetails.getWidth()
                    , oldEdgStorageCageDetails.getHeight(), minTemperingLayoutId.getTemperingLayoutId(), minTemperingLayoutId.getTemperingLayoutId() + threshold);
            outEdgStorageCageDetails = this.getOne(new LambdaQueryWrapper<EdgStorageCageDetails>()
                    .notIn(CollectionUtils.isNotEmpty(glassIds), EdgStorageCageDetails::getGlassId, glassIds)
                    .eq(EdgStorageCageDetails::getWidth, oldEdgStorageCageDetails.getWidth())
                    .eq(EdgStorageCageDetails::getHeight, oldEdgStorageCageDetails.getHeight())
                    .orderByAsc(EdgStorageCageDetails::getTemperingLayoutId, EdgStorageCageDetails::getTemperingFeedSequence)
                    .last("limit 1"));
            log.info("出片任务的玻璃信息:{}", outEdgStorageCageDetails);
        }
        if (outEdgStorageCageDetails == null) {
            outEdgStorageCageDetails = minTemperingLayoutId;
        }
        return outEdgStorageCageDetails;
    }
    @Override
    public String identControls(DamageRequest request) {
        //将识别破损的玻璃直接加入破损表
        damageService.autoSubmitReport(request.getGlassId(), request.getLine(), request.getWorkingProcedure(), "掰片识别", request.getState());
        return "success";
    }
    @Override
    public String edgReportStatus(DamageRequest request) {
        //将磨边队列破损的玻璃直接加入破损表
        damageService.autoSubmitReport(request.getGlassId(), request.getLine(), request.getWorkingProcedure(), "磨边清洗", request.getState());
        //修改磨边队列数据状态
        edgGlassTaskInfoService.update(new LambdaUpdateWrapper<EdgGlassTaskInfo>()
                .set(EdgGlassTaskInfo::getState, request.getState()).eq(EdgGlassTaskInfo::getGlassId, request.getGlassId()));
        return "success";
    }
    /**
     * 进片  扫码ID验证重复
     *
     * @param glassId
     * @return
     */
    @Override
    public boolean inToVerify(String glassId) {
        List<EdgStorageCageDetails> listEdgStorageCageDetails = baseMapper.selectList(new LambdaQueryWrapper<EdgStorageCageDetails>()
                .eq(EdgStorageCageDetails::getGlassId, glassId)
        );
        if (listEdgStorageCageDetails.isEmpty()) {
            //说明此玻璃没有进过理片
            return true;
        } else {
            List<Damage> damage = damageService.list(new LambdaQueryWrapper<Damage>()
                    .eq(Damage::getGlassId, glassId)
                    .and(wrapper -> wrapper.eq(Damage::getType, 8).or().eq(Damage::getType, 9))
            );
            if (!damage.isEmpty()) {
                return true;
            }
        }
        return false;
    }
    @Override
    public EdgStorageCageDetails queryEdgStorageDetailsBySize(int deviceId, int currentSlot, double width, double height, int cell, int maxThickness) {
        return baseMapper.queryEdgStorageDetailsBySize(deviceId, currentSlot, width, height, cell, maxThickness);
    }
    @Override
    public EdgStorageCageDetails queryEdgStorageDetailsByLimitSize(int deviceId, Integer currentCell, double width, double height, int cell, int minOneFirstLength, int minOneSecondLength, int maxTwoFirstLength, int maxTwoSecondLength, int maxThickness) {
        return baseMapper.queryEdgStorageDetailsByLimitSize(deviceId, currentCell, width, height, cell, minOneFirstLength, minOneSecondLength, maxTwoFirstLength, maxTwoSecondLength, maxThickness);
    }
    @Override
    public String edgDetailsOperate(DamageRequest request) {
        //卧式理片笼爆破损
        damageService.autoSubmitReport(request.getGlassId(), request.getLine(), request.getWorkingProcedure(), "卧式理片笼", request.getState());
        this.remove(new LambdaQueryWrapper<EdgStorageCageDetails>().eq(EdgStorageCageDetails::getGlassId, request.getGlassId()));
        return "success";
    }
    @Override
    public List<EdgSlotRemainVO> querySlotRemainWidth(int cellLength, int glassGap) {
        return this.baseMapper.querySlotRemainWidth(cellLength, glassGap);
    }
    @Override
    public List<PieChartVO> queryPieChart() {
        return this.baseMapper.queryPieChart();
    }
}