自动化立体仓库 - WMS系统
dubin
2 天以前 6c8588d5f7f0de7e9489426c350472bf911a4933
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
package com.zy.asrs.task.handler;
 
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.*;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
 
@Component
@Slf4j
public class CreateOutTask {
    @Value("${wcs.address.URL}")
    private String addrs;
    @Value("${wcs.address.createOutTask}")
    private String outTask;
    @Value("${wcs.address.createLocMoveTask}")
    private String locMoveTask;
    @Value("${wcs.address.devicesStatus}")
    private String devicesStatus;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private WrkDetlService wrkDetlService;
 
    @Scheduled(cron = "0/10 * * * * ? ")
    @Transactional
    public void outTask(){
        //调用wcs接口获取设备状态
        String statusResponse = "";
        try {
            statusResponse = new HttpHandler.Builder()
                    .setUri(addrs)
                    .setPath(devicesStatus)
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(statusResponse);
            if (jsonObject.get("code").equals(200)){
                log.info("设备正常");
            }
        }catch (Exception e){
            log.error("设备异常");
        }
        log.info("开始调用WCS接口,派发出库/移库任务");
        Date now = new Date();
        boolean flag= false;
        List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>().eq("loc_sts", "F"));
        List<Integer> outSitelist = new ArrayList<>();
        outSitelist.add(1152);
        outSitelist.add(1169);
        outSitelist.add(1177);
        LocMast shallowLocMast = new LocMast();
        for (LocMast locMast : locMasts) {
        //判断库位是否有出库任务
        if (!Cools.isEmpty(wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("source_loc_no",locMast.getLocNo())))){
            continue;
        }
            //判断是否是深库位 触发移库任务
            if (Utils.isDeepLoc(locMast.getLocNo())) {
                String deepLoc = locMast.getLocNo();
                String shallowLocNo = Utils.getShallowLocNo(deepLoc);
                shallowLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLocNo));
                if (shallowLocMast.getLocSts().equals("F") || shallowLocMast.getLocSts().equals("D")) {
                    flag = true;
                }
            }
            int outSite = ThreadLocalRandom.current().nextInt(0, outSitelist.size());
            List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
            // 目标站点状态检测
            int workNo = commonService.getWorkNo(2);
            //生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(flag ? 11 : 101); // 入出库状态
            wrkMast.setIoPri(flag ? 20D : 15D); // 优先级
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setStaNo(outSitelist.get(outSite)); // 目标站
            wrkMast.setSourceLocNo(flag ? shallowLocMast.getLocNo() : locMast.getLocNo()); // 源库位
            wrkMast.setLocNo(flag ? getMoveLocNo(locMast.getLocNo()) : ""); //目标库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(9527L); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(9527l);
            wrkMast.setModiTime(now);
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:" + locMast.getLocNo());
            }
            // 生成工作档明细
                for (LocDetl locDetl : locDetlList) {
                    if (locDetl.getAnfme() == null || locDetl.getAnfme() <= 0.0D) {
                        continue;
                    }
                    WrkDetl wrkDetl = new WrkDetl();
                    wrkDetl.sync(locDetl);
                    wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号
                    wrkDetl.setWrkNo(workNo);
                    wrkDetl.setIoTime(now);
                    Double anfme = locDetl.getAnfme();
                    wrkDetl.setAnfme(anfme); // 数量
                    wrkDetl.setAppeTime(now);
                    wrkDetl.setAppeUser(9527L);
                    wrkDetl.setModiTime(now);
                    wrkDetl.setModiUser(9527L);
                    if (!wrkDetlService.insert(wrkDetl)) {
                        throw new CoolException("保存工作档明细失败");
                    }
                }
                String response = "";
                StartupDto startupDto = new StartupDto();
                startupDto.setTaskNo(wrkMast.getWrkNo());
                startupDto.setStaNo(wrkMast.getStaNo());
                startupDto.setLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo()));
                startupDto.setTaskPri(wrkMast.getIoPri());
                flag = false;
                try {
                    response = new HttpHandler.Builder()
                            .setUri(addrs)
                            .setPath(flag ? locMoveTask : outTask)
                            .setJson(JSON.toJSONString(startupDto))
                            .build()
                            .doPost();
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.get("code").equals(200)) {
                        wrkMast.setWrkSts(12L);
                        if (!wrkMastService.updateById(wrkMast)) {
                            throw new CoolException("工作档状态修改失败,工作号:{}" + wrkMast.getWrkNo());
                        }
                        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
                        locMast = locMastService.selectById(flag?shallowLocMast.getLocNo():locMast.getLocNo());
                        if (locMast.getLocSts().equals("F")) {
                            locMast.setLocSts("R");
                            locMast.setModiUser(9527L);
                            locMast.setModiTime(now);
                            if (!locMastService.updateById(locMast)) {
                                throw new CoolException("预约库位状态失败,库位号:" + locMast.getLocNo());
                            }
                        } else {
                            throw new CoolException(locMast.getLocNo() + "库位不是在库状态");
                        }
                        log.info("出库/移库任务派发成功");
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                }
        }
    }
 
    //移库任务找空库位 深库位
    public String getMoveLocNo(String locNo){
        LocMast targetLocMast = new LocMast();
        int deepRow = Utils.getRow(locNo);
        //先找深库位这一排还有没有空位库
        targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow));
        if (targetLocMast == null){
            targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 3));
 
        }
        if (targetLocMast == null){
            targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 1));
 
        }
        if (targetLocMast == null){
            targetLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("row1", deepRow + 2));
 
        }
        return targetLocMast.getLocNo();
    }
}