diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java index a252bca..fbdd72d 100644 --- a/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java +++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java @@ -2,6 +2,7 @@ package com.gear.mat.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.gear.common.exception.ServiceException; import com.gear.common.utils.StringUtils; import com.gear.common.core.page.TableDataInfo; import com.gear.common.core.domain.PageQuery; @@ -146,7 +147,28 @@ public class MatMaterialServiceImpl implements IMatMaterialService { * 保存前的数据校验 */ private void validEntityBeforeSave(MatMaterial entity){ - //TODO 做一些数据校验,如唯一约束 + if (entity == null) { + return; + } + if (StringUtils.isNotBlank(entity.getMaterialName())) { + entity.setMaterialName(entity.getMaterialName().trim()); + } + if (StringUtils.isNotBlank(entity.getFactory())) { + entity.setFactory(entity.getFactory().trim()); + } + if (StringUtils.isBlank(entity.getMaterialName()) || StringUtils.isBlank(entity.getFactory()) || entity.getMaterialType() == null) { + return; + } + Long cnt = baseMapper.selectCount(Wrappers.lambdaQuery() + .eq(MatMaterial::getMaterialName, entity.getMaterialName()) + .eq(MatMaterial::getFactory, entity.getFactory()) + .eq(MatMaterial::getMaterialType, entity.getMaterialType()) + .eq(MatMaterial::getDelFlag, 0) + .ne(entity.getMaterialId() != null, MatMaterial::getMaterialId, entity.getMaterialId())); + if (cnt != null && cnt > 0) { + String typeLabel = Objects.equals(entity.getMaterialType(), 2) ? "主材" : Objects.equals(entity.getMaterialType(), 1) ? "辅材" : "原料"; + throw new ServiceException(typeLabel + "已存在:" + entity.getMaterialName() + " - " + entity.getFactory()); + } } /** diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearStockIoOrderController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearStockIoOrderController.java index 427cec5..c25ac14 100644 --- a/gear-oa/src/main/java/com/gear/oa/controller/GearStockIoOrderController.java +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearStockIoOrderController.java @@ -9,6 +9,7 @@ import com.gear.common.core.page.TableDataInfo; import com.gear.common.core.validate.AddGroup; import com.gear.common.core.validate.EditGroup; import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; import com.gear.oa.domain.bo.GearStockIoOrderBo; import com.gear.oa.domain.bo.GearStockIoOrderWithDetailBo; import com.gear.oa.domain.vo.GearStockIoOrderVo; @@ -18,9 +19,11 @@ import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.util.Arrays; +import java.util.List; import java.util.Map; @Validated @@ -36,6 +39,13 @@ public class GearStockIoOrderController extends BaseController { return stockIoOrderService.queryPageList(bo, pageQuery); } + @Log(title = "出入库单据", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearStockIoOrderBo bo, HttpServletResponse response) { + List list = stockIoOrderService.queryList(bo); + ExcelUtil.exportExcel(list, "出入库单据", GearStockIoOrderVo.class, response); + } + @GetMapping("/{orderId}") public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { return R.ok(stockIoOrderService.queryById(orderId)); @@ -68,57 +78,19 @@ public class GearStockIoOrderController extends BaseController { } @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @PostMapping("/submit/{orderId}") - public R submit(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { - stockIoOrderService.submitOrder(orderId); - return R.ok(); - } - - @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @PostMapping("/audit/{orderId}") - public R audit(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { - stockIoOrderService.auditOrder(orderId); - return R.ok(); - } - - @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @PostMapping("/execute/{orderId}") - public R execute(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { - stockIoOrderService.executeOrder(orderId); - return R.ok(); - } - - @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @PostMapping("/arrival/{orderId}") - public R arrival(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { - stockIoOrderService.confirmArrival(orderId); - return R.ok(); - } - - @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @PostMapping("/finish/{orderId}") - public R finish(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { - stockIoOrderService.finishOrder(orderId); + @PostMapping("/confirmIn/{orderId}") + public R confirmIn(@NotNull(message = "主键不能为空") @PathVariable Long orderId) { + stockIoOrderService.confirmIn(orderId); return R.ok(); } @Log(title = "出入库单据", businessType = BusinessType.UPDATE) @RepeatSubmit - @PostMapping("/cancel/{orderId}") - public R cancel(@NotNull(message = "主键不能为空") @PathVariable Long orderId, + @PostMapping("/revoke/{orderId}") + public R revoke(@NotNull(message = "主键不能为空") @PathVariable Long orderId, @RequestBody(required = false) Map payload) { String reason = payload == null ? "" : String.valueOf(payload.getOrDefault("reason", "")); - stockIoOrderService.cancelOrder(orderId, reason); + stockIoOrderService.revoke(orderId, reason); return R.ok(); } - - @Log(title = "出入库单据", businessType = BusinessType.UPDATE) - @RepeatSubmit - @PostMapping("/reverse/{orderId}") - public R reverse(@NotNull(message = "主键不能为空") @PathVariable Long orderId, - @RequestBody(required = false) Map payload) { - String reason = payload == null ? "" : String.valueOf(payload.getOrDefault("reason", "")); - return R.ok(stockIoOrderService.reverseOrder(orderId, reason)); - } } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrder.java b/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrder.java index d517bfc..665c790 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrder.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrder.java @@ -60,6 +60,18 @@ public class GearStockIoOrder extends BaseEntity { private String execFlag; + private String confirmInFlag; + + private String confirmInBy; + + private Date confirmInTime; + + private String revokeFlag; + + private String revokeBy; + + private Date revokeTime; + private String reversalFlag; private Long reversalOrderId; @@ -89,4 +101,3 @@ public class GearStockIoOrder extends BaseEntity { @TableLogic(value = "0", delval = "2") private String delFlag; } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrderDetail.java b/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrderDetail.java index a23bc2e..70cb697 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrderDetail.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearStockIoOrderDetail.java @@ -27,6 +27,8 @@ public class GearStockIoOrderDetail extends BaseEntity { private Long itemId; + private Integer materialTypeSnapshot; + private String itemName; private String specName; @@ -54,4 +56,3 @@ public class GearStockIoOrderDetail extends BaseEntity { @TableLogic(value = "0", delval = "2") private String delFlag; } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderBo.java index c94aaa1..ce47891 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderBo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderBo.java @@ -59,6 +59,10 @@ public class GearStockIoOrderBo extends BaseEntity { private String execFlag; + private String confirmInFlag; + + private String revokeFlag; + private String reversalFlag; private Long reversalOrderId; @@ -87,4 +91,3 @@ public class GearStockIoOrderBo extends BaseEntity { private String delFlag; } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderDetailBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderDetailBo.java index 9c4226b..76859d3 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderDetailBo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearStockIoOrderDetailBo.java @@ -26,6 +26,8 @@ public class GearStockIoOrderDetailBo extends BaseEntity { @NotNull(message = "物料ID不能为空", groups = {AddGroup.class, EditGroup.class}) private Long itemId; + private Integer materialTypeSnapshot; + private String itemName; private String specName; @@ -53,4 +55,3 @@ public class GearStockIoOrderDetailBo extends BaseEntity { private String delFlag; } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderDetailVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderDetailVo.java index 2545a8d..6948160 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderDetailVo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderDetailVo.java @@ -23,6 +23,8 @@ public class GearStockIoOrderDetailVo extends BaseEntity { private Long itemId; + private Integer materialTypeSnapshot; + @ExcelProperty(value = "物料名称") private String itemName; @@ -49,4 +51,3 @@ public class GearStockIoOrderDetailVo extends BaseEntity { private String remark; } - diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderVo.java index c40bd38..163829c 100644 --- a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderVo.java +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearStockIoOrderVo.java @@ -61,6 +61,18 @@ public class GearStockIoOrderVo extends BaseEntity { private String execFlag; + private String confirmInFlag; + + private String confirmInBy; + + private Date confirmInTime; + + private String revokeFlag; + + private String revokeBy; + + private Date revokeTime; + private String reversalFlag; private Long reversalOrderId; diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearStockIoOrderService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearStockIoOrderService.java index f5f2b0e..613b152 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/IGearStockIoOrderService.java +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearStockIoOrderService.java @@ -26,18 +26,7 @@ public interface IGearStockIoOrderService { Boolean deleteWithValidByIds(Collection ids, Boolean isValid); - void submitOrder(Long orderId); + void confirmIn(Long orderId); - void auditOrder(Long orderId); - - void executeOrder(Long orderId); - - void confirmArrival(Long orderId); - - void finishOrder(Long orderId); - - void cancelOrder(Long orderId, String reason); - - Long reverseOrder(Long orderId, String reason); + void revoke(Long orderId, String reason); } - diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearStockIoOrderServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearStockIoOrderServiceImpl.java index 99197b3..c486c48 100644 --- a/gear-oa/src/main/java/com/gear/oa/service/impl/GearStockIoOrderServiceImpl.java +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearStockIoOrderServiceImpl.java @@ -123,6 +123,8 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { lqw.eq(StringUtils.isNotBlank(bo.getBizType()), GearStockIoOrder::getBizType, bo.getBizType()); lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GearStockIoOrder::getStatus, bo.getStatus()); lqw.eq(StringUtils.isNotBlank(bo.getExecFlag()), GearStockIoOrder::getExecFlag, bo.getExecFlag()); + lqw.eq(StringUtils.isNotBlank(bo.getConfirmInFlag()), GearStockIoOrder::getConfirmInFlag, bo.getConfirmInFlag()); + lqw.eq(StringUtils.isNotBlank(bo.getRevokeFlag()), GearStockIoOrder::getRevokeFlag, bo.getRevokeFlag()); lqw.eq(StringUtils.isNotBlank(bo.getReversalFlag()), GearStockIoOrder::getReversalFlag, bo.getReversalFlag()); lqw.like(StringUtils.isNotBlank(bo.getSourceNo()), GearStockIoOrder::getSourceNo, bo.getSourceNo()); lqw.like(StringUtils.isNotBlank(bo.getResponsibleName()), GearStockIoOrder::getResponsibleName, bo.getResponsibleName()); @@ -144,6 +146,8 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } order.setStatus("0"); order.setExecFlag("0"); + order.setConfirmInFlag("0"); + order.setRevokeFlag("0"); order.setReversalFlag("0"); order.setDelayMinutes(0); order.setDelayStatus("0"); @@ -158,19 +162,17 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } insertDetails(order.getOrderId(), bo.getDetails()); - if ("O".equalsIgnoreCase(order.getIoType())) { List details = detailMapper.selectList(Wrappers.lambdaQuery() .eq(GearStockIoOrderDetail::getOrderId, order.getOrderId()) .orderByAsc(GearStockIoOrderDetail::getLineNo)); - applyMaterialStockChange(order.getIoType(), details); + applyMaterialStockChange("O", details, "原料库存不足,无法出库"); + GearStockIoOrder update = new GearStockIoOrder(); update.setOrderId(order.getOrderId()); update.setExecFlag("1"); update.setExecuteBy(LoginHelper.getNickName()); update.setExecuteTime(new Date()); - update.setStatus("1"); - update.setActualFinishTime(new Date()); baseMapper.updateById(update); } return order.getOrderId(); @@ -285,66 +287,16 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { return baseMapper.deleteBatchIds(ids) > 0; } - @Override - public void submitOrder(Long orderId) { - GearStockIoOrder order = requireOrder(orderId); - ensureNotCanceled(order); - Long cnt = detailMapper.selectCount(Wrappers.lambdaQuery().eq(GearStockIoOrderDetail::getOrderId, orderId)); - if (cnt == null || cnt <= 0) { - throw new ServiceException("单据明细不能为空"); - } - } - @Override @Transactional(rollbackFor = Exception.class) - public void auditOrder(Long orderId) { - GearStockIoOrder order = requireOrder(orderId); - ensureNotCanceled(order); - if (order.getAuditTime() != null) { - return; - } - GearStockIoOrder update = new GearStockIoOrder(); - update.setOrderId(orderId); - update.setAuditBy(LoginHelper.getNickName()); - update.setAuditTime(new Date()); - baseMapper.updateById(update); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void executeOrder(Long orderId) { - GearStockIoOrder order = requireOrder(orderId); - ensureNotCanceled(order); - if ("1".equals(order.getExecFlag())) { - return; - } - List details = detailMapper.selectList(Wrappers.lambdaQuery() - .eq(GearStockIoOrderDetail::getOrderId, orderId) - .orderByAsc(GearStockIoOrderDetail::getLineNo)); - if (details == null || details.isEmpty()) { - throw new ServiceException("单据明细不能为空"); - } - applyMaterialStockChange(order.getIoType(), details); - - GearStockIoOrder update = new GearStockIoOrder(); - update.setOrderId(orderId); - update.setExecFlag("1"); - update.setExecuteBy(LoginHelper.getNickName()); - update.setExecuteTime(new Date()); - update.setStatus("1"); - update.setActualFinishTime(new Date()); - baseMapper.updateById(update); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void confirmArrival(Long orderId) { + public void confirmIn(Long orderId) { GearStockIoOrder order = requireOrder(orderId); ensureNotCanceled(order); + ensureNotRevoked(order); if (!"I".equalsIgnoreCase(order.getIoType())) { - throw new ServiceException("仅入库单支持到货确认"); + throw new ServiceException("仅入库单支持确认入库"); } - if ("1".equals(order.getExecFlag())) { + if ("1".equals(order.getConfirmInFlag())) { return; } List details = detailMapper.selectList(Wrappers.lambdaQuery() @@ -353,146 +305,54 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { if (details == null || details.isEmpty()) { throw new ServiceException("单据明细不能为空"); } - applyMaterialStockChange("I", details); + for (GearStockIoOrderDetail d : details) { + if (d == null) { + continue; + } + if (d.getItemId() == null) { + throw new ServiceException("原料ID不能为空"); + } + if (d.getQuantity() == null || d.getQuantity().compareTo(BigDecimal.ZERO) <= 0) { + throw new ServiceException("入库数量必须大于0"); + } + fillMaterialSnapshotIfNeeded(d); + detailMapper.updateById(d); + } + applyMaterialStockChange("I", details, "确认入库失败"); GearStockIoOrder update = new GearStockIoOrder(); update.setOrderId(orderId); + update.setConfirmInFlag("1"); + update.setConfirmInBy(LoginHelper.getNickName()); + update.setConfirmInTime(new Date()); update.setActualArrivalTime(new Date()); update.setExecFlag("1"); - update.setExecuteBy(LoginHelper.getNickName()); - update.setExecuteTime(new Date()); baseMapper.updateById(update); } @Override @Transactional(rollbackFor = Exception.class) - public void finishOrder(Long orderId) { + public void revoke(Long orderId, String reason) { GearStockIoOrder order = requireOrder(orderId); ensureNotCanceled(order); - if ("1".equals(order.getStatus())) { - return; - } - Date finishTime = order.getActualFinishTime() != null ? order.getActualFinishTime() : new Date(); - - GearStockIoOrder update = new GearStockIoOrder(); - update.setOrderId(orderId); - update.setStatus("1"); - update.setActualFinishTime(finishTime); - fillDelayOnFinish(order, update, finishTime); - baseMapper.updateById(update); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void cancelOrder(Long orderId, String reason) { - GearStockIoOrder order = requireOrder(orderId); - ensureNotCanceled(order); - if ("1".equals(order.getExecFlag())) { - throw new ServiceException("已执行单据不允许作废"); - } - if ("1".equals(order.getStatus())) { - throw new ServiceException("已完成单据不允许作废"); - } - - GearStockIoOrder update = new GearStockIoOrder(); - update.setOrderId(orderId); - update.setCancelReason(StringUtils.isBlank(reason) ? "" : reason); - update.setCancelTime(new Date()); - update.setDelFlag("2"); - baseMapper.updateById(update); - - detailMapper.delete(Wrappers.lambdaQuery().eq(GearStockIoOrderDetail::getOrderId, orderId)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public Long reverseOrder(Long orderId, String reason) { - GearStockIoOrder original = requireOrder(orderId); - ensureNotCanceled(original); - if ("1".equals(original.getReversalFlag())) { - throw new ServiceException("冲销单不允许再冲销"); - } - if (!"1".equals(original.getExecFlag())) { - throw new ServiceException("原单未执行,无法冲销"); - } - - Long exists = baseMapper.selectCount(Wrappers.lambdaQuery() - .eq(GearStockIoOrder::getReversalFlag, "1") - .eq(GearStockIoOrder::getReversalOrderId, orderId)); - if (exists != null && exists > 0) { - throw new ServiceException("该单据已创建冲销单"); - } - - List originalDetails = detailMapper.selectList(Wrappers.lambdaQuery() + ensureNotRevoked(order); + List details = detailMapper.selectList(Wrappers.lambdaQuery() .eq(GearStockIoOrderDetail::getOrderId, orderId) .orderByAsc(GearStockIoOrderDetail::getLineNo)); - if (originalDetails == null || originalDetails.isEmpty()) { - throw new ServiceException("原单明细为空,无法冲销"); + + if ("O".equalsIgnoreCase(order.getIoType()) && "1".equals(order.getExecFlag())) { + applyMaterialStockChange("I", details, "撤回出库失败"); } - - GearStockIoOrder reversal = new GearStockIoOrder(); - reversal.setOrderCode("SIOO_R_" + IdUtil.getSnowflakeNextIdStr()); - reversal.setIoType(reverseIoType(original.getIoType())); - reversal.setBizType(original.getBizType()); - reversal.setSourceType("reversal"); - reversal.setSourceNo(original.getOrderCode()); - reversal.setSourceOrderId(original.getOrderId()); - reversal.setResponsibleId(original.getResponsibleId()); - reversal.setResponsibleName(original.getResponsibleName()); - reversal.setWarehouseId(original.getWarehouseId()); - reversal.setFromWarehouseId(original.getFromWarehouseId()); - reversal.setToWarehouseId(original.getToWarehouseId()); - reversal.setStatus("0"); - reversal.setExecFlag("0"); - reversal.setReversalFlag("1"); - reversal.setReversalOrderId(original.getOrderId()); - reversal.setReversalReason(StringUtils.isBlank(reason) ? "" : reason); - reversal.setReversalTime(new Date()); - reversal.setDelayMinutes(0); - reversal.setDelayStatus("0"); - reversal.setDelFlag("0"); - reversal.setTotalQty(original.getTotalQty()); - reversal.setRemark(original.getRemark()); - baseMapper.insert(reversal); - - int lineNo = 1; - for (GearStockIoOrderDetail od : originalDetails) { - GearStockIoOrderDetail rd = new GearStockIoOrderDetail(); - rd.setOrderId(reversal.getOrderId()); - rd.setLineNo(od.getLineNo() == null ? lineNo++ : od.getLineNo()); - rd.setItemType(od.getItemType()); - rd.setItemId(od.getItemId()); - rd.setItemName(od.getItemName()); - rd.setSpecName(od.getSpecName()); - rd.setWarehouseId(od.getWarehouseId()); - rd.setFromWarehouseId(od.getFromWarehouseId()); - rd.setQuantity(od.getQuantity()); - rd.setUnit(od.getUnit()); - rd.setBatchNo(od.getBatchNo()); - rd.setUnitPrice(od.getUnitPrice()); - rd.setAmount(od.getAmount()); - rd.setSourceDetailNo(od.getSourceDetailNo()); - rd.setReversalDetailId(od.getDetailId()); - rd.setRemark(od.getRemark()); - rd.setDelFlag("0"); - detailMapper.insert(rd); + if ("I".equalsIgnoreCase(order.getIoType()) && "1".equals(order.getConfirmInFlag()) && "1".equals(order.getExecFlag())) { + applyMaterialStockChange("O", details, "原料库存不足,无法撤回入库"); } - List reversalDetails = detailMapper.selectList(Wrappers.lambdaQuery() - .eq(GearStockIoOrderDetail::getOrderId, reversal.getOrderId()) - .orderByAsc(GearStockIoOrderDetail::getLineNo)); - applyMaterialStockChange(reversal.getIoType(), reversalDetails); - GearStockIoOrder update = new GearStockIoOrder(); - update.setOrderId(reversal.getOrderId()); - update.setAuditBy(LoginHelper.getNickName()); - update.setAuditTime(new Date()); - update.setExecFlag("1"); - update.setExecuteBy(LoginHelper.getNickName()); - update.setExecuteTime(new Date()); - update.setStatus("1"); - update.setActualFinishTime(new Date()); + update.setOrderId(orderId); + update.setRevokeFlag("1"); + update.setRevokeBy(LoginHelper.getNickName()); + update.setRevokeTime(new Date()); + update.setExecFlag("0"); baseMapper.updateById(update); - return reversal.getOrderId(); } private GearStockIoOrder requireOrder(Long orderId) { @@ -512,13 +372,23 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } } + private void ensureNotRevoked(GearStockIoOrder order) { + if ("1".equals(order.getRevokeFlag())) { + throw new ServiceException("单据已撤回"); + } + } + private void ensureEditable(GearStockIoOrder order) { ensureNotCanceled(order); + ensureNotRevoked(order); + if ("1".equals(order.getConfirmInFlag())) { + throw new ServiceException("已确认入库单据不允许修改"); + } if ("1".equals(order.getStatus())) { throw new ServiceException("已完成单据不允许修改"); } if ("1".equals(order.getExecFlag())) { - throw new ServiceException("已执行单据不允许修改"); + throw new ServiceException("已影响库存单据不允许修改"); } if (order.getAuditTime() != null) { throw new ServiceException("已审核单据不允许修改"); @@ -578,46 +448,6 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } } - private void fillDelayOnFinish(GearStockIoOrder dbOrder, GearStockIoOrder update, Date finishTime) { - if ("2".equals(dbOrder.getDelayStatus())) { - return; - } - Date planFinish = dbOrder.getPlanFinishTime(); - if (planFinish == null || finishTime == null) { - update.setDelayMinutes(0); - update.setDelayStatus("0"); - return; - } - long diffMs = finishTime.getTime() - planFinish.getTime(); - int minutes = (int) Math.max(0, diffMs / (60_000L)); - update.setDelayMinutes(minutes); - update.setDelayStatus(minutes > 0 ? "1" : "0"); - } - - private void applyMaterialStockChange(String ioType, List details) { - if (!"I".equalsIgnoreCase(ioType) && !"O".equalsIgnoreCase(ioType)) { - throw new ServiceException("仅支持入库/出库类型"); - } - if (details == null || details.isEmpty()) { - throw new ServiceException("单据明细不能为空"); - } - for (GearStockIoOrderDetail d : details) { - if (d == null) { - continue; - } - if (!"material".equals(d.getItemType())) { - throw new ServiceException("仅支持原料(主材/辅材)出入库"); - } - fillMaterialSnapshotIfNeeded(d); - BigDecimal qty = d.getQuantity() == null ? BigDecimal.ZERO : d.getQuantity(); - if (qty.compareTo(BigDecimal.ZERO) <= 0) { - continue; - } - BigDecimal delta = "I".equalsIgnoreCase(ioType) ? qty : qty.negate(); - adjustMaterialStock(d.getItemId(), delta); - } - } - private String resolveUnit(String preferred, String itemType, Long itemId) { if (StringUtils.isNotBlank(preferred)) { return preferred; @@ -642,6 +472,14 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { if (snapshot == null) { throw new ServiceException("原料不存在:" + d.getItemId()); } + if (d.getMaterialTypeSnapshot() == null) { + Object materialType = snapshot.get("materialType"); + if (materialType instanceof Number) { + d.setMaterialTypeSnapshot(((Number) materialType).intValue()); + } else if (materialType != null && StringUtils.isNotBlank(String.valueOf(materialType))) { + d.setMaterialTypeSnapshot(Integer.parseInt(String.valueOf(materialType))); + } + } if (StringUtils.isBlank(d.getItemName())) { Object name = snapshot.get("materialName"); if (name != null) { @@ -656,7 +494,31 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } } - private void adjustMaterialStock(Long materialId, BigDecimal delta) { + private void applyMaterialStockChange(String ioType, List details, String insufficientMessage) { + if (!"I".equalsIgnoreCase(ioType) && !"O".equalsIgnoreCase(ioType)) { + throw new ServiceException("仅支持入库/出库类型"); + } + if (details == null || details.isEmpty()) { + throw new ServiceException("单据明细不能为空"); + } + for (GearStockIoOrderDetail d : details) { + if (d == null) { + continue; + } + if (!"material".equals(d.getItemType())) { + throw new ServiceException("仅支持原料(主材/辅材)出入库"); + } + fillMaterialSnapshotIfNeeded(d); + BigDecimal qty = d.getQuantity() == null ? BigDecimal.ZERO : d.getQuantity(); + if (qty.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } + BigDecimal delta = "I".equalsIgnoreCase(ioType) ? qty : qty.negate(); + adjustMaterialStock(d.getItemId(), delta, insufficientMessage); + } + } + + private void adjustMaterialStock(Long materialId, BigDecimal delta, String insufficientMessage) { if (delta == null || delta.compareTo(BigDecimal.ZERO) == 0) { return; } @@ -673,24 +535,11 @@ public class GearStockIoOrderServiceImpl implements IGearStockIoOrderService { } BigDecimal after = currentStock.add(delta); if (after.compareTo(BigDecimal.ZERO) < 0) { - throw new ServiceException("原料库存不足,无法出库"); + throw new ServiceException(StringUtils.isBlank(insufficientMessage) ? "原料库存不足" : insufficientMessage); } matMaterialMapper.updateStockDelta(materialId, delta); } - private String reverseIoType(String ioType) { - if ("I".equalsIgnoreCase(ioType)) { - return "O"; - } - if ("O".equalsIgnoreCase(ioType)) { - return "I"; - } - if ("T".equalsIgnoreCase(ioType)) { - return "T"; - } - return ioType; - } - @SafeVarargs private static T firstNonNull(T... values) { if (values == null) { diff --git a/gear-ui3/src/api/wms/stockIoOrder.js b/gear-ui3/src/api/wms/stockIoOrder.js index d07c290..366448d 100644 --- a/gear-ui3/src/api/wms/stockIoOrder.js +++ b/gear-ui3/src/api/wms/stockIoOrder.js @@ -45,54 +45,17 @@ export function delStockIoOrder(orderId) { }) } -export function submitStockIoOrder(orderId) { +export function confirmInStockIoOrder(orderId) { return request({ - url: '/gear/stockIoOrder/submit/' + orderId, + url: '/gear/stockIoOrder/confirmIn/' + orderId, method: 'post' }) } -export function auditStockIoOrder(orderId) { +export function revokeStockIoOrder(orderId, reason) { return request({ - url: '/gear/stockIoOrder/audit/' + orderId, - method: 'post' - }) -} - -export function executeStockIoOrder(orderId) { - return request({ - url: '/gear/stockIoOrder/execute/' + orderId, - method: 'post' - }) -} - -export function arrivalStockIoOrder(orderId) { - return request({ - url: '/gear/stockIoOrder/arrival/' + orderId, - method: 'post' - }) -} - -export function finishStockIoOrder(orderId) { - return request({ - url: '/gear/stockIoOrder/finish/' + orderId, - method: 'post' - }) -} - -export function cancelStockIoOrder(orderId, reason) { - return request({ - url: '/gear/stockIoOrder/cancel/' + orderId, + url: '/gear/stockIoOrder/revoke/' + orderId, method: 'post', data: { reason: reason || '' } }) } - -export function reverseStockIoOrder(orderId, reason) { - return request({ - url: '/gear/stockIoOrder/reverse/' + orderId, - method: 'post', - data: { reason: reason || '' } - }) -} - diff --git a/gear-ui3/src/components/RawSelector/index.vue b/gear-ui3/src/components/RawSelector/index.vue index c41c1f4..9baa1cb 100644 --- a/gear-ui3/src/components/RawSelector/index.vue +++ b/gear-ui3/src/components/RawSelector/index.vue @@ -4,8 +4,7 @@ 选择配料 - {{ currentMaterial.materialName }}({{ currentMaterial.spec }})[{{ currentMaterial.model }}] - {{ - currentMaterial.factory }},库存:{{ currentMaterial.currentStock }}{{ currentMaterial.unit }} + {{ currentMaterial.materialName }} - {{ currentMaterial.factory }},库存:{{ currentMaterial.currentStock }}{{ currentMaterial.unit }} @@ -23,12 +22,6 @@ - - - - - - @@ -57,8 +50,6 @@ {{ scope.row.materialType === 1 ? '辅料' : scope.row.materialType === 2 ? '主材' : '-' }} - - - - @@ -88,12 +80,6 @@ - - - - - - diff --git a/gear-ui3/src/views/mat/raw/index.vue b/gear-ui3/src/views/mat/raw/index.vue index a3ce4c2..0435baa 100644 --- a/gear-ui3/src/views/mat/raw/index.vue +++ b/gear-ui3/src/views/mat/raw/index.vue @@ -4,12 +4,6 @@ - - - - - - @@ -55,8 +49,6 @@ {{ scope.row.materialType === 1 ? '辅料' : '主材' }} - - @@ -92,12 +84,6 @@ - - - - - - diff --git a/gear-ui3/src/views/wms/stockIoOrder/in.vue b/gear-ui3/src/views/wms/stockIoOrder/in.vue index 7d6fb5d..6ca5194 100644 --- a/gear-ui3/src/views/wms/stockIoOrder/in.vue +++ b/gear-ui3/src/views/wms/stockIoOrder/in.vue @@ -10,9 +10,6 @@ - - - 搜索 重置 @@ -24,10 +21,13 @@ 新增 - 到货确认 + 确认入库 - 撤回 + 撤回 + + + 导出 @@ -51,12 +51,18 @@ - + + + @@ -87,11 +93,6 @@ - - - - - @@ -180,10 +181,12 @@ {{ detailData.order.bizType }} {{ detailData.order.responsibleName }} {{ detailData.order.actualArrivalTime || '-' }} + {{ detailData.order.confirmInBy || '-' }} + {{ detailData.order.revokeBy || '-' }}
- 到货确认 - 撤回 + 确认入库 + 撤回
@@ -211,8 +214,8 @@ import { listStockIoOrder, getStockIoOrderWithDetail, addStockIoOrderWithDetail, - arrivalStockIoOrder, - reverseStockIoOrder + confirmInStockIoOrder, + revokeStockIoOrder } from '@/api/wms/stockIoOrder' export default { @@ -235,8 +238,7 @@ export default { orderCode: undefined, ioType: 'I', bizType: undefined, - responsibleName: undefined, - sourceNo: undefined + responsibleName: undefined }, editOpen: false, editTitle: '', @@ -291,11 +293,39 @@ export default { this.single = selection.length !== 1 this.multiple = !selection.length }, + handleExport() { + this.download( + '/gear/stockIoOrder/export', + { + ...this.queryParams + }, + `stockIoOrder_in_${new Date().getTime()}.xlsx` + ) + }, + handleConfirm(row) { + const target = row || (this.rows && this.rows[0]) + if (!target || !target.orderId) return + this.$modal + .confirm('确认入库前将进行数据校验,确认继续?') + .then(() => { + this.buttonLoading = true + return confirmInStockIoOrder(target.orderId) + }) + .then(() => { + this.$modal.msgSuccess('确认成功') + this.getList() + if (this.detailOpen && this.detailData && this.detailData.order) { + return getStockIoOrderWithDetail(this.detailData.order.orderId).then((res) => (this.detailData = res.data)) + } + }) + .finally(() => { + this.buttonLoading = false + }) + }, resetEdit() { this.editForm = { ioType: 'I', bizType: undefined, - sourceNo: undefined, responsibleName: undefined, remark: undefined } @@ -316,36 +346,21 @@ export default { this.detailData = res.data }) }, - handleArrival(row) { + handleRevoke(row) { const target = row || (this.rows && this.rows[0]) if (!target || !target.orderId) return this.$modal - .confirm('确认到货?') + .confirm('确认撤回该入库单据?撤回后将标记为已撤回。') .then(() => { this.buttonLoading = true - return arrivalStockIoOrder(target.orderId) + return revokeStockIoOrder(target.orderId, '') }) .then(() => { - this.$modal.msgSuccess('已确认到货') - this.getList() - }) - .finally(() => { - this.buttonLoading = false - }) - }, - handleReverse(row) { - const target = row || (this.rows && this.rows[0]) - if (!target || !target.orderId) return - this.$modal - .confirm('确认冲销该单据?系统将创建一张反向单据并自动执行。') - .then(() => { - this.buttonLoading = true - return reverseStockIoOrder(target.orderId, '') - }) - .then((res) => { - const newId = res.data - this.$modal.msgSuccess('冲销成功,冲销单ID:' + newId) + this.$modal.msgSuccess('撤回成功') this.getList() + if (this.detailOpen) { + this.detailOpen = false + } }) .finally(() => { this.buttonLoading = false @@ -417,6 +432,7 @@ export default { lineNo, itemType: 'material', itemId: d.itemId, + materialTypeSnapshot: d._materialType, itemName: d.itemName, quantity: quantity, unit: d.unit, @@ -493,6 +509,9 @@ export default { onMaterialPicked(row, material) { if (material && material.materialName) { row.itemName = material.materialName + if (material.materialType != null) { + row._materialType = material.materialType + } if (!row.unit && material.unit) { row.unit = material.unit } diff --git a/gear-ui3/src/views/wms/stockIoOrder/out.vue b/gear-ui3/src/views/wms/stockIoOrder/out.vue index b70f761..0518669 100644 --- a/gear-ui3/src/views/wms/stockIoOrder/out.vue +++ b/gear-ui3/src/views/wms/stockIoOrder/out.vue @@ -23,6 +23,9 @@ 撤回 + + 导出 + @@ -44,10 +47,16 @@ + + + @@ -78,11 +87,6 @@
- - - - - @@ -127,7 +131,7 @@
@@ -140,16 +144,6 @@ - - - - - - -