自动化立体仓库 - WMS系统
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
package com.zy.asrs.service.impl;
 
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.zy.asrs.entity.OrderDetlPakout;
import com.zy.asrs.mapper.OrderDetlPakoutMapper;
import com.zy.asrs.service.OrderDetlPakoutService;
import org.springframework.stereotype.Service;
 
import java.util.List;
 
@Service("orderDetlPakoutService")
public class OrderDetlPakoutServiceImpl extends ServiceImpl<OrderDetlPakoutMapper, OrderDetlPakout> implements OrderDetlPakoutService {
 
    @Override
    public List<OrderDetlPakout> selectByOrderId(Long orderId) {
        return this.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_id", orderId));
    }
 
    @Override
    public Page<OrderDetlPakout> getPakoutPage(Page<OrderDetlPakout> page) {
        page.setRecords(baseMapper.getPakoutPage(page.getCondition()));
        page.setTotal(baseMapper.getPakoutPageCount(page.getCondition()));
        return page;
    }
 
    @Override
    public OrderDetlPakout selectItem(Long orderId, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3) {
        // 延迟出库后,man_order_detl_pakout 会按托盘拆明细。
        // 旧的 orderId + 物料维度可能命中多条记录,不能再用 mapper 返回单对象的 selectOne 语义。
        // 这里统一改为列表查询并按 id 取第一条,避免 TooManyResultsException;需要精确回写时请优先使用 pallet_id。
        return selectFirst(buildItemWrapper(orderId, null, matnr, batch, brand, standby1, standby2, standby3, boxType1, boxType2, boxType3));
    }
 
    @Override
    public OrderDetlPakout selectItem(String orderNo, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3) {
        // 同上,orderNo + 物料维度在新模型中不保证唯一,只作为旧数据的兜底匹配。
        return selectFirst(buildItemWrapper(null, orderNo, matnr, batch, brand, standby1, standby2, standby3, boxType1, boxType2, boxType3));
    }
 
    @Override
    public OrderDetlPakout selectItemByOrderNoAndPallet(String orderNo, String palletId) {
        if (Cools.isEmpty(orderNo) || Cools.isEmpty(palletId)) {
            return null;
        }
        // orderNo + palletId 是延迟出库订单明细的精确匹配键。
        // 仍然使用 selectList 取第一条,防止历史脏数据里同一托盘重复时 selectOne 直接中断定时线程。
        EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();
        wrapper.eq("order_no", orderNo)
                .eq("pallet_id", palletId)
                .orderBy("id", true);
        return selectFirst(wrapper);
    }
 
    @Override
    public OrderDetlPakout findByLook(List<OrderDetlPakout> orderDetls, Long orderId, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3) {
        for (OrderDetlPakout orderDetl : orderDetls) {
            if (orderDetl.getOrderId().equals(orderId) && orderDetl.getMatnr().equals(matnr)  && orderDetl.getBrand().equals(brand)
                    && orderDetl.getStandby1().equals(standby1)  && orderDetl.getStandby2().equals(standby2)  && orderDetl.getStandby3().equals(standby3)
                    && orderDetl.getBoxType1().equals(boxType1)  && orderDetl.getBoxType2().equals(boxType2)  && orderDetl.getBoxType3().equals(boxType3)
            ) {
                if (Cools.eq(batch, orderDetl.getBatch())) {
                    return orderDetl;
                }
            }
        }
        return null;
    }
 
    @Override
    public boolean increase(Long orderId, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double qty) {
        return this.baseMapper.increase(orderId, matnr, batch,brand,standby1,standby2,standby3,boxType1,boxType2,boxType3, qty) > 0;
    }
 
    @Override
    public boolean decrease(String orderNo, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double qty) {
        int decrease = this.baseMapper.decrease(orderNo, matnr, batch,brand,standby1,standby2,standby3,boxType1,boxType2,boxType3, qty);
        if (decrease == 0) {
            return this.baseMapper.decrease(orderNo, matnr, "",brand,standby1,standby2,standby3,boxType1,boxType2,boxType3, qty) > 0;
        } else {
            return true;
        }
    }
 
    @Override
    public boolean modifyStatus(Long orderId, Integer status) {
        return this.baseMapper.modifyStatus(orderId, status) > 0;
    }
 
    @Override
    public boolean addToLogTable(OrderDetlPakout orderDetl) {
        return this.baseMapper.addToLogTable(orderDetl) > 0;
    }
 
    @Override
    public boolean increaseQtyByOrderNo(String orderNo, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double qty) {
        return this.baseMapper.increaseQtyByOrderNo(orderNo, matnr, batch,brand,standby1,standby2,standby3,boxType1,boxType2,boxType3, qty) > 0;
    }
 
    @Override
    public boolean increaseQtyByOrderNoAndPallet(String orderNo, String palletId, Double qty) {
        OrderDetlPakout orderDetl = selectItemByOrderNoAndPallet(orderNo, palletId);
        if (orderDetl == null) {
            return false;
        }
        // qty 是完成数量,由任务完成回写递增;workQty 是任务生成数量,定时生成任务时已维护。
        Double oldQty = orderDetl.getQty() == null ? 0.0D : orderDetl.getQty();
        orderDetl.setQty(oldQty + (qty == null ? 0.0D : qty));
        return this.updateById(orderDetl);
    }
 
    /**
     * 入出库任务生成时,更新单据表中作业数量
     * @param orderId
     * @param matnr
     * @param batch
     * @param workQty
     * @return
     */
    @Override
    public boolean increaseWorkQty(Long orderId, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3, Double workQty) {
        return this.baseMapper.increaseWorkQty(orderId, matnr, batch,brand,standby1,standby2,standby3,boxType1,boxType2,boxType3, workQty) > 0;
    }
 
    private EntityWrapper<OrderDetlPakout> buildItemWrapper(Long orderId, String orderNo, String matnr, String batch, String brand,
                                                           String standby1, String standby2, String standby3,
                                                           String boxType1, String boxType2, String boxType3) {
        EntityWrapper<OrderDetlPakout> wrapper = new EntityWrapper<>();
        wrapper.eq("matnr", matnr)
                .eq("batch", batch)
                .eq("brand", brand)
                .eq("standby1", standby1)
                .eq("standby2", standby2)
                .eq("standby3", standby3)
                .eq("box_type1", boxType1)
                .eq("box_type2", boxType2)
                .eq("box_type3", boxType3)
                .orderBy("id", true);
        if (!Cools.isEmpty(orderId)) {
            wrapper.eq("order_id", orderId);
        }
        if (!Cools.isEmpty(orderNo)) {
            wrapper.eq("order_no", orderNo);
        }
        return wrapper;
    }
 
    private OrderDetlPakout selectFirst(EntityWrapper<OrderDetlPakout> wrapper) {
        List<OrderDetlPakout> rows = this.selectList(wrapper);
        return Cools.isEmpty(rows) ? null : rows.get(0);
    }
}