自动化立体仓库 - WMS系统
野心家
2 天以前 c3e47e5e70a9055b7d25c118eb1f7ec3c869e953
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
package com.zy.asrs.task;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.StaDescService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.service.impl.LocDetlServiceImpl;
import com.zy.asrs.service.impl.LocMastServiceImpl;
import com.zy.asrs.task.handler.AutomaticLibraryTransferHandler;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.util.Date;
import java.util.List;
 
@Component
public class AutomaticOutboundShipment {
    @Autowired
    private ConfigService configService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private AutomaticLibraryTransferHandler automaticLibraryTransferHandler;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private LocDetlServiceImpl locDetlService;
    @Autowired
    private LocMastServiceImpl locMastService;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private WrkDetlService wrkDetlService;
 
    /**
     * 自动出满托
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    private void execute(){
        Config config = configService.selectConfigByCode("AutomaticOutboundShipment");
        if(config.getStatus()==0){
            return;
        }
        WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("sta_no",200));
        if(!Cools.isEmpty(wrkMast1)){
            return;
        }
        BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no", 200));
        if (Cools.isEmpty(basDevp.getLoading())||basDevp.getLoading().equals("N")) {
            //找到入库最早的
            List<LocDetl> locDetlss = locDetlService.selectList(new EntityWrapper<LocDetl>().orderBy("appe_time"));
            LocMast locMastIoTime=new LocMast();
            for (LocDetl locDetl : locDetlss) {
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
                if(!Cools.isEmpty(locMast)&&locMast.getLocSts().equals("F")){
                    locMastIoTime=locMast;
                    break;
                }
            }
//            LocMast locMastIoTime=locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "F").orderBy("io_time"));
            //最早入库的可能不是最靠近出库口的,所以需要再去找这层最靠近出库口的货
            LocMast locMast =locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "F").eq("lev1",locMastIoTime.getLev1()).orderBy("bay1",false));
 
            boolean res1 = false;
            List<LocMast> locMasts = locMastService.selectList(new EntityWrapper<LocMast>()
                    .eq("lev1", locMast.getLev1())
                    .orderBy("bay1", res1));
            for (LocMast locMast1 : locMasts) {
                if (locMast1.getLocNo().equals(locMast.getLocNo())) {
                    break;
                }
                if (locMast1.getLocSts().equals("D") || locMast1.getLocSts().equals("F")) {
                    throw new CoolException(locMast.getLocNo() + "库位堵塞,禁止出库");
                }else if(!locMast1.getLocSts().equals("O")){
                    return;
                }
            }
            // 获取源站
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", 101)
                    .eq("stn_no", 200)
                    .eq("crn_no", locMast.getCrnNo());
            StaDesc staDesc = staDescService.selectOne(wrapper);
            if (Cools.isEmpty(staDesc)) {
                throw new CoolException("检索源站失败");
            }
            Date now = new Date();
 
            List<LocDetl> locDetls=locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
 
            if(Cools.isEmpty(locDetls)){
                throw new CoolException("库存明细为空---locNo:"+locMast.getLocNo());
            }
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(101));
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(0L); // 工作状态:0.待接收
            wrkMast.setIoType(101); // 入出库状态
            wrkMast.setIoPri(15D); // 优先级:15
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
            wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
            wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(9945L); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(9945L);
            wrkMast.setModiTime(now);
            if (!wrkMastService.insert(wrkMast)) {
                throw new CoolException("保存工作档失败,出库库位号:"+locMast.getLocNo());
            }
            // 生成工作档明细
            for (LocDetl l : locDetls) {
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(l);
                wrkDetl.setOrderNo(""); // 手动出库不需要带出库存中的单据编号
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(now);
                wrkDetl.setAnfme(l.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(9945L);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(9945L);
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(locMast.getLocNo());
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts("R");
                locMast.setModiUser(9945L);
                locMast.setModiTime(now);
                if (!locMastService.updateById(locMast)) {
                    throw new CoolException("预约库位状态失败,库位号:"+locMast.getLocNo());
                }
            } else {
                throw new CoolException(locMast.getLocNo() + "库位不是在库状态");
            }
        }
    }
}