#
Junjie
2025-11-17 1c5fb21749a5c6e0bce0fa8a839434a99fefe618
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -1,162 +1,74 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.BasMap;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.WaitPakinMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.common.model.StartupDto;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.SlaveType;
import com.zy.core.model.DevpSlave;
import com.zy.core.model.Task;
import com.zy.core.model.protocol.StaProtocol;
import com.zy.core.properties.SlaveProperties;
import com.zy.core.thread.BarcodeThread;
import com.zy.core.thread.DevpThread;
import com.zy.asrs.service.BasMapService;
import com.zy.asrs.utils.Utils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.enums.MapNodeType;
import com.zy.core.enums.RedisKeyType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/8/6
 * 立体仓库WCS系统主流程业务
 */
@Slf4j
@Service("mainService")
public class MainServiceImpl {
    @Autowired
    private CommonService commonService;
    private BasMapService basMapService;
    @Autowired
    private SlaveProperties slaveProperties;
    @Autowired
    private WrkMastMapper wrkMastMapper;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private WaitPakinMapper waitPakinMapper;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private JdbcTemplate jdbcTemplate;
    private RedisUtil redisUtil;
    /**
     * 入库站,根据条码扫描生成入库工作档,工作状态 2
     */
    @Transactional
    public void generateStoreWrkFile() {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                // 获取条码
                BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                String barcode = barcodeThread.getBarcode();
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                // 判断是否满足入库条件
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInreq1()
                        && !staProtocol.isEmptyMk() && staProtocol.isInreq1() && staProtocol.getWorkNO() ==0
                        && staProtocol.isPakMk() && !Cools.isEmpty(barcode)) {
                    // 判断重复工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakInStep1(inSta.getStaNo(), barcode);
                    if (wrkMast != null) {
                        log.warn("工作档中已存在该站状态为1的数据,工作号-{}", wrkMast.getWrkNo());
                        continue;
                    }
                    // 获取入库通知档
                    List<WaitPakin> waitPakins = waitPakinMapper.selectList(new EntityWrapper<WaitPakin>().eq("barcode", barcode));
                    // 工作号
                    int workNo = commonService.getWorkNo(0);
                    // 检索库位
                    List<String> matNos = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
                    StartupDto startupDto = commonService.getLocNo(1, 1, inSta.getStaNo(), matNos);
                    String locNo = startupDto.getLocNo();
                    if (!waitPakins.isEmpty()) {
                        // 插入工作明细档
                        wrkDetlService.createWorkDetail(workNo, waitPakins, barcode);
                    } else {
                        log.warn("无此入库条码数据---{}", barcode);
                        continue;
                    }
    //初始化库位地图数据结构
    public void initLocMap() {
        Object object = redisUtil.get(RedisKeyType.LOC_MAP_BASE.key);
        if (object != null) {
            return;
        }
                    // 插入工作主档
                    wrkMast = new WrkMast();
                    wrkMast.setWrkNo(workNo);
                    wrkMast.setIoTime(new Date());
                    wrkMast.setWrkSts(2L); // 工作状态:2.设备上走
                    wrkMast.setIoType(1); // 入出库状态:1.入库
                    wrkMast.setIoPri(10D); // 优先级:10
                    wrkMast.setCrnNo(startupDto.getCrnNo());
                    wrkMast.setSourceStaNo(startupDto.getSourceStaNo());
                    wrkMast.setStaNo(startupDto.getStaNo());
                    wrkMast.setLocNo(startupDto.getLocNo());
                    wrkMast.setBarcode(barcode); // 托盘码
                    wrkMast.setFullPlt("Y"); // 满板:Y
                    wrkMast.setPicking("N"); // 拣料
                    wrkMast.setExitMk("N"); // 退出
                    wrkMast.setEmptyMk("N"); // 空板
                    wrkMast.setLinkMis("N");
//                    wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
                    // 操作人员数据
                    wrkMast.setAppeTime(new Date());
                    wrkMast.setModiTime(new Date());
                    Integer insert = wrkMastMapper.insert(wrkMast);
                    if (insert == 0) {
                        throw new CoolException("保存工作档失败");
                    }
                    // 更新目标库位状态
                    LocMast locMast = locMastService.selectById(startupDto.getLocNo());
                    locMast.setLocSts("S"); // S.入库预约
                    locMast.setModiTime(new Date());
                    if (!locMastService.updateById(locMast)){
                        throw new CoolException("改变库位状态失败");
                    }
        BasMap basMap = basMapService.selectOne(new EntityWrapper<BasMap>().eq("lev", 1));
        if (Cools.isEmpty(basMap)){
            //缺少初始化库位地图
            return;
        }
                    // 更新站点信息 且 下发plc命令
                    barcodeThread.setBarcode("");
                    staProtocol.setWorkNO(workNo);
                    staProtocol.setStaNo(startupDto.getStaNo());
                    staProtocol.setPakMk(false);
                    staProtocol.setInreq1(false);
                    boolean result = MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task<>(4, staProtocol));
                    if (!result) {
                        throw new CoolException("更新plc站点信息失败");
                    }
        List<List<JSONObject>> dataList = JSON.parseObject(basMap.getData(), List.class);
        List<List<HashMap<String, Object>>> mapNodeList = new ArrayList<>();
        for (int i = 0; i < dataList.size(); i++) {
            List<JSONObject> row = dataList.get(i);
            List<HashMap<String, Object>> mapNodeRow = new ArrayList<>();
            for (int j = 0; j < row.size(); j++) {
                JSONObject map = row.get(j);
                HashMap<String, Object> mapNode = new HashMap<>();
                mapNode.put("id", i + "-" + j);
                String nodeType = map.getString("type");
                if("shelf".equals(nodeType)) {
                    mapNode.put("value", MapNodeType.NORMAL_PATH.id);
                }else {
                    mapNode.put("value", MapNodeType.DISABLE.id);
                }
                mapNodeRow.add(mapNode);
            }
            mapNodeList.add(mapNodeRow);
        }
    }
    /**
     * 拣料、并板、盘点再入库
     */
    public void stnToCrnStnPick(){
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickSta()) {
            }
        }
        redisUtil.set(RedisKeyType.LOC_MAP_BASE.key, mapNodeList);
    }
}