Blame view

src/main/java/com/huaheng/pc/receipt/receiptDetail/service/ReceiptDetailServiceImpl.java 33.1 KB
tangying authored
1
2
package com.huaheng.pc.receipt.receiptDetail.service;
mahuandong authored
3
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
4
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
pengcheng authored
5
import com.huaheng.common.constant.QuantityConstant;
6
import com.huaheng.common.exception.service.ServiceException;
7
8
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.StringUtils;
9
import com.huaheng.common.utils.Wrappers;
mahuandong authored
10
11
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.web.domain.AjaxResult;
游杰 authored
12
import com.huaheng.mobile.receipt.ReceiptBill;
13
14
import com.huaheng.pc.check.checkHeader.domain.CheckHeader;
import com.huaheng.pc.check.checkHeader.service.CheckHeaderService;
游杰 authored
15
16
import com.huaheng.pc.config.company.domain.Company;
import com.huaheng.pc.config.company.service.CompanyService;
17
18
import com.huaheng.pc.config.configValue.domain.ConfigValue;
import com.huaheng.pc.config.configValue.service.ConfigValueService;
mahuandong authored
19
20
import com.huaheng.pc.config.material.domain.Material;
import com.huaheng.pc.config.material.service.MaterialService;
21
22
23
24
25
26
27
28
import com.huaheng.pc.config.materialType.domain.MaterialType;
import com.huaheng.pc.config.materialType.service.MaterialTypeService;
import com.huaheng.pc.config.receiptPreference.domain.ReceiptPreference;
import com.huaheng.pc.config.receiptPreference.service.ReceiptPreferenceService;
import com.huaheng.pc.config.receiptType.domain.ReceiptType;
import com.huaheng.pc.config.receiptType.service.ReceiptTypeService;
import com.huaheng.pc.config.statusFlow.domain.StatusFlowDetail;
import com.huaheng.pc.config.statusFlow.service.StatusFlowDetailService;
29
30
import com.huaheng.pc.receipt.receiptDetail.domain.ReceiptDetail;
import com.huaheng.pc.receipt.receiptDetail.mapper.ReceiptDetailMapper;
31
32
import com.huaheng.pc.receipt.receiptHeader.domain.ReceiptHeader;
import com.huaheng.pc.receipt.receiptHeader.service.ReceiptHeaderService;
33
import com.huaheng.pc.system.dict.service.IDictDataService;
pengcheng authored
34
import com.huaheng.pc.task.taskDetail.domain.TaskDetail;
tangying authored
35
import org.springframework.stereotype.Service;
36
37
import org.springframework.transaction.annotation.Transactional;
tangying authored
38
import javax.annotation.Resource;
39
import java.math.BigDecimal;
xumiao authored
40
41
import java.util.*;
import java.util.stream.Collectors;
周鸿 authored
42
tangying authored
43
@Service
44
public class ReceiptDetailServiceImpl extends ServiceImpl<ReceiptDetailMapper, ReceiptDetail> implements ReceiptDetailService {
tangying authored
45
mahuandong authored
46
47
    @Resource
    private MaterialService materialService;
48
49
    @Resource
    private ReceiptHeaderService receiptHeaderService;
50
51
52
53
54
55
56
57
    @Resource
    private ReceiptTypeService receiptTypeService;
    @Resource
    private StatusFlowDetailService statusFlowDetailService;
    @Resource
    private MaterialTypeService materialTypeService;
    @Resource
    private ReceiptPreferenceService receiptPreferenceService;
58
59
    @Resource
    private IDictDataService dictDataService;
60
61
    @Resource
    private CheckHeaderService checkHeaderService;
62
63
    @Resource
    private ConfigValueService configValueService;
64
65
    @Resource
    private ReceiptDetailMapper receiptDetailMapper;
游杰 authored
66
67
68
    @Resource
    private CompanyService companyService;
69
70
    /**
     * 新增入库明细
71
     *
72
73
74
     * @param receiptDetail
     * @return
     */
mahuandong authored
75
    @Transactional(rollbackFor = Exception.class)
mahuandong authored
76
    @Override
77
    public AjaxResult saveReceiptDetaial(ReceiptDetail receiptDetail) {
78
        /* 判断入库头表状态*/
79
80
81
82
83
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getId, receiptDetail.getReceiptId());
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //判断入库头表状态
84
        if (receiptHeader == null) {
85
            throw new ServiceException("找不到主单据");
86
        } else if (receiptHeader.getFirstStatus() > QuantityConstant.RECEIPT_HEADER_POOL) {
87
            throw new ServiceException("单据进入订单池后,不允许新增明细");
88
        } else if (receiptHeader.getFirstStatus() == 20) {
89
            throw new ServiceException("单据已作废");
90
91
92
93
        }
        receiptDetail.setReceiptCode(receiptHeader.getCode());

        /* 判断物料编码*/
mahuandong authored
94
        LambdaQueryWrapper<Material> lambdaQueryWrapper = Wrappers.lambdaQuery();
95
        lambdaQueryWrapper.eq(Material::getCode, receiptDetail.getMaterialCode());
96
        lambdaQueryWrapper.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
97
98
        Material material = materialService.getOne(lambdaQueryWrapper);
        if (material == null) {
99
            throw new ServiceException("物料不存在");
100
        }
mahuandong authored
101
        receiptDetail.setCompanyCode(receiptHeader.getCompanyCode());
102
        receiptDetail.setMaterialCode(material.getCode());
103
104
105
106
        receiptDetail.setMaterialName(material.getName());
        receiptDetail.setMaterialSpec(material.getSpec());
        receiptDetail.setMaterialUnit(material.getUnit());
tongzhonghao authored
107
        receiptDetail.setInventorySts(QuantityConstant.GOOD);
108
109
        receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
mahuandong authored
110
        receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
111
        receiptDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
112
113
114
        //根据流程配置更新入库明细下一流程
        ReceiptDetail receiptDetail1 = queryflow(receiptDetail);
115
116
        if (this.save(receiptDetail1)) {
117
118
119
120
//            receiptHeader.setTotalQty(receiptHeader.getTotalQty().add(receiptDetail1.getTotalQty()));
//            receiptHeader.setTotalLines(receiptHeader.getTotalLines()+1);
//            receiptHeaderService.updateById(receiptHeader);
            updateReceiptHeader(receiptHeader);
121
122
123
124
125
            return AjaxResult.success("新增单据明细成功");
        } else {
            return AjaxResult.error("新增单据明细失败!");
        }
mahuandong authored
126
    }
127
128
129

    /**
     * 修改入库明细
130
     *
131
132
133
134
135
136
137
138
     * @param receiptDetail
     * @return
     */
    @Override
    @Transactional
    public AjaxResult updateReceiptDetaial(ReceiptDetail receiptDetail) {
        /* 先修改入库头表中的总数量和总行数,再更新记录,完成后更新入库头表中总数量和总行数*/
139
        //查询原记录
140
        ReceiptDetail originalReceiptDetail = this.getById(receiptDetail.getId());
mahuandong authored
141
        ReceiptHeader receiptHeader = receiptHeaderService.getById(receiptDetail.getReceiptId());
142
        //判断物料编码是否被修改
143
        if (!originalReceiptDetail.getMaterialCode().equals(receiptDetail.getMaterialCode())) {
144
            LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
145
            lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
146
            Material material = materialService.getOne(lambdaMaterial);
147
148
149
            if (material == null) {
                throw new ServiceException("该物料编码不存在");
150
            } else {
151
152
153
                receiptDetail.setMaterialName(material.getName());
                receiptDetail.setMaterialSpec(material.getSpec());
                receiptDetail.setMaterialUnit(material.getUnit());
154
155
156
157
158
159
//                receiptDetail.setProcessStamp("0");
//                receiptHeader.setTotalQty(receiptHeader.getTotalQty().subtract(originalReceiptDetail.getTotalQty()));
//                receiptHeader.setTotalLines(receiptHeader.getTotalLines()-1);
//                if ( !receiptHeaderService.updateById(receiptHeader)){
//                    return AjaxResult.error("入库头表更新失败");
//                }
160
            }
161
        }
162
        //如果单据状态为驳回则设置状态为提交审核
163
164
165
//        if ("10".equals(receiptDetail.getProcessStamp())){
//            receiptDetail.setProcessStamp("5");
//        }
166
        receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
167
        if (!this.updateById(receiptDetail)) {
168
169
            return AjaxResult.error("入库明细更新失败");
        } else {
170
171
            updateReceiptHeader(receiptHeader);
172
173
174
            return AjaxResult.success("修改单据明细成功");
        }
    }
175
mahuandong authored
176
177
    /**
     * 更新入库单头表状态
178
     *
mahuandong authored
179
180
181
     * @param receiptHeader 入库单按头表
     * @return
     */
182
    @Override
mahuandong authored
183
    public AjaxResult updateReceiptHeader(ReceiptHeader receiptHeader) {
184
185
186
        BigDecimal totalQty = new BigDecimal(0);
        int totalLines = 0;
        LambdaQueryWrapper<ReceiptDetail> receiptDetailLambdaQueryWrapper = Wrappers.lambdaQuery();
187
188
189
        receiptDetailLambdaQueryWrapper.eq(ReceiptDetail::getReceiptId, receiptHeader.getId());
        List<ReceiptDetail> receiptDetailList = list(receiptDetailLambdaQueryWrapper);
        for (ReceiptDetail receiptDetail : receiptDetailList) {
190
            totalLines++;
肖超群 authored
191
            totalQty = totalQty.add(receiptDetail.getQty());
192
193
194
        }
        receiptHeader.setTotalQty(totalQty);
        receiptHeader.setTotalLines(totalLines);
195
        if (!receiptHeaderService.updateById(receiptHeader)) {
196
197
198
199
200
            return AjaxResult.error("入库头表更新失败");
        }
        return AjaxResult.success("入库头表更新成功");
    }
DESKTOP-AO0VKC8\mahua authored
201
202
203
204
205
206
207
    @Override
    public List<ReceiptDetail> findByReceiptId(Integer id) {
        LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(ReceiptDetail::getReceiptId, id);
        return list(queryWrapper);
    }
208
209
    /**
     * 根据流程配置更新入库明细下一流程
210
211
212
213
214
     * 1.先查询入库子表要没有设置入库流程
     * 2.查询入库主表的入库单据流程
     * 3.物料是否有入库流程
     * 4.物料类别是否有入库流程
     * 5.入库首选项的入库流程
215
     *
216
217
218
     * @param receiptDetail
     * @return
     */
xqs authored
219
    @Override
mahuandong authored
220
    @Transactional(rollbackFor = Exception.class)
221
    public ReceiptDetail queryflow(ReceiptDetail receiptDetail) {
222
        //当单据状态为驳回或作废时不更新状态
223
        if (QuantityConstant.RECEIPT_HEADER_REJECTED.toString().equals(receiptDetail.getProcessStamp()) || QuantityConstant.RECEIPT_HEADER_OBSOLETE.toString().equals(receiptDetail.getProcessStamp())) {
224
225
226
            return receiptDetail;
        }
227
        //如果入库明细绑定了入库流程则从入库明细中选择流程
228
        if (StringUtils.isNotEmpty(receiptDetail.getStatusFlowCode())) {
229
230
231
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptDetail.getStatusFlowCode());
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
            //在状态到达时候是判断是否要质检
232
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
pengcheng authored
233
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
234
235
236
237
238
            } else {
                receiptDetail.setProcessStamp(status);
            }
            return receiptDetail;
        }
239
240
241
        //查询头表信息
        LambdaQueryWrapper<ReceiptHeader> lambdaReceiptHeader = Wrappers.lambdaQuery();
        lambdaReceiptHeader.eq(ReceiptHeader::getCode, receiptDetail.getReceiptCode());
242
        lambdaReceiptHeader.last("limit 1");
243
244
245
246
247
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaReceiptHeader);

        //查询明细表中入库物料信息
        LambdaQueryWrapper<Material> lambdaMaterial = Wrappers.lambdaQuery();
        lambdaMaterial.eq(Material::getCode, receiptDetail.getMaterialCode());
248
        lambdaMaterial.eq(Material::getWarehouseCode, ShiroUtils.getWarehouseCode());
249
        lambdaMaterial.last("limit 1");
250
251
252
253
        Material material = materialService.getOne(lambdaMaterial);

        //查询头表中绑定的入库类型中的入库流程
        LambdaQueryWrapper<ReceiptType> lambdaReceiptType = Wrappers.lambdaQuery();
254
255
        lambdaReceiptType.eq(ReceiptType::getCode, receiptHeader.getReceiptType())
                .eq(ReceiptType::getWarehouseCode, ShiroUtils.getWarehouseCode());
256
//                .eq(ReceiptType::getCompanyCode, receiptDetail.getCompanyCode());
257
        lambdaReceiptType.last("limit 1");
258
        ReceiptType receiptType = receiptTypeService.getOne(lambdaReceiptType);
259
260
261
        if (receiptType.getReceiptFlow() != null) {
262
263
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptType.getReceiptFlow());
mahuandong authored
264
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
265
            //在状态到达时候是判断是否要质检
266
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
pengcheng authored
267
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
268
269
270
            } else {
                receiptDetail.setProcessStamp(status);
            }
271
            return receiptDetail;
272
        } else if (material.getReceivingFlow() != null) {
273
274
            //物料是否有入库流程
            List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(material.getReceivingFlow());
mahuandong authored
275
            String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
276
            //在状态到达时候是判断是否要质检
277
            if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
pengcheng authored
278
                receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
279
280
281
            } else {
                receiptDetail.setProcessStamp(status);
            }
282
283
284
285
286
287
288
289
            return receiptDetail;
        } else {
            //该物料类别是否有入库流程
            LambdaQueryWrapper<MaterialType> lambdaMaterialType = Wrappers.lambdaQuery();
            lambdaMaterialType.eq(MaterialType::getCode, material.getType());
            MaterialType materialType = materialTypeService.getOne(lambdaMaterialType);
            if (materialType.getReceivingFlow() != null) {
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(materialType.getReceivingFlow());
mahuandong authored
290
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
291
                //在状态到达时候是判断是否要质检
292
                if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
pengcheng authored
293
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
294
295
296
                } else {
                    receiptDetail.setProcessStamp(status);
                }
297
298
                return receiptDetail;
            } else {
299
                //以上都没有的情况下查询入库首选项中的入库流程
300
301
302
303
                LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
                lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
                ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);
304
                LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
305
                lambda.eq(ReceiptPreference::getCode, configValue.getValue());
306
307
                ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
                List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
mahuandong authored
308
                String status = nextStatusFlow(statusFlowDetails, receiptDetail.getProcessStamp());
309
                //在状态到达时候是判断是否要质检
310
                if (QuantityConstant.RECEIPT_HEADER_RECEIVING.toString().equals(status) && inspection(receiptDetail)) {
pengcheng authored
311
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_CHECK.toString());
312
313
314
                } else {
                    receiptDetail.setProcessStamp(status);
                }
315
316
317
318
319
                return receiptDetail;
            }
        }
    }
mahuandong authored
320
321
    /**
     * 获取配置流程中下一状态
322
     *
mahuandong authored
323
     * @param statusFlowDetails 流程列表
324
     * @param status            当前状态
mahuandong authored
325
     */
326
    public String nextStatusFlow(List<StatusFlowDetail> statusFlowDetails, String status) {
327
        //判断当前状态是否为最后状态,若为最后状态返回当前状态
328
        if (StringUtils.isEmpty(status)) {
329
330
            status = "0";
        }
331
        if (status.equals(statusFlowDetails.get(statusFlowDetails.size() - 1).getFlowCode())) {
mahuandong authored
332
333
            return status;
        } else {
334
335
            for (int i = 0; i < statusFlowDetails.size(); i++) {
                if (Integer.parseInt(statusFlowDetails.get(i).getFlowCode()) > Integer.parseInt(status)) {
mahuandong authored
336
337
338
339
340
341
                    return statusFlowDetails.get(i).getFlowCode();
                }
            }
            return status;
        }
    }
342
343
    @Override
344
    public List<StatusFlowDetail> queryflow() {
345
346
347
348
349
350
351
352
353
354
355
        LambdaQueryWrapper<ConfigValue> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ConfigValue::getModuleType, "receipt");
        ConfigValue configValue = configValueService.getOne(lambdaQueryWrapper);

        LambdaQueryWrapper<ReceiptPreference> lambda = Wrappers.lambdaQuery();
        lambda.eq(ReceiptPreference::getCode, configValue.getValue());
        ReceiptPreference receiptPreference = receiptPreferenceService.getOne(lambda);
        List<StatusFlowDetail> statusFlowDetails = statusFlowDetailService.queryStatusFlowDetail(receiptPreference.getReceivingFlow());
        return statusFlowDetails;
    }
356
    /**
357
     * @param id 头表id
358
359
360
361
     * @description 更新头表尾状态
     * 每次明细表更新后调用该方法
     * 当所有明细表到达该状态时,更新头表状态
     */
游杰 authored
362
    @Override
363
    public void updateReceiptHeaderLastStatus(Integer id) {
364
365
366
367
368
        LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
        lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
        List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
        //查询出头表信息
        ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
369
370
371
        int minStatus;
        int maxStatus;
        // 判断入库明细是否为空, 为空时入库单头表状态为新建
372
        if (receiptDetails.isEmpty()) {
373
374
375
376
377
378
            minStatus = 0;
            maxStatus = 0;
        } else {
            minStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
            maxStatus = Integer.parseInt(receiptDetails.get(0).getProcessStamp());
            //遍历明细状态得出最小状态值
379
380
            for (int i = 1; i < receiptDetails.size(); i++) {
                if (minStatus > Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
381
382
                    minStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                }
383
                if (maxStatus < Integer.parseInt(receiptDetails.get(i).getProcessStamp())) {
384
385
                    maxStatus = Integer.parseInt(receiptDetails.get(i).getProcessStamp());
                }
386
387
388
            }
        }
        //若更新状态值小于头状态,更新尾状态否则更新头尾状态
mahuandong authored
389
390
391
392
        receiptHeader.setFirstStatus(maxStatus);
        receiptHeader.setLastStatus(minStatus);
        if (!receiptHeaderService.updateById(receiptHeader)) {
            throw new ServiceException("更新状态失败");
393
394
        }
    }
395
周鸿 authored
396
    /**
397
     * @param receiptHeaderIdSet 头表id
周鸿 authored
398
399
400
401
402
     * @description 更新头表尾状态
     * 每次明细表更新后调用该方法
     * 当所有明细表到达该状态时,更新头表状态
     */
    @Override
403
404
    public void updateReceiptHeaderLastStatusV2(Set<Integer> receiptHeaderIdSet) {
        for (Integer id : receiptHeaderIdSet) {
周鸿 authored
405
406
407
408
409
410
            LambdaQueryWrapper<ReceiptDetail> lambdaDetails = Wrappers.lambdaQuery();
            lambdaDetails.eq(ReceiptDetail::getReceiptId, id);
            lambdaDetails.orderByDesc(ReceiptDetail::getProcessStamp);
            List<ReceiptDetail> receiptDetails = this.list(lambdaDetails);
            //查询出头表信息
            ReceiptHeader receiptHeader = receiptHeaderService.getById(id);
411
412
413
            int minStatus = 0;
            int maxStatus = 0;
            if (receiptDetails != null && receiptDetails.size() > 0) {
xumiao authored
414
                receiptDetails = receiptDetails.stream().sorted(Comparator.comparing(ReceiptDetail::getProcessStamp)).collect(Collectors.toList());
415
416
                minStatus = Integer.valueOf(receiptDetails.get(0).getProcessStamp());
                maxStatus = Integer.valueOf(receiptDetails.get(receiptDetails.size() - 1).getProcessStamp());
周鸿 authored
417
418
419
420
421
422
423
424
425
            }
            //若更新状态值小于头状态,更新尾状态否则更新头尾状态
            receiptHeader.setFirstStatus(maxStatus);
            receiptHeader.setLastStatus(minStatus);
            if (!receiptHeaderService.updateById(receiptHeader)) {
                throw new ServiceException("更新状态失败");
            }
        }
    }
426
427
428
    /**
     * 入库单审核
429
     *
430
431
432
433
     * @param ids
     * @param approval
     * @return
     */
434
435
436
    @Override
    public AjaxResult approval(String ids, Integer approval) {
        ReceiptHeader receiptHeader = new ReceiptHeader();
437
        if (StringUtils.isEmpty(ids)) {
438
439
440
            return AjaxResult.error("id不能为空");
        }
        Integer[] idArray = Convert.toIntArray(ids);
441
        for (Integer id : idArray) {
442
443
444
445
            receiptHeader.setId(id);
            receiptHeader.setLastStatus(approval);
            receiptHeader.setFirstStatus(approval);
            receiptHeader.setLastUpdatedBy(ShiroUtils.getLoginName());
446
            if (!receiptHeaderService.updateById(receiptHeader)) {
447
448
449
450
451
                throw new ServiceException("更新头表失败");
            } else {
                LambdaQueryWrapper<ReceiptDetail> lambda = Wrappers.lambdaQuery();
                lambda.eq(ReceiptDetail::getReceiptId, id);
                List<ReceiptDetail> receiptDetails = this.list(lambda);
452
                for (ReceiptDetail receiptDetail : receiptDetails) {
pengcheng authored
453
                    receiptDetail.setProcessStamp(QuantityConstant.RECEIPT_HEADER_POOL.toString());
454
                    receiptDetail = this.queryflow(receiptDetail);
455
                    if (!this.updateById(receiptDetail)) {
456
457
458
459
                        throw new ServiceException("更新入库明细表失败");
                    }
                }
            }
460
            this.updateReceiptHeaderLastStatus(id);
461
462
463
        }
        return AjaxResult.success("审核完成");
    }
464
465
    @Override
pengcheng authored
466
    public List<TaskDetail> getReceiptQtyLast7Days() {
467
468
469
470
        return receiptDetailMapper.getReceiptQtyLast7Days();
    }

    @Override
pengcheng authored
471
    public List<TaskDetail> getWarehouseReceipt() {
472
473
474
475
        return receiptDetailMapper.getWarehouseReceipt();
    }

    @Override
pengcheng authored
476
    public List<TaskDetail> getCompanyReceipt() {
477
478
479
        return receiptDetailMapper.getCompanyReceipt();
    }
mahuandong authored
480
481
482
483
    /**
     * 判断明细中是否质检
     */
484
    public boolean inspection(ReceiptDetail receiptDetail) {
485
        //如果明细中需要质检,则判断是否已经生成质检单
486
        if ("0".equals(receiptDetail.getQcCheck())) {
487
            LambdaQueryWrapper<CheckHeader> lambda = Wrappers.lambdaQuery();
488
            lambda.eq(CheckHeader::getCode, receiptDetail.getReceiptCode());
489
            CheckHeader checkHeader = checkHeaderService.getOne(lambda);
490
            if (checkHeader == null) {
491
492
493
494
495
                return true;
            }
        }
        return false;
    }
游杰 authored
496
497

    /**
498
499
500
501
502
503
     * //     * 移动端收货
     * //     *
     * //     * @param code
     * //     * @return
     * //
     */
游杰 authored
504
505
506
507
508
509
510
511
    @Override
    public AjaxResult scanReceiptCode(String code, String type, String companyCode) {
        LambdaQueryWrapper<ReceiptHeader> lambdaQueryWrapper = Wrappers.lambdaQuery();
        lambdaQueryWrapper.eq(ReceiptHeader::getReferCode, code)
                .eq(ReceiptHeader::getReceiptType, type);
        ReceiptHeader receiptHeader = receiptHeaderService.getOne(lambdaQueryWrapper);
        if (receiptHeader == null) {
            LambdaQueryWrapper<Company> companyLambdaQueryWrapper = Wrappers.lambdaQuery();
512
            companyLambdaQueryWrapper.eq(Company::getCode, companyCode);
游杰 authored
513
514
            Company company = companyService.getOne(companyLambdaQueryWrapper);
            return AjaxResult.success("");
huhai authored
515
            //    return receiptHeaderService.findErpReceipt(String.valueOf(company.getId()), receiptHeader.getReferType(), receiptHeader.getReferCode());
游杰 authored
516
517
518
519
520
521
522
523
524
525
        } else {
            LambdaQueryWrapper<ReceiptDetail> queryWrapper = Wrappers.lambdaQuery();
            queryWrapper.eq(ReceiptDetail::getReceiptCode, receiptHeader.getCode());
            List<ReceiptDetail> receiptDetailList = list(queryWrapper);
            return AjaxResult.success(receiptDetailList);
        }

    }

    @Override
xumiao authored
526
    @Transactional(rollbackFor = Exception.class)
游杰 authored
527
528
529
530
    public List<Integer> insertTodayReceiptDetail(int headerId, List<ReceiptBill> receiptBills, boolean isCompletedQty, String companyCode) {
        List<Integer> mReceiptDetailIds = new ArrayList<>();
        ReceiptHeader receiptHeader = receiptHeaderService.getById(headerId);
531
        for (ReceiptBill receiptBill : receiptBills) {
游杰 authored
532
533
534
            ReceiptDetail receiptDetail = new ReceiptDetail();
            receiptDetail.setId(null);
            receiptDetail.setWarehouseCode(ShiroUtils.getWarehouseCode());
535
            receiptDetail.setCompanyCode(companyCode);
536
            receiptDetail.setUWarehouseCode(receiptHeader.getUWarehouseCode());
游杰 authored
537
538
539
            receiptDetail.setReceiptId(receiptHeader.getId());
            receiptDetail.setReceiptCode(receiptHeader.getCode());
            receiptDetail.setMaterialCode(receiptBill.getMaterialCode());
游杰 authored
540
            receiptDetail.setMaterialName(receiptBill.getMaterialName());
541
542
            Material material = materialService.getMaterialByCode(receiptBill.getMaterialCode(), ShiroUtils.getWarehouseCode());
            if (material != null) {
543
544
545
546
                receiptDetail.setMaterialName(material.getName());
                receiptDetail.setMaterialUnit(material.getUnit());
                receiptDetail.setMaterialSpec(material.getSpec());
            }
游杰 authored
547
            receiptDetail.setInventorySts("good");
肖超群 authored
548
            receiptDetail.setQty(receiptBill.getQty());
549
            if (isCompletedQty) {
肖超群 authored
550
                receiptDetail.setTaskQty(receiptBill.getQty());
游杰 authored
551
552
553
554
555
556
557
558
559
560
            }
            receiptDetail.setCreatedBy(ShiroUtils.getLoginName());
            receiptDetail.setLastUpdatedBy(ShiroUtils.getLoginName());
            receiptDetail.setDeleted(false);
            receiptDetail.setBatch(receiptBill.getBatch());
            save(receiptDetail);
            mReceiptDetailIds.add(receiptDetail.getId());
        }
        return mReceiptDetailIds;
    }
周鸿 authored
561
562

    @Override
563
    @Transactional(rollbackFor = Exception.class)
周鸿 authored
564
565
    public String insertExcelData(List<ReceiptDetail> list, boolean updateSupport, String operName) {
        if (StringUtils.isNull(list) || list.size() == 0) {
566
            throw new ServiceException("导入数据不能为空!");
周鸿 authored
567
        }
568
569
        //过滤物料为空的数据
        list = list.stream().filter(e -> StringUtils.isNotEmpty(e.getMaterialCode())).collect(Collectors.toList());
周鸿 authored
570
        //新增入库头表
571
        ReceiptHeader receiptHeader = createHeader(operName, list);
周鸿 authored
572
573
574
575
576
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        for (ReceiptDetail importData : list) {
周鸿 authored
577
            /*if(StringUtils.isEmpty(importData.getWarehouseCode())){
周鸿 authored
578
579
580
581
582
583
584
585
586
587
                failureNum++;
                String msg = "<br/>" + failureNum + "、仓库编码为空 导入失败:";
                failureMsg.append(msg );
                continue;
            }
            if(StringUtils.isEmpty(importData.getCompanyCode())){
                failureNum++;
                String msg = "<br/>" + failureNum + "、货主编码为空 导入失败:";
                failureMsg.append(msg );
                continue;
周鸿 authored
588
            }*/
589
            if (StringUtils.isNull(importData.getQty())) {
周鸿 authored
590
591
                failureNum++;
                String msg = "<br/>" + failureNum + "、数量为空 导入失败:";
592
                failureMsg.append(msg);
周鸿 authored
593
594
                continue;
            }
周鸿 authored
595
596
            try {
                importData.setReceiptId(receiptHeader.getId());
周鸿 authored
597
                importData.setReceiptCode(receiptHeader.getCode());
周鸿 authored
598
599
600
601
                Material material = materialService.getMaterialByCode(importData.getMaterialCode());
                importData.setMaterialName(material.getName());
                importData.setMaterialSpec(material.getSpec());
                importData.setMaterialUnit(material.getUnit());
602
603
                importData.setWarehouseCode(receiptHeader.getWarehouseCode());
                importData.setCompanyCode(receiptHeader.getCompanyCode());
tongzhonghao authored
604
                importData.setInventorySts(QuantityConstant.GOOD);
周鸿 authored
605
606
607
608
609
610
611
612
613
614
615
616
                this.save(importData);
                successNum++;
                successMsg.append("<br/>" + successNum + "、数据 " + importData.getMaterialCode() + " 导入成功");

            } catch (Exception e) {
                failureNum++;
                String msg = "<br/>" + failureNum + "、物料编码 " + importData.getMaterialCode() + " 导入失败:";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0) {
            failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
617
            throw new ServiceException(failureMsg.toString());
周鸿 authored
618
619
620
621
622
        } else {
            successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
        }
        return successMsg.toString();
    }
623
624
625
    public ReceiptHeader createHeader(String operName, List<ReceiptDetail> list) {
        ReceiptHeader receiptHeader = new ReceiptHeader();
626
        receiptHeader.setWarehouseCode(ShiroUtils.getWarehouseCode());
627
628
629
630
631
        String receipttype = QuantityConstant.RECEIPT_TYPE_PPI;
        if (!receiptHeader.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_CS)) {
            receipttype = QuantityConstant.RECEIPT_TYPE_PPII;
        }
        String code = receiptHeaderService.createCode(receipttype, receiptHeader.getWarehouseCode());
周鸿 authored
632
633
634
635
636
        receiptHeader.setId(null);
        receiptHeader.setLastUpdated(null);
        receiptHeader.setLastUpdatedBy(operName);
        receiptHeader.setCreated(null);
        receiptHeader.setCreatedBy(operName);
637
638
639
640
641
642
        if (receiptHeader.getWarehouseCode().equals(QuantityConstant.WAREHOUSE_CS)) {
            receiptHeader.setCompanyCode(QuantityConstant.COMPANY_CS);
        } else {
            receiptHeader.setCompanyCode(ShiroUtils.getCompanyCodeList().get(0));
        }
周鸿 authored
643
        receiptHeader.setCode(code);
644
        receiptHeader.setReceiptType(receipttype);
周鸿 authored
645
646
647
648
649
650
651
652
653
654
655
        receiptHeader.setTotalLines(list.size());
        receiptHeader.setFirstStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        receiptHeader.setLastStatus(QuantityConstant.RECEIPT_HEADER_BUILD);
        BigDecimal bigDecimal = list.stream().map(ReceiptDetail::getQty).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
        receiptHeader.setTotalQty(bigDecimal);
        if (!receiptHeaderService.save(receiptHeader)) {
            throw new ServiceException("导入失败,添加入库单头表失败");
        }
        return receiptHeader;
    }
656
657
658
659
660
    @Override
    public String getWorkNo(Integer id) {
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
        detailLambda.eq(ReceiptDetail::getId, id);
        detailLambda.last("limit 1");
661
662
        ReceiptDetail receiptDetail = this.getOne(detailLambda);
        if (receiptDetail != null) {
663
664
665
666
            return receiptDetail.getMoCode();
        }
        return null;
    }
667
668

    @Override
669
    public List<ReceiptDetail> getByHeaderCode(String code) {
670
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
671
672
        detailLambda.eq(ReceiptDetail::getReceiptCode, code);
        List<ReceiptDetail> list = this.list(detailLambda);
673
674
        return list;
    }
675
676
    @Override
677
    public List<ReceiptDetail> selectListEntityByLike(ReceiptDetail receiptDetail) {
678
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
679
680
681
        detailLambda.eq(StringUtils.isNotEmpty(receiptDetail.getReceiptCode()), ReceiptDetail::getReceiptCode, receiptDetail.getReceiptCode());
        detailLambda.eq(StringUtils.isNotNull(receiptDetail.getReceiptId()), ReceiptDetail::getReceiptId, receiptDetail.getReceiptId());
        detailLambda.eq(ReceiptDetail::getDeleted, false);
682
683
        List<ReceiptDetail> list = this.list(detailLambda);
684
685
        return list;
    }
686
周鸿 authored
687
    @Override
688
    public ReceiptDetail selectFirstEntity(ReceiptDetail receiptDetail) {
周鸿 authored
689
        LambdaQueryWrapper<ReceiptDetail> detailLambda = Wrappers.lambdaQuery();
690
691
        detailLambda.eq(StringUtils.isNotNull(receiptDetail.getId()), ReceiptDetail::getReceiptCode, receiptDetail.getReceiptCode());
        detailLambda.eq(ReceiptDetail::getDeleted, false);
周鸿 authored
692
693
694
        detailLambda.last("limit 1");
        return this.getOne(detailLambda);
    }
695
周鸿 authored
696
697
    @Override
    public List<Map<String, Object>> selectList(String code, String goodsShelfNo) {
698
699
700
        String warehouseCode = ShiroUtils.getWarehouseCode();
        String shelfNo = goodsShelfNo.substring(1, 5);
        return receiptDetailMapper.selectLists(code, shelfNo, warehouseCode);
周鸿 authored
701
    }
tangying authored
702
}