李林
2023-10-07 658d4927d468c47208fd012d9128b09249c07eff
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
package com.chinaztt.mes.warehouse.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.injector.methods.DeleteById;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.chinaztt.mes.warehouse.entity.ReverseStockApply;
import com.chinaztt.mes.warehouse.entity.ReverseStockApplyDetail;
import com.chinaztt.mes.warehouse.entity.Stock;
import com.chinaztt.mes.warehouse.mapper.ReverseStockApplyDetailMapper;
import com.chinaztt.mes.warehouse.mapper.ReverseStockApplyMapper;
import com.chinaztt.mes.warehouse.mapper.StockMapper;
import com.chinaztt.mes.warehouse.service.ReverseStockApplyDetailService;
import com.chinaztt.mes.warehouse.state.constant.ReverseApplyState;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
import java.util.List;
 
/**
 * @Author: Zero
 * @Date: 2022/9/19 13:47
 * @Description:
 */
@Service
@Transactional(rollbackFor = Exception.class)
public class ReverseStockApplyDetailServiceImpl extends ServiceImpl<ReverseStockApplyDetailMapper,
        ReverseStockApplyDetail> implements ReverseStockApplyDetailService {
 
    @Autowired
    private ReverseStockApplyDetailMapper reverseStockApplyDetailMapper;
 
    @Autowired
    private StockMapper stockMapper;
 
    @Autowired
    private ReverseStockApplyMapper reverseStockApplyMapper;
 
    @Override
    public Boolean insertApplyDetail(List<ReverseStockApplyDetail> applyDetailList) {
        applyDetailList.forEach(applyDetail -> applyDetail.setState(ReverseApplyState.NEW.getCode()));
        return saveBatch(applyDetailList);
    }
 
    @Override
    public Boolean updateApplyDetail(ReverseStockApplyDetail applyDetail) {
        Stock stock = stockMapper.selectById(applyDetail.getStockId());
        if (stock.getAvailableStockQuantity().compareTo(applyDetail.getReverseQuantity()) < 0) {
            throw new RuntimeException("退料数量不能大于剩余可用库存数量");
        }
        return updateById(applyDetail);
    }
 
    @Override
    public Boolean batchUpdateDetail(List<ReverseStockApplyDetail> applyDetailList) {
        return updateBatchById(applyDetailList);
    }
 
    @Override
    public List<Long> getLockStockIds() {
        return reverseStockApplyDetailMapper.getLockStockIds(ReverseApplyState.NEW.getCode());
    }
 
    @Override
    public String deleteApplyDetail(Long id) {
        ReverseStockApplyDetail applyDetail = getById(id);
        if (!StringUtils.equals(ReverseApplyState.NEW.getCode(), applyDetail.getState())) {
            throw new RuntimeException("只能删除新建状态的退料详情");
        }
        reverseStockApplyDetailMapper.deleteById(id);
        List<ReverseStockApplyDetail> applyDetailList =
                reverseStockApplyDetailMapper.selectList(Wrappers.<ReverseStockApplyDetail>lambdaQuery()
                        .eq(ReverseStockApplyDetail::getReverseApplyId, applyDetail.getReverseApplyId()));
        long newStateDetailCount = applyDetailList.stream().filter(d -> StringUtils.equals(ReverseApplyState.NEW.getCode(),
                d.getState())).count();
        String state = ReverseApplyState.DRAFT.getCode();
        // 当前申请单下仍然有退料详情
        if (CollectionUtil.isNotEmpty(applyDetailList)) {
            // 有退料详情,无新建状态详情,说明全部都为已执行
            if (newStateDetailCount == 0) {
                state = ReverseApplyState.PROCESSED.getCode();
            }else if (newStateDetailCount < applyDetailList.size()) {
                // 退料详情新建条数小于总条数,说明此时已执行和新建状态详情都有,则主表为执行中
                state = ReverseApplyState.PROCESSING.getCode();
            }
        }
        reverseStockApplyMapper.update(null, Wrappers.<ReverseStockApply>lambdaUpdate().eq(ReverseStockApply::getId,
                applyDetail.getReverseApplyId()).set(ReverseStockApply::getState, state));
        return state;
    }
 
}