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 implements OrderDetlPakoutService { @Override public List selectByOrderId(Long orderId) { return this.selectList(new EntityWrapper().eq("order_id", orderId)); } @Override public Page getPakoutPage(Page 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 wrapper = new EntityWrapper<>(); wrapper.eq("order_no", orderNo) .eq("pallet_id", palletId) .orderBy("id", true); return selectFirst(wrapper); } @Override public OrderDetlPakout findByLook(List 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 buildItemWrapper(Long orderId, String orderNo, String matnr, String batch, String brand, String standby1, String standby2, String standby3, String boxType1, String boxType2, String boxType3) { EntityWrapper 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 wrapper) { List rows = this.selectList(wrapper); return Cools.isEmpty(rows) ? null : rows.get(0); } }