luxiaotao1123
2021-11-17 85d878b12d6988ca2275d60e7da0ec31814f8fc8
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
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.model.MatnrDto;
import zy.cloud.wms.common.model.OrderStoDto;
import zy.cloud.wms.common.utils.VersionUtils;
import zy.cloud.wms.manager.entity.*;
import zy.cloud.wms.manager.service.*;
 
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;
 
    @Transactional
    public List<StoPreTab> stockOutPreview(OrderStoDto orderStoDto, Long hostId) {
        if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) {
            throw new CoolException("数据异常,请联系管理员");
        }
        List<StoPreTab> res = new ArrayList<>();
        // 检查库存是否足够
//        locDetlService.checkLocDetlCount(orderStoDto.getDtos());
 
        for (MatnrDto matnrDto : orderStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(hostId, matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + orderStoDto.getOrderNo() +"单据因此中断!");
            }
 
            Double sumAnfme = Optional.ofNullable(locDetlService.selectCountByMatnr(mat.getMatnr(), hostId)).orElse(0.0D);
            double lack = 0.0D;
            // 缺货
            if (sumAnfme < matnrDto.getCount()) {
                lack = matnrDto.getCount() - sumAnfme;
                // 视图对象
                StoPreTab tab = new StoPreTab();
                tab.setTitle(mat.getMaktx() + "(" + mat.getMatnr() + ")");
                tab.setMatnr(mat.getMatnr());
                tab.setMaktx(mat.getMaktx());
                tab.setAnfme(matnrDto.getCount());
                tab.setLocNo("缺货");
                tab.setTotal(lack);
                tab.setReduce(lack);
                tab.setRemQty(0.0D);
                tab.setPrior(false);
                tab.setPrior$("×");
                tab.setType(0);
                res.add(tab);
            }
 
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(hostId, mat.getMatnr());
            double issued = Optional.of(matnrDto.getCount() - lack).orElse(0.0D) ;
            double anfme = issued;
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    // 视图对象
                    StoPreTab tab = new StoPreTab();
                    tab.setTitle(mat.getMaktx() + "(" + mat.getMatnr() + ")");
                    tab.setMatnr(mat.getMatnr());
                    tab.setMaktx(mat.getMaktx());
                    tab.setAnfme(matnrDto.getCount());
 
                    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, Long hostId) {
        if (Cools.isEmpty(orderStoDto) || Cools.isEmpty(orderStoDto.getDtos())) {
            return;
        }
        Order order = orderService.selectByOrderNo(orderStoDto.getOrderNo(), hostId);
        if (order == null) {
            throw new CoolException(orderStoDto.getOrderNo() + "单据不存在");
        }
        Date now = new Date();
        // 检查库存是否足够
        locDetlService.checkLocDetlCount(orderStoDto.getDtos(), hostId);
 
        for (MatnrDto matnrDto : orderStoDto.getDtos()) {
            // 判断物料是否存在
            Mat mat = matService.selectByMatnr(hostId, matnrDto.getMatnr());
            if (null == mat) {
                throw new CoolException(matnrDto.getMatnr() + "物料尚未更新。" + matnrDto.getCount() +"单据因此中断!");
            }
            // 查询存有当前物料的货位
            List<LocDetl> locDetls = locDetlService.findOfSort(hostId, mat.getMatnr());
            double issued = Optional.ofNullable(matnrDto.getCount()).orElse(0.0D) ;
            for (LocDetl locDetl : locDetls) {
               if (issued > 0) {
                    // 保存出库通知单
                    Pakout pakout = new Pakout();
                    pakout.setHostId(hostId);
                    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, hostId)) {
                throw new CoolException("修改单据状态失败");
            }
        }
    }
 
}