自动化立体仓库 - WMS系统
#
18516761980
2021-09-18 a7b476eaa50abb7cdebf691cc232c26926ee1328
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
package com.zy.asrs.service.impl;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.FullStoreParam;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.VersionUtils;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.service.CommonService;
import com.zy.ints.entity.WaitMatin;
import com.zy.ints.service.WaitMatinService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
 
@Service
public class MatStoreServiceImpl implements MatStoreService {
 
    // 工作号生成规则默认类型
    private static final int DEFAULT_WORK_NO_TYPE = 0;
    // 库位排号分配默认类别
    private static final int DEFAULT_ROW_NO_TYPE = 1;
 
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private BasDevpService basDevpService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private MatCodeService matCodeService;
    @Autowired
    private WaitMatinService matinService;
 
    @Override
    @Transactional
    public String startupFullStore(FullStoreParam param, Long userId) {
        // 参数非空判断
        if (Cools.isEmpty(param.getDevpNo(), param.getList())) {
            throw new CoolException(BaseRes.PARAM);
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getDevpNo(), true);
        // 生成工作号
        int workNo = commonService.getWorkNo(DEFAULT_WORK_NO_TYPE);
        // 检索库位
        List<String> matNos = param.getList().stream().map(FullStoreParam.MatCodeStore::getMatNo).distinct().collect(Collectors.toList());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
        locTypeDto.setLocType1((short) 1);
        StartupDto startupDtodto = commonService.getLocNo(DEFAULT_ROW_NO_TYPE, 1, param.getDevpNo(),false, matNos,locTypeDto, 0);
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setWrkSts(1L); // 工作状态:生成入库ID
        wrkMast.setIoType(1); // 入出库状态:1.入库
        wrkMast.setIoPri(13D); // 优先级:10
        wrkMast.setCrnNo(startupDtodto.getCrnNo());
        wrkMast.setSourceStaNo(startupDtodto.getSourceStaNo());
        wrkMast.setStaNo(startupDtodto.getStaNo());
        wrkMast.setLocNo(startupDtodto.getLocNo());
        wrkMast.setBarcode(param.getBarcode()); // 托盘码
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeUser(userId);
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(new Date());
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作主档失败");
        }
        // 生成工作档明细
        List<MatCodeCountDto> matDtos = new ArrayList<>();
        param.getList().forEach(elem -> {
            matDtos.add(new MatCodeCountDto(elem.getBillNo(),elem.getSeqNo(),elem.getMatNo(), elem.getCount()));
        });
        for (MatCodeCountDto dto : matDtos) {
            MatCode matCode = matCodeService.selectById(dto.getMatNo());
            if (Cools.isEmpty(matCode)){
                throw new CoolException("产品编码数据为空");
            }
            // 保持工作档明细
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setIoTime(new Date());
            wrkDetl.setBillNo(dto.getBillNo());
            wrkDetl.setSeqNo(dto.getSeqNo());
            wrkDetl.setQty(dto.getCount()); // 数量
            VersionUtils.setWrkDetl(wrkDetl, matCode); // 版本控制
            wrkDetl.setZpallet(param.getBarcode()); // 托盘条码
            wrkDetl.setAppeUser(userId);
            wrkDetl.setAppeTime(new Date());
            wrkDetl.setModiUser(userId);
            wrkDetl.setModiTime(new Date());
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细档失败");
            }
            else {
                //更新入库通知档
                WaitMatin waitMatin = matinService.selectOne(new EntityWrapper<WaitMatin>().eq("bill_no",dto.getBillNo()).eq("seq_no",dto.getSeqNo()));
                if(dto.getCount() > (waitMatin.getQty() - waitMatin.getInQty())){
                    throw new CoolException("入库数量超过了可入库量");
                }
                waitMatin.setIoStatus(1);//入库中
                waitMatin.setInQty(waitMatin.getInQty()+dto.getCount()); //已入库量
                waitMatin.setModiTime(new Date());
                if(!matinService.update(waitMatin,new EntityWrapper<WaitMatin>().eq("bill_no",dto.getBillNo()).eq("seq_no",dto.getSeqNo()))){
                    throw new CoolException("更新入库通知档失败");
                }
            }
        }
//        wrkDetlService.createWorkDetail(workNo, matDtos, param.getBarcode(), userId);
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiUser(userId);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)){
            throw new CoolException("更新源站失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(startupDtodto.getLocNo());
        if (locMast.getLocSts().equals("O")){
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiUser(userId);
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)){
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(startupDtodto.getLocNo()+"目标库位已被占用");
        }
        return startupDtodto.getLocNo();
    }
}