自动化立体仓库 - WMS系统
skyouc
2 天以前 61eb8dfa4ff44b539d9dd03205705270ba6e1fa7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
package com.zy.api.service.impl;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.api.controller.params.ReceviceTaskParams;
import com.zy.api.service.HmesApiService;
import com.zy.api.service.WcsApiService;
import com.zy.asrs.entity.BasDevice;
import com.zy.asrs.entity.LocAroundBind;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.service.BasDeviceService;
import com.zy.asrs.service.LocAroundBindService;
import com.zy.asrs.service.LocMastService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
 
@Service
public class HmesApiServiceImpl implements HmesApiService {
 
    @Autowired
    private BasDeviceService basDeviceService;
 
    @Autowired
    private LocAroundBindService locAroundBindService;
 
    @Autowired
    private LocMastService locMastService;
 
    @Autowired
    private WcsApiService wcsApiService;
    /**
     * 接收MES穿线任务
     * @author Ryan
     * @date 2026/1/10 10:54
     * @param params
     * @return com.core.common.R
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R pubWorkTask(ReceviceTaskParams params) {
        if (Objects.isNull(params) || Objects.isNull(params.getDeviceNo())) {
            return R.error("参数不能为空!!");
        }
        BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>()
                .eq("status", 1)
                .eq("dev_no", params.getDeviceNo()));
        if (Objects.isNull(basDevice)) {
            throw new CoolException("机台信息不存在或已禁用!!");
        }
        List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>().eq("dev_no", basDevice.getDevNo()));
        if (Objects.isNull(binds) || binds.isEmpty()) {
            throw new CoolException("机台未绑定工作站台!!");
        }
        Set<String> locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
 
        LocMast locMasts = locMastService.selectOne(new EntityWrapper<LocMast>()
                .in("loc_no", locs)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_F.type)
                .orderAsc(Arrays.asList("loc_no"))
                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
 
        if (Objects.isNull(locMasts)) {
            throw new CoolException("未查到可工作线轴!!");
        }
 
        //todo 锁库位需WCS锁定(相关库位,不可执行任务操作,不能只在WMS锁定)
        List<LocMast> locMs = locMastService.selectList(new EntityWrapper<LocMast>()
                .in("loc_no", locs)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type));
        locMs.forEach(loc -> {
            loc.setLocSts(LocStsType.LOC_STS_TYPE_X.type);
            if (!locMastService.updateById(loc)) {
                throw new CoolException("工作台周边库位禁用失败,不可执行穿线操作!!");
            }
        });
 
        return R.ok("可执行穿线动作!!");
    }
 
    /**
     * 穿线完成,释放机台周边库位
     * @author Ryan
     * @date 2026/1/10 11:07
     * @param params
     * @return com.core.common.R
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R releaseLock(ReceviceTaskParams params) {
        if (Objects.isNull(params) || Objects.isNull(params.getDeviceNo())) {
            return R.error("参数不能为空!!");
        }
        BasDevice basDevice = basDeviceService.selectOne(new EntityWrapper<BasDevice>()
                .eq("status", 1)
                .eq("dev_no", params.getDeviceNo()));
        if (Objects.isNull(basDevice)) {
            throw new CoolException("机台信息不存在或已禁用!!");
        }
        List<LocAroundBind> binds = locAroundBindService.selectList(new EntityWrapper<LocAroundBind>().eq("dev_no", basDevice.getDevNo()));
        if (Objects.isNull(binds) || binds.isEmpty()) {
            throw new CoolException("机台未绑定工作站台!!");
        }
        Set<String> locs = binds.stream().map(LocAroundBind::getBLocNo).collect(Collectors.toSet());
 
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().in("loc_no", locs).eq("loc_sts", LocStsType.LOC_STS_TYPE_X.type));
        if (Objects.isNull(locMasts) || locMasts.isEmpty()) {
            throw new CoolException("没有禁用库位,不需要释放!!");
        }
 
        locMasts.forEach(loc -> {
           loc.setLocSts(LocStsType.LOC_STS_TYPE_O.type);
           if (!locMastService.updateById(loc)) {
               throw new CoolException("库位释放失败,请检查后再操作!!");
           }
        });
 
        wcsApiService.reportLockLocs(locs, "lock");
 
        return R.ok("释放成功 !!");
    }
}