Blame view

src/main/java/com/huaheng/api/general/service/ReceiptContainerApiService.java 20.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package com.huaheng.api.general.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.api.general.domain.ReceiptDomain;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.exception.service.ServiceException;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.pc.config.container.domain.Container;
import com.huaheng.pc.config.container.service.ContainerService;
import com.huaheng.pc.config.location.domain.Location;
import com.huaheng.pc.config.location.service.LocationService;
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
17
import com.huaheng.pc.inventory.inventoryDetail.service.InventoryDetailService;
18
19
20
21
22
23
24
25
26
27
28
29
30
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.receipt.receiptContainerDetail.service.ReceiptContainerDetailService;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerHeader;
import com.huaheng.pc.receipt.receiptContainerHeader.domain.ReceiptContainerView;
import com.huaheng.pc.receipt.receiptContainerHeader.service.ReceiptContainerHeaderService;
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.service.ReceiptDetailService;
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
import com.huaheng.pc.task.taskDetail.service.TaskDetailService;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
31
import org.springframework.beans.factory.annotation.Autowired;
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
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Component
@Transactional
public class ReceiptContainerApiService {
    @Resource
    private ReceiptHeaderService receiptHeaderService;
    @Resource
    private ReceiptDetailService receiptDetailService;
    @Resource
    private ContainerService containerService;
    @Resource
    private TaskHeaderService taskHeaderService;
    @Resource
    private TaskDetailService taskDetailService;
    @Resource
    private MaterialService materialService;
    @Resource
    private ReceiptContainerHeaderService receiptContainerHeaderService;
    @Resource
    private ReceiptContainerDetailService receiptContainerDetailService;
    @Resource
    private LocationService locationService;
60
61
    @Autowired
    private InventoryDetailService inventoryDetailService;
62
63
64
65
66
67
68
69
70


    /**
     * 入库组盘,生成任务
     *
     * @param receiptDomain 入库组盘
     * @return 是否下发成功
     */
    @Transactional(rollbackFor = Exception.class)
tongzhonghao authored
71
    public AjaxResult saveReceiptContainer(ReceiptDomain receiptDomain) {
72
        String companyCode = receiptDomain.getReceiptHeader().getCompanyCode();
tongzhonghao authored
73
74
75
        ReceiptHeader receiptHeaders = receiptDomain.getReceiptHeader();
        List<ReceiptDetail> details = receiptDomain.getReceiptDetails();
        int taskId = 0;
76
77
78
        if (receiptHeaders == null || details == null) {
            return AjaxResult.error("入库主单或入库子单为空");
        }
tongzhonghao authored
79
        if (StringUtils.isEmpty(receiptHeaders.getZoneCode())) {
80
81
            return AjaxResult.error("库区为空");
        }
tongzhonghao authored
82
        String zoneCode = receiptHeaders.getZoneCode();
83
84
        String containerCode = receiptHeaders.getContainerCode();
        String locationCode = receiptHeaders.getLocationCode();
tongzhonghao authored
85
        if (StringUtils.isEmpty(containerCode)) {
86
87
88
89
90
            return AjaxResult.error("容器为空");
        }
        LambdaQueryWrapper<Container> containerQueryWrapper = Wrappers.lambdaQuery();
        containerQueryWrapper.eq(Container::getCode, containerCode);
        Container container = containerService.getOne(containerQueryWrapper);
tongzhonghao authored
91
        if (container == null) {
92
93
94
95
            return AjaxResult.error("不存在这个托盘");
        }
        //保存入库信息和组盘信息和任务信息
        ReceiptContainerView record = new ReceiptContainerView();
96
        record.setContainerCode(containerCode);
97
        record.setLocationCode(locationCode);
tongzhonghao authored
98
        record.setTaskType((short) 100);
99
100
        record.setCompanyCode(details.get(0).getCompanyCode());
        receiptContainerHeaderService.checkContainer(record);
tongzhonghao authored
101
        if (locationCode != null) {
102
103
104
            receiptContainerHeaderService.mobileCheckLocationCode(record);
        }
        // 保存ReceiptHeader,没有则生成,有则返回id
tongzhonghao authored
105
        int receiptHeaderId = receiptHeaderService.createHeader(companyCode, receiptHeaders.getZoneCode());
106
107
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptHeaderId);
        // 保存ReceiptDetail
tongzhonghao authored
108
109
        List<Integer> receiptDetailIds = insertReceiptDetail(receiptHeaderId, details, companyCode);
        if (receiptDetailIds != null && receiptDetailIds.size() > 0) {
110
            //保存ReceiptContainerHeader
tongzhonghao authored
111
112
            ReceiptContainerHeader containerHeader = insertReceiptContainerHeader(details.get(0), container, locationCode, zoneCode);
            if (containerHeader != null && containerHeader.getId() > 0) {
113
                // 保存ReceiptcContainerDetail
tongzhonghao authored
114
115
                List<Integer> receiptContainerDetailIds = insertReceiptcContainerDetail(containerHeader.getId(), receiptHeaderId, receiptDetailIds, details, container);
                if (receiptContainerDetailIds != null && receiptContainerDetailIds.size() > 0) {
116
                    //保存任务task
tongzhonghao authored
117
                    taskId = saveTaskHeader(container, containerHeader);
118
119
120
121
122
123
124
125
126
127
128
129
130
131
                } else {
                    return AjaxResult.error("入库组盘失败");
                }
            } else {
                return AjaxResult.error("插入入库容器表单头失败");
            }
        } else {
            return AjaxResult.error("插入入库明细表单失败");
        }
        return AjaxResult.success().setData(taskId);
    }

    /**
     * 保存ReceiptDetail
tongzhonghao authored
132
     *
133
134
     * @return
     */
tongzhonghao authored
135
    public List<Integer> insertReceiptDetail(int headerId, List<ReceiptDetail> receiptDetails, String companyCode) {
136
137
        List<Integer> mReceiptDetailIds = new ArrayList<>();
        ReceiptHeader receiptHeader = receiptHeaderService.getById(headerId);
tongzhonghao authored
138
        for (ReceiptDetail receiptBill : receiptDetails) {
139
140
            ReceiptDetail receiptDetail = receiptBill;
            receiptDetail.setId(null);
周鸿 authored
141
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
142
143
144
            receiptDetail.setCompanyCode(companyCode);
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
tongzhonghao authored
145
            receiptDetail.setInventorySts(receiptDetail.getInventorySts() == null ? QuantityConstant.GOOD : receiptDetail.getInventorySts());
tongzhonghao authored
146
            Material material = materialService.getMaterialByCode(receiptDetail.getMaterialCode(),
147
148
149
150
151
152
153
                    receiptHeader.getWarehouseCode());
            receiptDetail.setMaterialName(material.getName());
            receiptDetail.setMaterialSpec(material.getSpec());
            receiptDetail.setMaterialUnit(material.getUnit());
            receiptDetail.setAbcClass(material.getAbcClass());
            receiptDetail.setMaterialType(material.getMaterialType());
tongzhonghao authored
154
155
156
157
158
            if (StringUtils.isNotEmpty(receiptDetail.getRollNumber())) {
                boolean tag = inventoryDetailService.isRollNumber(null, receiptDetail);
                if (tag) {
//                卷号已存在
                    throw new ServiceException(receiptDetail.getRollNumber() + "卷号已存在");
159
160
                }
            }
161
            receiptDetail.setInventorySts(QuantityConstant.GOOD);
周鸿 authored
162
            receiptDetail.setQty(receiptBill.getQty());
tongzhonghao authored
163
            receiptDetail.setTaskQty(receiptBill.getQty());
164
165
166
            receiptDetail.setCreatedBy(QuantityConstant.LOGINNAME);
            receiptDetail.setLastUpdatedBy(QuantityConstant.LOGINNAME);
            receiptDetail.setDeleted(false);
167
168
169
170
171
172
            receiptDetailService.save(receiptDetail);
            mReceiptDetailIds.add(receiptDetail.getId());
        }
        return mReceiptDetailIds;
    }
tongzhonghao authored
173
174
175
    /**
     * ReceiptContainerHeader
tongzhonghao authored
176
     *
177
178
     * @return
     */
tongzhonghao authored
179
    public ReceiptContainerHeader insertReceiptContainerHeader(ReceiptDetail receiptDetail, Container container, String locationCode, String zoneCode) {
180
181
182
183
184
        String receiptContainerCode = container.getCode();
        String companyCode = receiptDetail.getCompanyCode();
        ReceiptContainerHeader recorder = new ReceiptContainerHeader();
        recorder.setContainerCode(receiptContainerCode);
        recorder.setToLocation(locationCode);
周鸿 authored
185
        recorder.setWarehouseCode(ShiroUtils.getWarehouseCode());
186
187
        recorder.setCompanyCode(companyCode);
        //如果该容器已绑定库位,则补充入库TASK_TYPE_SUPPLEMENTRECEIPT,否则整盘入库TASK_TYPE_WHOLERECEIPT
tongzhonghao authored
188
        if (StringUtils.isEmpty(container.getLocationCode())) {
189
            recorder.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
tongzhonghao authored
190
        } else {
191
            recorder.setTaskType(QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT);
192
            recorder.setFromLocation(container.getLocationCode());
193
194
195
196
197
198
199
200
201
202
203
204
205
        }
        recorder.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD);
        recorder.setCreatedBy(QuantityConstant.LOGINNAME);
        recorder.setLastUpdatedBy(QuantityConstant.LOGINNAME);
        recorder.setZoneCode(zoneCode);

        LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambada = Wrappers.lambdaQuery();
        receiptContainerHeaderLambada.eq(ReceiptContainerHeader::getContainerCode, receiptContainerCode)
                .eq(ReceiptContainerHeader::getCompanyCode, companyCode)
                .eq(ReceiptContainerHeader::getTaskType, String.valueOf(QuantityConstant.TASK_TYPE_WHOLERECEIPT))
                .eq(ReceiptContainerHeader::getStatus, 0);

        ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService.getOne(receiptContainerHeaderLambada);
tongzhonghao authored
206
        if (receiptContainerHeader == null) {
207
208
209
210
211
212
213
214
215
216
            receiptContainerHeaderService.save(recorder);
        } else {
            return recorder;
        }

        locationService.updateStatus(locationCode, QuantityConstant.STATUS_LOCATION_LOCK);
        containerService.updateLocationCodeAndStatus(receiptContainerCode,
                locationCode, QuantityConstant.STATUS_CONTAINER_SOME);
        return recorder;
    }
tongzhonghao authored
217
218
219
    /**
     * ReceiptcContainerDetail
tongzhonghao authored
220
     *
221
222
223
     * @return
     */
    public List<Integer> insertReceiptcContainerDetail(int headerId, int receiptId,
tongzhonghao authored
224
225
                                                       List<Integer> receiptDetailId, List<ReceiptDetail> receiptDetails,
                                                       Container container) {
226
227
228
        List<Integer> mReceiptContainerIds = new ArrayList<>();

        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptId);
tongzhonghao authored
229
        if (receiptHeader == null) {
230
231
            throw new ServiceException("没有找到入库单表头!");
        }
tongzhonghao authored
232
        for (int i = 0; i < receiptDetails.size(); i++) {
233
234
235
            ReceiptDetail receiptDetail = receiptDetails.get(i);
            Material condition2 = new Material();
            condition2.setCode(receiptDetail.getMaterialCode());
周鸿 authored
236
            condition2.setWarehouseCode(ShiroUtils.getWarehouseCode());
237
238
239
240
            condition2.setDeleted(false);
            condition2.setEnable(true);
            LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
            lambdaQueryWrapper.eq(Material::getCode, receiptDetail.getMaterialCode())
tongzhonghao authored
241
                    .eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
242
243
            Material material = materialService.getOne(lambdaQueryWrapper);
            ReceiptContainerDetail record = new ReceiptContainerDetail();
周鸿 authored
244
245
            record.setWarehouseCode(ShiroUtils.getWarehouseCode());
            record.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
246
247
248
249
250
251
252
253
254
            record.setReceiptContainerId(headerId);
            record.setRollNumber(receiptDetail.getRollNumber());
            record.setReceiptCode(receiptHeader.getCode());
            record.setReceiptId(receiptId);
            record.setReceiptDetailId(receiptDetailId.get(i));
            record.setMaterialCode(receiptDetail.getMaterialCode());
            record.setMaterialName(material.getName());
            record.setMaterialUnit(material.getUnit());
            record.setMaterialSpec(material.getSpec());
周鸿 authored
255
            record.setQty(receiptDetail.getQty());
256
257
258
259
260
261
            record.setContainerCode(container.getCode());
            record.setTaskType(QuantityConstant.TASK_TYPE_WHOLERECEIPT);
            record.setContainerType(container.getContainerType());
            record.setInventorySts(receiptDetail.getInventorySts());
            record.setLot(receiptDetail.getLot());
            record.setBatch(receiptDetail.getBatch());
262
            record.setContainerDetailNumber(receiptDetail.getContainerDetailNumber());
263
264
265
266
267
268
269
270
271
            record.setRollNumber(receiptDetail.getRollNumber());
            record.setCreatedBy(QuantityConstant.LOGINNAME);
            record.setLastUpdatedBy(QuantityConstant.LOGINNAME);

            LambdaQueryWrapper<ReceiptContainerDetail> detailyWrapper = Wrappers.lambdaQuery();
            detailyWrapper.eq(ReceiptContainerDetail::getReceiptContainerId, headerId)
                    .eq(ReceiptContainerDetail::getReceiptCode, receiptHeader.getCode())
                    .eq(ReceiptContainerDetail::getRollNumber, receiptDetail.getRollNumber());
            ReceiptContainerDetail receiptContainerDetail = receiptContainerDetailService.getOne(detailyWrapper);
tongzhonghao authored
272
            if (receiptContainerDetail == null) {
273
274
275
276
277
278
279
280
281
282
283
                receiptContainerDetailService.save(record);
                mReceiptContainerIds.add(record.getId());
            } else {
                mReceiptContainerIds.add(receiptContainerDetail.getId());
            }
        }
        return mReceiptContainerIds;
    }

    /**
     * 生成任务
tongzhonghao authored
284
     *
285
286
287
288
     * @param container
     * @param receiptContainerHeader
     * @return
     */
tongzhonghao authored
289
290
    public int saveTaskHeader(Container container, ReceiptContainerHeader receiptContainerHeader) {
        int taskId = 0;
291
292
293
        //锁定容器
        containerService.updateStatus(receiptContainerHeader.getContainerCode(),
                QuantityConstant.STATUS_CONTAINER_LOCK, container.getWarehouseCode());
tongzhonghao authored
294
        if (StringUtils.isNotEmpty(receiptContainerHeader.getFromLocation())) {
295
296
297
298
299
            //锁定库位
            locationService.updateStatus(receiptContainerHeader.getFromLocation(),
                    QuantityConstant.STATUS_LOCATION_LOCK);
        }
        String locationCode = receiptContainerHeader.getToLocation();
tongzhonghao authored
300
        if (StringUtils.isNotEmpty(locationCode)) {
301
302
            locationService.updateStatus(locationCode, QuantityConstant.STATUS_LOCATION_LOCK);
            Location desLocation = locationService.getLocationByCode(locationCode);
周鸿 authored
303
            String loginWarehouse = ShiroUtils.getWarehouseCode();
tongzhonghao authored
304
            if (!desLocation.getWarehouseCode().equals(loginWarehouse)) {
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
                throw new ServiceException("库位对应仓库不对");
            }
            if (taskHeaderService.getUncompleteTaskInNear(desLocation) > 0) {
                throw new ServiceException("目标库位:" + desLocation + "旁边存在任务,请完成任务以后再分配");
            }
        }
        //查询入库组盘明细
        LambdaQueryWrapper<ReceiptContainerDetail> containerDetailLambda = Wrappers.lambdaQuery();
        containerDetailLambda.eq(ReceiptContainerDetail::getReceiptContainerId, receiptContainerHeader.getId());
        List<ReceiptContainerDetail> list = receiptContainerDetailService.list(containerDetailLambda);

        if (list.isEmpty()) {
            throw new ServiceException("没有组盘明细,请先组盘!");
        }
        if (receiptContainerHeader.getStatus() == QuantityConstant.RECEIPT_CONTAINER_BUILD.intValue()) {
            if (receiptContainerHeader.getStatus() < QuantityConstant.RECEIPT_CONTAINER_TASK) {
                receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
                receiptContainerHeaderService.updateById(receiptContainerHeader);
            }
            //添加任务主表
            TaskHeader task = new TaskHeader();
            task.setAllocationHeadId(receiptContainerHeader.getId());
            task.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
            task.setWarehouseCode(receiptContainerHeader.getWarehouseCode());
            task.setZoneCode(receiptContainerHeader.getZoneCode());
            task.setCompanyCode(receiptContainerHeader.getCompanyCode());
            task.setStatus(QuantityConstant.TASK_STATUS_BUILD);
            task.setTaskType(receiptContainerHeader.getTaskType());
            task.setFromLocation(receiptContainerHeader.getFromLocation());
tongzhonghao authored
335
            if (receiptContainerHeader.getToLocation() != null) {
336
337
338
                task.setToLocation(receiptContainerHeader.getToLocation());
            }
            Location location = locationService.getLocationByCode(
周鸿 authored
339
                    task.getToLocation(), ShiroUtils.getWarehouseCode());
tongzhonghao authored
340
            if (location != null) {
341
342
343
344
345
346
347
348
349
350
                task.setZoneCode(location.getZoneCode());
            }
            task.setContainerCode(receiptContainerHeader.getContainerCode());
            task.setRecvDock(receiptContainerHeader.getRecvDock());
            task.setPort(receiptContainerHeader.getPort());
            task.setCreatedBy(QuantityConstant.LOGINNAME);
            task.setLastUpdatedBy(QuantityConstant.LOGINNAME);
            if (taskHeaderService.save(task)) {
                taskId = task.getId();
                //TaskDetail
tongzhonghao authored
351
                saveTaskDetail(task, list);
352
353
354
355
356
357
358
            } else {
                throw new ServiceException("任务生成失败");
            }
        }
        return taskId;
    }
tongzhonghao authored
359
    public void saveTaskDetail(TaskHeader task, List<ReceiptContainerDetail> list) {
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
        //添加任务明细表
        for (ReceiptContainerDetail item : list) {
            TaskDetail taskDetail = new TaskDetail();
            taskDetail.setTaskId(task.getId());
            taskDetail.setTaskType(task.getTaskType());
            taskDetail.setInternalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT);
            taskDetail.setWarehouseCode(task.getWarehouseCode());
            taskDetail.setAllocationId(item.getId());
            taskDetail.setCompanyCode(task.getCompanyCode());
            taskDetail.setMaterialCode(item.getMaterialCode());
            taskDetail.setMaterialName(item.getMaterialName());
            taskDetail.setMaterialSpec(item.getMaterialSpec());
            taskDetail.setMaterialUnit(item.getMaterialUnit());
            taskDetail.setInventorySts(item.getInventorySts());
            taskDetail.setRollNumber(item.getRollNumber());
375
            taskDetail.setContainerDetailNumber(item.getContainerDetailNumber());
376
377
378
379
380
            taskDetail.setBillCode(item.getReceiptCode());
            taskDetail.setBillDetailId(item.getReceiptDetailId());
            taskDetail.setQty(item.getQty());
            taskDetail.setContainerCode(task.getContainerCode());
            taskDetail.setFromLocation(task.getFromLocation());
tongzhonghao authored
381
            if (task.getToLocation() != null) {
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
                taskDetail.setToLocation(task.getToLocation());
            }
            taskDetail.setBatch(item.getBatch());
            taskDetail.setProjectNo(item.getProjectNo());
            taskDetail.setCreatedBy(QuantityConstant.LOGINNAME);
            taskDetail.setLastUpdatedBy(QuantityConstant.LOGINNAME);
            if (!taskDetailService.save(taskDetail)) {
                throw new ServiceException("生成任务明细失败");
            }

            //更新入库组盘明细状态
            item.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK);
            if (!receiptContainerDetailService.updateById(item)) {
                throw new ServiceException("更新入库组盘明细状态出错");
            }

            /* 修改明细状态为上架*/
            ReceiptDetail receiptDetail = receiptDetailService.getById(item.getReceiptDetailId());
            receiptDetail.setProcessStamp(String.valueOf(QuantityConstant.RECEIPT_HEADER_SHELF));
            if (!receiptDetailService.updateById(receiptDetail)) {
                throw new ServiceException("更新入库单详情失败");
            }
            //更新头表状态
            receiptDetailService.updateReceiptHeaderLastStatus(receiptDetail.getReceiptId());
        }
    }

}