mrzhssss
2021-12-07 591c676bdd4a3f016fe060e69ff3c1711043bdd0
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
200
201
202
203
204
205
206
207
208
209
210
package zy.cloud.wms.common.service;
 
import com.core.common.Cools;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import zy.cloud.wms.common.config.CodeCoolException;
import zy.cloud.wms.common.model.MatnrDto;
import zy.cloud.wms.common.model.OrderStoDto;
import zy.cloud.wms.common.service.asrs.AsrsService;
import zy.cloud.wms.common.service.asrs.entity.Result;
import zy.cloud.wms.common.service.asrs.entity.Result1;
import zy.cloud.wms.common.utils.VersionUtils;
import zy.cloud.wms.manager.entity.*;
import zy.cloud.wms.manager.entity.param.StockTransferParam;
import zy.cloud.wms.manager.entity.result.PakoutVo;
import zy.cloud.wms.manager.service.LocDetlService;
import zy.cloud.wms.manager.service.MatService;
import zy.cloud.wms.manager.service.OrderService;
import zy.cloud.wms.manager.service.PakoutService;
 
import java.util.*;
 
/**
 * Created by vincent on 2021/3/1
 */
@Slf4j
@Service("mainService")
public class MainService {
 
    @Autowired
    private MatService matService;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private PakoutService pakoutService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private OrderService orderService;
    @Autowired
    private AsrsService asrsService;
 
    @Transactional
    public List<StoPreTab> stockOutPreview(OrderStoDto orderStoDto) {
        if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) {
            throw new CoolException("数据异常,请联系管理员");
        }
        List<StoPreTab> res = new ArrayList<>();
        // 检查库存是否足够
        List<StockTransferParam> transferParams = locDetlService.checkLocDetlCountOfRes(orderStoDto.getDtos());
        if (!Cools.isEmpty(transferParams)) {
            // 查看立库库存
            Result result = asrsService.stockTransferPrew(transferParams);
            if (result.getCode() == 500) {
                throw new CodeCoolException("20001-" + String.valueOf(result.getMsg()));
            }
            if (result.getCode() == 200) {
                res = (List<StoPreTab>) result.getData();
            }
        }
 
        for (MatnrDto matnrDto : orderStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!");
            }
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(mat.getMatnr());
            double issued = Optional.ofNullable(matnrDto.getCount()).orElse(0.0D) ;
            double anfme = issued;
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    // 视图对象
                    StoPreTab tab = new StoPreTab();
                    tab.setTitle(mat.getMatnr() + "(" + mat.getMaktx() + ")");
                    tab.setMatnr(mat.getMatnr());
                    tab.setMaktx(mat.getMaktx());
                    tab.setAnfme(anfme);
 
                    tab.setLocNo(locDetl.getLocNo());
                    tab.setNodeId(locDetl.getNodeId());
                    tab.setTotal(locDetl.getAnfme());
                    tab.setReduce(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued);
                    tab.setRemQty(tab.getTotal() - tab.getReduce());
                    tab.setPrior(locDetlService.isPrior(locDetl.getNodeId(), mat.getMatnr()));
                    tab.setPrior$(tab.getPrior()?"✔":"×");
                    tab.setType(1);
                    res.add(tab);
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                }
            }
 
        }
        res.sort(new Comparator<StoPreTab>() {
            @Override
            public int compare(StoPreTab o1, StoPreTab o2) {
//                return o1.getMatnr().length() - o2.getMatnr().length();
                return (int) (o1.getAnfme() - o2.getAnfme());
            }
        });
        return res;
    }
 
    @Transactional
    public void stockOutProcess(OrderStoDto orderStoDto) {
        if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) {
            return;
        }
        Order order = orderService.selectByOrderNo(orderStoDto.getOrderNo());
        if (order == null) {
            throw new CoolException(orderStoDto.getOrderNo() + "单据不存在");
        }
        Date now = new Date();
        // 检查库存是否足够
        List<StockTransferParam> transferParams = locDetlService.checkLocDetlCountOfRes(orderStoDto.getDtos());
        if (!Cools.isEmpty(transferParams)) {
            // 查看立库库存
            Result1 result = asrsService.stockTransfer(transferParams);
            if (result.getCode() == 500) {
                if (Cools.isEmpty(result.getData())) {
                    throw new CoolException(result.getMsg());
                } else {
                    throw new CodeCoolException("20001-" + result.getData());
                }
            }
            if (result.getCode() == 200) {
                for (PakoutVo vo : result.getData()) {
                    // 判断物料是否存在
                    Mat mat = matService.selectByMatnr(vo.getMatnr());
                    if (null == mat) {
                        throw new CoolException(vo.getMatnr() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!");
                    }
                    Pakout pakout = new Pakout();
                    pakout.setWrkSts(1L);
                    pakout.setAnfme(vo.getAnfme());
                    pakout.setZpallet(vo.getZpallet());
                    pakout.setLocNo(vo.getLocNo());
                    pakout.setNodeId(-1L);
                    pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId()));
                    VersionUtils.setPakout(pakout, mat);
                    pakout.setDocId(order.getDocType()); // 单据类型
                    pakout.setDocNum(order.getOrderNo());    // 单据编号
                    pakout.setCreateTime(now);
                    pakout.setUpdateTime(now);
                    pakout.setStatus(1);
                    if (!pakoutService.insert(pakout)) {
                        throw new CoolException("保存出库通知单失败");
                    }
                }
 
            }
        }
 
        for (MatnrDto matnrDto : orderStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + matnrDto.getCount() +"单据因此中断!");
            }
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(mat.getMatnr());
            double issued = Optional.ofNullable(matnrDto.getCount()).orElse(0.0D) ;
            for (LocDetl locDetl : locDetls) {
               if (issued > 0) {
                    // 保存出库通知单
                    Pakout pakout = new Pakout();
                    pakout.setWrkSts(1L);
                    pakout.setAnfme(issued>=locDetl.getAnfme()?locDetl.getAnfme():issued);
                    pakout.setZpallet(locDetl.getZpallet());
                    pakout.setLocNo(locDetl.getLocNo());
                    pakout.setNodeId(locDetl.getNodeId());
                    pakout.setWrkNo(String.valueOf(snowflakeIdWorker.nextId()));
                    VersionUtils.setPakout(pakout, mat);
                    pakout.setDocId(order.getDocType()); // 单据类型
                    pakout.setDocNum(order.getOrderNo());    // 单据编号
                    pakout.setCreateTime(now);
                    pakout.setUpdateTime(now);
                    pakout.setStatus(1);
                    if (!pakoutService.insert(pakout)) {
                        throw new CoolException("保存出库通知单失败");
                    }
                    if (issued>=locDetl.getAnfme()) {
//                        // 删除库存明细
//                        if (!locDetlService.removeStock(locDetl.getNodeId(), mat.getMatnr())) {
//                            throw new CoolException("删除库存明细失败");
//                        }
                    } else {
//                        // 修改库存明细数量
//                        if (!locDetlService.reduceStock(locDetl.getNodeId(), mat.getMatnr(), issued)) {
//                            throw new CoolException("修改库存明细数量失败");
//                        }
                    }
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
                }
            }
            // 修改单据状态
            if (!orderService.updateSettle(orderStoDto.getOrderNo(), 2L)) {
                throw new CoolException("修改单据状态失败");
            }
        }
    }
 
}